Skip to content

Commit b5bfe50

Browse files
Merge pull request #165 from MihaiCristianCondrea/codex/implement-generic-ad-fragment
refactor: unify TabCode fragments with generic ad base
2 parents 389feb8 + 1cf2e93 commit b5bfe50

File tree

10 files changed

+122
-79
lines changed

10 files changed

+122
-79
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.d4rk.androidtutorials.java.ui.components;
2+
3+
import android.os.Bundle;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
8+
import androidx.annotation.NonNull;
9+
import androidx.annotation.Nullable;
10+
import androidx.fragment.app.Fragment;
11+
import androidx.viewbinding.ViewBinding;
12+
13+
import com.d4rk.androidtutorials.java.R;
14+
import com.d4rk.androidtutorials.java.ads.AdUtils;
15+
16+
/**
17+
* Generic fragment that inflates a provided ViewBinding and loads a banner ad.
18+
*
19+
* @param <T> The type of ViewBinding associated with this fragment.
20+
*/
21+
public abstract class NoCodeAdFragment<T extends ViewBinding> extends Fragment {
22+
protected T binding;
23+
24+
/**
25+
* Inflate the ViewBinding for this fragment.
26+
*
27+
* @param inflater LayoutInflater to use.
28+
* @param container Optional container.
29+
* @return The inflated binding.
30+
*/
31+
@NonNull
32+
protected abstract T inflateBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container);
33+
34+
/**
35+
* Called after the binding has been created and the banner ad loaded.
36+
* Subclasses can override to perform additional setup.
37+
*
38+
* @param binding The binding instance.
39+
* @param savedInstanceState Saved instance state.
40+
*/
41+
protected void onBindingCreated(@NonNull T binding, @Nullable Bundle savedInstanceState) {
42+
// default no-op
43+
}
44+
45+
@Override
46+
@NonNull
47+
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
48+
@Nullable Bundle savedInstanceState) {
49+
binding = inflateBinding(inflater, container);
50+
View adView = binding.getRoot().findViewById(R.id.ad_view);
51+
AdUtils.loadBanner(adView);
52+
onBindingCreated(binding, savedInstanceState);
53+
return binding.getRoot();
54+
}
55+
56+
@Override
57+
public void onDestroyView() {
58+
super.onDestroyView();
59+
binding = null;
60+
}
61+
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
import android.os.Bundle;
66
import android.util.Log;
77
import android.view.LayoutInflater;
8-
import android.view.View;
98
import android.view.ViewGroup;
109

1110
import androidx.annotation.NonNull;
12-
import androidx.fragment.app.Fragment;
1311
import androidx.preference.PreferenceManager;
1412

1513
import com.d4rk.androidtutorials.java.R;
1614
import com.d4rk.androidtutorials.java.databinding.FragmentSameCodeBinding;
15+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1716
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1817
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
1918
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
import com.d4rk.androidtutorials.java.ads.AdUtils;
2119

2220
import java.io.BufferedReader;
2321
import java.io.IOException;
@@ -26,13 +24,17 @@
2624

2725
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2826

29-
public class ButtonsTabCodeFragment extends Fragment {
27+
public class ButtonsTabCodeFragment extends NoCodeAdFragment<FragmentSameCodeBinding> {
3028

3129
@Override
32-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
33-
FragmentSameCodeBinding binding = FragmentSameCodeBinding.inflate(inflater, container, false);
30+
@NonNull
31+
protected FragmentSameCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
32+
return FragmentSameCodeBinding.inflate(inflater, container, false);
33+
}
34+
35+
@Override
36+
protected void onBindingCreated(@NonNull FragmentSameCodeBinding binding, Bundle savedInstanceState) {
3437
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
35-
AdUtils.loadBanner(binding.adView);
3638

3739
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
3840
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
@@ -51,7 +53,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5153
Log.e("ButtonsTabCode", "Error reading code", e);
5254
}
5355
binding.textViewWarning.setText(R.string.same_code_buttons);
54-
return binding.getRoot();
5556
}
56-
5757
}
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.clocks.clock.tabs;
22

