package treehou.se.habit;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import javax.inject.Inject;
import io.realm.Realm;
import io.realm.RealmResults;
import treehou.se.habit.core.db.model.ServerDB;
import treehou.se.habit.core.db.model.controller.ControllerDB;
import treehou.se.habit.ui.control.ControlHelper;
import treehou.se.habit.ui.menu.NavigationDrawerFragment;
import treehou.se.habit.ui.settings.SettingsFragment;
import treehou.se.habit.ui.control.ControllsFragment;
import treehou.se.habit.ui.servers.ServersFragment;
import treehou.se.habit.ui.sitemaps.SitemapFragment;
import treehou.se.habit.ui.sitemaps.SitemapListFragment;
import treehou.se.habit.util.Settings;
import static treehou.se.habit.ui.menu.NavigationDrawerFragment.NavigationItems;
public class MainActivity extends AppCompatActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks{
private static final String TAG = "MainActivity";
private Realm realm;
@Inject Settings settings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getApplicationComponent().inject(this);
setContentView(R.layout.activity_main);
realm = Realm.getDefaultInstance();
ControlHelper.showNotifications(this);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
// Fragment managing the behaviors, interactions and presentation of the navigation drawer.
NavigationDrawerFragment navigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
// Set up the drawer.
navigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));
setupFragments(savedInstanceState);
showControllerInNotification();
}
/**
* Setup the saved instance state.
* @param savedInstanceState saved instance state
*/
private void setupFragments(Bundle savedInstanceState){
FragmentManager fragmentManager = getSupportFragmentManager();
if(fragmentManager.findFragmentById(R.id.page_container) == null) {
// Load server setup server fragment if no server found
RealmResults<ServerDB> serverDBs = realm.where(ServerDB.class).findAll();
if(serverDBs.size() <= 0) {
fragmentManager.beginTransaction()
.replace(R.id.page_container, ServersFragment.newInstance())
.commit();
}else {
// Load default sitemap if any
String defaultSitemap = settings.getDefaultSitemap();
if(savedInstanceState == null && defaultSitemap != null) {
fragmentManager.beginTransaction()
.replace(R.id.page_container, SitemapListFragment.newInstance(defaultSitemap))
.commit();
}else {
fragmentManager.beginTransaction()
.replace(R.id.page_container, SitemapListFragment.newInstance())
.commit();
}
}
}
}
protected HabitApplication.ApplicationComponent getApplicationComponent() {
return ((HabitApplication) getApplication()).component();
}
@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public void onNavigationDrawerItemSelected(@NavigationDrawerFragment.NavigationItems int value) {
Fragment fragment = null;
switch (value) {
case NavigationItems.ITEM_SITEMAPS:
fragment = SitemapListFragment.newInstance();
break;
case NavigationItems.ITEM_CONTROLLERS:
fragment = ControllsFragment.newInstance();
break;
case NavigationItems.ITEM_SERVER:
fragment = ServersFragment.newInstance();
break;
case NavigationItems.ITEM_SETTINGS:
fragment = SettingsFragment.newInstance();
break;
}
clearFragments();
if(fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.page_container, fragment)
.commit();
}
}
/**
* Show controllers in notification tray
*/
private void showControllerInNotification() {
for(ControllerDB controller : realm.where(ControllerDB.class).findAll()){
if (controller.isShowNotification()) {
ControlHelper.showNotification(this, controller);
}
}
}
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.page_container);
if(fragment instanceof SitemapFragment){
SitemapFragment sitemapFragment = (SitemapFragment) fragment;
boolean result = sitemapFragment.popStack();
if(result) {
return;
}
}
super.onBackPressed();
}
/**
* Clear fragments on backstack
*/
private void clearFragments(){
FragmentManager fragmentManager = getSupportFragmentManager();
if(fragmentManager.getBackStackEntryCount() > 0){
fragmentManager.popBackStackImmediate();
}
}
}