package com.pennapps.labs.pennmobile;
import android.Manifest;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.annotation.AnyRes;
import android.support.annotation.NonNull;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.crashlytics.android.Crashlytics;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.pennapps.labs.pennmobile.api.Labs;
import com.pennapps.labs.pennmobile.api.Serializer;
import com.pennapps.labs.pennmobile.classes.Building;
import com.pennapps.labs.pennmobile.classes.BusRoute;
import com.pennapps.labs.pennmobile.classes.BusStop;
import com.pennapps.labs.pennmobile.classes.Course;
import com.pennapps.labs.pennmobile.classes.DiningHall;
import com.pennapps.labs.pennmobile.classes.LaundryMachine;
import com.pennapps.labs.pennmobile.classes.LaundryRoom;
import com.pennapps.labs.pennmobile.classes.Person;
import com.pennapps.labs.pennmobile.classes.Venue;
import java.util.List;
import io.fabric.sdk.android.Fabric;
import retrofit.RestAdapter;
import retrofit.converter.GsonConverter;
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private NavigationView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private static Labs mLabs;
private boolean from_alarm;
private static final int CODE_MAP = 1;
private boolean tab_showed;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
if (!BuildConfig.DEBUG) {
Fabric.with(this, new Crashlytics());
}
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
from_alarm = getIntent().getBooleanExtra(getString(R.string.laundry_notification_alarm_intent), false);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerList = (NavigationView) findViewById(R.id.navigation);
mDrawerList.setNavigationItemSelectedListener(new DrawerItemClickListener());
mDrawerList.getMenu().findItem(R.id.nav_home).setChecked(true);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
// Set default fragment to MainFragment
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.content_frame, new MainFragment());
tx.commit();
}
@Override
public void onBackPressed() {
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
return;
}
try {
WebView webView = NewsTab.currentWebView;
if (webView.canGoBack()) {
webView.goBack();
} else if (getSupportFragmentManager().getBackStackEntryCount() > 0){
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
} catch (NullPointerException ignored) {
// No webview exists currently
super.onBackPressed();
if (CourseFragment.containsNum(getTitle())) {
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerToggle.syncState();
}
}
}
@Override
public void onResume() {
super.onResume();
setTitle(R.string.main_title);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancelAll();
if (from_alarm) {
navigateLayout(R.id.nav_laundry);
}
}
public void closeKeyboard() {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View view = getCurrentFocus();
if (view != null) {
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
closeKeyboard();
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
private class DrawerItemClickListener implements NavigationView.OnNavigationItemSelectedListener {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
removeTabs();
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
int id = item.getItemId();
item.setChecked(true);
navigateLayout(id);
return false;
}
}
private void navigateLayout(@AnyRes int id) {
Fragment fragment = null;
switch (id) {
case R.id.nav_home:
if(getSupportFragmentManager().getBackStackEntryCount() > 0) {
fragment = new MainFragment();
}
break;
case R.id.nav_registrar:
case R.id.registrar_cont:
fragment = new RegistrarFragment();
break;
case R.id.nav_directory:
case R.id.directory_cont:
fragment = new DirectoryFragment();
break;
case R.id.nav_dining:
case R.id.dining_cont:
fragment = new DiningFragment();
break;
case R.id.nav_news:
case R.id.news_cont:
fragment = new NewsFragment();
break;
case R.id.nav_map:
case R.id.map_cont:
getPermission();
return;
case R.id.nav_laundry:
case R.id.laundry_cont:
fragment = new LaundryFragment();
if (from_alarm) {
from_alarm = false;
Bundle arg = new Bundle();
arg.putInt(getString(R.string.laundry_hall_no), getIntent().getIntExtra(getString(R.string.laundry_hall_no), -1));
fragment.setArguments(arg);
}
break;
// case R.id.nav_nso:
// case R.id.nso_cont:
// fragment = new NsoFragment();
// break;
case R.id.nav_support:
fragment = new SupportFragment();
break;
case R.id.nav_about:
fragment = new AboutFragment();
break;
case R.id.nav_pref:
fragment = new PreferenceFragment();
break;
}
fragmentTransact(fragment);
}
public void onHomeButtonClick(View v) {
navigateLayout(v.getId());
}
public static Labs getLabsInstance() {
if (mLabs == null) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(new TypeToken<List<Course>>(){}.getType(), new Serializer.CourseSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<Building>>(){}.getType(), new Serializer.BuildingSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<Person>>(){}.getType(), new Serializer.DataSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<Venue>>(){}.getType(), new Serializer.VenueSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<BusStop>>(){}.getType(), new Serializer.BusStopSerializer());
gsonBuilder.registerTypeAdapter(DiningHall.class, new Serializer.MenuSerializer());
gsonBuilder.registerTypeAdapter(BusRoute.class, new Serializer.BusRouteSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<BusRoute>>(){}.getType(), new Serializer.BusRouteListSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<LaundryRoom>>(){}.getType(), new Serializer.LaundryListSerializer());
gsonBuilder.registerTypeAdapter(new TypeToken<List<LaundryMachine>>(){}.getType(), new Serializer.LaundryMachineSerializer());
Gson gson = gsonBuilder.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setConverter(new GsonConverter(gson))
.setEndpoint("https://api.pennlabs.org")
.build();
mLabs = restAdapter.create(Labs.class);
}
return mLabs;
}
public void showErrorToast(final int errorMessage) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_SHORT).show();
}
});
}
public ActionBarDrawerToggle getActionBarToggle() {
return mDrawerToggle;
}
public void setNav(int id){
final Menu menu = mDrawerList.getMenu();
menu.findItem(id).setChecked(true);
}
public void addTabs(FragmentStatePagerAdapter pageAdapter, final ViewPager pager, boolean scrollable) {
if (tab_showed) {
return;
}
final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.appbar);
final TabLayout tabLayout = (TabLayout) getLayoutInflater().inflate(R.layout.tab_layout, null);
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(pager);
}
});
if (!scrollable) {
tabLayout.setTabMode(TabLayout.MODE_FIXED);
}
appBar.addView(tabLayout, 1);
pager.setAdapter(pageAdapter);
tab_showed = true;
}
public void removeTabs() {
tab_showed = false;
final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.appbar);
if (appBar != null && appBar.getChildCount() >= 3) {
appBar.removeViewAt(1);
}
}
public void openMapDirectionMenu() {
final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.appbar);
appBar.getChildAt(0).setVisibility(View.GONE);
appBar.getChildAt(1).setVisibility(View.VISIBLE);
}
public void closeMapDirectionMenu() {
final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.appbar);
appBar.getChildAt(0).setVisibility(View.VISIBLE);
appBar.getChildAt(1).setVisibility(View.GONE);
}
public RelativeLayout getMenuMapExtension() {
return (RelativeLayout) findViewById(R.id.menu_map_extension);
}
private void getPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat
.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, CODE_MAP);
} else {
Fragment fragment = new MapFragment();
fragmentTransact(fragment);
}
}
private void fragmentTransact(Fragment fragment) {
if (fragment != null) {
final Fragment frag = fragment;
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, frag)
.addToBackStack("Main Activity")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
} catch (IllegalStateException e) {
//ignore because the onSaveInstanceState etc states are called when activity is going to background etc
}
}
});
}
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
showErrorToast(R.string.ask_permission_fail);
return;
}
if (requestCode == CODE_MAP) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Fragment fragment = new MapFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.addToBackStack(null)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commitAllowingStateLoss();
mDrawerLayout.closeDrawer(mDrawerList);
}
});
}
}
}