forked from mirrors/Fedilab
Add counter for new messages
This commit is contained in:
parent
204cb84dca
commit
e2be4871e0
5 changed files with 247 additions and 140 deletions
|
@ -148,7 +148,7 @@ import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
|
|
||||||
public abstract class BaseMainActivity extends BaseActivity implements NetworkStateReceiver.NetworkStateReceiverListener {
|
public abstract class BaseMainActivity extends BaseActivity implements NetworkStateReceiver.NetworkStateReceiverListener, FragmentMastodonTimeline.UpdateCounters {
|
||||||
|
|
||||||
public static String currentInstance, currentToken, currentUserID, client_id, client_secret, software;
|
public static String currentInstance, currentToken, currentUserID, client_id, client_secret, software;
|
||||||
public static HashMap<String, List<Emoji>> emojis = new HashMap<>();
|
public static HashMap<String, List<Emoji>> emojis = new HashMap<>();
|
||||||
|
@ -1082,6 +1082,63 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpdate(int count, Timeline.TimeLineEnum type, String slug) {
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(BaseMainActivity.this);
|
||||||
|
boolean singleBar = sharedpreferences.getBoolean(getString(R.string.SET_USE_SINGLE_TOPBAR), false);
|
||||||
|
if (!singleBar) {
|
||||||
|
switch (type) {
|
||||||
|
case HOME:
|
||||||
|
if (count > 0) {
|
||||||
|
binding.bottomNavView.getOrCreateBadge(R.id.nav_home).setNumber(count);
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_home).setBackgroundColor(ContextCompat.getColor(BaseMainActivity.this, R.color.cyanea_accent_reference));
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_home).setBadgeTextColor(ThemeHelper.getAttColor(BaseMainActivity.this, R.attr.mTextColor));
|
||||||
|
} else {
|
||||||
|
binding.bottomNavView.removeBadge(R.id.nav_home);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOCAL:
|
||||||
|
if (count > 0) {
|
||||||
|
binding.bottomNavView.getOrCreateBadge(R.id.nav_local).setNumber(count);
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_local).setBackgroundColor(ContextCompat.getColor(BaseMainActivity.this, R.color.cyanea_accent_reference));
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_local).setBadgeTextColor(ThemeHelper.getAttColor(BaseMainActivity.this, R.attr.mTextColor));
|
||||||
|
} else {
|
||||||
|
binding.bottomNavView.removeBadge(R.id.nav_local);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PUBLIC:
|
||||||
|
if (count > 0) {
|
||||||
|
binding.bottomNavView.getOrCreateBadge(R.id.nav_public).setNumber(count);
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_public).setBackgroundColor(ContextCompat.getColor(BaseMainActivity.this, R.color.cyanea_accent_reference));
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_public).setBadgeTextColor(ThemeHelper.getAttColor(BaseMainActivity.this, R.attr.mTextColor));
|
||||||
|
} else {
|
||||||
|
binding.bottomNavView.removeBadge(R.id.nav_public);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NOTIFICATION:
|
||||||
|
if (count > 0) {
|
||||||
|
binding.bottomNavView.getOrCreateBadge(R.id.nav_notifications).setNumber(count);
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_notifications).setBackgroundColor(ContextCompat.getColor(BaseMainActivity.this, R.color.cyanea_accent_reference));
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_notifications).setBadgeTextColor(ThemeHelper.getAttColor(BaseMainActivity.this, R.attr.mTextColor));
|
||||||
|
} else {
|
||||||
|
binding.bottomNavView.removeBadge(R.id.nav_notifications);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DIRECT:
|
||||||
|
if (count > 0) {
|
||||||
|
binding.bottomNavView.getOrCreateBadge(R.id.nav_privates).setNumber(count);
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_privates).setBackgroundColor(ContextCompat.getColor(BaseMainActivity.this, R.color.cyanea_accent_reference));
|
||||||
|
binding.bottomNavView.getBadge(R.id.nav_privates).setBadgeTextColor(ThemeHelper.getAttColor(BaseMainActivity.this, R.attr.mTextColor));
|
||||||
|
} else {
|
||||||
|
binding.bottomNavView.removeBadge(R.id.nav_privates);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
LocalBroadcastManager.getInstance(BaseMainActivity.this).unregisterReceiver(broadcast_data);
|
LocalBroadcastManager.getInstance(BaseMainActivity.this).unregisterReceiver(broadcast_data);
|
||||||
|
|
|
@ -77,6 +77,14 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
private StatusAdapter statusAdapter;
|
private StatusAdapter statusAdapter;
|
||||||
private Timeline.TimeLineEnum timelineType;
|
private Timeline.TimeLineEnum timelineType;
|
||||||
private List<Status> timelineStatuses;
|
private List<Status> timelineStatuses;
|
||||||
|
public UpdateCounters update;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
route(DIRECTION.FETCH_NEW, true);
|
||||||
|
}
|
||||||
|
|
||||||
//Handle actions that can be done in other fragments
|
//Handle actions that can be done in other fragments
|
||||||
private final BroadcastReceiver receive_action = new BroadcastReceiver() {
|
private final BroadcastReceiver receive_action = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -263,6 +271,81 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
return binding.getRoot();
|
return binding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update view and pagination when scrolling down
|
||||||
|
*
|
||||||
|
* @param fetched_statuses Statuses
|
||||||
|
*/
|
||||||
|
private synchronized void dealWithPagination(Statuses fetched_statuses, DIRECTION direction, boolean fetchingMissing, Status statusToUpdate) {
|
||||||
|
if (binding == null || !isAdded() || getActivity() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
binding.swipeContainer.setRefreshing(false);
|
||||||
|
binding.loadingNextElements.setVisibility(View.GONE);
|
||||||
|
flagLoading = false;
|
||||||
|
if (timelineStatuses != null && fetched_statuses != null && fetched_statuses.statuses != null && fetched_statuses.statuses.size() > 0) {
|
||||||
|
try {
|
||||||
|
if (statusToUpdate != null) {
|
||||||
|
new Thread(() -> {
|
||||||
|
StatusCache statusCache = new StatusCache();
|
||||||
|
statusCache.instance = BaseMainActivity.currentInstance;
|
||||||
|
statusCache.user_id = BaseMainActivity.currentUserID;
|
||||||
|
statusToUpdate.isFetchMore = false;
|
||||||
|
statusCache.status = statusToUpdate;
|
||||||
|
statusCache.status_id = statusToUpdate.id;
|
||||||
|
try {
|
||||||
|
new StatusCache(requireActivity()).updateIfExists(statusCache);
|
||||||
|
} catch (DBException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
flagLoading = fetched_statuses.pagination.max_id == null;
|
||||||
|
binding.noAction.setVisibility(View.GONE);
|
||||||
|
if (timelineType == Timeline.TimeLineEnum.ART) {
|
||||||
|
//We have to split media in different statuses
|
||||||
|
List<Status> mediaStatuses = new ArrayList<>();
|
||||||
|
for (Status status : fetched_statuses.statuses) {
|
||||||
|
if (status.media_attachments.size() > 1) {
|
||||||
|
for (Attachment attachment : status.media_attachments) {
|
||||||
|
status.media_attachments = new ArrayList<>();
|
||||||
|
status.media_attachments.add(0, attachment);
|
||||||
|
mediaStatuses.add(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fetched_statuses.statuses = mediaStatuses;
|
||||||
|
}
|
||||||
|
//Update the timeline with new statuses
|
||||||
|
int insertedStatus = updateStatusListWith(fetched_statuses.statuses);
|
||||||
|
|
||||||
|
//For these directions, the app will display counters for new messages
|
||||||
|
if (insertedStatus >= 0 && (direction == DIRECTION.FETCH_NEW || direction == DIRECTION.SCROLL_TOP)) {
|
||||||
|
update.onUpdate(insertedStatus, timelineType, slug);
|
||||||
|
}
|
||||||
|
if (direction == DIRECTION.TOP && fetchingMissing) {
|
||||||
|
binding.recyclerView.scrollToPosition(getPosition(fetched_statuses.statuses.get(fetched_statuses.statuses.size() - 1)) + 1);
|
||||||
|
}
|
||||||
|
if (!fetchingMissing) {
|
||||||
|
if (fetched_statuses.pagination.max_id == null) {
|
||||||
|
flagLoading = true;
|
||||||
|
} else if (max_id == null || fetched_statuses.pagination.max_id.compareTo(max_id) < 0) {
|
||||||
|
max_id = fetched_statuses.pagination.max_id;
|
||||||
|
}
|
||||||
|
if (min_id == null || (fetched_statuses.pagination.min_id != null && fetched_statuses.pagination.min_id.compareTo(min_id) > 0)) {
|
||||||
|
min_id = fetched_statuses.pagination.min_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (direction == DIRECTION.BOTTOM) {
|
||||||
|
flagLoading = true;
|
||||||
|
}
|
||||||
|
if (direction == DIRECTION.SCROLL_TOP) {
|
||||||
|
binding.recyclerView.scrollToPosition(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intialize the common view for statuses on different timelines
|
* Intialize the common view for statuses on different timelines
|
||||||
|
@ -377,91 +460,13 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Update view and pagination when scrolling down
|
|
||||||
*
|
|
||||||
* @param fetched_statuses Statuses
|
|
||||||
*/
|
|
||||||
private synchronized void dealWithPagination(Statuses fetched_statuses, DIRECTION direction, boolean fetchingMissing, Status statusToUpdate) {
|
|
||||||
if (binding == null || !isAdded() || getActivity() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
binding.swipeContainer.setRefreshing(false);
|
|
||||||
binding.loadingNextElements.setVisibility(View.GONE);
|
|
||||||
flagLoading = false;
|
|
||||||
if (timelineStatuses != null && fetched_statuses != null && fetched_statuses.statuses != null && fetched_statuses.statuses.size() > 0) {
|
|
||||||
try {
|
|
||||||
if (statusToUpdate != null) {
|
|
||||||
new Thread(() -> {
|
|
||||||
StatusCache statusCache = new StatusCache();
|
|
||||||
statusCache.instance = BaseMainActivity.currentInstance;
|
|
||||||
statusCache.user_id = BaseMainActivity.currentUserID;
|
|
||||||
statusToUpdate.isFetchMore = false;
|
|
||||||
statusCache.status = statusToUpdate;
|
|
||||||
statusCache.status_id = statusToUpdate.id;
|
|
||||||
try {
|
|
||||||
new StatusCache(requireActivity()).updateIfExists(statusCache);
|
|
||||||
} catch (DBException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
flagLoading = fetched_statuses.pagination.max_id == null;
|
|
||||||
binding.noAction.setVisibility(View.GONE);
|
|
||||||
if (timelineType == Timeline.TimeLineEnum.ART) {
|
|
||||||
//We have to split media in different statuses
|
|
||||||
List<Status> mediaStatuses = new ArrayList<>();
|
|
||||||
for (Status status : fetched_statuses.statuses) {
|
|
||||||
if (status.media_attachments.size() > 1) {
|
|
||||||
for (Attachment attachment : status.media_attachments) {
|
|
||||||
status.media_attachments = new ArrayList<>();
|
|
||||||
status.media_attachments.add(0, attachment);
|
|
||||||
mediaStatuses.add(status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fetched_statuses.statuses = mediaStatuses;
|
|
||||||
}
|
|
||||||
//Update the timeline with new statuses
|
|
||||||
updateStatusListWith(fetched_statuses.statuses);
|
|
||||||
if (direction == DIRECTION.TOP && fetchingMissing) {
|
|
||||||
binding.recyclerView.scrollToPosition(getPosition(fetched_statuses.statuses.get(fetched_statuses.statuses.size() - 1)) + 1);
|
|
||||||
}
|
|
||||||
if (!fetchingMissing) {
|
|
||||||
if (fetched_statuses.pagination.max_id == null) {
|
|
||||||
flagLoading = true;
|
|
||||||
} else if (max_id == null || fetched_statuses.pagination.max_id.compareTo(max_id) < 0) {
|
|
||||||
max_id = fetched_statuses.pagination.max_id;
|
|
||||||
}
|
|
||||||
if (min_id == null || (fetched_statuses.pagination.min_id != null && fetched_statuses.pagination.min_id.compareTo(min_id) > 0)) {
|
|
||||||
min_id = fetched_statuses.pagination.min_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (direction == DIRECTION.BOTTOM) {
|
|
||||||
flagLoading = true;
|
|
||||||
}
|
|
||||||
if (direction == DIRECTION.SCROLL_TOP) {
|
|
||||||
binding.recyclerView.scrollToPosition(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update view and pagination when scrolling down
|
|
||||||
*
|
|
||||||
* @param fetched_statuses Statuses
|
|
||||||
*/
|
|
||||||
private synchronized void dealWithPagination(Statuses fetched_statuses, DIRECTION direction, boolean fetchingMissing) {
|
|
||||||
dealWithPagination(fetched_statuses, direction, fetchingMissing, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the timeline with received statuses
|
* Update the timeline with received statuses
|
||||||
*
|
*
|
||||||
* @param statusListReceived - List<Status> Statuses received
|
* @param statusListReceived - List<Status> Statuses received
|
||||||
*/
|
*/
|
||||||
private void updateStatusListWith(List<Status> statusListReceived) {
|
private int updateStatusListWith(List<Status> statusListReceived) {
|
||||||
|
int insertedStatus = 0;
|
||||||
if (statusListReceived != null && statusListReceived.size() > 0) {
|
if (statusListReceived != null && statusListReceived.size() > 0) {
|
||||||
for (Status statusReceived : statusListReceived) {
|
for (Status statusReceived : statusListReceived) {
|
||||||
int position = 0;
|
int position = 0;
|
||||||
|
@ -477,6 +482,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
if (!timelineStatuses.contains(statusReceived) && !statusReceived.pinned && timelineType != Timeline.TimeLineEnum.ACCOUNT_TIMELINE) {
|
if (!timelineStatuses.contains(statusReceived) && !statusReceived.pinned && timelineType != Timeline.TimeLineEnum.ACCOUNT_TIMELINE) {
|
||||||
timelineStatuses.add(position, statusReceived);
|
timelineStatuses.add(position, statusReceived);
|
||||||
statusAdapter.notifyItemInserted(position);
|
statusAdapter.notifyItemInserted(position);
|
||||||
|
insertedStatus++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -491,56 +497,16 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return insertedStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void onPause() {
|
* Update view and pagination when scrolling down
|
||||||
storeMarker();
|
*
|
||||||
super.onPause();
|
* @param fetched_statuses Statuses
|
||||||
}
|
*/
|
||||||
|
private synchronized void dealWithPagination(Statuses fetched_statuses, DIRECTION direction, boolean fetchingMissing) {
|
||||||
@Override
|
dealWithPagination(fetched_statuses, direction, fetchingMissing, null);
|
||||||
public void onDestroyView() {
|
|
||||||
//Update last read id for home timeline
|
|
||||||
if (isAdded()) {
|
|
||||||
storeMarker();
|
|
||||||
}
|
|
||||||
LocalBroadcastManager.getInstance(requireActivity()).unregisterReceiver(receive_action);
|
|
||||||
super.onDestroyView();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void storeMarker() {
|
|
||||||
if (timelineType == Timeline.TimeLineEnum.HOME && mLayoutManager != null) {
|
|
||||||
int position = mLayoutManager.findFirstVisibleItemPosition();
|
|
||||||
if (timelineStatuses != null && timelineStatuses.size() > position) {
|
|
||||||
try {
|
|
||||||
Status status = timelineStatuses.get(position);
|
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
|
|
||||||
SharedPreferences.Editor editor = sharedpreferences.edit();
|
|
||||||
editor.putString(getString(R.string.SET_INNER_MARKER) + BaseMainActivity.currentUserID + BaseMainActivity.currentInstance + slug, status.id);
|
|
||||||
editor.apply();
|
|
||||||
timelinesVM.addMarker(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, status.id, null);
|
|
||||||
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void router(DIRECTION direction) {
|
|
||||||
if (networkAvailable == BaseMainActivity.status.UNKNOWN) {
|
|
||||||
new Thread(() -> {
|
|
||||||
if (networkAvailable == BaseMainActivity.status.UNKNOWN) {
|
|
||||||
networkAvailable = Helper.isConnectedToInternet(requireActivity(), BaseMainActivity.currentInstance);
|
|
||||||
}
|
|
||||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
|
||||||
Runnable myRunnable = () -> route(direction, false);
|
|
||||||
mainHandler.post(myRunnable);
|
|
||||||
}).start();
|
|
||||||
} else {
|
|
||||||
route(direction, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -600,7 +566,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
|
||||||
boolean useCache = sharedpreferences.getBoolean(getString(R.string.SET_USE_CACHE), true);
|
boolean useCache = sharedpreferences.getBoolean(getString(R.string.SET_USE_CACHE), true);
|
||||||
if (useCache) {
|
if (useCache && direction != DIRECTION.SCROLL_TOP && direction != DIRECTION.FETCH_NEW) {
|
||||||
getCachedStatus(direction, fetchingMissing, timelineParams);
|
getCachedStatus(direction, fetchingMissing, timelineParams);
|
||||||
} else {
|
} else {
|
||||||
getLiveStatus(direction, fetchingMissing, timelineParams, status);
|
getLiveStatus(direction, fetchingMissing, timelineParams, status);
|
||||||
|
@ -608,6 +574,56 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
storeMarker();
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
//Update last read id for home timeline
|
||||||
|
if (isAdded()) {
|
||||||
|
storeMarker();
|
||||||
|
}
|
||||||
|
LocalBroadcastManager.getInstance(requireActivity()).unregisterReceiver(receive_action);
|
||||||
|
super.onDestroyView();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void storeMarker() {
|
||||||
|
if (timelineType == Timeline.TimeLineEnum.HOME && mLayoutManager != null) {
|
||||||
|
int position = mLayoutManager.findFirstVisibleItemPosition();
|
||||||
|
if (timelineStatuses != null && timelineStatuses.size() > position) {
|
||||||
|
try {
|
||||||
|
Status status = timelineStatuses.get(position);
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
|
||||||
|
SharedPreferences.Editor editor = sharedpreferences.edit();
|
||||||
|
editor.putString(getString(R.string.SET_INNER_MARKER) + BaseMainActivity.currentUserID + BaseMainActivity.currentInstance + slug, status.id);
|
||||||
|
editor.apply();
|
||||||
|
timelinesVM.addMarker(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, status.id, null);
|
||||||
|
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void router(DIRECTION direction) {
|
||||||
|
if (networkAvailable == BaseMainActivity.status.UNKNOWN) {
|
||||||
|
new Thread(() -> {
|
||||||
|
if (networkAvailable == BaseMainActivity.status.UNKNOWN) {
|
||||||
|
networkAvailable = Helper.isConnectedToInternet(requireActivity(), BaseMainActivity.currentInstance);
|
||||||
|
}
|
||||||
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
|
Runnable myRunnable = () -> route(direction, false);
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
|
}).start();
|
||||||
|
} else {
|
||||||
|
route(direction, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void getCachedStatus(DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams) {
|
private void getCachedStatus(DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams) {
|
||||||
if (direction == null) {
|
if (direction == null) {
|
||||||
timelinesVM.getTimelineCache(timelineStatuses, timelineParams)
|
timelinesVM.getTimelineCache(timelineStatuses, timelineParams)
|
||||||
|
@ -637,11 +653,11 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
} else if (direction == DIRECTION.REFRESH || direction == DIRECTION.SCROLL_TOP) {
|
} else if (direction == DIRECTION.REFRESH) {
|
||||||
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
timelinesVM.getTimelineCache(timelineStatuses, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), statusesRefresh -> {
|
.observe(getViewLifecycleOwner(), statusesRefresh -> {
|
||||||
if (statusesRefresh == null || statusesRefresh.statuses == null || statusesRefresh.statuses.size() == 0) {
|
if (statusesRefresh == null || statusesRefresh.statuses == null || statusesRefresh.statuses.size() == 0) {
|
||||||
getCachedStatus(direction, fetchingMissing, timelineParams);
|
getLiveStatus(direction, fetchingMissing, timelineParams, null);
|
||||||
} else {
|
} else {
|
||||||
if (statusAdapter != null) {
|
if (statusAdapter != null) {
|
||||||
dealWithPagination(statusesRefresh, direction, true);
|
dealWithPagination(statusesRefresh, direction, true);
|
||||||
|
@ -653,7 +669,6 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void getLiveStatus(DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams, Status status) {
|
private void getLiveStatus(DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams, Status status) {
|
||||||
if (direction == null) {
|
if (direction == null) {
|
||||||
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
||||||
|
@ -664,7 +679,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
} else if (direction == DIRECTION.TOP) {
|
} else if (direction == DIRECTION.TOP) {
|
||||||
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), statusesTop -> dealWithPagination(statusesTop, DIRECTION.TOP, fetchingMissing, status));
|
.observe(getViewLifecycleOwner(), statusesTop -> dealWithPagination(statusesTop, DIRECTION.TOP, fetchingMissing, status));
|
||||||
} else if (direction == DIRECTION.REFRESH || direction == DIRECTION.SCROLL_TOP) {
|
} else if (direction == DIRECTION.REFRESH || direction == DIRECTION.SCROLL_TOP || direction == DIRECTION.FETCH_NEW) {
|
||||||
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
timelinesVM.getTimeline(timelineStatuses, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), statusesRefresh -> {
|
.observe(getViewLifecycleOwner(), statusesRefresh -> {
|
||||||
if (statusAdapter != null) {
|
if (statusAdapter != null) {
|
||||||
|
@ -677,6 +692,15 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum DIRECTION {
|
||||||
|
TOP,
|
||||||
|
BOTTOM,
|
||||||
|
REFRESH,
|
||||||
|
SCROLL_TOP,
|
||||||
|
FETCH_NEW
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Router for timelines
|
* Router for timelines
|
||||||
*
|
*
|
||||||
|
@ -887,10 +911,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
|
||||||
route(DIRECTION.BOTTOM, true, statusToUpdate);
|
route(DIRECTION.BOTTOM, true, statusToUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum DIRECTION {
|
public interface UpdateCounters {
|
||||||
TOP,
|
void onUpdate(int count, Timeline.TimeLineEnum type, String slug);
|
||||||
BOTTOM,
|
|
||||||
REFRESH,
|
|
||||||
SCROLL_TOP
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -46,10 +46,12 @@ public class FedilabPageAdapter extends FragmentStatePagerAdapter {
|
||||||
private final int toRemove;
|
private final int toRemove;
|
||||||
private final boolean singleBar;
|
private final boolean singleBar;
|
||||||
private Fragment mCurrentFragment;
|
private Fragment mCurrentFragment;
|
||||||
|
private final BaseMainActivity activity;
|
||||||
|
|
||||||
public FedilabPageAdapter(BaseMainActivity activity, FragmentManager fm, Pinned pinned, BottomMenu bottomMenu) {
|
public FedilabPageAdapter(BaseMainActivity activity, FragmentManager fm, Pinned pinned, BottomMenu bottomMenu) {
|
||||||
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
||||||
this.pinned = pinned;
|
this.pinned = pinned;
|
||||||
|
this.activity = activity;
|
||||||
this.bottomMenu = bottomMenu;
|
this.bottomMenu = bottomMenu;
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||||
singleBar = sharedpreferences.getBoolean(activity.getString(R.string.SET_USE_SINGLE_TOPBAR), false);
|
singleBar = sharedpreferences.getBoolean(activity.getString(R.string.SET_USE_SINGLE_TOPBAR), false);
|
||||||
|
@ -86,6 +88,7 @@ public class FedilabPageAdapter extends FragmentStatePagerAdapter {
|
||||||
@Override
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment getItem(int position) {
|
||||||
FragmentMastodonTimeline fragment = new FragmentMastodonTimeline();
|
FragmentMastodonTimeline fragment = new FragmentMastodonTimeline();
|
||||||
|
fragment.update = activity;
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
//Position 3 is for notifications
|
//Position 3 is for notifications
|
||||||
if (position < (BOTTOM_TIMELINE_COUNT - toRemove) && !singleBar) {
|
if (position < (BOTTOM_TIMELINE_COUNT - toRemove) && !singleBar) {
|
||||||
|
|
9
app/src/main/res/drawable/shape_counter.xml
Normal file
9
app/src/main/res/drawable/shape_counter.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<solid android:color="@color/cyanea_accent_dark_reference" />
|
||||||
|
<padding
|
||||||
|
android:left="2dp"
|
||||||
|
android:right="2dp" />
|
||||||
|
<corners android:radius="3dp" />
|
||||||
|
</shape>
|
17
app/src/main/res/layout/notification_badge.xml
Normal file
17
app/src/main/res/layout/notification_badge.xml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:id="@+id/notifications.badge"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="top|center_horizontal"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:background="@drawable/shape_counter"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="3dp"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="11sp"
|
||||||
|
tools:text="9+" />
|
||||||
|
</merge>
|
Loading…
Reference in a new issue