package uk.co.traintrackapp.traintrack;
import android.os.AsyncTask;
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.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.google.firebase.messaging.FirebaseMessaging;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import uk.co.traintrackapp.traintrack.fragment.AccountManagerFragment;
import uk.co.traintrackapp.traintrack.fragment.DashboardFragment;
import uk.co.traintrackapp.traintrack.fragment.JourneysFragment;
import uk.co.traintrackapp.traintrack.fragment.SettingsFragment;
import uk.co.traintrackapp.traintrack.fragment.StationsFragment;
import uk.co.traintrackapp.traintrack.model.Station;
import uk.co.traintrackapp.traintrack.model.User;
import uk.co.traintrackapp.traintrack.utils.Utils;
public class MainActivity extends AppCompatActivity {
public static final int DASHBOARD_FRAGMENT = 0;
public static final int STATIONS_FRAGMENT = 1;
public static final int JOURNEYS_FRAGMENT = 2;
public static final int SETTINGS_FRAGMENT = 3;
public static final int ACCOUNT_FRAGMENT = 4;
private static final String NEW_USER = "New User";
private static final String ONLINE_USER = "Online User";
private static final String OFFLINE_USER = "Offline User";
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
private ActionBarDrawerToggle toggle;
private DrawerLayout drawerLayout;
private Fragment newFragment;
private String newTitle;
private Toolbar toolbar;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
toggle.setDrawerIndicatorEnabled(true);
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
toggle.onDrawerSlide(drawerView, slideOffset);
}
@Override
public void onDrawerOpened(View drawerView) {
toggle.onDrawerOpened(drawerView);
}
@Override
public void onDrawerClosed(View drawerView) {
toggle.onDrawerClosed(drawerView);
updateFragment();
}
@Override
public void onDrawerStateChanged(int newState) {
toggle.onDrawerStateChanged(newState);
}
});
listView = (ListView) findViewById(R.id.list);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
});
listView.setAdapter(new ArrayAdapter<>(
getSupportActionBar().getThemedContext(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
new String[]{
getString(R.string.title_dashboard_fragment),
getString(R.string.title_stations_fragment),
getString(R.string.title_journeys_fragment),
getString(R.string.title_settings_fragment),
getString(R.string.title_account_fragment),
}));
updateFragment(0);
new LoadAssets().execute();
FirebaseMessaging.getInstance().subscribeToTopic("news");
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
toggle.syncState();
}
private void selectItem(int position) {
listView.setItemChecked(position, true);
switch (position) {
case DASHBOARD_FRAGMENT:
newFragment = DashboardFragment.newInstance();
newTitle = getString(R.string.title_dashboard_fragment);
break;
case STATIONS_FRAGMENT:
newFragment = StationsFragment.newInstance();
newTitle = getString(R.string.title_stations_fragment);
break;
case JOURNEYS_FRAGMENT:
newFragment = JourneysFragment.newInstance();
newTitle = getString(R.string.title_journeys_fragment);
break;
case SETTINGS_FRAGMENT:
newFragment = SettingsFragment.newInstance();
newTitle = getString(R.string.title_settings_fragment);
break;
case ACCOUNT_FRAGMENT:
newFragment = AccountManagerFragment.newInstance();
newTitle = getString(R.string.title_account_fragment);
break;
}
drawerLayout.closeDrawers();
}
/**
* Commits the new fragment and updates the title
*/
private void updateFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, newFragment).commit();
toolbar.setTitle(newTitle);
}
/**
* Update the application fragment
* @param position the id fragment to show
*/
public void updateFragment(int position) {
selectItem(position);
updateFragment();
}
/**
* Load the JSON from a file
* @param filename the file to open
* @param from either assets folder or the file system
* @return JSON String
*/
private String loadJSON(String filename, int from) {
String jsonString = "";
try {
StringBuilder sb = new StringBuilder();
InputStream is;
if (from == Utils.ASSETS) {
is = getAssets().open(filename);
} else if (from == Utils.FILESYSTEM) {
is = openFileInput(filename);
} else {
return jsonString;
}
InputStreamReader inputStreamReader = new InputStreamReader(is);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}
jsonString = sb.toString();
} catch (IOException e) {
Utils.log(e.getMessage());
}
return jsonString;
}
private class LoadAssets extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... asset) {
TrainTrack app = (TrainTrack) getApplication();
String returnCode = NEW_USER;
ArrayList<Station> stations = new ArrayList<>();
try {
JSONArray jsonStations = new JSONArray(loadJSON(Station.FILENAME, Utils.ASSETS));
for (int i = 0; i < jsonStations.length(); i++) {
Station station = new Station(jsonStations.getJSONObject(i));
stations.add(station);
}
} catch (JSONException e) {
Utils.log(e.getMessage());
}
app.setStations(stations);
Utils.log("Stations set");
User user = new User();
try {
JSONObject jsonUser = new JSONObject(loadJSON(User.FILENAME, Utils.FILESYSTEM));
user = new User(jsonUser);
if (user.getId() > 0) {
returnCode = ONLINE_USER;
} else if (user.getId() == 0) {
returnCode = OFFLINE_USER;
}
} catch (JSONException e) {
Utils.log(e.getMessage());
returnCode = NEW_USER;
}
app.setUser(user);
Utils.log("User set");
return returnCode;
}
@Override
protected void onPostExecute(String returnCode) {
super.onPostExecute(returnCode);
Utils.log("The return code is: " + returnCode);
}
}
}