package fr.ydelouis.selfoss.activity;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.FragmentById;
import org.androidannotations.annotations.OnActivityResult;
import org.androidannotations.annotations.Receiver;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.sharedpreferences.DefaultInt;
import org.androidannotations.annotations.sharedpreferences.Pref;
import org.androidannotations.annotations.sharedpreferences.SharedPref;
import fr.ydelouis.selfoss.R;
import fr.ydelouis.selfoss.config.ui.ConfigActivity_;
import fr.ydelouis.selfoss.config.model.ConfigManager;
import fr.ydelouis.selfoss.entity.Article;
import fr.ydelouis.selfoss.entity.ArticleType;
import fr.ydelouis.selfoss.entity.Filter;
import fr.ydelouis.selfoss.fragment.ArticleFragment;
import fr.ydelouis.selfoss.fragment.ArticleFragment_;
import fr.ydelouis.selfoss.fragment.ArticleListFragment;
import fr.ydelouis.selfoss.fragment.MenuFragment;
import fr.ydelouis.selfoss.model.ArticleActionHelper;
import fr.ydelouis.selfoss.model.DatabaseHelper;
import fr.ydelouis.selfoss.rest.NewVersionHelper;
import fr.ydelouis.selfoss.sync.SyncManager;
import fr.ydelouis.selfoss.sync.Uploader;
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity implements MenuFragment.Listener, ArticleListFragment.Listener, DrawerLayout.DrawerListener {
private static final int ACCOUNT_SETTINGS_FIRST_TIME = 16;
@Bean
protected ConfigManager account;
@Bean
protected SyncManager syncManager;
@Bean
protected Uploader uploader;
@Bean
protected ArticleActionHelper articleActionHelper;
@Bean
protected NewVersionHelper newVersionHelper;
@Pref
protected MainActivity_.MainActivityPrefs_ prefs;
@ViewById
protected DrawerLayout drawer;
@ViewById
protected FrameLayout articleFrame;
@FragmentById
protected ArticleListFragment list;
private ArticleFragment article;
@FragmentById
protected MenuFragment menu;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
if (isConfigFilled()) {
synchronize();
newVersionHelper.showNewVersionMessageIfNeeded();
} else {
startConfig();
}
}
}
private boolean isConfigFilled() {
return account.getAccount() != null;
}
protected void synchronize() {
if (!syncManager.isActive()) {
syncManager.requestSync();
}
}
private void startConfig() {
ConfigActivity_.intent(this).startForResult(ACCOUNT_SETTINGS_FIRST_TIME);
}
@AfterViews
protected void initViews() {
drawerToggle = new ActionBarDrawerToggle(this, drawer, R.drawable.ic_drawer, R.string.app_name, R.string.app_name);
drawer.setDrawerListener(this);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
ArticleType type = ArticleType.values()[prefs.articleTypeIndex().get()];
list.setArticleType(type);
list.setListener(this);
menu.setArticleType(type);
menu.setListener(this);
setFilterInTitle();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
protected void onDestroy() {
upload();
super.onDestroy();
}
@Background
protected void upload() {
try {
uploader.performSync();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onAccountActivityStarted() {
drawer.closeDrawers();
}
@Override
public void onFilterChanged(Filter filter) {
list.setFilter(filter);
setFilterInTitle();
drawer.closeDrawers();
prefs.articleTypeIndex().put(filter.getType().ordinal());
}
private void setFilterInTitle() {
Filter filter = list.getFilter();
ArticleType type = filter.getType();
String tagOrSource;
if (filter.getTag() != null) {
tagOrSource = filter.getTag().getName(this);
} else {
tagOrSource = filter.getSource().getTitle();
}
setTitle(String.format("%s (%s)", tagOrSource, type.getName(this)));
}
@Override
public void onArticleClicked(Article article) {
if (articleFrame != null) {
articleActionHelper.markRead(article);
this.article = ArticleFragment_.builder().article(article).build();
getFragmentManager().beginTransaction().replace(R.id.articleFrame, this.article).commit();
} else {
ArticleActivity_.intent(this).article(article).filter(list.getFilter()).start();
}
}
@Receiver(actions = DatabaseHelper.ACTION_TABLES_CLEARED)
protected void onTablesCleared() {
if (articleFrame != null) {
articleFrame.removeAllViews();
article = null;
}
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
drawerToggle.onDrawerSlide(drawerView, slideOffset);
}
@Override
public void onDrawerOpened(View drawerView) {
menu.onOpened();
drawerToggle.onDrawerOpened(drawerView);
}
@Override
public void onDrawerClosed(View drawerView) {
drawerToggle.onDrawerClosed(drawerView);
}
@Override
public void onDrawerStateChanged(int newState) {
drawerToggle.onDrawerStateChanged(newState);
}
@OnActivityResult(ACCOUNT_SETTINGS_FIRST_TIME)
protected void onConfigFinished(int resultCode) {
if (resultCode != RESULT_OK) {
finish();
}
}
@SharedPref
public interface MainActivityPrefs {
@DefaultInt(0)
int articleTypeIndex();
}
}