id.zelory.codepolitan.ui.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for id.zelory.codepolitan.ui.MainActivity.java

Source

/*
 * Copyright (c) 2015 Zelory.
 *
 *  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 id.zelory.codepolitan.ui;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import id.zelory.benih.BenihActivity;
import id.zelory.benih.fragment.BenihFragment;
import id.zelory.benih.util.BenihBus;
import id.zelory.benih.util.BenihPreferenceUtils;
import id.zelory.codepolitan.R;
import id.zelory.codepolitan.controller.event.ReloadEvent;
import id.zelory.codepolitan.ui.adapter.MainPagerAdapter;
import id.zelory.codepolitan.ui.adapter.MenuSpinnerAdapter;
import id.zelory.codepolitan.ui.fragment.AbstractHomeFragment;
import id.zelory.codepolitan.ui.fragment.CategoryFragment;
import id.zelory.codepolitan.ui.fragment.HomeFragment;
import id.zelory.codepolitan.ui.fragment.KomikFragment;
import id.zelory.codepolitan.ui.fragment.MemeFragment;
import id.zelory.codepolitan.ui.fragment.NewsFragment;
import id.zelory.codepolitan.ui.fragment.QuotesFragment;
import id.zelory.codepolitan.ui.fragment.SettingFragment;
import id.zelory.codepolitan.ui.fragment.TagFragment;
import id.zelory.codepolitan.ui.fragment.UserFragment;
import timber.log.Timber;

/**
 * Created on : July 28, 2015
 * Author     : zetbaitsu
 * Name       : Zetra
 * Email      : zetra@mail.ugm.ac.id
 * GitHub     : https://github.com/zetbaitsu
 * LinkedIn   : https://id.linkedin.com/in/zetbaitsu
 */
public class MainActivity extends BenihActivity
        implements TabLayout.OnTabSelectedListener, AdapterView.OnItemSelectedListener {
    @Bind(R.id.view_pager)
    ViewPager viewPager;
    @Bind(R.id.tab_layout)
    TabLayout tabLayout;
    @Bind(R.id.toolbar)
    Toolbar toolbar;
    @Bind(R.id.spinner_nav)
    Spinner spinner;
    private boolean doubleBackToExitPressedOnce = false;

    @Override
    protected int getActivityView() {
        return R.layout.activity_main;
    }

    @Override
    protected void onViewReady(Bundle bundle) {
        BenihPreferenceUtils.putBoolean(this, "loaded", true);

        BenihBus.pluck().receive().subscribe(o -> {
            if (o instanceof ReloadEvent) {
                onReload();
            }
        });
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        setUpViewPager();
        setUpTabLayout();
        spinner.setAdapter(new MenuSpinnerAdapter(this));
        spinner.setOnItemSelectedListener(this);
    }

    private void setUpViewPager() {
        List<BenihFragment> fragments = new ArrayList<>();
        fragments.add(new HomeFragment());
        fragments.add(new CategoryFragment());
        fragments.add(new TagFragment());
        fragments.add(new UserFragment());
        fragments.add(new SettingFragment());

        MainPagerAdapter adapter = new MainPagerAdapter(getSupportFragmentManager(), fragments);
        viewPager.setAdapter(adapter);
    }

    private void setUpTabLayout() {
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.getTabAt(0).setIcon(R.drawable.home);
        tabLayout.getTabAt(1).setIcon(R.drawable.category);
        tabLayout.getTabAt(2).setIcon(R.drawable.tag);
        tabLayout.getTabAt(3).setIcon(R.drawable.user);
        tabLayout.getTabAt(4).setIcon(R.drawable.setting);
        tabLayout.setOnTabSelectedListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (tabLayout.getSelectedTabPosition() == 0) {
            toolbar.getMenu().clear();
            toolbar.inflateMenu(R.menu.menu_main);
            new Handler().postDelayed(() -> BenihBus.pluck().send(toolbar.getMenu()), 800);
        }
        return true;
    }

    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        switch (tab.getPosition()) {
        case 0:
            break;
        case 1:
            getSupportActionBar().setTitle("Category");
            break;
        case 2:
            getSupportActionBar().setTitle("Tag");
            break;
        case 3:
            getSupportActionBar().setTitle("Yours");
            break;
        case 4:
            getSupportActionBar().setTitle("Settings");
            break;
        }

        if (tab.getPosition() == 0) {
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            spinner.setVisibility(View.VISIBLE);
            toolbar.getMenu().clear();
            toolbar.inflateMenu(R.menu.menu_main);
            BenihBus.pluck().send(toolbar.getMenu());
        } else {
            spinner.setVisibility(View.GONE);
            getSupportActionBar().setDisplayShowTitleEnabled(true);
            toolbar.getMenu().clear();
        }

        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        HomeFragment homeFragment = (HomeFragment) ((MainPagerAdapter) viewPager.getAdapter()).getItem(0);

        try {
            AbstractHomeFragment fragment = (AbstractHomeFragment) homeFragment.getChildFragmentManager()
                    .getFragments().get(0);

            if (fragment.isRefreshing()) {
                fragment.dismissLoading();
                fragment.onDestroyView();
                fragment.onDestroy();
                fragment.onDetach();
                new Handler().postDelayed(() -> switchFragment(homeFragment, position), 500);
            } else {
                switchFragment(homeFragment, position);
            }
        } catch (Exception e) {
            Timber.e(e.getMessage());
            switchFragment(homeFragment, position);
        }
    }

    private void switchFragment(HomeFragment homeFragment, int position) {
        switch (position) {
        case 0:
            homeFragment.replace(R.id.fragment_home_container, new NewsFragment(), false);
            break;
        case 1:
            homeFragment.replace(R.id.fragment_home_container, new KomikFragment(), false);
            break;
        case 2:
            homeFragment.replace(R.id.fragment_home_container, new MemeFragment(), false);
            break;
        case 3:
            homeFragment.replace(R.id.fragment_home_container, new QuotesFragment(), false);
            break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    public void onReload() {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);
        finish();
    }

    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }

        doubleBackToExitPressedOnce = true;
        Snackbar.make(viewPager, "Please click BACK again to exit.", Snackbar.LENGTH_SHORT).show();

        new Handler().postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
    }
}