com.google.reviewit.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.google.reviewit.MainActivity.java

Source

// Copyright (C) 2016 The Android Open Source Project
//
// 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.google.reviewit;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;

import com.google.reviewit.app.ReviewItBaseActivity;
import com.google.reviewit.util.WidgetUtil;

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

import static com.google.common.base.Preconditions.checkNotNull;

public class MainActivity extends ReviewItBaseActivity {
    private DrawerLayout drawer;
    private ActionBarDrawerToggle toggle;
    private ListView list;
    private List<Item> items;

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

        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
        }

        drawer = (DrawerLayout) findViewById(R.id.drawer);
        list = (ListView) findViewById(R.id.mainList);

        items = new ArrayList<>();
        items.add(new Item(SortChangesFragment.class, R.string.app_menu_sort, R.drawable.ic_star_white_16dp, null));
        items.add(new Item(ReviewChangesFragment.class, R.string.app_menu_review, R.drawable.ic_feedback_white_18dp,
                null));
        items.add(new Item(SettingsFragment.class, R.string.app_menu_settings, R.drawable.ic_settings_white_18dp,
                null));

        list.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return items.size();
            }

            @Override
            public Object getItem(int position) {
                return items.get(position);
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    convertView = ((LayoutInflater) MainActivity.this
                            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.main_list_item,
                                    null);
                }

                Item item = items.get(position);

                ((ImageView) convertView.findViewById(R.id.mainListItemIcon)).setImageResource(item.iconId);
                WidgetUtil.setText(convertView, R.id.mainListItemTitle, getString(item.titleId));

                if (item.count != null) {
                    WidgetUtil.setText(convertView, R.id.mainListItemCounter, item.count.toString());
                } else {
                    convertView.findViewById(R.id.mainListItemCounter).setVisibility(View.GONE);
                }

                return convertView;
            }
        });

        toggle = new ActionBarDrawerToggle(this, drawer, R.string.app_name, R.string.app_name) {
            public void onDrawerClosed(View view) {
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                invalidateOptionsMenu();
            }
        };
        drawer.setDrawerListener(toggle);

        list.setOnItemClickListener(new ListView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                displayView(position);
            }
        });

        if (getApp().getPrefs().showIntro) {
            displayInitialView(new IntroFragment1());
        } else if (savedInstanceState == null) {
            switch (getApp().getPrefs().startScreen) {
            case REVIEW_SCREEN:
                displayInitialView(newFragmentInstance(items.get(1).fragmentClass));
                break;
            case SORT_SCREEN:
            default:
                displayInitialView(newFragmentInstance(items.get(0).fragmentClass));
                break;
            }
        }
    }

    private void displayView(int position) {
        if (position < items.size()) {
            Item item = items.get(position);
            displayView(newFragmentInstance(item.fragmentClass), position);
            return;
        }
        throw new IllegalStateException("view not found: " + position);
    }

    private void displayView(Fragment fragment, int position) {
        displayView(fragment);

        Item item = items.get(position);
        checkNotNull(item);
        list.setItemChecked(position, true);
        list.setSelection(position);
        setTitle(getString(item.titleId));
        drawer.closeDrawer(list);
    }

    private void displayInitialView(Fragment fragment) {
        displayView(fragment, false);
    }

    private void displayView(Fragment fragment) {
        displayView(fragment, true);
    }

    private void displayView(Fragment fragment, boolean addToBackStack) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction t = fragmentManager.beginTransaction().replace(R.id.mainFrame, fragment);

        if (addToBackStack) {
            t.addToBackStack(null);
        }

        t.commit();
    }

    private Fragment newFragmentInstance(Class<? extends Fragment> fragmentClass) {
        try {
            return fragmentClass.newInstance();
        } catch (IllegalAccessException e) {
            throw new IllegalStateException(e);
        } catch (InstantiationException e) {
            throw new IllegalStateException(e);
        }
    }

    public void select(Class<? extends Fragment> fragmentClass) {
        for (Item item : items) {
            if (item.fragmentClass.equals(fragmentClass)) {
                list.setItemChecked(items.indexOf(item), true);
            }
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (toggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void setTitle(CharSequence title) {
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle(title);
        }
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        toggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        toggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.mainFrame);
        if (fragment instanceof DispatchTouchEventAware) {
            ((DispatchTouchEventAware) fragment).dispatchTouchEvent(event);
        }

        return super.dispatchTouchEvent(event);
    }

    @Override
    public void onBackPressed() {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.mainFrame);
        if (fragment instanceof OnBackPressedAware) {
            if (((OnBackPressedAware) fragment).onBackPressed()) {
                return;
            }
        }

        getFragmentManager().executePendingTransactions();
        int count = getFragmentManager().getBackStackEntryCount();
        if (count == 0) {
            super.onBackPressed();
        } else {
            getFragmentManager().popBackStack();
        }
    }

    private class Item {
        final Class<? extends Fragment> fragmentClass;
        final @StringRes int titleId;
        final @DrawableRes int iconId;
        Integer count;

        Item(Class<? extends Fragment> fragmentClass, @StringRes int titleId, @DrawableRes int iconId,
                Integer count) {
            this.fragmentClass = fragmentClass;
            this.titleId = titleId;
            this.iconId = iconId;
            this.count = count;
        }
    }
}