Skip to content

Commit 57e4a7c

Browse files
Merge pull request #156 from MihaiCristianCondrea/codex/replace-linearlayout-with-linearlayoutcompat
Use Material components in layout XMLs
2 parents 588a06d + e50a570 commit 57e4a7c

File tree

52 files changed

+861
-761
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+861
-761
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
import android.view.MenuItem;
1414
import android.view.View;
1515
import android.view.ViewGroup;
16-
import android.widget.ImageView;
17-
import android.widget.TextView;
1816

1917
import androidx.annotation.NonNull;
2018
import androidx.annotation.Nullable;
19+
import androidx.appcompat.widget.AppCompatImageView;
2120
import androidx.appcompat.widget.SearchView;
2221
import androidx.core.view.MenuHost;
2322
import androidx.core.view.MenuProvider;
@@ -30,10 +29,14 @@
3029
import com.d4rk.androidtutorials.java.R;
3130
import com.d4rk.androidtutorials.java.ads.views.NativeAdBannerView;
3231
import com.d4rk.androidtutorials.java.utils.ConsentUtils;
32+
import com.d4rk.androidtutorials.java.databinding.FragmentAndroidStudioBinding;
33+
import com.d4rk.androidtutorials.java.databinding.ItemAndroidStudioCategoryBinding;
34+
import com.d4rk.androidtutorials.java.databinding.ItemAndroidStudioLessonBinding;
3335
import com.google.android.gms.ads.AdListener;
3436
import com.google.android.gms.ads.LoadAdError;
3537
import com.google.android.gms.ads.MobileAds;
3638
import com.google.android.material.card.MaterialCardView;
39+
import com.google.android.material.textview.MaterialTextView;
3740
import com.google.android.material.shape.CornerFamily;
3841
import com.google.android.material.shape.ShapeAppearanceModel;
3942

@@ -55,12 +58,14 @@ public class AndroidStudioFragment extends Fragment {
5558
private final List<Object> allItems = new ArrayList<>();
5659
private LessonsAdapter adapter;
5760
private boolean showAds;
61+
private FragmentAndroidStudioBinding binding;
5862

5963
@Nullable
6064
@Override
6165
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
6266
@Nullable Bundle savedInstanceState) {
63-
return inflater.inflate(R.layout.fragment_android_studio, container, false);
67+
binding = FragmentAndroidStudioBinding.inflate(inflater, container, false);
68+
return binding.getRoot();
6469
}
6570

6671
@Override
@@ -70,7 +75,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
7075
if (showAds) {
7176
ensureMobileAdsInitialized();
7277
}
73-
RecyclerView list = view.findViewById(R.id.lessons_list);
78+
RecyclerView list = binding.lessonsList;
7479
list.setLayoutManager(new LinearLayoutManager(requireContext()));
7580
adapter = new LessonsAdapter();
7681
list.setAdapter(adapter);
@@ -125,6 +130,12 @@ public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
125130
}, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
126131
}
127132

133+
@Override
134+
public void onDestroyView() {
135+
super.onDestroyView();
136+
binding = null;
137+
}
138+
128139
private void ensureMobileAdsInitialized() {
129140
if (!mobileAdsInitialized) {
130141
MobileAds.initialize(requireContext());
@@ -351,13 +362,13 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
351362
adView.setNativeAdLayout(R.layout.ad_android_studio_list);
352363
return new AdHolder(adView);
353364
} else if (viewType == TYPE_CATEGORY) {
354-
View view = LayoutInflater.from(parent.getContext())
355-
.inflate(R.layout.item_android_studio_category, parent, false);
356-
return new CategoryHolder(view);
365+
ItemAndroidStudioCategoryBinding binding = ItemAndroidStudioCategoryBinding.inflate(
366+
LayoutInflater.from(parent.getContext()), parent, false);
367+
return new CategoryHolder(binding);
357368
} else {
358-
View view = LayoutInflater.from(parent.getContext())
359-
.inflate(R.layout.item_android_studio_lesson, parent, false);
360-
return new LessonHolder(view);
369+
ItemAndroidStudioLessonBinding binding = ItemAndroidStudioLessonBinding.inflate(
370+
LayoutInflater.from(parent.getContext()), parent, false);
371+
return new LessonHolder(binding);
361372
}
362373
}
363374

