Skip to content

Commit aa3b871

Browse files
Add search to Home screen
1 parent d8011dd commit aa3b871

File tree

4 files changed

+57
-12
lines changed

4 files changed

+57
-12
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeFragment.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import androidx.annotation.NonNull;
99
import androidx.annotation.Nullable;
10+
import androidx.appcompat.widget.SearchView;
1011
import androidx.fragment.app.Fragment;
1112
import androidx.lifecycle.ViewModelProvider;
1213

@@ -39,6 +40,19 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
3940
getString(com.d4rk.androidtutorials.java.R.string.announcement_title),
4041
getString(com.d4rk.androidtutorials.java.R.string.announcement_subtitle)
4142
);
43+
binding.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
44+
@Override
45+
public boolean onQueryTextSubmit(String query) {
46+
homeViewModel.setSearchQuery(query);
47+
return true;
48+
}
49+
50+
@Override
51+
public boolean onQueryTextChange(String newText) {
52+
homeViewModel.setSearchQuery(newText);
53+
return true;
54+
}
55+
});
4256
LayoutInflater inflater = LayoutInflater.from(requireContext());
4357
homeViewModel.getUiState().observe(getViewLifecycleOwner(), state -> {
4458
binding.announcementTitle.setText(state.announcementTitle());

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/home/HomeViewModel.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class HomeViewModel extends ViewModel {
2929
private final GetAppPlayStoreUrlUseCase getAppPlayStoreUrlUseCase;
3030

3131
private final MutableLiveData<HomeUiState> uiState = new MutableLiveData<>();
32+
private final MutableLiveData<String> searchQuery = new MutableLiveData<>("");
33+
private List<PromotedApp> allPromotedApps = new ArrayList<>();
3234

3335
@Inject
3436
public HomeViewModel(GetDailyTipUseCase getDailyTipUseCase,
@@ -59,18 +61,8 @@ public HomeViewModel(GetDailyTipUseCase getDailyTipUseCase,
5961
result.add(apps.get((startIndex + i) % apps.size()));
6062
}
6163
}
62-
HomeUiState current = uiState.getValue();
63-
if (current == null) {
64-
current = new HomeUiState("", "", "", result);
65-
} else {
66-
current = new HomeUiState(
67-
current.announcementTitle(),
68-
current.announcementSubtitle(),
69-
current.dailyTip(),
70-
result
71-
);
72-
}
73-
uiState.postValue(current);
64+
allPromotedApps = result;
65+
filterPromotedApps();
7466
});
7567
}
7668

@@ -84,6 +76,34 @@ public void setAnnouncements(String title, String subtitle) {
8476
uiState.setValue(current);
8577
}
8678

79+
public void setSearchQuery(String query) {
80+
searchQuery.setValue(query);
81+
filterPromotedApps();
82+
}
83+
84+
private void filterPromotedApps() {
85+
String query = searchQuery.getValue();
86+
List<PromotedApp> filtered = new ArrayList<>();
87+
for (PromotedApp app : allPromotedApps) {
88+
if (query == null || query.isEmpty() ||
89+
app.name().toLowerCase().contains(query.toLowerCase())) {
90+
filtered.add(app);
91+
}
92+
}
93+
HomeUiState current = uiState.getValue();
94+
if (current == null) {
95+
current = new HomeUiState("", "", getDailyTipUseCase.invoke(), filtered);
96+
} else {
97+
current = new HomeUiState(
98+
current.announcementTitle(),
99+
current.announcementSubtitle(),
100+
current.dailyTip(),
101+
filtered
102+
);
103+
}
104+
uiState.postValue(current);
105+
}
106+
87107
/**
88108
* Exposes the UI state for the Home screen.
89109
*/

app/src/main/res/layout/fragment_home.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,15 @@
168168
android:text="@string/other_apps_title"
169169
android:textAppearance="@style/TextAppearance.Material3.TitleMedium" />
170170

171+
<androidx.appcompat.widget.SearchView
172+
android:id="@+id/search_view"
173+
android:layout_width="match_parent"
174+
android:layout_height="wrap_content"
175+
android:layout_marginBottom="8dp"
176+
android:queryHint="@string/search_tutorials_hint"
177+
android:contentDescription="@string/search_tutorials_content_description"
178+
android:iconifiedByDefault="false" />
179+
171180
<HorizontalScrollView
172181
android:layout_width="match_parent"
173182
android:layout_height="wrap_content"

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
<string name="get_on_google_play">Get it on Google Play</string>
2020
<string name="learn_more">Learn More</string>
2121
<string name="play_store">Play Store</string>
22+
<string name="search_tutorials_hint">Search tutorials</string>
23+
<string name="search_tutorials_content_description">Search tutorials</string>
2224

2325
<string name="android_studio">Android Studio</string>
2426

0 commit comments

Comments
 (0)