Loading app/src/main/java/app/fedilab/android/BaseMainActivity.java +24 −1 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.os.Looper; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; import android.util.Log; import android.util.Patterns; import android.view.ContextThemeWrapper; import android.view.Gravity; Loading Loading @@ -75,6 +76,7 @@ import com.bumptech.glide.load.resource.gif.GifDrawable; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayout; import com.jaredrummler.cyanea.Cyanea; import java.io.File; Loading Loading @@ -1135,7 +1137,28 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt break; } } int selectedTab = binding.tabLayout.getSelectedTabPosition(); TabLayout.Tab tab = binding.tabLayout.getTabAt(selectedTab); Log.v(Helper.TAG, "selectedTab: " + selectedTab); Log.v(Helper.TAG, "tab: " + tab); View view = null; if (tab != null) { view = tab.getCustomView(); } if (view != null) { Log.v(Helper.TAG, "view: " + view); TextView counter = view.findViewById(R.id.tab_counter); Log.v(Helper.TAG, "counter: " + counter); if (counter != null) { if (count > 0) { counter.setVisibility(View.VISIBLE); counter.setText(String.valueOf(count)); } else { counter.setVisibility(View.GONE); counter.setText("0"); } } } } Loading app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java +6 −5 Original line number Diff line number Diff line Loading @@ -175,20 +175,21 @@ public class StatusCache { * Insert or update a status * * @param statusCache {@link StatusCache} * @return long - db id * @return int - 0 if updated 1 if inserted * @throws DBException exception with database */ public long insertOrUpdate(StatusCache statusCache, String slug) throws DBException { public int insertOrUpdate(StatusCache statusCache, String slug) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } statusCache.slug = slug; boolean exists = statusExist(statusCache); long idReturned; int idReturned = 0; if (exists) { idReturned = updateStatus(statusCache); updateStatus(statusCache); } else { idReturned = insertStatus(statusCache, slug); insertStatus(statusCache, slug); idReturned = 1; } return idReturned; } Loading app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +7 −3 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. 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)) { if (insertedStatus >= 0 && update != null && (direction == DIRECTION.FETCH_NEW || direction == DIRECTION.SCROLL_TOP)) { update.onUpdate(insertedStatus, timelineType, slug); } if (direction == DIRECTION.TOP && fetchingMissing) { Loading Loading @@ -424,7 +424,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); binding.recyclerView.setLayoutManager(mLayoutManager); binding.recyclerView.setAdapter(statusAdapter); //Fetching new messages route(DIRECTION.FETCH_NEW, true); if (searchCache == null && timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) { binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { Loading Loading @@ -460,6 +461,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. } }); } } /** Loading @@ -484,8 +486,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. if (!timelineStatuses.contains(statusReceived) && !statusReceived.pinned && timelineType != Timeline.TimeLineEnum.ACCOUNT_TIMELINE) { timelineStatuses.add(position, statusReceived); statusAdapter.notifyItemInserted(position); if (!statusReceived.cached) { insertedStatus++; } } break; } position++; Loading app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java +4 −1 Original line number Diff line number Diff line Loading @@ -428,7 +428,10 @@ public class TimelinesVM extends AndroidViewModel { statusCache.type = timelineParams.type; statusCache.status_id = status.id; try { statusCacheDAO.insertOrUpdate(statusCache, timelineParams.slug); int inserted = statusCacheDAO.insertOrUpdate(statusCache, timelineParams.slug); if (inserted == 0) { status.cached = true; } } catch (DBException e) { e.printStackTrace(); } Loading app/src/main/res/layout/tab_custom_default_view.xml +18 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" android:layout_height="wrap_content"> <androidx.appcompat.widget.AppCompatImageView Loading @@ -8,4 +9,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <TextView android:id="@+id/tab_counter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/icon" android:layout_alignEnd="@+id/icon" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:background="@drawable/shape_counter" android:paddingLeft="2dp" android:paddingRight="2dp" android:textColor="?mTextColor" android:textSize="12sp" android:visibility="gone" tools:text="35" tools:visibility="visible" /> </RelativeLayout> Loading
app/src/main/java/app/fedilab/android/BaseMainActivity.java +24 −1 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.os.Looper; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; import android.util.Log; import android.util.Patterns; import android.view.ContextThemeWrapper; import android.view.Gravity; Loading Loading @@ -75,6 +76,7 @@ import com.bumptech.glide.load.resource.gif.GifDrawable; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayout; import com.jaredrummler.cyanea.Cyanea; import java.io.File; Loading Loading @@ -1135,7 +1137,28 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt break; } } int selectedTab = binding.tabLayout.getSelectedTabPosition(); TabLayout.Tab tab = binding.tabLayout.getTabAt(selectedTab); Log.v(Helper.TAG, "selectedTab: " + selectedTab); Log.v(Helper.TAG, "tab: " + tab); View view = null; if (tab != null) { view = tab.getCustomView(); } if (view != null) { Log.v(Helper.TAG, "view: " + view); TextView counter = view.findViewById(R.id.tab_counter); Log.v(Helper.TAG, "counter: " + counter); if (counter != null) { if (count > 0) { counter.setVisibility(View.VISIBLE); counter.setText(String.valueOf(count)); } else { counter.setVisibility(View.GONE); counter.setText("0"); } } } } Loading
app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java +6 −5 Original line number Diff line number Diff line Loading @@ -175,20 +175,21 @@ public class StatusCache { * Insert or update a status * * @param statusCache {@link StatusCache} * @return long - db id * @return int - 0 if updated 1 if inserted * @throws DBException exception with database */ public long insertOrUpdate(StatusCache statusCache, String slug) throws DBException { public int insertOrUpdate(StatusCache statusCache, String slug) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } statusCache.slug = slug; boolean exists = statusExist(statusCache); long idReturned; int idReturned = 0; if (exists) { idReturned = updateStatus(statusCache); updateStatus(statusCache); } else { idReturned = insertStatus(statusCache, slug); insertStatus(statusCache, slug); idReturned = 1; } return idReturned; } Loading
app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +7 −3 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. 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)) { if (insertedStatus >= 0 && update != null && (direction == DIRECTION.FETCH_NEW || direction == DIRECTION.SCROLL_TOP)) { update.onUpdate(insertedStatus, timelineType, slug); } if (direction == DIRECTION.TOP && fetchingMissing) { Loading Loading @@ -424,7 +424,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); binding.recyclerView.setLayoutManager(mLayoutManager); binding.recyclerView.setAdapter(statusAdapter); //Fetching new messages route(DIRECTION.FETCH_NEW, true); if (searchCache == null && timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) { binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { Loading Loading @@ -460,6 +461,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. } }); } } /** Loading @@ -484,8 +486,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. if (!timelineStatuses.contains(statusReceived) && !statusReceived.pinned && timelineType != Timeline.TimeLineEnum.ACCOUNT_TIMELINE) { timelineStatuses.add(position, statusReceived); statusAdapter.notifyItemInserted(position); if (!statusReceived.cached) { insertedStatus++; } } break; } position++; Loading
app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java +4 −1 Original line number Diff line number Diff line Loading @@ -428,7 +428,10 @@ public class TimelinesVM extends AndroidViewModel { statusCache.type = timelineParams.type; statusCache.status_id = status.id; try { statusCacheDAO.insertOrUpdate(statusCache, timelineParams.slug); int inserted = statusCacheDAO.insertOrUpdate(statusCache, timelineParams.slug); if (inserted == 0) { status.cached = true; } } catch (DBException e) { e.printStackTrace(); } Loading
app/src/main/res/layout/tab_custom_default_view.xml +18 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" android:layout_height="wrap_content"> <androidx.appcompat.widget.AppCompatImageView Loading @@ -8,4 +9,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <TextView android:id="@+id/tab_counter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/icon" android:layout_alignEnd="@+id/icon" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:background="@drawable/shape_counter" android:paddingLeft="2dp" android:paddingRight="2dp" android:textColor="?mTextColor" android:textSize="12sp" android:visibility="gone" tools:text="35" tools:visibility="visible" /> </RelativeLayout>