Skip to content

Commit 262253d

Browse files
Refactor: Centralize CodeView population with CodeViewUtils
This commit introduces a new helper method, `CodeViewUtils.populateFromRawResource`, to centralize and simplify the process of loading code snippets from raw resources into `CodeView` components. This refactoring removes a significant amount of boilerplate code from multiple fragment classes. The new method handles file reading, font and preference application, syntax highlighting, and fast-scroller attachment. Key changes: - Introduced `CodeViewUtils.populateFromRawResource` to encapsulate the logic for displaying code. - Removed manual `InputStream` reading, font loading, `CodeHighlighter` calls, and `FastScrollerBuilder` setups from various fragments. - Refactored all affected fragments to use the new utility method, resulting in cleaner and more maintainable code.
1 parent 685db45 commit 262253d

File tree

16 files changed

+205
-512
lines changed

16 files changed

+205
-512
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.buttons.buttons.tabs;
22

3-
import android.content.SharedPreferences;
4-
import android.graphics.Typeface;
53
import android.os.Bundle;
6-
import android.util.Log;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
107

118
import androidx.annotation.NonNull;
12-
import androidx.preference.PreferenceManager;
139

1410
import com.d4rk.androidtutorials.java.R;
1511
import com.d4rk.androidtutorials.java.databinding.FragmentSameCodeBinding;
1612
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
17-
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1813
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
19-
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
21-
import java.io.BufferedReader;
22-
import java.io.IOException;
23-
import java.io.InputStream;
24-
import java.io.InputStreamReader;
25-
26-
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2714

