package com.thomasdh.roosterpgplus;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.gms.analytics.HitBuilders;
import com.mikepenz.materialdrawer.AccountHeader;
import com.mikepenz.materialdrawer.AccountHeaderBuilder;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.DividerDrawerItem;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
import com.mikepenz.materialdrawer.model.SectionDrawerItem;
import com.quinny898.library.persistentsearch.SearchBox;
import com.thomasdh.roosterpgplus.Adapters.ToolbarSpinnerAdapter;
import com.thomasdh.roosterpgplus.Data.Account;
import com.thomasdh.roosterpgplus.Data.RoosterInfo;
import com.thomasdh.roosterpgplus.Fragments.EntityRoosterFragment;
import com.thomasdh.roosterpgplus.Fragments.PGTVRoosterFragment;
import com.thomasdh.roosterpgplus.Fragments.PersoonlijkRoosterFragment;
import com.thomasdh.roosterpgplus.Fragments.RoosterViewFragment;
import com.thomasdh.roosterpgplus.Helpers.HelperFunctions;
import com.thomasdh.roosterpgplus.Helpers.InternetConnectionManager;
import com.thomasdh.roosterpgplus.Models.Week;
import com.thomasdh.roosterpgplus.Notifications.NextUurNotifications;
import com.thomasdh.roosterpgplus.Settings.Constants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import lombok.AccessLevel;
import lombok.Getter;
public class RoosterActivity extends AppCompatActivity implements InternetConnectionManager.InternetConnectionChangeListener {
private static final String ROOSTER_TYPE = "roosterType";
@Getter
private static int selectedWeek = -1;
private static ActionBar actionBar;
private static Toolbar toolbar;
private static ToolbarSpinnerAdapter toolbarSpinnerAdapter;
@Getter(value = AccessLevel.PRIVATE) private static MenuItem refreshItem;
@Getter(value = AccessLevel.PRIVATE) private static MenuItem searchItem;
private int currentSelection = 0;
private RoosterViewFragment mainFragment;
private Class<? extends RoosterViewFragment> roosterType;
private boolean isRooster = true;
private boolean isShowingBackArrow = false;
private Drawer drawer;
private AccountHeader drawerHeader;
private ProfileDrawerItem profileDrawerItem;
private SearchBox searchBox;
private Snackbar internetConnectionSnackbar;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle actionBarDrawerToggle;
//region Lifecycle
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Setup */
boolean shouldUpdateToolbar = false;
setContentView(R.layout.activity_rooster);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
Account.getInstance(this);
new NextUurNotifications(this);
if (savedInstanceState == null) {
// Defaults
roosterType = PersoonlijkRoosterFragment.class;
mainFragment = RoosterViewFragment.newInstance(roosterType, getSelectedWeek());
isRooster = true;
isShowingBackArrow = false;
getSupportFragmentManager().beginTransaction()
.add(R.id.container, mainFragment)
.commit();
} else {
roosterType = (Class<? extends RoosterViewFragment>) savedInstanceState.getSerializable(ROOSTER_TYPE);
mainFragment = (RoosterViewFragment) getSupportFragmentManager().findFragmentById(R.id.container);
isRooster = savedInstanceState.getBoolean("isRooster");
isShowingBackArrow = savedInstanceState.getBoolean("isShowingBackArrow");
shouldUpdateToolbar = true;
setSelectedWeek(savedInstanceState.getInt("WEEK"));
currentSelection = savedInstanceState.getInt("drawerSelection");
if(!isRooster) {
((PGTVRoosterFragment) mainFragment).setType((PGTVRoosterFragment.PGTVType) savedInstanceState.getSerializable("PGTVTYPE"));
}
}
/* Navigation Drawer */
drawerHeader = new AccountHeaderBuilder()
.withActivity(this)
.addProfiles(
Account.isSet() ?
(profileDrawerItem = new ProfileDrawerItem().withName(Account.getName()).withEmail(
Account.getUserType() == Account.UserType.LEERLING ?
"Klas " + Account.getLeerlingKlas() :
"Docentcode: " + Account.getLeraarCode()
)) : (profileDrawerItem = new ProfileDrawerItem().withName("Nog niet ingelogd"))
)
.withCompactStyle(!Account.isSet())
.withHeaderBackground(R.drawable.drawer_header_blurred)
.withHeaderBackgroundScaleType(ImageView.ScaleType.CENTER_CROP)
.withOnAccountHeaderListener((view, iProfile, b) -> false)
.withSavedInstance(savedInstanceState)
.withProfileImagesVisible(false)
.withSelectionListEnabled(false)
.build();
ArrayList<String> groups = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.drawer_groups)));
ArrayList<ArrayList<String>> itemTitles = new ArrayList<ArrayList<String>>() {{
add(new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.drawer_items_roosters))));
add(new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.drawer_items_pgtv))));
}};
ArrayList<ArrayList<String>> itemIcons = new ArrayList<ArrayList<String>>() {{
add(new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.drawer_icons_rooster))));
add(new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.drawer_icons_pgtv))));
}};
DrawerBuilder drawerBuilder = new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withAccountHeader(drawerHeader)
.withCloseOnClick(true)
.withActionBarDrawerToggleAnimated(true)
.withSavedInstance(savedInstanceState)
.withOnDrawerItemClickListener((view, i, iDrawerItem) -> {
if(iDrawerItem == null) return false;
int firstDigit = iDrawerItem.getIdentifier() / 10; // first digit
int secondDigit = iDrawerItem.getIdentifier() % 10; // second digit
Class<? extends RoosterViewFragment> newType;
if (firstDigit == 0) {
newType = RoosterViewFragment.types[secondDigit];
setRoosterType(newType);
} else if (firstDigit == 1) {
// PGTV group
newType = PGTVRoosterFragment.class;
PGTVRoosterFragment.PGTVType pgtvType;
switch (secondDigit) {
case 0:
pgtvType = PGTVRoosterFragment.PGTVType.ROOSTER;
break;
case 1:
pgtvType = PGTVRoosterFragment.PGTVType.MEDEDELINGEN;
break;
default:
pgtvType = PGTVRoosterFragment.PGTVType.ROOSTER;
break;
}
setRoosterType(newType, pgtvType);
} else if (firstDigit == 2) {
// Settings
drawer.closeDrawer();
drawer.setSelection(currentSelection);
Intent preferencesIntent = new Intent(this, PreferencesActivity.class);
startActivity(preferencesIntent);
return false;
}
drawer.closeDrawer();
currentSelection = iDrawerItem.getIdentifier();
return true;
});
int i = 0;
for(String groupName : groups) {
drawerBuilder.addDrawerItems(new SectionDrawerItem().setDivider(i != 0).withName(groupName));
int u = 0;
for(String childName : itemTitles.get(i)) {
int resource = HelperFunctions.getResId(itemIcons.get(i).get(u), R.drawable.class);
drawerBuilder.addDrawerItems(
new PrimaryDrawerItem()
.withName(childName)
.withIdentifier(10*i + u)
.withIcon(resource)
);
u++;
}
i++;
}
drawer = drawerBuilder
.addDrawerItems(
new DividerDrawerItem(),
new PrimaryDrawerItem().withName("Instellingen").withIcon(R.drawable.ic_settings_grey).withIdentifier(20)
)
.build();
drawer.setSelection(currentSelection);
drawerLayout = drawer.getDrawerLayout();
actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerOpened(View view) {
supportInvalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View view) {
updateToolbarViews();
}
@Override
public void onDrawerSlide(View view, float v) {
if (isShowingBackArrow) {
super.onDrawerSlide(view, 1);
} else {
super.onDrawerSlide(view, v);
}
}
};
drawerLayout.setDrawerListener(actionBarDrawerToggle);
View.OnClickListener toolbarOnClickListener = view -> {
if (roosterType == EntityRoosterFragment.class && isShowingBackArrow) {
onBackPressed();
} else {
if(drawer.isDrawerOpen()) {
drawer.closeDrawer();
} else {
drawer.openDrawer();
}
}
};
toolbar.setNavigationOnClickListener(toolbarOnClickListener);
actionBarDrawerToggle.setToolbarNavigationClickListener(toolbarOnClickListener);
/* Search */
searchBox = (SearchBox) findViewById(R.id.searchbox);
searchBox.enableVoiceRecognition(this);
if(shouldUpdateToolbar)
setShowBackArrow(isShowingBackArrow);
RoosterInfo.getWeken(this, this::addWekenToToolbar); // hier gebeurt de rest
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState = drawer.saveInstanceState(savedInstanceState);
savedInstanceState = drawerHeader.saveInstanceState(savedInstanceState);
savedInstanceState.putSerializable(ROOSTER_TYPE, roosterType);
savedInstanceState.putBoolean("isShowingBackArrow", isShowingBackArrow);
savedInstanceState.putBoolean("isRooster", isRooster);
savedInstanceState.putInt("WEEK", getSelectedWeek());
savedInstanceState.putInt("drawerSelection", currentSelection);
if(!isRooster) {
savedInstanceState.putSerializable("PGTVTYPE", ((PGTVRoosterFragment) mainFragment).getType());
}
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestart() {
super.onRestart();
if (HelperFunctions.hasInternetConnection(this)) {
mainFragment.loadRooster(true);
}
}
public void onResume() {
super.onResume();
InternetConnectionManager.registerListener("main", this);
// Update profile item
if(Account.isSet()) {
profileDrawerItem.withName(Account.getName()).withEmail(
Account.getUserType() == Account.UserType.LEERLING ?
"Klas " + Account.getLeerlingKlas() :
"Docentcode: " + Account.getLeraarCode());
} else {
profileDrawerItem.withEmail("").withName("Nog niet ingelogd");
}
}
public void onPause() {
super.onPause();
InternetConnectionManager.unregisterListener("main");
}
//endregion
//region Fragmentmanagement
@Override
public void onBackPressed() {
if(drawer != null && drawer.isDrawerOpen()) {
drawer.closeDrawer();
} else if(searchBox != null && searchBox.isShown()) {
searchBox.toggleSearch();
} else if(roosterType == EntityRoosterFragment.class) {
// actionbar goed maken
setShowBackArrow(false);
// fragments goed maken
getSupportFragmentManager().popBackStackImmediate();
mainFragment = (RoosterViewFragment) getSupportFragmentManager().findFragmentById(R.id.container);
roosterType = mainFragment.getClass();
isRooster = roosterType != PGTVRoosterFragment.class;
drawer.setSelection(currentSelection);
// toolbar goed maken
updateToolbarViews();
} else {
super.onBackPressed();
}
}
private void setRoosterType(Class<? extends RoosterViewFragment> type) { setRoosterType(type, PGTVRoosterFragment.PGTVType.ROOSTER, null); }
private void setRoosterType(Class<? extends RoosterViewFragment> type, PGTVRoosterFragment.PGTVType pgtvType) { setRoosterType(type, pgtvType, null); }
private void setRoosterType(Class<? extends RoosterViewFragment> type, String query) { setRoosterType(type, PGTVRoosterFragment.PGTVType.ROOSTER, query); }
private void setRoosterType(Class<? extends RoosterViewFragment> type, PGTVRoosterFragment.PGTVType pgtvType, String query) {
if(type == roosterType && type != PGTVRoosterFragment.class) {
// Zelfde type, niets doen behalve bij zoeken en PGTV
if(type == EntityRoosterFragment.class) {
((EntityRoosterFragment) mainFragment).setEntity(query);
mainFragment.loadRooster();
}
} else {
// Niet zoeken
mainFragment = RoosterViewFragment.newInstance(type, getSelectedWeek());
roosterType = type;
if(type == PGTVRoosterFragment.class) {
// PGTV type
((PGTVRoosterFragment) mainFragment).setType(pgtvType);
isRooster = false;
} else if(type == EntityRoosterFragment.class) {
// Zoeken
((EntityRoosterFragment) mainFragment).setEntity(query);
isRooster = true;
} else {
isRooster = true;
}
if(type != EntityRoosterFragment.class) {
getSupportFragmentManager().popBackStackImmediate();
getSupportFragmentManager().beginTransaction().replace(R.id.container, mainFragment).commit();
setShowBackArrow(false);
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.container, mainFragment).addToBackStack("search").commit();
setShowBackArrow(true);
}
}
updateToolbarViews();
}
private void updateToolbarViews() {
View toolbarTitle = toolbar.findViewById(R.id.toolbar_title);
View toolbarSpinner = toolbar.findViewById(R.id.toolbar_spinner);
if(isRooster && toolbarSpinner != null) {
// Rooster en weken geset, toon de spinner en geen titel
toolbarSpinner.setVisibility(View.VISIBLE);
if(toolbarTitle != null) toolbarTitle.setVisibility(View.GONE);
} else {
// Geen rooster of geen weken geset, toon geen spinner en een titel
if(toolbarTitle == null) return; // dan weet ik het ook niet meer
toolbarTitle.setVisibility(View.VISIBLE);
if(toolbarSpinner != null) toolbarSpinner.setVisibility(View.GONE);
// Als het PGTV is, toon de juiste titel
if(!isRooster) {
((TextView) toolbarTitle).setText("PGTV - " + ((PGTVRoosterFragment) mainFragment).getType().toDesc());
} else {
((TextView) toolbarTitle).setText(R.string.app_name);
}
}
supportInvalidateOptionsMenu(); // voor context-afhankelijke knoppen
}
//endregion
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Menu maken
getMenuInflater().inflate(R.menu.main, menu);
searchItem = menu.findItem(R.id.menu_item_search);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_item_search: {
openSearch();
return true;
}
default: return super.onOptionsItemSelected(item);
}
}
public boolean onWeekSelected(int pos) {
String itemString = (String) toolbarSpinnerAdapter.getItem(pos);
int week = Integer.parseInt(itemString.substring(5));
MainApplication.getTracker(MainApplication.TrackerName.APP_TRACKER, getApplicationContext())
.send(new HitBuilders.EventBuilder()
.setCategory(Constants.ANALYTICS_CATEGORIES_ROOSTER)
.setAction(Constants.ANALYTICS_ACTIVITY_ROOSTER_ACTION_CHANGE_WEEK)
.setLabel(mainFragment.getAnalyticsTitle())
.build());
setSelectedWeek(week);
return true;
}
private void addWekenToToolbar(Object weken) {
ArrayList<Week> wekenArray = (ArrayList<Week>) weken;
ArrayList<String> strings = new ArrayList<>();
if (wekenArray == null || wekenArray.isEmpty()) {
strings.add("Week " + Calendar.getInstance().get(Calendar.WEEK_OF_YEAR));
} else {
for (int c = 0; c < Constants.WEEKS_IN_SPINNER && c < wekenArray.size(); c++) {
if(wekenArray.get(c).isVakantieweek()) continue;
strings.add("Week " + wekenArray.get(c).week);
}
}
View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner, toolbar, false);
ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
toolbar.addView(spinnerContainer, layoutParams);
toolbarSpinnerAdapter = new ToolbarSpinnerAdapter(this, strings);
Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.toolbar_spinner);
spinner.setAdapter(toolbarSpinnerAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
onWeekSelected(i);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
if(getSelectedWeek() != -1) {
spinner.setSelection(strings.indexOf("Week " + getSelectedWeek()));
}
updateToolbarViews();
}
void setSelectedWeek(int week) {
selectedWeek = week;
mainFragment.setWeek(week);
}
public void openSearch() {
searchBox.revealFromMenuItem(R.id.menu_item_search, this);
searchBox.setLogoText(getString(R.string.search_hint));
searchBox.setSearchListener(new SearchBox.SearchListener() {
@Override
public void onSearchOpened() {
// Show tint
View overlay = findViewById(R.id.search_overlay);
overlay.setVisibility(View.VISIBLE);
overlay.setOnClickListener(view -> searchBox.toggleSearch());
}
@Override
public void onSearchCleared() {
}
@Override
public void onSearchClosed() {
closeSearch();
}
@Override
public void onSearchTermChanged() {
}
@Override
public void onSearch(String s) {
closeSearch();
setRoosterType(EntityRoosterFragment.class, s);
/* IDrawerItem drawerItem = drawer.getDrawerItem(drawer.getCurrentSelection());
if(drawerItem != null) {
drawerItem.withSetSelected(false);
drawer.updateItem(drawerItem);
//drawer.getAdapter().notifyItemChanged(drawer.getCurrentSelectedPosition());
}*/
drawer.setSelectionAtPosition(-1);
updateToolbarViews();
// Save search query
}
});
}
public void closeSearch() {
searchBox.hideCircularly(this);
View overlay = findViewById(R.id.search_overlay);
overlay.setVisibility(View.GONE);
}
public void setShowBackArrow(boolean showBackArrow) {
float start = showBackArrow ? 0: 1;
float end = showBackArrow ? 1 : 0;
ValueAnimator animator = ValueAnimator.ofFloat(start, end);
animator.addUpdateListener(valueAnimator -> {
float slideOffset = (float) valueAnimator.getAnimatedValue();
drawer.getActionBarDrawerToggle().onDrawerSlide(drawerLayout, slideOffset);
});
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(500);
animator.start();
isShowingBackArrow = showBackArrow;
}
@Override
public void internetConnectionChanged(boolean hasInternetConnection) {
if(!hasInternetConnection) {
internetConnectionSnackbar = Snackbar.make(findViewById(R.id.container), "Geen internetverbinding!", Snackbar.LENGTH_INDEFINITE);
internetConnectionSnackbar.show();
} else {
if(internetConnectionSnackbar != null)
internetConnectionSnackbar.dismiss();
}
mainFragment.setInternetConnectionState(hasInternetConnection);
}
}