3-
import android.os.Bundle;
43
import android.view.LayoutInflater;
5-
import android.view.View;
64
import android.view.ViewGroup;
75

86
import androidx.annotation.NonNull;
9-
import androidx.fragment.app.Fragment;
107

118
import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding;
12-
import com.d4rk.androidtutorials.java.ads.AdUtils;
9+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1310

14-
public class ClockTabCodeFragment extends Fragment {
11+
public class ClockTabCodeFragment extends NoCodeAdFragment<FragmentNoCodeBinding> {
1512
@Override
16-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
17-
com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false);
18-
AdUtils.loadBanner(binding.adView);
19-
return binding.getRoot();
13+
@NonNull
14+
protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
15+
return FragmentNoCodeBinding.inflate(inflater, container, false);
2016
}
2117
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
import android.os.Bundle;
66
import android.util.Log;
77
import android.view.LayoutInflater;
8-
import android.view.View;
98
import android.view.ViewGroup;
109

1110
import androidx.annotation.NonNull;
12-
import androidx.fragment.app.Fragment;
1311
import androidx.preference.PreferenceManager;
1412

1513
import com.d4rk.androidtutorials.java.R;
1614
import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding;
15+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1716
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1817
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
1918
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
import com.d4rk.androidtutorials.java.ads.AdUtils;
2119

2220
import java.io.BufferedReader;
2321
import java.io.IOException;
@@ -29,13 +27,17 @@
2927
/**
3028
* Shows the Java implementation for the Room example.
3129
*/
32-
public class RoomTabCodeFragment extends Fragment {
30+
public class RoomTabCodeFragment extends NoCodeAdFragment<FragmentCodeBinding> {
3331

3432
@Override
35-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36-
FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false);
33+
@NonNull
34+
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
35+
return FragmentCodeBinding.inflate(inflater, container, false);
36+
}
37+
38+
@Override
39+
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
3740
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
38-
AdUtils.loadBanner(binding.adView);
3941

4042
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
4143
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
@@ -53,7 +55,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5355
} catch (IOException e) {
5456
Log.e("RoomTabCode", "Error reading code", e);
5557
}
56-
return binding.getRoot();
5758
}
5859
}
5960

Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.linear.tabs;
22

3-
import android.os.Bundle;
43
import android.view.LayoutInflater;
5-
import android.view.View;
64
import android.view.ViewGroup;
75

86
import androidx.annotation.NonNull;
9-
import androidx.fragment.app.Fragment;
107

118
import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding;
12-
import com.d4rk.androidtutorials.java.ads.AdUtils;
9+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1310

14-
public class LinearLayoutTabCodeFragment extends Fragment {
11+
public class LinearLayoutTabCodeFragment extends NoCodeAdFragment<FragmentNoCodeBinding> {
1512
@Override
16-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
17-
com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false);
18-
AdUtils.loadBanner(binding.adView);
19-
return binding.getRoot();
13+
@NonNull
14+
protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
15+
return FragmentNoCodeBinding.inflate(inflater, container, false);
2016
}
2117
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.relative.tabs;
22

3-
import android.os.Bundle;
43
import android.view.LayoutInflater;
5-
import android.view.View;
64
import android.view.ViewGroup;
75

86
import androidx.annotation.NonNull;
9-
import androidx.fragment.app.Fragment;
107

118
import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding;
12-
import com.d4rk.androidtutorials.java.ads.AdUtils;
9+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1310

14-
public class RelativeLayoutTabCodeFragment extends Fragment {
11+
public class RelativeLayoutTabCodeFragment extends NoCodeAdFragment<FragmentNoCodeBinding> {
1512
@Override
16-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
17-
com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false);
18-
AdUtils.loadBanner(binding.adView);
19-
return binding.getRoot();
13+
@NonNull
14+
protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
15+
return FragmentNoCodeBinding.inflate(inflater, container, false);
2016
}
2117
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.table.tabs;
22