2815
public class ButtonsTabCodeFragment extends NoCodeAdFragment<FragmentSameCodeBinding> {
2916

@@ -41,24 +28,11 @@ protected View getAdView(@NonNull FragmentSameCodeBinding binding) {
4128

4229
@Override
4330
protected void onBindingCreated(@NonNull FragmentSameCodeBinding binding, Bundle savedInstanceState) {
44-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
45-
46-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
47-
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
48-
CodeViewUtils.applyDefaults(monospaceFont, binding.codeView);
49-
50-
StringBuilder builder = new StringBuilder();
51-
InputStream inputStream = getResources().openRawResource(R.raw.text_buttons_java);
52-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
53-
String line;
54-
while ((line = reader.readLine()) != null) {
55-
builder.append(line).append('\n');
56-
}
57-
binding.codeView.setText(builder.toString());
58-
CodeHighlighter.applyJavaTheme(binding.codeView);
59-
} catch (IOException e) {
60-
Log.e("ButtonsTabCode", "Error reading code", e);
61-
}
31+
CodeViewUtils.populateFromRawResource(
32+
binding.codeView,
33+
R.raw.text_buttons_java,
34+
CodeViewUtils.HighlightMode.JAVA,
35+
"ButtonsTabCode");
6236
binding.textViewWarning.setText(R.string.same_code_buttons);
6337
}
6438
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/buttons/buttons/tabs/ButtonsTabLayoutFragment.java

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,51 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.buttons.buttons.tabs;
22

3-
import android.content.SharedPreferences;
4-
import android.graphics.Typeface;
53
import android.os.Bundle;
6-
import android.util.Log;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
107

118
import androidx.annotation.NonNull;
129
import androidx.fragment.app.Fragment;
13-
import androidx.preference.PreferenceManager;
1410

1511
import com.amrdeveloper.codeview.CodeView;
1612
import com.d4rk.androidtutorials.java.R;
1713
import com.d4rk.androidtutorials.java.ads.AdUtils;
1814
import com.d4rk.androidtutorials.java.databinding.FragmentButtonsLayoutBinding;
19-
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
2015
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
21-
import com.d4rk.androidtutorials.java.utils.FontManager;
22-
23-
import java.io.BufferedReader;
24-
import java.io.IOException;
25-
import java.io.InputStream;
26-
import java.io.InputStreamReader;
27-
import java.nio.charset.StandardCharsets;
28-
import java.util.HashMap;
16+
import java.util.LinkedHashMap;
2917
import java.util.Map;
3018

31-
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
32-
3319
public class ButtonsTabLayoutFragment extends Fragment {
34-
private final Map<Integer, CodeView> buttonXMLResources = new HashMap<>();
35-
3620
@Override
3721
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3822
FragmentButtonsLayoutBinding binding = FragmentButtonsLayoutBinding.inflate(inflater, container, false);
39-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
4023
AdUtils.loadBanner(binding.adView);
41-
42-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
43-
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
44-
CodeViewUtils.applyDefaults(monospaceFont, buttonXMLResources.values().toArray(new CodeView[0]));
45-
buttonXMLResources.put(R.raw.text_button_normal_xml, binding.codeViewButtonNormalXml);
46-
buttonXMLResources.put(R.raw.text_button_outlined_xml, binding.codeViewButtonOutlinedXml);
47-
buttonXMLResources.put(R.raw.text_button_elevated_xml, binding.codeViewButtonElevatedXml);
48-
buttonXMLResources.put(R.raw.text_button_normal_icon_xml, binding.codeViewButtonNormalIconXml);
49-
buttonXMLResources.put(R.raw.text_button_outlined_icon_xml, binding.codeViewButtonOutlinedIconXml);
50-
buttonXMLResources.put(R.raw.text_button_elevated_icon_xml, binding.codeViewButtonElevatedIconXml);
51-
buttonXMLResources.put(R.raw.text_extended_floating_button_primary_xml, binding.codeViewExtendedFloatingButtonPrimaryXml);
52-
buttonXMLResources.put(R.raw.text_extended_floating_button_secondary_xml, binding.codeViewExtendedFloatingButtonSecondaryXml);
53-
buttonXMLResources.put(R.raw.text_extended_floating_button_surface_xml, binding.codeViewExtendedFloatingButtonSurfaceXml);
54-
buttonXMLResources.put(R.raw.text_extended_floating_button_tertiary_xml, binding.codeViewExtendedFloatingButtonTertiaryXml);
55-
buttonXMLResources.put(R.raw.text_extended_floating_button_primary_icon_xml, binding.codeViewExtendedFloatingButtonPrimaryIconXml);
56-
buttonXMLResources.put(R.raw.text_extended_floating_button_secondary_icon_xml, binding.codeViewExtendedFloatingButtonSecondaryIconXml);
57-
buttonXMLResources.put(R.raw.text_extended_floating_button_surface_icon_xml, binding.codeViewExtendedFloatingButtonSurfaceIconXml);
58-
buttonXMLResources.put(R.raw.text_extended_floating_button_tertiary_icon_xml, binding.codeViewExtendedFloatingButtonTertiaryIconXml);
59-
buttonXMLResources.put(R.raw.text_floating_button_primary_xml, binding.codeViewFloatingButtonPrimaryXml);
60-
buttonXMLResources.put(R.raw.text_floating_button_secondary_xml, binding.codeViewFloatingButtonSecondaryXml);
61-
buttonXMLResources.put(R.raw.text_floating_button_surface_xml, binding.codeViewFloatingButtonSurfaceXml);
62-
buttonXMLResources.put(R.raw.text_floating_button_tertiary_xml, binding.codeViewFloatingButtonTertiaryXml);
63-
for (Map.Entry<Integer, CodeView> entry : buttonXMLResources.entrySet()) {
64-
Integer resourceId = entry.getKey();
65-
CodeView codeView = entry.getValue();
66-
try (InputStream inputStream = getResources().openRawResource(resourceId);
67-
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
68-
StringBuilder builder = new StringBuilder();
69-
String line;
70-
while ((line = reader.readLine()) != null) {
71-
builder.append(line).append('\n');
72-
}
73-
codeView.setText(builder.toString());
74-
CodeHighlighter.applyXmlTheme(codeView);
75-
} catch (IOException e) {
76-
Log.e("ButtonsTab", "Error reading button resource", e);
77-
}
24+
Map<Integer, CodeView> buttonXmlResources = new LinkedHashMap<>();
25+
buttonXmlResources.put(R.raw.text_button_normal_xml, binding.codeViewButtonNormalXml);
26+
buttonXmlResources.put(R.raw.text_button_outlined_xml, binding.codeViewButtonOutlinedXml);
27+
buttonXmlResources.put(R.raw.text_button_elevated_xml, binding.codeViewButtonElevatedXml);
28+
buttonXmlResources.put(R.raw.text_button_normal_icon_xml, binding.codeViewButtonNormalIconXml);
29+
buttonXmlResources.put(R.raw.text_button_outlined_icon_xml, binding.codeViewButtonOutlinedIconXml);
30+
buttonXmlResources.put(R.raw.text_button_elevated_icon_xml, binding.codeViewButtonElevatedIconXml);
31+
buttonXmlResources.put(R.raw.text_extended_floating_button_primary_xml, binding.codeViewExtendedFloatingButtonPrimaryXml);
32+
buttonXmlResources.put(R.raw.text_extended_floating_button_secondary_xml, binding.codeViewExtendedFloatingButtonSecondaryXml);
33+
buttonXmlResources.put(R.raw.text_extended_floating_button_surface_xml, binding.codeViewExtendedFloatingButtonSurfaceXml);
34+
buttonXmlResources.put(R.raw.text_extended_floating_button_tertiary_xml, binding.codeViewExtendedFloatingButtonTertiaryXml);
35+
buttonXmlResources.put(R.raw.text_extended_floating_button_primary_icon_xml, binding.codeViewExtendedFloatingButtonPrimaryIconXml);
36+
buttonXmlResources.put(R.raw.text_extended_floating_button_secondary_icon_xml, binding.codeViewExtendedFloatingButtonSecondaryIconXml);
37+
buttonXmlResources.put(R.raw.text_extended_floating_button_surface_icon_xml, binding.codeViewExtendedFloatingButtonSurfaceIconXml);
38+
buttonXmlResources.put(R.raw.text_extended_floating_button_tertiary_icon_xml, binding.codeViewExtendedFloatingButtonTertiaryIconXml);
39+
buttonXmlResources.put(R.raw.text_floating_button_primary_xml, binding.codeViewFloatingButtonPrimaryXml);
40+
buttonXmlResources.put(R.raw.text_floating_button_secondary_xml, binding.codeViewFloatingButtonSecondaryXml);
41+
buttonXmlResources.put(R.raw.text_floating_button_surface_xml, binding.codeViewFloatingButtonSurfaceXml);
42+
buttonXmlResources.put(R.raw.text_floating_button_tertiary_xml, binding.codeViewFloatingButtonTertiaryXml);
43+
for (Map.Entry<Integer, CodeView> entry : buttonXmlResources.entrySet()) {
44+
CodeViewUtils.populateFromRawResource(
45+
entry.getValue(),
46+
entry.getKey(),
47+
CodeViewUtils.HighlightMode.XML,
48+
"ButtonsTabLayout");
7849
}
7950
return binding.getRoot();
8051
}
Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,36 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.clocks.clock.tabs;
22

3-
import android.content.SharedPreferences;
4-
import android.graphics.Typeface;
53
import android.os.Bundle;
6-
import android.util.Log;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
107

118
import androidx.annotation.NonNull;
129
import androidx.fragment.app.Fragment;
13-
import androidx.preference.PreferenceManager;
1410

1511
import com.amrdeveloper.codeview.CodeView;
1612
import com.d4rk.androidtutorials.java.R;
1713
import com.d4rk.androidtutorials.java.ads.AdUtils;
1814
import com.d4rk.androidtutorials.java.databinding.FragmentClockLayoutBinding;
19-
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
2015
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
21-
import com.d4rk.androidtutorials.java.utils.FontManager;
22-
23-
import java.io.ByteArrayOutputStream;
24-
import java.io.IOException;
25-
import java.io.InputStream;
26-
27-
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2816

2917
public class ClockTabLayoutFragment extends Fragment {
3018

3119
@Override
3220
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3321
FragmentClockLayoutBinding binding = FragmentClockLayoutBinding.inflate(inflater, container, false);
34-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
3522
AdUtils.loadBanner(binding.adView);
36-
37-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
38-
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
39-
CodeViewUtils.applyDefaults(monospaceFont,
40-
binding.codeViewDigitalClockXml,
41-
binding.codeViewTextClockXml,
42-
binding.codeViewAnalogClockXml);
4323
setCodeView(binding.codeViewDigitalClockXml, R.raw.text_clock_digital_xml);
4424
setCodeView(binding.codeViewTextClockXml, R.raw.text_clock_xml);
4525
setCodeView(binding.codeViewAnalogClockXml, R.raw.text_clock_analog_xml);
4626
return binding.getRoot();
4727
}
4828

4929
private void setCodeView(CodeView codeView, int rawResource) {
50-
try (InputStream inputStream = getResources().openRawResource(rawResource)) {
51-
ByteArrayOutputStream result = new ByteArrayOutputStream();
52-
byte[] buffer = new byte[1024];
53-
int length;
54-
while ((length = inputStream.read(buffer)) != -1) {
55-
result.write(buffer, 0, length);
56-
}
57-
String text = result.toString();
58-
codeView.setText(text);
59-
CodeHighlighter.applyXmlTheme(codeView);
60-
} catch (IOException e) {
61-
Log.e("ClockTab", "Error reading clock layout", e);
62-
}
30+
CodeViewUtils.populateFromRawResource(
31+
codeView,
32+
rawResource,
33+
CodeViewUtils.HighlightMode.XML,
34+
"ClockTabLayout");
6335
}
64-
}
36+
}
Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.data.room.tabs;
22

