com.andremion.heroes.ui.character.view.CharacterActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.andremion.heroes.ui.character.view.CharacterActivity.java

Source

/*
 * Copyright (c) 2017. Andr Mion
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.andremion.heroes.ui.character.view;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSnapHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SnapHelper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;

import com.andremion.heroes.R;
import com.andremion.heroes.api.data.CharacterVO;
import com.andremion.heroes.api.data.SectionVO;
import com.andremion.heroes.databinding.ActivityCharacterBinding;
import com.andremion.heroes.databinding.ItemListSectionBinding;
import com.andremion.heroes.ui.adapter.ArrayAdapter;
import com.andremion.heroes.ui.character.CharacterContract;
import com.andremion.heroes.ui.character.CharacterPresenter;
import com.andremion.heroes.ui.search.view.SearchActivity;
import com.andremion.heroes.ui.section.view.SectionActivity;
import com.andremion.heroes.ui.util.PagerSharedElementCallback;

import java.util.List;

public class CharacterActivity extends AppCompatActivity implements CharacterContract.View,
        ArrayAdapter.OnItemClickListener<SectionVO, SectionAdapter.ViewHolder, ItemListSectionBinding> {

    public static final String EXTRA_CHARACTER = CharacterActivity.class.getPackage().getName()
            + ".extra.CHARACTER";

    public static void start(@NonNull Activity activity, @NonNull View characterView,
            @NonNull CharacterVO character) {

        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, characterView,
                ViewCompat.getTransitionName(characterView));
        Intent intent = new Intent(activity, CharacterActivity.class);
        intent.putExtra(EXTRA_CHARACTER, character);

        ActivityCompat.startActivity(activity, intent, options.toBundle());
    }

    public static PendingIntent getPendingIntent(@NonNull Context context, @NonNull CharacterVO character, int id) {

        Intent intent = new Intent(context, CharacterActivity.class);
        intent.setAction(Integer.toString(id)); // Used to update all PendingIntent extras data for each widget
        intent.putExtra(EXTRA_CHARACTER, character);

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addNextIntentWithParentStack(intent); // Return to MainActivity

        return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private ActivityCharacterBinding mBinding;
    private CharacterPresenter mPresenter;
    private PagerSharedElementCallback mSharedElementCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_character);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_character);
        setSupportActionBar(mBinding.toolbar);
        //noinspection ConstantConditions
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        setupSectionView(mBinding.recyclerComics, SectionVO.TYPE_COMIC);
        setupSectionView(mBinding.recyclerSeries, SectionVO.TYPE_SERIES);
        setupSectionView(mBinding.recyclerStories, SectionVO.TYPE_STORY);
        setupSectionView(mBinding.recyclerEvents, SectionVO.TYPE_EVENT);

        CharacterVO character = (CharacterVO) getIntent().getExtras().get(EXTRA_CHARACTER);
        assert character != null;

        if (savedInstanceState == null) {
            mPresenter = new CharacterPresenter(character);
        } else {
            mPresenter = (CharacterPresenter) getLastCustomNonConfigurationInstance();
        }
        mPresenter.attachView(this);

        mBinding.setPresenter(mPresenter);
    }

    private void setupSectionView(RecyclerView recyclerView, @SectionVO.Type int type) {
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
        recyclerView.setNestedScrollingEnabled(false);
        recyclerView.setHasFixedSize(true);
        SectionAdapter adapter = new SectionAdapter(this, type, this);
        recyclerView.setAdapter(adapter);
        SnapHelper snapHelper = new LinearSnapHelper();
        snapHelper.attachToRecyclerView(recyclerView);
    }

    @Nullable
    @Override
    public Intent getParentActivityIntent() {
        //noinspection ConstantConditions
        return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    }

    @Override
    public Object onRetainCustomNonConfigurationInstance() {
        return mPresenter;
    }

    @Override
    protected void onDestroy() {
        mPresenter.detachView();
        super.onDestroy();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_character, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (R.id.action_search == item.getItemId()) {
            mPresenter.searchClick();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onActivityReenter(int resultCode, Intent data) {

        int type = SectionActivity.getType(resultCode, data);
        final int position = SectionActivity.getPosition(resultCode, data);

        final RecyclerView recyclerView;
        switch (type) {
        case SectionVO.TYPE_COMIC:
            recyclerView = mBinding.recyclerComics;
            break;
        case SectionVO.TYPE_SERIES:
            recyclerView = mBinding.recyclerSeries;
            break;
        case SectionVO.TYPE_STORY:
            recyclerView = mBinding.recyclerStories;
            break;
        case SectionVO.TYPE_EVENT:
            recyclerView = mBinding.recyclerEvents;
            break;
        default:
            recyclerView = null;
        }

        if (recyclerView == null) {
            return;
        }

        if (position != SectionActivity.EXTRA_NOT_FOUND) {
            recyclerView.scrollToPosition(position);
        }

        mSharedElementCallback = new PagerSharedElementCallback();
        setExitSharedElementCallback(mSharedElementCallback);

        //noinspection ConstantConditions
        supportPostponeEnterTransition();
        recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);

                RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(position);
                if (holder instanceof SectionAdapter.ViewHolder) {
                    SectionAdapter.ViewHolder mediaViewHolder = (SectionAdapter.ViewHolder) holder;
                    // TODO: 01/02/2017 Change findViewById(R.id.image) for a view reference
                    mSharedElementCallback.setSharedElementViews(mediaViewHolder.itemView.findViewById(R.id.image));
                }

                supportStartPostponedEnterTransition();

                return true;
            }
        });

    }

    @Override
    public void onItemClick(ArrayAdapter<SectionVO, SectionAdapter.ViewHolder> adapter,
            ItemListSectionBinding binding, int position) {
        SectionAdapter sectionAdapter = (SectionAdapter) adapter;
        mPresenter.sectionClick(sectionAdapter.getType(), binding.image, adapter.getItems(), position);
    }

    @Override
    public void showAttribution(String attribution) {
        mBinding.setAttribution(attribution);
    }

    @Override
    public void showCharacter(@NonNull CharacterVO character) {
        mBinding.setCharacter(character);
    }

    @Override
    public void showComics(@NonNull List<SectionVO> entries) {
        SectionAdapter adapter = (SectionAdapter) mBinding.recyclerComics.getAdapter();
        adapter.setItems(entries);
    }

    @Override
    public void showSeries(@NonNull List<SectionVO> entries) {
        SectionAdapter adapter = (SectionAdapter) mBinding.recyclerSeries.getAdapter();
        adapter.setItems(entries);
    }

    @Override
    public void showStories(@NonNull List<SectionVO> entries) {
        SectionAdapter adapter = (SectionAdapter) mBinding.recyclerStories.getAdapter();
        adapter.setItems(entries);
    }

    @Override
    public void showEvents(@NonNull List<SectionVO> entries) {
        SectionAdapter adapter = (SectionAdapter) mBinding.recyclerEvents.getAdapter();
        adapter.setItems(entries);
    }

    @Override
    public void showError(@NonNull Throwable e) {
        Snackbar.make(mBinding.toolbarLayout, e.getMessage(), Snackbar.LENGTH_LONG).show();
    }

    @Override
    public void openSection(int type, @NonNull View heroView, String attribution, @NonNull List<SectionVO> entries,
            int position) {
        SectionActivity.start(this, type, heroView, attribution, entries, position);
    }

    @Override
    public void openLink(@NonNull String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
    }

    @Override
    public void openSearch() {
        startActivity(new Intent(this, SearchActivity.class));
    }
}