blob: 13705fdeb5c2e8710ed1a006abda517c102d696a [file] [log] [blame]
// 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;
}
}
}