Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ android {
applicationId 'com.d4rk.androidtutorials.java'
minSdk 23
targetSdk 36
versionCode 43
versionCode 44
versionName '5.0.2'
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.d4rk.androidtutorials.java.di;

import android.app.Application;
import android.content.res.AssetManager;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public class Note {
@PrimaryKey(autoGenerate = true)
public int id;
public String text;
public String text; // FIXME: Declaration can have final modifier

public Note(String text) {
this.text = text;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import androidx.navigation.ui.NavigationUI;
import androidx.preference.PreferenceManager;

import com.d4rk.androidtutorials.java.BuildConfig;
import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.ActivityMainBinding;
import com.d4rk.androidtutorials.java.ui.components.navigation.BottomSheetMenuFragment;
Expand All @@ -49,7 +48,6 @@
import com.google.android.play.core.install.InstallStateUpdatedListener;
import com.google.android.play.core.install.model.AppUpdateType;
import com.google.android.play.core.install.model.InstallStatus;
import com.google.android.play.core.install.model.UpdateAvailability;
import com.google.android.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.UserMessagingPlatform;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

import com.google.android.material.radiobutton.MaterialRadioButton;

import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingBottomLabelsBinding;

public class BottomLabelsFragment extends Fragment {

private FragmentOnboardingBottomLabelsBinding binding;
private OnboardingViewModel viewModel;
private MaterialRadioButton[] radioButtons;
private View[] optionCards; // FIXME: Field can be converted to a local variable

@Nullable
@Override
Expand All @@ -29,18 +33,53 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(requireActivity()).get(OnboardingViewModel.class);

radioButtons = new MaterialRadioButton[]{
binding.optionLabeled.radioButton,
binding.optionSelected.radioButton,
binding.optionUnlabeled.radioButton
};

optionCards = new View[]{
binding.cardLabeled,
binding.cardSelected,
binding.cardUnlabeled
};

for (int i = 0; i < radioButtons.length; i++) {
int index = i;
radioButtons[i].setId(View.generateViewId());
optionCards[i].setOnClickListener(v -> selectOption(index));
radioButtons[i].setOnClickListener(v -> selectOption(index));
}

String current = viewModel.getBottomNavLabels();
String[] values = getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
int index = 0;
if (current.equals(values[1])) {
index = 1;
} else if (current.equals(values[2])) {
index = 2;
}
selectOption(index);
}

private void selectOption(int index) {
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].setChecked(i == index);
}
}

public void saveSelection() {
int checkedId = binding.labelsGroup.getCheckedRadioButtonId();
String[] values = getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
String value = values[0];
if (checkedId == R.id.radio_selected) {
value = values[1];
} else if (checkedId == R.id.radio_unlabeled) {
value = values[2];
int index = 0;
for (int i = 0; i < radioButtons.length; i++) {
if (radioButtons[i].isChecked()) {
index = i;
break;
}
}
viewModel.setBottomNavLabels(value);
viewModel.setBottomNavLabels(values[index]);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.core.content.res.ResourcesCompat;

import com.google.android.material.radiobutton.MaterialRadioButton;

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

private FragmentOnboardingFontBinding binding;
private OnboardingViewModel viewModel;
private MaterialRadioButton[] radioButtons;
private View[] optionCards; // FIXME: Field can be converted to a local variable

@Nullable
@Override
Expand All @@ -29,26 +34,70 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(requireActivity()).get(OnboardingViewModel.class);

radioButtons = new MaterialRadioButton[]{
binding.optionAudiowide.radioButton,
binding.optionFiraCode.radioButton,
binding.optionJetbrainsMono.radioButton,
binding.optionNotoSansMono.radioButton,
binding.optionPoppins.radioButton,
binding.optionRobotoMono.radioButton,
binding.optionGoogleSansCode.radioButton
};

optionCards = new View[]{
binding.cardAudiowide,
binding.cardFiraCode,
binding.cardJetbrainsMono,
binding.cardNotoSansMono,
binding.cardPoppins,
binding.cardRobotoMono,
binding.cardGoogleSansCode
};

binding.optionAudiowide.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_audiowide));
binding.optionFiraCode.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_fira_code));
binding.optionJetbrainsMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_jetbrains_mono));
binding.optionNotoSansMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_noto_sans_mono));
binding.optionPoppins.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_poppins));
binding.optionRobotoMono.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_roboto_mono));
binding.optionGoogleSansCode.titleText.setTypeface(ResourcesCompat.getFont(requireContext(), R.font.font_google_sans_code));

for (int i = 0; i < radioButtons.length; i++) {
int index = i;
radioButtons[i].setId(View.generateViewId());
optionCards[i].setOnClickListener(v -> selectOption(index));
radioButtons[i].setOnClickListener(v -> selectOption(index));
}

String current = viewModel.getMonospaceFont();
String[] values = getResources().getStringArray(R.array.code_font_values);
int index = 6;
for (int i = 0; i < values.length; i++) {
if (current.equals(values[i])) {
index = i;
break;
}
}
selectOption(index);
}

private void selectOption(int index) {
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].setChecked(i == index);
}
}

