Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /