szkolny/material-about-library/src/main/java/com/danielstone/materialaboutlibrary/MaterialAboutActivity.java

187 lines
6.4 KiB
Java
Raw Normal View History

package com.danielstone.materialaboutlibrary;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.appbar.AppBarLayout;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import androidx.appcompat.widget.Toolbar;
import android.util.TypedValue;
import android.view.MenuItem;
import com.danielstone.materialaboutlibrary.adapters.MaterialAboutListAdapter;
import com.danielstone.materialaboutlibrary.model.MaterialAboutList;
import com.danielstone.materialaboutlibrary.util.DefaultViewTypeManager;
import com.danielstone.materialaboutlibrary.util.ViewTypeManager;
import java.lang.ref.WeakReference;
public abstract class MaterialAboutActivity extends AppCompatActivity {
private MaterialAboutList list = new MaterialAboutList.Builder().build();
private Toolbar toolbar;
private RecyclerView recyclerView;
private MaterialAboutListAdapter adapter;
@NonNull
protected abstract MaterialAboutList getMaterialAboutList(@NonNull Context context);
@Nullable
protected abstract CharSequence getActivityTitle();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
verifyAttributesExist();
setContentView(R.layout.mal_material_about_activity);
CharSequence title = getActivityTitle();
if (title == null)
setTitle(R.string.mal_title_about);
else
setTitle(title);
assignViews();
initViews();
ListTask task = new ListTask(this);
task.execute();
}
private void verifyAttributesExist() {
TypedValue typedValue = new TypedValue();
boolean malColorPrimaryExists =
getTheme().resolveAttribute(R.attr.mal_color_primary, typedValue, true);
boolean malColorSecondaryExists =
getTheme().resolveAttribute(R.attr.mal_color_secondary, typedValue, true);
if (!malColorPrimaryExists || !malColorSecondaryExists) {
throw new IllegalStateException(String.format("The current theme doesn't provide %s " +
"and/or %s. Please use a theme provided by the library or an extension.",
getResources().getResourceEntryName(R.attr.mal_color_primary),
getResources().getResourceEntryName(R.attr.mal_color_secondary)));
}
}
private void assignViews() {
toolbar = (Toolbar) findViewById(R.id.mal_toolbar);
recyclerView = (RecyclerView) findViewById(R.id.mal_recyclerview);
recyclerView.setAlpha(0f);
recyclerView.setTranslationY(20);
}
private void initViews() {
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
adapter = new MaterialAboutListAdapter(getViewTypeManager());
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
}
@NonNull
protected ViewTypeManager getViewTypeManager() {
return new DefaultViewTypeManager();
}
@NonNull
protected MaterialAboutList getList() {
return list;
}
protected boolean shouldAnimate() {
return true;
}
protected void refreshMaterialAboutList() {
setMaterialAboutList(list);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
private void onTaskFinished(@Nullable MaterialAboutList materialAboutList) {
if (materialAboutList != null) {
list = materialAboutList;
adapter.setData(list.getCards());
if (shouldAnimate()) {
recyclerView.animate()
.alpha(1f)
.translationY(0f)
.setDuration(600)
.setInterpolator(new FastOutSlowInInterpolator()).start();
} else {
recyclerView.setAlpha(1f);
recyclerView.setTranslationY(0f);
}
} else {
finish();//?? why we remain here anyway?
}
}
protected void setMaterialAboutList(MaterialAboutList materialAboutList) {
list = materialAboutList;
adapter.setData(list.getCards());
}
protected void setScrollToolbar(boolean scrollToolbar) {
if (toolbar != null) {
AppBarLayout.LayoutParams params =
(AppBarLayout.LayoutParams) toolbar.getLayoutParams();
if (scrollToolbar) {
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
} else {
params.setScrollFlags(0);
}
}
}
private static class ListTask extends AsyncTask<String, String, MaterialAboutList> {
private WeakReference<MaterialAboutActivity> context;
ListTask(MaterialAboutActivity context) {
this.context = new WeakReference<>(context);
}
@Override
protected MaterialAboutList doInBackground(String... params) {
return isCancelled() || context.get() == null ? null : context.get().getMaterialAboutList(context.get());
}
@Override
protected void onPostExecute(MaterialAboutList materialAboutList) {
super.onPostExecute(materialAboutList);
if (context.get() != null) {
if (!context.get().isFinishing()) {
context.get().onTaskFinished(materialAboutList);
}
}
context = null;
}
}
}