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
17 changes: 16 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,21 @@
android:exported="false"
android:label="@string/table_layout"
android:parentActivityName=".ui.screens.main.MainActivity" />
<activity
android:name=".ui.screens.android.lessons.layouts.constraint.ConstraintLayoutActivity"
android:exported="false"
android:label="@string/constraint_layout"
android:parentActivityName=".ui.screens.main.MainActivity" />
<activity
android:name=".ui.screens.android.lessons.lists.recyclerview.RecyclerViewActivity"
android:exported="false"
android:label="@string/recycler_view"
android:parentActivityName=".ui.screens.main.MainActivity" />
<activity
android:name=".ui.screens.android.lessons.architecture.viewmodel.ViewModelActivity"
android:exported="false"
android:label="@string/view_model"
android:parentActivityName=".ui.screens.main.MainActivity" />
<activity
android:name=".ui.screens.android.lessons.views.grid.GirdViewActivity"
android:exported="false"
Expand Down Expand Up @@ -341,4 +356,4 @@
android:name="google_analytics_default_allow_ad_personalization_signals"
android:value="eu_consent_policy" />
</application>
</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class CounterViewModel extends ViewModel {

private final MutableLiveData<Integer> counter = new MutableLiveData<>(0);

public LiveData<Integer> getCounter() {
return counter;
}

public void incrementCounter() {
Integer currentValue = counter.getValue();
if (currentValue == null) {
currentValue = 0;
}
counter.setValue(currentValue + 1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;

import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.ActivityViewModelBinding;
import com.d4rk.androidtutorials.java.ui.components.navigation.SyntaxFabActivity;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel.tabs.ViewModelTabCodeFragment;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel.tabs.ViewModelTabLayoutFragment;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.common.LessonCodeTabsActivity;
import com.d4rk.androidtutorials.java.ui.utils.LessonUiUtils;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeHelper;

import java.util.Arrays;

import me.zhanghai.android.fastscroll.FastScrollerBuilder;

public class ViewModelActivity extends SyntaxFabActivity {

private ActivityViewModelBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityViewModelBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
EdgeToEdgeHelper.applyEdgeToEdge(getWindow(), binding.getRoot());
LessonUiUtils.setupDescriptionSection(binding.descriptionSection,
R.string.summary_view_model,
true);

new FastScrollerBuilder(binding.scrollView).useMd2Style().build();

CounterViewModel counterViewModel = new ViewModelProvider(this).get(CounterViewModel.class);
binding.incrementButton.setOnClickListener(view -> counterViewModel.incrementCounter());
counterViewModel.getCounter().observe(this, value ->
binding.counterValue.setText(getString(R.string.view_model_counter_value, value)));

setupSyntaxFab(binding.floatingButtonShowSyntax, () -> startActivity(
LessonCodeTabsActivity.createIntent(
this,
R.string.view_model,
Arrays.asList(
LessonCodeTabsActivity.PageSpec.of(
ViewModelTabCodeFragment.class,
getString(R.string.code_java)
),
LessonCodeTabsActivity.PageSpec.of(
ViewModelTabLayoutFragment.class,
getString(R.string.layout_xml)
)
)
)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel.tabs;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;

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.CodeViewUtils;

public class ViewModelTabCodeFragment extends NoCodeAdFragment<FragmentCodeBinding> {

@Override
@NonNull
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
return FragmentCodeBinding.inflate(inflater, container, false);
}

@Override
@NonNull
protected View getAdView(@NonNull FragmentCodeBinding binding) {
return binding.adView;
}

@Override
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
CodeViewUtils.populateFromRawResource(
binding.codeView,
R.raw.text_view_model_java,
CodeViewUtils.HighlightMode.JAVA,
"ViewModelTabCode");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.architecture.viewmodel.tabs;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;

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.CodeViewUtils;

public class ViewModelTabLayoutFragment extends NoCodeAdFragment<FragmentCodeBinding> {

@Override
@NonNull
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
return FragmentCodeBinding.inflate(inflater, container, false);
}

@Override
@NonNull
protected View getAdView(@NonNull FragmentCodeBinding binding) {
return binding.adView;
}

@Override
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
CodeViewUtils.populateFromRawResource(
binding.codeView,
R.raw.text_view_model_xml,
CodeViewUtils.HighlightMode.XML,
"ViewModelTabLayout");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.constraint;

import android.os.Bundle;

import androidx.annotation.Nullable;

import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.ActivityConstraintLayoutBinding;
import com.d4rk.androidtutorials.java.ui.components.navigation.SyntaxFabActivity;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.common.LessonCodeTabsActivity;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.constraint.tabs.ConstraintLayoutTabCodeFragment;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.constraint.tabs.ConstraintLayoutTabLayoutFragment;
import com.d4rk.androidtutorials.java.ui.utils.LessonUiUtils;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeHelper;

import java.util.Arrays;

import me.zhanghai.android.fastscroll.FastScrollerBuilder;

public class ConstraintLayoutActivity extends SyntaxFabActivity {

private ActivityConstraintLayoutBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityConstraintLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
EdgeToEdgeHelper.applyEdgeToEdge(getWindow(), binding.getRoot());
LessonUiUtils.setupDescriptionSection(binding.descriptionSection,
R.string.summary_constraint_layout,
true);

new FastScrollerBuilder(binding.scrollView).useMd2Style().build();

setupSyntaxFab(binding.floatingButtonShowSyntax, () -> startActivity(
LessonCodeTabsActivity.createIntent(
this,
R.string.constraint_layout,
Arrays.asList(
LessonCodeTabsActivity.PageSpec.of(
ConstraintLayoutTabCodeFragment.class,
getString(R.string.code_java)
),
LessonCodeTabsActivity.PageSpec.of(
ConstraintLayoutTabLayoutFragment.class,
getString(R.string.layout_xml)
)
)
)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.constraint.tabs;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;

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.CodeViewUtils;

public class ConstraintLayoutTabCodeFragment extends NoCodeAdFragment<FragmentCodeBinding> {

@Override
@NonNull
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
return FragmentCodeBinding.inflate(inflater, container, false);
}

@Override
@NonNull
protected View getAdView(@NonNull FragmentCodeBinding binding) {
return binding.adView;
}

@Override
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
CodeViewUtils.populateFromRawResource(
binding.codeView,
R.raw.text_constraint_layout_java,
CodeViewUtils.HighlightMode.JAVA,
"ConstraintLayoutTabCode");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.layouts.constraint.tabs;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;

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.CodeViewUtils;

public class ConstraintLayoutTabLayoutFragment extends NoCodeAdFragment<FragmentCodeBinding> {

@Override
@NonNull
protected FragmentCodeBinding inflateBinding(@NonNull LayoutInflater inflater, ViewGroup container) {
return FragmentCodeBinding.inflate(inflater, container, false);
}

@Override
@NonNull
protected View getAdView(@NonNull FragmentCodeBinding binding) {
return binding.adView;
}

@Override
protected void onBindingCreated(@NonNull FragmentCodeBinding binding, Bundle savedInstanceState) {
CodeViewUtils.populateFromRawResource(
binding.codeView,
R.raw.text_constraint_layout_xml,
CodeViewUtils.HighlightMode.XML,
"ConstraintLayoutTabLayout");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.d4rk.androidtutorials.java.ui.screens.android.lessons.lists.recyclerview;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;

import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.ActivityRecyclerViewBinding;
import com.d4rk.androidtutorials.java.ui.components.navigation.SyntaxFabActivity;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.common.LessonCodeTabsActivity;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.lists.recyclerview.tabs.RecyclerViewTabCodeFragment;
import com.d4rk.androidtutorials.java.ui.screens.android.lessons.lists.recyclerview.tabs.RecyclerViewTabLayoutFragment;
import com.d4rk.androidtutorials.java.ui.utils.LessonUiUtils;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeHelper;

import java.util.Arrays;
import java.util.List;

import me.zhanghai.android.fastscroll.FastScrollerBuilder;

public class RecyclerViewActivity extends SyntaxFabActivity {

private ActivityRecyclerViewBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityRecyclerViewBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
EdgeToEdgeHelper.applyEdgeToEdge(getWindow(), binding.getRoot());
LessonUiUtils.setupDescriptionSection(binding.descriptionSection,
R.string.summary_recycler_view,
true);

new FastScrollerBuilder(binding.scrollView).useMd2Style().build();

binding.recyclerViewPreview.setLayoutManager(new LinearLayoutManager(this));
binding.recyclerViewPreview.setAdapter(new RecyclerViewPreviewAdapter(getLessonTitles()));

setupSyntaxFab(binding.floatingButtonShowSyntax, () -> startActivity(
LessonCodeTabsActivity.createIntent(
this,
R.string.recycler_view,
Arrays.asList(
LessonCodeTabsActivity.PageSpec.of(
RecyclerViewTabCodeFragment.class,
getString(R.string.code_java)
),
LessonCodeTabsActivity.PageSpec.of(
RecyclerViewTabLayoutFragment.class,
getString(R.string.layout_xml)
)
)
)));
}

private List<String> getLessonTitles() {
return Arrays.asList(
getString(R.string.linear_layout),
getString(R.string.constraint_layout),
getString(R.string.recycler_view),
getString(R.string.view_model)
);
}
}
Loading
Loading