@@ -401,16 +412,16 @@ static class AdHolder extends RecyclerView.ViewHolder {
401412

402413
static class LessonHolder extends RecyclerView.ViewHolder {
403414
final MaterialCardView card;
404-
final ImageView icon;
405-
final TextView title;
406-
final TextView summary;
407-
408-
LessonHolder(@NonNull View itemView) {
409-
super(itemView);
410-
card = (MaterialCardView) itemView;
411-
icon = itemView.findViewById(R.id.lesson_icon);
412-
title = itemView.findViewById(R.id.lesson_title);
413-
summary = itemView.findViewById(R.id.lesson_summary);
415+
final AppCompatImageView icon;
416+
final MaterialTextView title;
417+
final MaterialTextView summary;
418+
419+
LessonHolder(@NonNull ItemAndroidStudioLessonBinding binding) {
420+
super(binding.getRoot());
421+
card = binding.lessonCard;
422+
icon = binding.lessonIcon;
423+
title = binding.lessonTitle;
424+
summary = binding.lessonSummary;
414425
}
415426

416427
void bind(Lesson lesson, boolean first, boolean last) {
@@ -450,21 +461,18 @@ private void applyCorners(boolean first, boolean last) {
450461
}
451462

452463
static class CategoryHolder extends RecyclerView.ViewHolder {
453-
final ImageView icon;
454-
final TextView title;
464+
final MaterialTextView title;
455465

456-
CategoryHolder(@NonNull View itemView) {
457-
super(itemView);
458-
icon = itemView.findViewById(R.id.category_icon);
459-
title = itemView.findViewById(R.id.category_title);
466+
CategoryHolder(@NonNull ItemAndroidStudioCategoryBinding binding) {
467+
super(binding.getRoot());
468+
title = binding.categoryTitle;
460469
}
461470

462471
void bind(Category category) {
463472
if (category.iconRes != 0) {
464-
icon.setImageResource(category.iconRes);
465-
icon.setVisibility(View.VISIBLE);
473+
title.setCompoundDrawablesRelativeWithIntrinsicBounds(category.iconRes, 0, 0, 0);
466474
} else {
467-
icon.setVisibility(View.GONE);
475+
title.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
468476
}
469477
title.setText(category.title);
470478
}
Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,108 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.basics.shortcuts.tabs;
22

33
import android.os.Bundle;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.TextView;
48

9+
import androidx.annotation.NonNull;
10+
import androidx.recyclerview.widget.LinearLayoutManager;
11+
import androidx.recyclerview.widget.RecyclerView;
12+
13+
import com.d4rk.androidtutorials.java.R;
514
import com.d4rk.androidtutorials.java.databinding.ActivityShortcutsNavigationAndSearchingBinding;
615
import com.d4rk.androidtutorials.java.ui.components.navigation.UpNavigationActivity;
716
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
817
import com.google.android.gms.ads.AdRequest;
918
import com.google.android.gms.ads.MobileAds;
1019

20+
import java.util.List;
21+
1122
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
1223

1324
public class NavigationAndSearchingShortcutsActivity extends UpNavigationActivity {
1425
@Override
1526
protected void onCreate(Bundle savedInstanceState) {
1627
super.onCreate(savedInstanceState);
17-
com.d4rk.androidtutorials.java.databinding.ActivityShortcutsNavigationAndSearchingBinding binding = ActivityShortcutsNavigationAndSearchingBinding.inflate(getLayoutInflater());
28+
ActivityShortcutsNavigationAndSearchingBinding binding = ActivityShortcutsNavigationAndSearchingBinding.inflate(getLayoutInflater());
1829
setContentView(binding.getRoot());
1930
MobileAds.initialize(this);
2031

2132
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
22-
edgeToEdgeDelegate.applyEdgeToEdge(binding.scrollView);
33+
edgeToEdgeDelegate.applyEdgeToEdge(binding.shortcutList);
2334

2435
binding.adView.loadAd(new AdRequest.Builder().build());
25-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
36+
new FastScrollerBuilder(binding.shortcutList).useMd2Style().build();
37+
38+
List<Shortcut> shortcuts = List.of(
39+
new Shortcut(getString(R.string.press_shift_twice), getString(R.string.search_everything)),
40+
new Shortcut("Ctrl + F", getString(R.string.find)),
41+
new Shortcut("F3", getString(R.string.find_next)),
42+
new Shortcut("Shift + F3", getString(R.string.find_previous)),
43+
new Shortcut("Ctrl + R", getString(R.string.replace)),
44+
new Shortcut("Ctrl + Shift + A", getString(R.string.find_action)),
45+
new Shortcut("Ctrl + Alt + Shift + N", getString(R.string.search_by_symbol_name)),
46+
new Shortcut("Ctrl + N", getString(R.string.find_class)),
47+
new Shortcut("Ctrl + Shift + N", getString(R.string.find_file)),
48+
new Shortcut("Ctrl + Shift + F", getString(R.string.find_path)),
49+
new Shortcut("Ctrl + F12", getString(R.string.open_file_structure)),
50+
new Shortcut("Alt + Right/Left Arrow", getString(R.string.navigate_between_open_tabs)),
51+
new Shortcut("F4/Ctrl +Enter", getString(R.string.jump_to_source)),
52+
new Shortcut("Shift + F4", getString(R.string.open_current_editor_tab_in_new_window)),
53+
new Shortcut("Ctrl + E", getString(R.string.recently_opened_files)),
54+
new Shortcut("Ctrl + Shift + E", getString(R.string.recently_edited_files)),
55+
new Shortcut("Ctrl + Shift + Backspace", getString(R.string.go_to_last_edit_location)),
56+
new Shortcut("Ctrl + F4", getString(R.string.close_active_editor_tabs)),
57+
new Shortcut("Esc", getString(R.string.return_to_editor_window)),
58+
new Shortcut("Shift + Esc", getString(R.string.hide_active_window)),
59+
new Shortcut("Ctrl + G", getString(R.string.go_to_line)),
60+
new Shortcut("Ctrl + H", getString(R.string.open_type_hierarchy)),
61+
new Shortcut("Ctrl + Shift + H", getString(R.string.open_v_hierarchy)),
62+
new Shortcut("Ctrl + Alt + H", getString(R.string.open_call_hierarchy))
63+
);
64+
65+
binding.shortcutList.setLayoutManager(new LinearLayoutManager(this));
66+
binding.shortcutList.setAdapter(new ShortcutsAdapter(shortcuts));
2667
}
68+
69+
private static class ShortcutsAdapter extends RecyclerView.Adapter<ShortcutsAdapter.ShortcutHolder> {
70+
private final List<Shortcut> items;
71+
72+
ShortcutsAdapter(List<Shortcut> items) {
73+
this.items = items;
74+
}
75+
76+
@NonNull
77+
@Override
78+
public ShortcutHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
79+
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shortcut, parent, false);
80+
return new ShortcutHolder(view);
81+
}
82+
83+
@Override
84+
public void onBindViewHolder(@NonNull ShortcutHolder holder, int position) {
85+
Shortcut item = items.get(position);
86+
holder.key.setText(item.key);
87+
holder.description.setText(item.description);
88+
}
89+
90+
@Override
91+
public int getItemCount() {
92+
return items.size();
93+
}
94+
95+
static class ShortcutHolder extends RecyclerView.ViewHolder {
96+
final TextView key;
97+
final TextView description;
98+
99+
ShortcutHolder(@NonNull View itemView) {
100+
super(itemView);
101+
key = itemView.findViewById(R.id.shortcut_key);
102+
description = itemView.findViewById(R.id.shortcut_description);
103+
}
104+
}
105+
}
106+
107+
private record Shortcut(String key, String description) { }
27108
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/data/room/Note.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
public class Note {
1111
@PrimaryKey(autoGenerate = true)
1212
public int id;
13-
public String text; // FIXME: Declaration can have final modifier
13+
public final String text;
1414

1515
public Note(String text) {
1616
this.text = text;

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/BottomLabelsFragment.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public class BottomLabelsFragment extends Fragment {
2020
private FragmentOnboardingBottomLabelsBinding binding;
2121
private OnboardingViewModel viewModel;
2222
private MaterialRadioButton[] radioButtons;
23-
private View[] optionCards; // FIXME: Field can be converted to a local variable
2423

2524
@Nullable
2625
@Override
@@ -40,7 +39,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4039
binding.optionUnlabeled.radioButton
4140
};
4241

43-
optionCards = new View[]{
42+
View[] optionCards = new View[]{
4443
binding.cardLabeled,
4544
binding.cardSelected,
4645
binding.cardUnlabeled

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/FontFragment.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public class FontFragment extends Fragment {
2121
private FragmentOnboardingFontBinding binding;
2222
private OnboardingViewModel viewModel;
2323
private MaterialRadioButton[] radioButtons;
24-
private View[] optionCards; // FIXME: Field can be converted to a local variable
2524

2625
@Nullable
2726
@Override
@@ -45,7 +44,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4544
binding.optionGoogleSansCode.radioButton
4645
};
4746

48-
optionCards = new View[]{
47+
View[] optionCards = new View[]{
4948
binding.cardAudiowide,
5049
binding.cardFiraCode,
5150
binding.cardJetbrainsMono,

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/OnboardingActivity.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ public void onPageSelected(int position) {
8181

8282
new TabLayoutMediator(binding.tabIndicator, binding.viewPager, (tab, position) -> {
8383
ImageView dot = new ImageView(this);
84-
dot.setImageResource(R.drawable.onboarding_dot_unselected);
85-
int margin = dpToPx(2);
84+
dot.setImageResource(R.drawable.onboarding_dot_unselected);
85+
int margin = Math.round(TypedValue.applyDimension(
86+
TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()));
8687
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
8788
LinearLayout.LayoutParams.WRAP_CONTENT,
8889
LinearLayout.LayoutParams.WRAP_CONTENT);
@@ -173,10 +174,7 @@ private void updateButtons(int position) {
173174
}
174175
}
175176

176-
private int dpToPx(int dp) { // FIXME: Value of parameter 'dp' is always '2'
177-
return Math.round(TypedValue.applyDimension(
178-
TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()));
179-
}
177+
180178

181179
private static class OnboardingPagerAdapter extends FragmentStateAdapter {
182180

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
app:layout_constraintStart_toStartOf="parent"
2727
app:layout_constraintTop_toBottomOf="@id/buttonSkip" />
2828

29-
<LinearLayout
29+
<androidx.appcompat.widget.LinearLayoutCompat
3030
android:id="@+id/bottomBar"
3131
android:layout_width="0dp"
3232
android:layout_height="wrap_content"
@@ -71,6 +71,6 @@
7171
app:icon="@drawable/ic_arrow_forward"
7272
app:iconGravity="textEnd" />
7373

74-
</LinearLayout>
74+
</androidx.appcompat.widget.LinearLayoutCompat>
7575

7676
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
33
android:id="@+id/container"
44
android:layout_width="match_parent"
55
android:layout_height="match_parent"
@@ -9,4 +9,4 @@
99
android:id="@+id/settings"
1010
android:layout_width="match_parent"
1111
android:layout_height="match_parent" />
12-
</LinearLayout>
12+
</androidx.appcompat.widget.LinearLayoutCompat>

0 commit comments

Comments
 (0)