Skip to content

Commit 588a06d

Browse files
Merge pull request #155 from MihaiCristianCondrea/codex/review-onboarding-for-additional-tabs
Add font and bottom label onboarding steps
2 parents f178054 + f283133 commit 588a06d

File tree

45 files changed

+391
-365
lines changed

Some content is hidden

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

45 files changed

+391
-365
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ android {
1313
applicationId 'com.d4rk.androidtutorials.java'
1414
minSdk 23
1515
targetSdk 36
16-
versionCode 43
16+
versionCode 44
1717
versionName '5.0.2'
1818
vectorDrawables.useSupportLibrary = true
1919
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.d4rk.androidtutorials.java.di;
22

33
import android.app.Application;
4-
import android.content.res.AssetManager;
54

65
import com.android.volley.RequestQueue;
76
import com.android.volley.toolbox.Volley;

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;
13+
public String text; // FIXME: Declaration can have final modifier
1414

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

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import androidx.navigation.ui.NavigationUI;
3131
import androidx.preference.PreferenceManager;
3232

33-
import com.d4rk.androidtutorials.java.BuildConfig;
3433
import com.d4rk.androidtutorials.java.R;
3534
import com.d4rk.androidtutorials.java.databinding.ActivityMainBinding;
3635
import com.d4rk.androidtutorials.java.ui.components.navigation.BottomSheetMenuFragment;
@@ -49,7 +48,6 @@
4948
import com.google.android.play.core.install.InstallStateUpdatedListener;
5049
import com.google.android.play.core.install.model.AppUpdateType;
5150
import com.google.android.play.core.install.model.InstallStatus;
52-
import com.google.android.play.core.install.model.UpdateAvailability;
5351
import com.google.android.ump.ConsentInformation;
5452
import com.google.android.ump.ConsentRequestParameters;
5553
import com.google.android.ump.UserMessagingPlatform;

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

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@
1010
import androidx.fragment.app.Fragment;
1111
import androidx.lifecycle.ViewModelProvider;
1212

13+
import com.google.android.material.radiobutton.MaterialRadioButton;
14+
1315
import com.d4rk.androidtutorials.java.R;
1416
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingBottomLabelsBinding;
1517

1618
public class BottomLabelsFragment extends Fragment {
1719

1820
private FragmentOnboardingBottomLabelsBinding binding;
1921
private OnboardingViewModel viewModel;
22+
private MaterialRadioButton[] radioButtons;
23+
private View[] optionCards; // FIXME: Field can be converted to a local variable
2024

2125
@Nullable
2226
@Override
@@ -29,18 +33,53 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
2933
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
3034
super.onViewCreated(view, savedInstanceState);
3135
viewModel = new ViewModelProvider(requireActivity()).get(OnboardingViewModel.class);
36+
37+
radioButtons = new MaterialRadioButton[]{
38+
binding.optionLabeled.radioButton,
39+
binding.optionSelected.radioButton,
40+
binding.optionUnlabeled.radioButton
41+
};
42+
43+
optionCards = new View[]{
44+
binding.cardLabeled,
45+
binding.cardSelected,
46+
binding.cardUnlabeled
47+
};
48+
49+
for (int i = 0; i < radioButtons.length; i++) {
50+
int index = i;
51+
radioButtons[i].setId(View.generateViewId());
52+
optionCards[i].setOnClickListener(v -> selectOption(index));
53+
radioButtons[i].setOnClickListener(v -> selectOption(index));
54+
}
55+
56+
String current = viewModel.getBottomNavLabels();
57+
String[] values = getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
58+
int index = 0;
59+
if (current.equals(values[1])) {
60+
index = 1;
61+
} else if (current.equals(values[2])) {
62+
index = 2;
63+
}
64+
selectOption(index);
65+
}
66+
67+
private void selectOption(int index) {
68+
for (int i = 0; i < radioButtons.length; i++) {
69+
radioButtons[i].setChecked(i == index);
70+
}
3271
}
3372

3473
public void saveSelection() {
35-
int checkedId = binding.labelsGroup.getCheckedRadioButtonId();
3674
String[] values = getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
37-
String value = values[0];
38-
if (checkedId == R.id.radio_selected) {
39-
value = values[1];
40-
} else if (checkedId == R.id.radio_unlabeled) {
41-
value = values[2];
75+
int index = 0;
76+
for (int i = 0; i < radioButtons.length; i++) {
77+
if (radioButtons[i].isChecked()) {
78+
index = i;
79+
break;
80+
}
4281
}
43-
viewModel.setBottomNavLabels(value);
82+
viewModel.setBottomNavLabels(values[index]);
4483
}
4584

4685
@Override

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

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import androidx.annotation.Nullable;
1010
import androidx.fragment.app.Fragment;
1111
import androidx.lifecycle.ViewModelProvider;
12+
import androidx.core.content.res.ResourcesCompat;
13+
14+
import com.google.android.material.radiobutton.MaterialRadioButton;
1215

1316
import com.d4rk.androidtutorials.java.R;
1417
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingFontBinding;
@@ -17,6 +20,8 @@ public class FontFragment extends Fragment {
1720

1821
private FragmentOnboardingFontBinding binding;
1922
private OnboardingViewModel viewModel;
23+
private MaterialRadioButton[] radioButtons;
24+
private View[] optionCards; // FIXME: Field can be converted to a local variable
2025

2126
@Nullable
2227
@Override
@@ -29,26 +34,70 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
2934
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
3035
super.onViewCreated(view, savedInstanceState);
3136
viewModel = new ViewModelProvider(requireActivity()).get(OnboardingViewModel.class);
37+
38+
radioButtons = new MaterialRadioButton[]{
39+
binding.optionAudiowide.radioButton,
40+
binding.optionFiraCode.radioButton,
41+
binding.optionJetbrainsMono.radioButton,
42+
binding.optionNotoSansMono.radioButton,
43+
binding.optionPoppins.radioButton,
44+
binding.optionRobotoMono.radioButton,
45+
binding.optionGoogleSansCode.radioButton
46+
};
47+
48+
optionCards = new View[]{
49+
binding.cardAudiowide,
50+
binding.cardFiraCode,
51+
binding.cardJetbrainsMono,
52+
binding.cardNotoSansMono,
53+
binding.cardPoppins,
54+
binding.cardRobotoMono,
55+
binding.cardGoogleSansCode
56+
};
57+
58+
binding.optionAudiowide.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_audiowide));
59+
binding.optionFiraCode.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_fira_code));
60+
binding.optionJetbrainsMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_jetbrains_mono));
61+
binding.optionNotoSansMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_noto_sans_mono));
62+
binding.optionPoppins.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_poppins));
63+
binding.optionRobotoMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_roboto_mono));
64+
binding.optionGoogleSansCode.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_google_sans_code));
65+
66+
for (int i = 0; i < radioButtons.length; i++) {
67+
int index = i;
68+
radioButtons[i].setId(View.generateViewId());
69+
optionCards[i].setOnClickListener(v -> selectOption(index));
70+
radioButtons[i].setOnClickListener(v -> selectOption(index));
71+
}
72+
73+
String current = viewModel.getMonospaceFont();
74+
String[] values = getResources().getStringArray(R.array.code_font_values);
75+
int index = 6;
76+
for (int i = 0; i < values.length; i++) {
77+
if (current.equals(values[i])) {
78+
index = i;
79+
break;
80+
}
81+
}
82+
selectOption(index);
83+
}
84+
85+
private void selectOption(int index) {
86+
for (int i = 0; i < radioButtons.length; i++) {
87+
radioButtons[i].setChecked(i == index);
88+
}
3289
}
3390