3-
import android.os.Bundle;
43
import android.view.LayoutInflater;
5-
import android.view.View;
64
import android.view.ViewGroup;
75

86
import androidx.annotation.NonNull;
9-
import androidx.fragment.app.Fragment;
107

118
import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding;
12-
import com.d4rk.androidtutorials.java.ads.AdUtils;
9+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1310

14-
public class TableLayoutTabCodeFragment extends Fragment {
11+
public class TableLayoutTabCodeFragment extends NoCodeAdFragment<FragmentNoCodeBinding> {
1512
@Override
16-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
17-
com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false);
18-
AdUtils.loadBanner(binding.adView);
19-
return binding.getRoot();
13+
@NonNull
14+
protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
15+
return FragmentNoCodeBinding.inflate(inflater, container, false);
2016
}
2117
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/tabs/RetrofitTabCodeFragment.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
import android.os.Bundle;
66
import android.util.Log;
77
import android.view.LayoutInflater;
8-
import android.view.View;
98
import android.view.ViewGroup;
109

1110
import androidx.annotation.NonNull;
12-
import androidx.fragment.app.Fragment;
1311
import androidx.preference.PreferenceManager;
1412

1513
import com.d4rk.androidtutorials.java.R;
1614
import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding;
15+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1716
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1817
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
1918
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
import com.d4rk.androidtutorials.java.ads.AdUtils;
2119

2220
import java.io.BufferedReader;
2321
import java.io.IOException;
@@ -29,13 +27,17 @@
2927
/**
3028
* Shows the Java implementation for the Retrofit example.
3129
*/
32-
public class RetrofitTabCodeFragment extends Fragment {
30+
public class RetrofitTabCodeFragment extends NoCodeAdFragment<FragmentCodeBinding> {
3331

3432
@Override
35-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36-
FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false);
33+
@NonNull
34+
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
35+
return FragmentCodeBinding.inflate(inflater, container, false);
36+
}
37+
38+
@Override
39+
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
3740
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
38-
AdUtils.loadBanner(binding.adView);
3941

4042
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
4143
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
@@ -53,6 +55,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5355
} catch (IOException e) {
5456
Log.e("RetrofitTabCode", "Error reading code", e);
5557
}
56-
return binding.getRoot();
5758
}
5859
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/progress/progressbar/tabs/ProgressBarTabCodeFragment.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
import android.os.Bundle;
66
import android.util.Log;
77
import android.view.LayoutInflater;
8-
import android.view.View;
98
import android.view.ViewGroup;
109

1110
import androidx.annotation.NonNull;
12-
import androidx.fragment.app.Fragment;
1311
import androidx.preference.PreferenceManager;
1412

1513
import com.d4rk.androidtutorials.java.R;
1614
import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding;
15+
import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment;
1716
import com.d4rk.androidtutorials.java.utils.CodeHighlighter;
1817
import com.d4rk.androidtutorials.java.utils.CodeViewUtils;
1918
import com.d4rk.androidtutorials.java.utils.FontManager;
20-
import com.d4rk.androidtutorials.java.ads.AdUtils;
2119

2220
import java.io.BufferedReader;
2321
import java.io.IOException;
@@ -26,13 +24,17 @@
2624

2725
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
2826

29-
public class ProgressBarTabCodeFragment extends Fragment {
27+
public class ProgressBarTabCodeFragment extends NoCodeAdFragment<FragmentCodeBinding> {
3028

3129
@Override
32-
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
33-
FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false);
30+
@NonNull
31+
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
32+
return FragmentCodeBinding.inflate(inflater, container, false);
33+
}
34+
35+
@Override
36+
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
3437
new FastScrollerBuilder(binding.scrollView).useMd2Style().build();
35-
AdUtils.loadBanner(binding.adView);
3638

3739
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
3840
Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs);
@@ -50,7 +52,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5052
} catch (IOException e) {
5153
Log.e("ProgressBarTabCode", "Error reading code", e);
5254
}
53-
return binding.getRoot();
5455
}
55-
5656
}

0 commit comments

Comments
 (0)