public void saveSelection() {
int checkedId = binding.fontGroup.getCheckedRadioButtonId();
String[] values = getResources().getStringArray(R.array.code_font_values);
String value = values[6];
if (checkedId == R.id.radio_font_audiowide) {
value = values[0];
} else if (checkedId == R.id.radio_font_fira_code) {
value = values[1];
} else if (checkedId == R.id.radio_font_jetbrains_mono) {
value = values[2];
} else if (checkedId == R.id.radio_font_noto_sans_mono) {
value = values[3];
} else if (checkedId == R.id.radio_font_poppins) {
value = values[4];
} else if (checkedId == R.id.radio_font_roboto_mono) {
value = values[5];
int index = 6;
for (int i = 0; i < radioButtons.length; i++) {
if (radioButtons[i].isChecked()) {
index = i;
break;
}
}
viewModel.setMonospaceFont(value);
viewModel.setMonospaceFont(values[index]);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.util.TypedValue;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
Expand Down Expand Up @@ -65,6 +66,10 @@ public void onPageSelected(int position) {
((ThemeFragment) fragment).saveSelection();
} else if (fragment instanceof StartPageFragment) {
((StartPageFragment) fragment).saveSelection();
} else if (fragment instanceof FontFragment) {
((FontFragment) fragment).saveSelection();
} else if (fragment instanceof BottomLabelsFragment) {
((BottomLabelsFragment) fragment).saveSelection();
} else if (fragment instanceof DataFragment) {
((DataFragment) fragment).saveSelection();
}
Expand All @@ -77,10 +82,11 @@ public void onPageSelected(int position) {
new TabLayoutMediator(binding.tabIndicator, binding.viewPager, (tab, position) -> {
ImageView dot = new ImageView(this);
dot.setImageResource(R.drawable.onboarding_dot_unselected);
int margin = dpToPx(2);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(8,0,8,0);
params.setMargins(margin, 0, margin, 0);
dot.setLayoutParams(params);
tab.setCustomView(dot);
}).attach();
Expand Down Expand Up @@ -130,6 +136,10 @@ public void onTabReselected(TabLayout.Tab tab) {
((ThemeFragment) fragment).saveSelection();
} else if (fragment instanceof StartPageFragment) {
((StartPageFragment) fragment).saveSelection();
} else if (fragment instanceof FontFragment) {
((FontFragment) fragment).saveSelection();
} else if (fragment instanceof BottomLabelsFragment) {
((BottomLabelsFragment) fragment).saveSelection();
} else if (fragment instanceof DataFragment) {
((DataFragment) fragment).saveSelection();
}
Expand Down Expand Up @@ -163,6 +173,11 @@ private void updateButtons(int position) {
}
}

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

private static class OnboardingPagerAdapter extends FragmentStateAdapter {

OnboardingPagerAdapter(@NonNull AppCompatActivity activity) {
Expand All @@ -175,14 +190,16 @@ public Fragment createFragment(int position) {
return switch (position) {
case 0 -> new ThemeFragment();
case 1 -> new StartPageFragment();
case 2 -> new DataFragment();
case 2 -> new FontFragment();
case 3 -> new BottomLabelsFragment();
case 4 -> new DataFragment();
default -> new DoneFragment();
};
}

@Override
public int getItemCount() {
return 4;
return 6;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,20 @@ public void setBottomNavLabels(String value) {
prefs.edit().putString(context.getString(R.string.key_bottom_navigation_bar_labels), value).apply();
}

public String getBottomNavLabels() {
String[] values = context.getResources().getStringArray(R.array.preference_bottom_navigation_bar_labels_values);
return prefs.getString(context.getString(R.string.key_bottom_navigation_bar_labels), values[0]);
}

public void setMonospaceFont(String value) {
prefs.edit().putString(context.getString(R.string.key_monospace_font), value).apply();
}

public String getMonospaceFont() {
String[] values = context.getResources().getStringArray(R.array.code_font_values);
return prefs.getString(context.getString(R.string.key_monospace_font), values[0]);
}

public void setCrashlyticsEnabled(boolean enabled) {
prefs.edit().putBoolean(context.getString(R.string.key_firebase_crashlytics), enabled).apply();
}
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/drawable/onboarding_dot_selected.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="8dp"
android:height="8dp" />
android:width="14dp"
android:height="14dp" />
<solid android:color="?attr/colorPrimary" />
</shape>
6 changes: 3 additions & 3 deletions app/src/main/res/drawable/onboarding_dot_unselected.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="8dp"
android:height="8dp" />
<solid android:color="@android:color/darker_gray" />
android:width="10dp"
android:height="10dp" />
<solid android:color="?attr/colorOutline" />
</shape>
5 changes: 5 additions & 0 deletions app/src/main/res/layout/activity_onboarding.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,14 @@
android:layout_weight="1"
android:background="@android:color/transparent"
android:minHeight="0dp"
app:tabGravity="center"
app:tabIndicatorFullWidth="false"
app:tabIndicatorGravity="center"
app:tabIndicatorHeight="0dp"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"
app:tabPaddingTop="0dp"
app:tabPaddingBottom="0dp"
app:tabRippleColor="@android:color/transparent" />

<com.google.android.material.button.MaterialButton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- FIXME: `activity_shortcuts_navigation_and_searching.xml` has more than 80 views, bad for performance-->

<me.zhanghai.android.fastscroll.FastScrollScrollView
android:id="@+id/scroll_view"
android:layout_width="0dp"
Expand Down
Loading
Loading