3491
public void saveSelection() {
35-
int checkedId = binding.fontGroup.getCheckedRadioButtonId();
3692
String[] values = getResources().getStringArray(R.array.code_font_values);
37-
String value = values[6];
38-
if (checkedId == R.id.radio_font_audiowide) {
39-
value = values[0];
40-
} else if (checkedId == R.id.radio_font_fira_code) {
41-
value = values[1];
42-
} else if (checkedId == R.id.radio_font_jetbrains_mono) {
43-
value = values[2];
44-
} else if (checkedId == R.id.radio_font_noto_sans_mono) {
45-
value = values[3];
46-
} else if (checkedId == R.id.radio_font_poppins) {
47-
value = values[4];
48-
} else if (checkedId == R.id.radio_font_roboto_mono) {
49-
value = values[5];
93+
int index = 6;
94+
for (int i = 0; i < radioButtons.length; i++) {
95+
if (radioButtons[i].isChecked()) {
96+
index = i;
97+
break;
98+
}
5099
}
51-
viewModel.setMonospaceFont(value);
100+
viewModel.setMonospaceFont(values[index]);
52101
}
53102

54103
@Override

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.view.View;
66
import android.widget.ImageView;
77
import android.widget.LinearLayout;
8+
import android.util.TypedValue;
89

910
import androidx.annotation.NonNull;
1011
import androidx.appcompat.app.AppCompatActivity;
@@ -65,6 +66,10 @@ public void onPageSelected(int position) {
6566
((ThemeFragment) fragment).saveSelection();
6667
} else if (fragment instanceof StartPageFragment) {
6768
((StartPageFragment) fragment).saveSelection();
69+
} else if (fragment instanceof FontFragment) {
70+
((FontFragment) fragment).saveSelection();
71+
} else if (fragment instanceof BottomLabelsFragment) {
72+
((BottomLabelsFragment) fragment).saveSelection();
6873
} else if (fragment instanceof DataFragment) {
6974
((DataFragment) fragment).saveSelection();
7075
}
@@ -77,10 +82,11 @@ public void onPageSelected(int position) {
7782
new TabLayoutMediator(binding.tabIndicator, binding.viewPager, (tab, position) -> {
7883
ImageView dot = new ImageView(this);
7984
dot.setImageResource(R.drawable.onboarding_dot_unselected);
85+
int margin = dpToPx(2);
8086
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
8187
LinearLayout.LayoutParams.WRAP_CONTENT,
8288
LinearLayout.LayoutParams.WRAP_CONTENT);
83-
params.setMargins(8,0,8,0);
89+
params.setMargins(margin, 0, margin, 0);
8490
dot.setLayoutParams(params);
8591
tab.setCustomView(dot);
8692
}).attach();
@@ -130,6 +136,10 @@ public void onTabReselected(TabLayout.Tab tab) {
130136
((ThemeFragment) fragment).saveSelection();
131137
} else if (fragment instanceof StartPageFragment) {
132138
((StartPageFragment) fragment).saveSelection();
139+
} else if (fragment instanceof FontFragment) {
140+
((FontFragment) fragment).saveSelection();
141+
} else if (fragment instanceof BottomLabelsFragment) {
142+
((BottomLabelsFragment) fragment).saveSelection();
133143
} else if (fragment instanceof DataFragment) {
134144
((DataFragment) fragment).saveSelection();
135145
}
@@ -163,6 +173,11 @@ private void updateButtons(int position) {
163173
}
164174
}
165175

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+
}
180+
166181
private static class OnboardingPagerAdapter extends FragmentStateAdapter {
167182

168183
OnboardingPagerAdapter(@NonNull AppCompatActivity activity) {
@@ -175,14 +190,16 @@ public Fragment createFragment(int position) {
175190
return switch (position) {
176191
case 0 -> new ThemeFragment();
177192
case 1 -> new StartPageFragment();
178-
case 2 -> new DataFragment();
193+
case 2 -> new FontFragment();
194+
case 3 -> new BottomLabelsFragment();
195+
case 4 -> new DataFragment();
179196
default -> new DoneFragment();
180197
};
181198
}
182199

183200
@Override
184201
public int getItemCount() {
185-
return 4;
202+
return 6;
186203
}
187204
}
188205
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,20 @@ public void setBottomNavLabels(String value) {
6666
prefs.edit().putString(context.getString(R.string.key_bottom_navigation_bar_labels), value).apply();
6767
}
6868

69+
public String getBottomNavLabels() {
70+
String[] values = context.getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
71+
return prefs.getString(context.getString(R.string.key_bottom_navigation_bar_labels), values[0]);
72+
}
73+
6974
public void setMonospaceFont(String value) {
7075
prefs.edit().putString(context.getString(R.string.key_monospace_font), value).apply();
7176
}
7277

78+
public String getMonospaceFont() {
79+
String[] values = context.getResources().getStringArray(R.array.code_font_values);
80+
return prefs.getString(context.getString(R.string.key_monospace_font), values[0]);
81+
}
82+
7383
public void setCrashlyticsEnabled(boolean enabled) {
7484
prefs.edit().putBoolean(context.getString(R.string.key_firebase_crashlytics), enabled).apply();
7585
}

app/src/main/res/drawable/onboarding_dot_selected.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<shape xmlns:android="http://schemas.android.com/apk/res/android"
33
android:shape="oval">
44
<size
5-
android:width="8dp"
6-
android:height="8dp" />
5+
android:width="14dp"
6+
android:height="14dp" />
77
<solid android:color="?attr/colorPrimary" />
88
</shape>

app/src/main/res/drawable/onboarding_dot_unselected.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<shape xmlns:android="http://schemas.android.com/apk/res/android"
33
android:shape="oval">
44
<size
5-
android:width="8dp"
6-
android:height="8dp" />
7-
<solid android:color="@android:color/darker_gray" />
5+
android:width="10dp"
6+
android:height="10dp" />
7+
<solid android:color="?attr/colorOutline" />
88
</shape>

0 commit comments

Comments
 (0)