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
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,56 @@

public class FontManager {

private static final String DEFAULT_FONT_CODE = "6";

public static Typeface getMonospaceFont(Context context, SharedPreferences prefs) {
String key = context.getString(R.string.key_monospace_font);
String font;
boolean resetPreference = false;
try {
font = prefs.getString(key, "6");
font = prefs.getString(key, DEFAULT_FONT_CODE);
} catch (ClassCastException e) {
prefs.edit().remove(key).apply();
font = "6";
font = DEFAULT_FONT_CODE;
resetPreference = true;
}
if (font == null) {
font = "6";
font = DEFAULT_FONT_CODE;
resetPreference = true;
}

Typeface typeface;
switch (font) {
case "0":
typeface = ResourcesCompat.getFont(context, R.font.font_audiowide);
break;
case "1":
typeface = ResourcesCompat.getFont(context, R.font.font_fira_code);
break;
case "2":
typeface = ResourcesCompat.getFont(context, R.font.font_jetbrains_mono);
break;
case "3":
typeface = ResourcesCompat.getFont(context, R.font.font_noto_sans_mono);
break;
case "4":
typeface = ResourcesCompat.getFont(context, R.font.font_poppins);
break;
case "5":
typeface = ResourcesCompat.getFont(context, R.font.font_roboto_mono);
break;
case DEFAULT_FONT_CODE:
typeface = ResourcesCompat.getFont(context, R.font.font_google_sans_code);
break;
default:
typeface = ResourcesCompat.getFont(context, R.font.font_google_sans_code);
resetPreference = true;
break;
}
return switch (font) {
case "0" -> ResourcesCompat.getFont(context, R.font.font_audiowide);
case "1" -> ResourcesCompat.getFont(context, R.font.font_fira_code);
case "2" -> ResourcesCompat.getFont(context, R.font.font_jetbrains_mono);
case "3" -> ResourcesCompat.getFont(context, R.font.font_noto_sans_mono);
case "4" -> ResourcesCompat.getFont(context, R.font.font_poppins);
case "5" -> ResourcesCompat.getFont(context, R.font.font_roboto_mono);
default -> ResourcesCompat.getFont(context, R.font.font_google_sans_code);
};

if (resetPreference) {
prefs.edit().remove(key).apply();
}

return typeface;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

Expand All @@ -25,7 +26,7 @@
public class FontManagerTest {

@Test
public void getMonospaceFont_returnsExpectedTypefaceForStoredValues() {
public void getMonospaceFont_returnsExpectedTypefaceForValidCodes() {
Context context = mock(Context.class);
when(context.getString(R.string.key_monospace_font)).thenReturn("monospace_font");

Expand All @@ -51,13 +52,72 @@ public void getMonospaceFont_returnsExpectedTypefaceForStoredValues() {

assertSame("Unexpected typeface for value " + entry.getKey(), expectedTypeface, result);
verify(prefs).getString("monospace_font", "6");
verify(prefs, never()).edit();
resourcesStatic.verify(() -> ResourcesCompat.getFont(context, entry.getValue()));
}
}
}

@Test
public void getMonospaceFont_removesInvalidPreferenceValueAndReturnsDefaultFont() {
public void getMonospaceFont_resetsPreferenceWhenCodeIsInvalid() {
Context context = mock(Context.class);
SharedPreferences prefs = mock(SharedPreferences.class);
SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);

when(context.getString(R.string.key_monospace_font)).thenReturn("monospace_font");
when(prefs.edit()).thenReturn(editor);
when(editor.remove("monospace_font")).thenReturn(editor);
when(prefs.getString("monospace_font", "6")).thenReturn("invalid");

Typeface defaultTypeface = mock(Typeface.class);

try (MockedStatic<ResourcesCompat> resourcesStatic = Mockito.mockStatic(ResourcesCompat.class)) {
resourcesStatic.when(() -> ResourcesCompat.getFont(context, R.font.font_google_sans_code))
.thenReturn(defaultTypeface);

Typeface result = FontManager.getMonospaceFont(context, prefs);

assertSame(defaultTypeface, result);
verify(prefs).getString("monospace_font", "6");
verify(prefs).edit();
InOrder inOrder = inOrder(editor);
inOrder.verify(editor).remove("monospace_font");
inOrder.verify(editor).apply();
resourcesStatic.verify(() -> ResourcesCompat.getFont(context, R.font.font_google_sans_code));
}
}

@Test
public void getMonospaceFont_resetsPreferenceWhenCodeIsMissing() {
Context context = mock(Context.class);
SharedPreferences prefs = mock(SharedPreferences.class);
SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);

when(context.getString(R.string.key_monospace_font)).thenReturn("monospace_font");
when(prefs.edit()).thenReturn(editor);
when(editor.remove("monospace_font")).thenReturn(editor);
when(prefs.getString("monospace_font", "6")).thenReturn(null);

Typeface defaultTypeface = mock(Typeface.class);

try (MockedStatic<ResourcesCompat> resourcesStatic = Mockito.mockStatic(ResourcesCompat.class)) {
resourcesStatic.when(() -> ResourcesCompat.getFont(context, R.font.font_google_sans_code))
.thenReturn(defaultTypeface);

Typeface result = FontManager.getMonospaceFont(context, prefs);

assertSame(defaultTypeface, result);
verify(prefs).getString("monospace_font", "6");
verify(prefs).edit();
InOrder inOrder = inOrder(editor);
inOrder.verify(editor).remove("monospace_font");
inOrder.verify(editor).apply();
resourcesStatic.verify(() -> ResourcesCompat.getFont(context, R.font.font_google_sans_code));
}
}

@Test
public void getMonospaceFont_resetsPreferenceWhenValueHasWrongType() {
Context context = mock(Context.class);
SharedPreferences prefs = mock(SharedPreferences.class);
SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);
Expand Down