diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/NoCodeAdFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/NoCodeAdFragment.java new file mode 100644 index 00000000..67830a48 --- /dev/null +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/components/NoCodeAdFragment.java @@ -0,0 +1,61 @@ +package com.d4rk.androidtutorials.java.ui.components; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewbinding.ViewBinding; + +import com.d4rk.androidtutorials.java.R; +import com.d4rk.androidtutorials.java.ads.AdUtils; + +/** + * Generic fragment that inflates a provided ViewBinding and loads a banner ad. + * + * @param The type of ViewBinding associated with this fragment. + */ +public abstract class NoCodeAdFragment extends Fragment { + protected T binding; + + /** + * Inflate the ViewBinding for this fragment. + * + * @param inflater LayoutInflater to use. + * @param container Optional container. + * @return The inflated binding. + */ + @NonNull + protected abstract T inflateBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container); + + /** + * Called after the binding has been created and the banner ad loaded. + * Subclasses can override to perform additional setup. + * + * @param binding The binding instance. + * @param savedInstanceState Saved instance state. + */ + protected void onBindingCreated(@NonNull T binding, @Nullable Bundle savedInstanceState) { + // default no-op + } + + @Override + @NonNull + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = inflateBinding(inflater, container); + View adView = binding.getRoot().findViewById(R.id.ad_view); + AdUtils.loadBanner(adView); + onBindingCreated(binding, savedInstanceState); + return binding.getRoot(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/buttons/buttons/tabs/ButtonsTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/buttons/buttons/tabs/ButtonsTabCodeFragment.java index d91cdadc..265756fc 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/buttons/buttons/tabs/ButtonsTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/buttons/buttons/tabs/ButtonsTabCodeFragment.java @@ -5,19 +5,17 @@ import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.FragmentSameCodeBinding; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; import com.d4rk.androidtutorials.java.utils.CodeHighlighter; import com.d4rk.androidtutorials.java.utils.CodeViewUtils; import com.d4rk.androidtutorials.java.utils.FontManager; -import com.d4rk.androidtutorials.java.ads.AdUtils; import java.io.BufferedReader; import java.io.IOException; @@ -26,13 +24,17 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder; -public class ButtonsTabCodeFragment extends Fragment { +public class ButtonsTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - FragmentSameCodeBinding binding = FragmentSameCodeBinding.inflate(inflater, container, false); + @NonNull + protected FragmentSameCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentSameCodeBinding.inflate(inflater, container, false); + } + + @Override + protected void onBindingCreated(@NonNull FragmentSameCodeBinding binding, Bundle savedInstanceState) { new FastScrollerBuilder(binding.scrollView).useMd2Style().build(); - AdUtils.loadBanner(binding.adView); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs); @@ -51,7 +53,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Log.e("ButtonsTabCode", "Error reading code", e); } binding.textViewWarning.setText(R.string.same_code_buttons); - return binding.getRoot(); } - } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/clocks/clock/tabs/ClockTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/clocks/clock/tabs/ClockTabCodeFragment.java index bb47fa2e..74c61e42 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/clocks/clock/tabs/ClockTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/clocks/clock/tabs/ClockTabCodeFragment.java @@ -1,21 +1,17 @@ package com.d4rk.androidtutorials.java.ui.screens.android.lessons.clocks.clock.tabs; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding; -import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; -public class ClockTabCodeFragment extends Fragment { +public class ClockTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false); - AdUtils.loadBanner(binding.adView); - return binding.getRoot(); + @NonNull + protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentNoCodeBinding.inflate(inflater, container, false); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/data/room/tabs/RoomTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/data/room/tabs/RoomTabCodeFragment.java index cd3c7eb6..5eb643b2 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/data/room/tabs/RoomTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/data/room/tabs/RoomTabCodeFragment.java @@ -5,19 +5,17 @@ import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; import com.d4rk.androidtutorials.java.utils.CodeHighlighter; import com.d4rk.androidtutorials.java.utils.CodeViewUtils; import com.d4rk.androidtutorials.java.utils.FontManager; -import com.d4rk.androidtutorials.java.ads.AdUtils; import java.io.BufferedReader; import java.io.IOException; @@ -29,13 +27,17 @@ /** * Shows the Java implementation for the Room example. */ -public class RoomTabCodeFragment extends Fragment { +public class RoomTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false); + @NonNull + protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentCodeBinding.inflate(inflater, container, false); + } + + @Override + protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) { new FastScrollerBuilder(binding.scrollView).useMd2Style().build(); - AdUtils.loadBanner(binding.adView); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs); @@ -53,7 +55,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } catch (IOException e) { Log.e("RoomTabCode", "Error reading code", e); } - return binding.getRoot(); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/linear/tabs/LinearLayoutTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/linear/tabs/LinearLayoutTabCodeFragment.java index d6102d9c..948ceeab 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/linear/tabs/LinearLayoutTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/linear/tabs/LinearLayoutTabCodeFragment.java @@ -1,21 +1,17 @@ package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.linear.tabs; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding; -import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; -public class LinearLayoutTabCodeFragment extends Fragment { +public class LinearLayoutTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false); - AdUtils.loadBanner(binding.adView); - return binding.getRoot(); + @NonNull + protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentNoCodeBinding.inflate(inflater, container, false); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/relative/tabs/RelativeLayoutTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/relative/tabs/RelativeLayoutTabCodeFragment.java index 0028fadb..8a7b61cd 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/relative/tabs/RelativeLayoutTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/relative/tabs/RelativeLayoutTabCodeFragment.java @@ -1,21 +1,17 @@ package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.relative.tabs; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding; -import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; -public class RelativeLayoutTabCodeFragment extends Fragment { +public class RelativeLayoutTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false); - AdUtils.loadBanner(binding.adView); - return binding.getRoot(); + @NonNull + protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentNoCodeBinding.inflate(inflater, container, false); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/table/tabs/TableLayoutTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/table/tabs/TableLayoutTabCodeFragment.java index 6c481695..75063288 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/table/tabs/TableLayoutTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/layouts/table/tabs/TableLayoutTabCodeFragment.java @@ -1,21 +1,17 @@ package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.table.tabs; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding; -import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; -public class TableLayoutTabCodeFragment extends Fragment { +public class TableLayoutTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false); - AdUtils.loadBanner(binding.adView); - return binding.getRoot(); + @NonNull + protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentNoCodeBinding.inflate(inflater, container, false); } } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/tabs/RetrofitTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/tabs/RetrofitTabCodeFragment.java index ed991d06..1116addf 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/tabs/RetrofitTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/tabs/RetrofitTabCodeFragment.java @@ -5,19 +5,17 @@ import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; import com.d4rk.androidtutorials.java.utils.CodeHighlighter; import com.d4rk.androidtutorials.java.utils.CodeViewUtils; import com.d4rk.androidtutorials.java.utils.FontManager; -import com.d4rk.androidtutorials.java.ads.AdUtils; import java.io.BufferedReader; import java.io.IOException; @@ -29,13 +27,17 @@ /** * Shows the Java implementation for the Retrofit example. */ -public class RetrofitTabCodeFragment extends Fragment { +public class RetrofitTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false); + @NonNull + protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentCodeBinding.inflate(inflater, container, false); + } + + @Override + protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) { new FastScrollerBuilder(binding.scrollView).useMd2Style().build(); - AdUtils.loadBanner(binding.adView); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs); @@ -53,6 +55,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } catch (IOException e) { Log.e("RetrofitTabCode", "Error reading code", e); } - return binding.getRoot(); } } diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/progress/progressbar/tabs/ProgressBarTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/progress/progressbar/tabs/ProgressBarTabCodeFragment.java index 0497aca7..b9d20110 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/progress/progressbar/tabs/ProgressBarTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/progress/progressbar/tabs/ProgressBarTabCodeFragment.java @@ -5,19 +5,17 @@ import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.FragmentCodeBinding; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; import com.d4rk.androidtutorials.java.utils.CodeHighlighter; import com.d4rk.androidtutorials.java.utils.CodeViewUtils; import com.d4rk.androidtutorials.java.utils.FontManager; -import com.d4rk.androidtutorials.java.ads.AdUtils; import java.io.BufferedReader; import java.io.IOException; @@ -26,13 +24,17 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder; -public class ProgressBarTabCodeFragment extends Fragment { +public class ProgressBarTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - FragmentCodeBinding binding = FragmentCodeBinding.inflate(inflater, container, false); + @NonNull + protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentCodeBinding.inflate(inflater, container, false); + } + + @Override + protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) { new FastScrollerBuilder(binding.scrollView).useMd2Style().build(); - AdUtils.loadBanner(binding.adView); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); Typeface monospaceFont = FontManager.getMonospaceFont(requireContext(), prefs); @@ -50,7 +52,5 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } catch (IOException e) { Log.e("ProgressBarTabCode", "Error reading code", e); } - return binding.getRoot(); } - } \ No newline at end of file diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/views/images/tabs/ImagesTabCodeFragment.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/views/images/tabs/ImagesTabCodeFragment.java index bc4eebba..5706d05b 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/views/images/tabs/ImagesTabCodeFragment.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/views/images/tabs/ImagesTabCodeFragment.java @@ -1,21 +1,17 @@ package com.d4rk.androidtutorials.java.ui.screens.android.lessons.views.images.tabs; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding; -import com.d4rk.androidtutorials.java.ads.AdUtils; +import com.d4rk.androidtutorials.java.ui.components.NoCodeAdFragment; -public class ImagesTabCodeFragment extends Fragment { +public class ImagesTabCodeFragment extends NoCodeAdFragment { @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - com.d4rk.androidtutorials.java.databinding.FragmentNoCodeBinding binding = FragmentNoCodeBinding.inflate(inflater, container, false); - AdUtils.loadBanner(binding.adView); - return binding.getRoot(); + @NonNull + protected FragmentNoCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) { + return FragmentNoCodeBinding.inflate(inflater, container, false); } } \ No newline at end of file