3-
import android.content.SharedPreferences;
4-
import android.graphics.Typeface;
53
import android.os.Bundle;
6-
import android.util.Log;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
107

118
import androidx.annotation.NonNull;
12-
import androidx.preference.PreferenceManager;
139

1410
import com.d4rk.androidtutorials.java.R;
1511
import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding;
1612
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
17-
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1813
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
19-
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
21-
import java.io.BufferedReader;
22-
import java.io.IOException;
23-
import java.io.InputStream;
24-
import java.io.InputStreamReader;
25-
26-
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2714

2815
/**
2916
* Shows the Java implementation for the Room example.
@@ -44,24 +31,11 @@ protected View getAdView(@NonNull FragmentCodeBinding binding) {
4431

4532
@Override
4633
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
47-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
48-
49-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
50-
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
51-
CodeViewUtils.applyDefaults(monospaceFont, binding.codeView);
52-
53-
StringBuilder builder = new StringBuilder();
54-
InputStream inputStream = getResources().openRawResource(R.raw.text_room_java);
55-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
56-
String line;
57-
while ((line = reader.readLine()) != null) {
58-
builder.append(line).append('\n');
59-
}
60-
binding.codeView.setText(builder.toString());
61-
CodeHighlighter.applyJavaTheme(binding.codeView);
62-
} catch (IOException e) {
63-
Log.e("RoomTabCode", "Error reading code", e);
64-
}
34+
CodeViewUtils.populateFromRawResource(
35+
binding.codeView,
36+
R.raw.text_room_java,
37+
CodeViewUtils.HighlightMode.JAVA,
38+
"RoomTabCode");
6539
}
6640
}
6741

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

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,17 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.data.room.tabs;
22

3-
import android.content.SharedPreferences;
4-
import android.graphics.Typeface;
53
import android.os.Bundle;
6-
import android.util.Log;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
107

118
import androidx.annotation.NonNull;
129
import androidx.fragment.app.Fragment;
13-
import androidx.preference.PreferenceManager;
1410

1511
import com.d4rk.androidtutorials.java.R;
1612
import com.d4rk.androidtutorials.java.ads.AdUtils;
1713
import com.d4rk.androidtutorials.java.databinding.FragmentLayoutBinding;
18-
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1914
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
20-
import com.d4rk.androidtutorials.java.utils.FontManager;
21-
22-
import java.io.BufferedReader;
23-
import java.io.IOException;
24-
import java.io.InputStream;
25-
import java.io.InputStreamReader;
26-
27-
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2815

2916
/**
3017
* Shows the XML layout for the Room example.
@@ -34,25 +21,12 @@ public class RoomTabLayoutFragment extends Fragment {
3421
@Override
3522
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3623
FragmentLayoutBinding binding = FragmentLayoutBinding.inflate(inflater, container, false);
37-
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
3824
AdUtils.loadBanner(binding.adView);
39-
40-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
41-
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
42-
CodeViewUtils.applyDefaults(monospaceFont, binding.codeView);
43-
44-
StringBuilder builder = new StringBuilder();
45-
InputStream inputStream = getResources().openRawResource(R.raw.text_room_xml);
46-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
47-
String line;
48-
while ((line = reader.readLine()) != null) {
49-
builder.append(line).append('\n');
50-
}
51-
binding.codeView.setText(builder.toString());
52-
CodeHighlighter.applyXmlTheme(binding.codeView);
53-
} catch (IOException e) {
54-
Log.e("RoomTabLayout", "Error reading layout", e);
55-
}
25+
CodeViewUtils.populateFromRawResource(
26+
binding.codeView,
27+
R.raw.text_room_xml,
28+
CodeViewUtils.HighlightMode.XML,
29+
"RoomTabLayout");
5630
return binding.getRoot();
5731
}
5832
}

0 commit comments

Comments
 (0)