Skip to content

Commit 0cbd413

Browse files
You can select now between navigation bar styles (bubble/material),
Sticky header on the home screen and in settings, Fixed broken scroll in the FiltersSheet, Some refactor, Removed unused old code
1 parent ff7bb3d commit 0cbd413

30 files changed

+517
-850
lines changed

app/src/main/assets/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@
4848
"key": "media_columns_count_port", "type": "integer", "from": 0, "to": 10, "integer_value": 0,
4949
"title": "media_columns_count_port", "description": "0 for auto",
5050
"show_if": "!tv"
51+
}, {
52+
"key": "navigation_style", "type": "select", "string_value": "BUBBLE", "restart": true, "show_if": "!tv",
53+
"title": "Navigation style", "items": [
54+
{ "key": "BUBBLE", "title": "Bubble" },
55+
{ "key": "MATERIAL", "title": "Material" }
56+
]
5157
}, {
5258
"type": "screen", "show_if": "never", "title": "Episodes list",
5359
"items": [

app/src/main/java/com/mrboomdev/awery/app/AweryApp.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static com.mrboomdev.awery.data.Constants.CATALOG_LIST_BLACKLIST;
99
import static com.mrboomdev.awery.data.Constants.CATALOG_LIST_HISTORY;
1010
import static com.mrboomdev.awery.data.settings.NicePreferences.getPrefs;
11+
import static com.mrboomdev.awery.util.NiceUtils.returnWith;
1112
import static com.mrboomdev.awery.util.ui.ViewUtil.MATCH_PARENT;
1213
import static com.mrboomdev.awery.util.ui.ViewUtil.dpPx;
1314
import static com.mrboomdev.awery.util.ui.ViewUtil.useLayoutParams;
@@ -392,6 +393,11 @@ public static int getOrientation() {
392393
return Resources.getSystem().getConfiguration().orientation;
393394
}
394395

396+
public static AwerySettings.NavigationStyle_Values getNavigationStyle() {
397+
return returnWith(AwerySettings.NAVIGATION_STYLE.getValue(), style ->
398+
(style == null || isTv()) ? AwerySettings.NavigationStyle_Values.MATERIAL : style);
399+
}
400+
395401
public static Configuration getConfiguration(@NonNull Context context) {
396402
return context.getResources().getConfiguration();
397403
}
@@ -400,27 +406,33 @@ public static Configuration getConfiguration() {
400406
return getConfiguration(getAnyContext());
401407
}
402408

403-
public static void snackbar(@NonNull Activity activity, Object title) {
404-
snackbar(activity, title, null, null);
409+
public static void snackbar(
410+
@NonNull Activity activity,
411+
@StringRes int title,
412+
@StringRes int button,
413+
Runnable buttonCallback
414+
) {
415+
snackbar(activity, title, button, buttonCallback, Snackbar.LENGTH_SHORT);
405416
}
406417

407418
public static void snackbar(
408419
@NonNull Activity activity,
409420
@StringRes int title,
410421
@StringRes int button,
411-
Runnable buttonCallback
422+
Runnable buttonCallback,
423+
int duration
412424
) {
413425
var context = getAnyContext();
414-
snackbar(activity, context.getString(title), context.getString(button), buttonCallback);
426+
snackbar(activity, context.getString(title), context.getString(button), buttonCallback, duration);
415427
}
416428

417-
public static void snackbar(@NonNull Activity activity, Object title, Object button, Runnable buttonCallback) {
429+
public static void snackbar(@NonNull Activity activity, Object title, Object button, Runnable buttonCallback, int duration) {
418430
runOnUiThread(() -> {
419431
var titleText = title == null ? "null" : title.toString();
420432
var buttonText = button == null ? "null" : button.toString();
421433

422434
var rootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
423-
var snackbar = Snackbar.make(rootView, titleText, Snackbar.LENGTH_SHORT);
435+
var snackbar = Snackbar.make(rootView, titleText, duration);
424436

425437
if(buttonCallback != null) {
426438
snackbar.setAction(buttonText, view -> buttonCallback.run());

app/src/main/java/com/mrboomdev/awery/ui/activity/MainActivity.java

Lines changed: 107 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,24 @@
33
import static com.mrboomdev.awery.app.AweryApp.addOnBackPressedListener;
44
import static com.mrboomdev.awery.app.AweryApp.enableEdgeToEdge;
55
import static com.mrboomdev.awery.app.AweryApp.getDatabase;
6+
import static com.mrboomdev.awery.app.AweryApp.getNavigationStyle;
67
import static com.mrboomdev.awery.app.AweryApp.getResourceId;
78
import static com.mrboomdev.awery.app.AweryApp.removeOnBackPressedListener;
8-
import static com.mrboomdev.awery.app.AweryApp.snackbar;
99
import static com.mrboomdev.awery.app.AweryApp.toast;
1010
import static com.mrboomdev.awery.app.AweryLifecycle.runDelayed;
1111
import static com.mrboomdev.awery.util.NiceUtils.find;
1212
import static com.mrboomdev.awery.util.NiceUtils.stream;
1313
import static com.mrboomdev.awery.util.io.FileUtil.readAssets;
14+
import static com.mrboomdev.awery.util.ui.ViewUtil.setBottomPadding;
15+
import static com.mrboomdev.awery.util.ui.ViewUtil.setLeftPadding;
16+
import static com.mrboomdev.awery.util.ui.ViewUtil.setOnApplyUiInsetsListener;
17+
import static com.mrboomdev.awery.util.ui.ViewUtil.setTopPadding;
1418

1519
import android.content.Intent;
1620
import android.graphics.drawable.Drawable;
1721
import android.os.Bundle;
1822
import android.util.Log;
23+
import android.view.View;
1924

2025
import androidx.annotation.NonNull;
2126
import androidx.annotation.Nullable;
@@ -26,6 +31,8 @@
2631
import androidx.lifecycle.Lifecycle;
2732
import androidx.viewpager2.adapter.FragmentStateAdapter;
2833

34+
import com.google.android.material.navigation.NavigationBarView;
35+
import com.google.android.material.navigationrail.NavigationRailView;
2936
import com.mrboomdev.awery.R;
3037
import com.mrboomdev.awery.app.CrashHandler;
3138
import com.mrboomdev.awery.data.db.item.DBTab;
@@ -67,7 +74,7 @@ public void run() {
6774
}
6875

6976
doubleBackToExitPressedOnce = true;
70-
snackbar(MainActivity.this, getString(R.string.back_to_exit));
77+
toast(R.string.back_to_exit);
7178
runDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
7279
}
7380
};
@@ -122,42 +129,76 @@ private void setupTabs(@NonNull List<DBTab> tabs) {
122129
CrashHandler.showErrorDialog(this, "Failed to read an icons list!", e);
123130
}
124131

125-
AnimatedBottomBar.Tab selectedNavbarItem = null;
132+
int selected = 0;
126133

127-
for(int i = 0; i < tabs.size(); i++) {
128-
Drawable drawable = null;
129-
var tab = tabs.get(i);
134+
switch(getNavigationStyle()) {
135+
case BUBBLE -> {
136+
for(int i = 0; i < tabs.size(); i++) {
137+
Drawable drawable = null;
138+
var tab = tabs.get(i);
130139

131-
if(icons != null) {
132-
var icon = icons.get(tab.icon);
140+
if(icons != null) {
141+
var icon = icons.get(tab.icon);
133142

134-
if(icon != null) {
135-
var id = getResourceId(R.drawable.class, icon.getInActive());
136-
drawable = ContextCompat.getDrawable(this, id);
143+
if(icon != null) {
144+
var id = getResourceId(R.drawable.class, icon.getInActive());
145+
drawable = ContextCompat.getDrawable(this, id);
146+
}
147+
}
148+
149+
if(drawable == null) {
150+
drawable = ContextCompat.getDrawable(
151+
this, R.drawable.ic_view_cozy);
152+
}
153+
154+
var navbarItem = new AnimatedBottomBar.Tab(
155+
Objects.requireNonNull(drawable), tab.title,
156+
i, null, true);
157+
158+
if(tab.id.equals(savedDefaultTab)) {
159+
selected = i;
160+
}
161+
162+
binding.navbarBubble.addTab(navbarItem);
137163
}
138-
}
139164

140-
if(drawable == null) {
141-
drawable = ContextCompat.getDrawable(
142-
this, R.drawable.ic_view_cozy);
165+
binding.navbarBubble.selectTabAt(selected, false);
166+
binding.navbarBubble.setVisibility(View.VISIBLE);
143167
}
144168

145-
var navbarItem = new AnimatedBottomBar.Tab(
146-
Objects.requireNonNull(drawable), tab.title,
147-
i, null, true);
169+
case MATERIAL -> {
170+
var nav = (NavigationBarView) binding.navbarMaterial;
148171

149-
if(tab.id.equals(savedDefaultTab)) {
150-
selectedNavbarItem = navbarItem;
151-
}
172+
for(int i = 0; i < tabs.size(); i++) {
173+
Drawable drawable = null;
174+
var tab = tabs.get(i);
152175

153-
binding.navbar.addTab(navbarItem);
154-
}
176+
if(icons != null) {
177+
var icon = icons.get(tab.icon);
155178

156-
if(selectedNavbarItem == null && binding.navbar.getTabCount() > 0) {
157-
selectedNavbarItem = binding.navbar.getTabs().get(0);
158-
}
179+
if(icon != null) {
180+
var id = getResourceId(R.drawable.class, icon.getInActive());
181+
drawable = ContextCompat.getDrawable(this, id);
182+
}
183+
}
184+
185+
if(drawable == null) {
186+
drawable = ContextCompat.getDrawable(
187+
this, R.drawable.ic_view_cozy);
188+
}
159189

160-
binding.navbar.selectTab(Objects.requireNonNull(selectedNavbarItem), false);
190+
if(tab.id.equals(savedDefaultTab)) {
191+
selected = i;
192+
}
193+
194+
nav.getMenu().add(0, i, 0, tab.title);
195+
nav.getMenu().getItem(i).setIcon(drawable);
196+
}
197+
198+
nav.setSelectedItemId(selected);
199+
nav.setVisibility(View.VISIBLE);
200+
}
201+
}
161202
}
162203

163204
/**
@@ -186,7 +227,38 @@ private void setupNavigation() {
186227
binding.pages.setUserInputEnabled(false);
187228
binding.pages.setPageTransformer(new FadeTransformer());
188229

189-
binding.navbar.setOnTabSelectListener(new AnimatedBottomBar.OnTabSelectListener() {
230+
setOnApplyUiInsetsListener(binding.navbarMaterial, insets -> {
231+
setTopPadding(binding.navbarMaterial, (binding.navbarMaterial instanceof NavigationRailView) ? insets.top : 0);
232+
233+
setLeftPadding(binding.navbarMaterial, insets.left);
234+
setBottomPadding(binding.navbarMaterial, insets.bottom);
235+
return true;
236+
});
237+
238+
setOnApplyUiInsetsListener(binding.bottomSideBarrier, insets -> {
239+
ViewUtil.setBottomMargin(binding.bottomSideBarrier, insets.bottom);
240+
return true;
241+
});
242+
243+
((NavigationBarView) binding.navbarMaterial).setOnItemSelectedListener(item -> {
244+
binding.pages.setCurrentItem(item.getItemId(), false);
245+
return true;
246+
});
247+
248+
((NavigationBarView) binding.navbarMaterial).setOnItemReselectedListener(item -> {
249+
var adapter = (FeedsAdapter) binding.pages.getAdapter();
250+
if(adapter == null) return;
251+
252+
var ref = adapter.fragments.get(item.getItemId());
253+
if(ref == null) return;
254+
255+
var fragment = ref.get();
256+
if(fragment == null) return;
257+
258+
fragment.scrollToTop();
259+
});
260+
261+
binding.navbarBubble.setOnTabSelectListener(new AnimatedBottomBar.OnTabSelectListener() {
190262

191263
@Override
192264
public void onTabSelected(
@@ -212,11 +284,6 @@ public void onTabReselected(int i, @NonNull AnimatedBottomBar.Tab tab) {
212284
fragment.scrollToTop();
213285
}
214286
});
215-
216-
ViewUtil.setOnApplyUiInsetsListener(binding.bottomSideBarrier, insets -> {
217-
ViewUtil.setBottomMargin(binding.bottomSideBarrier, insets.bottom);
218-
return true;
219-
});
220287
}
221288

222289
@Override
@@ -234,7 +301,10 @@ protected void onPause() {
234301
@Override
235302
protected void onSaveInstanceState(@NonNull Bundle outState) {
236303
if(binding != null) {
237-
outState.putInt("nav_index", binding.navbar.getSelectedIndex());
304+
outState.putInt("nav_index", switch(getNavigationStyle()) {
305+
case BUBBLE -> binding.navbarBubble.getSelectedIndex();
306+
case MATERIAL -> ((NavigationBarView) binding.navbarMaterial).getSelectedItemId();
307+
});
238308
}
239309

240310
super.onSaveInstanceState(outState);
@@ -243,7 +313,9 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
243313
@Override
244314
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
245315
if(binding != null) {
246-
binding.navbar.selectTabAt(savedInstanceState.getInt("nav_index"), false);
316+
/*var index = savedInstanceState.getInt("nav_index");
317+
binding.navbarBubble.selectTabAt(index, false);
318+
((NavigationBarView) binding.navbarMaterial).setSelectedItemId(index);*/
247319
}
248320

249321
super.onRestoreInstanceState(savedInstanceState);

app/src/main/java/com/mrboomdev/awery/ui/activity/SplashActivity.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@
88
import android.os.Bundle;
99
import android.util.Log;
1010
import android.view.Gravity;
11-
import android.widget.FrameLayout;
1211
import android.widget.LinearLayout;
13-
import android.widget.ProgressBar;
1412

1513
import androidx.annotation.Nullable;
1614
import androidx.appcompat.app.AppCompatActivity;
1715
import androidx.core.splashscreen.SplashScreen;
1816

19-
import com.google.android.material.color.DynamicColors;
17+
import com.google.android.material.progressindicator.CircularProgressIndicator;
2018
import com.mrboomdev.awery.app.CrashHandler;
2119
import com.mrboomdev.awery.generated.AwerySettings;
2220
import com.mrboomdev.awery.ui.ThemeManager;
@@ -40,7 +38,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4038
frame.setGravity(Gravity.CENTER);
4139
setContentView(frame);
4240

43-
var loading = new ProgressBar(this);
41+
var loading = new CircularProgressIndicator(this);
42+
loading.setIndeterminate(true);
4443
frame.addView(loading);
4544

4645
reportIfCrashHappened(this, () -> new Thread(() -> {

0 commit comments

Comments
 (0)