package edu.alaska.gina.feeder.gina_puffinfeeder_android_viewer; import android.app.*; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.*; import android.widget.*; import com.octo.android.robospice.*; import com.octo.android.robospice.persistence.*; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import edu.alaska.gina.feeder.gina_puffinfeeder_android_viewer.network.JsonSpiceService; import java.util.ArrayList; import java.util.Arrays; /** * Class that handles navigation drawer and startup. * created by bobby on 6/14/13. */ public class MainLauncherActivity extends Activity { private static final String JSON_CACHE_KEY = "feeds_json_array"; private final SpiceManager mSpiceManager = new SpiceManager(JsonSpiceService.class); private final FeedsJsonRequest mSpiceRequest = new FeedsJsonRequest(); private final ArrayList<String> listItems = new ArrayList<String>(); private ArrayAdapter<String> primary; private Feed[] masterFeedsList; private int current = -2; private Menu aBarMenu; private DrawerLayout mDrawerLayout; //Contains the entire activity. private ListView navDrawerList; //ListView of Nav Drawer. private RelativeLayout infoDrawerLayout; //Layout for the Info Drawer. private ActionBarDrawerToggle mDrawerToggle; //Indicates presence of nav drawer in action bar. /** Overridden Methods */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main_activity_launcher); setProgressBarIndeterminateVisibility(false); if (savedInstanceState != null) current = savedInstanceState.getInt("current"); if (current < 0) { StartFragment sFrag = new StartFragment(); getFragmentManager().beginTransaction().replace(R.id.content_frame, sFrag, "start").commit(); findViewById(R.id.more_info_button).setVisibility(View.GONE); } else { openPreviewFragment(current); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navDrawerList = (ListView) findViewById(R.id.drawer_left_nav); infoDrawerLayout = (RelativeLayout) findViewById(R.id.drawer_right_info); if (getActionBar() != null) getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM); listItems.add("No Feeds Loaded."); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { @Override public void onDrawerClosed(View drawerView) { if (getFragmentManager().findFragmentById(R.id.content_frame) instanceof StartFragment) getActionBar().setTitle("GINA Puffin Feeder"); else getActionBar().setTitle(masterFeedsList[current].getTitle()); invalidateOptionsMenu(); } @Override public void onDrawerOpened(View drawerView) { if (mDrawerLayout.isDrawerOpen(navDrawerList)) { getActionBar().setTitle("Select a Feed"); invalidateOptionsMenu(); } } }; primary = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems); navDrawerList.setAdapter(primary); mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, infoDrawerLayout); mDrawerLayout.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mDrawerLayout.isDrawerOpen(infoDrawerLayout)) { mDrawerLayout.closeDrawer(infoDrawerLayout); return true; } return false; } }); findViewById(R.id.more_info_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(masterFeedsList[current].getMoreinfo())); startActivity(browserIntent); } }); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override protected void onStart() { super.onStart(); if (current < 0) refreshFeedsList(DurationInMillis.ONE_DAY); navDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (!listItems.get(position).equals("No Feeds Loaded.")) { openPreviewFragment(position); } mDrawerLayout.closeDrawer(navDrawerList); } }); primary.notifyDataSetChanged(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("current", current); } @Override protected void onPause() { setProgressBarIndeterminateVisibility(false); if (mSpiceManager.isStarted()) mSpiceManager.shouldStop(); super.onPause(); } @Override protected void onStop() { setProgressBarIndeterminateVisibility(false); if (mSpiceManager.isStarted()) mSpiceManager.shouldStop(); super.onStop(); } @Override protected void onDestroy() { setProgressBarIndeterminateVisibility(false); if (mSpiceManager.isStarted()) mSpiceManager.shouldStop(); super.onDestroy(); } @Override public void onBackPressed() { super.onBackPressed(); setProgressBarIndeterminateVisibility(false); if (mDrawerLayout.isDrawerOpen(infoDrawerLayout)) { mDrawerLayout.closeDrawer(infoDrawerLayout); return; } try { if (getFragmentManager().findFragmentById(R.id.content_frame) instanceof StartFragment) { ((TextView) findViewById(R.id.description_body)).setText(getResources().getString(R.string.description_placeholder)); aBarMenu.findItem(R.id.action_refresh).setVisible(false); aBarMenu.findItem(R.id.action_load_next).setVisible(false); aBarMenu.findItem(R.id.action_load_prev).setVisible(false); aBarMenu.findItem(R.id.action_display_short_description).setVisible(false); if (getActionBar() != null) getActionBar().setTitle("GINA Puffin Feeder"); } } catch (NullPointerException e) {/*Do Nothing*/} } @Override public boolean onPrepareOptionsMenu(Menu menu) { if (getFragmentManager().findFragmentById(R.id.content_frame) instanceof StartFragment) { menu.findItem(R.id.action_load_next).setVisible(false); menu.findItem(R.id.action_load_prev).setVisible(false); menu.findItem(R.id.action_load_first).setVisible(false); menu.findItem(R.id.action_display_short_feed_description).setVisible(false); if (mDrawerLayout.isDrawerOpen(navDrawerList)) menu.findItem(R.id.action_refresh).setVisible(true); else menu.findItem(R.id.action_refresh).setVisible(false); } else { if (mDrawerLayout.isDrawerOpen(navDrawerList)) { menu.findItem(R.id.action_refresh).setVisible(true); menu.findItem(R.id.action_load_next).setVisible(false); menu.findItem(R.id.action_load_prev).setVisible(false); menu.findItem(R.id.action_load_first).setVisible(false); menu.findItem(R.id.action_display_short_feed_description).setVisible(false); } else { menu.findItem(R.id.action_refresh).setVisible(true); menu.findItem(R.id.action_load_next).setVisible(true); menu.findItem(R.id.action_load_prev).setVisible(true); menu.findItem(R.id.action_load_first).setVisible(true); menu.findItem(R.id.action_display_short_feed_description).setVisible(true); } } if (getResources().getString(R.string.alpha_test_build).equals("yes")) menu.findItem(R.id.action_change_base_url).setVisible(true); else menu.findItem(R.id.action_change_base_url).setVisible(false); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.launcher, menu); aBarMenu = menu; return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.closeDrawer(infoDrawerLayout); if (mDrawerLayout.isDrawerOpen(navDrawerList)) mDrawerLayout.closeDrawer(navDrawerList); else mDrawerLayout.openDrawer(navDrawerList); return true; case R.id.action_refresh: if (mDrawerLayout.isDrawerOpen(navDrawerList)) { refreshFeedsList(DurationInMillis.ALWAYS_EXPIRED); primary.notifyDataSetChanged(); return true; } break; case R.id.action_display_short_feed_description: mDrawerLayout.openDrawer(infoDrawerLayout); return true; case R.id.action_show_credits: this.startActivity(new Intent(this, WebViewActivity.class).putExtra("url", getString(R.string.credits_filepath)).putExtra("title", getString(R.string.credits_title))); return true; case R.id.action_open_preferences: this.startActivity(new Intent(this, PreferencesActivity.class)); return true; case R.id.action_change_base_url: new URLChanger().show(getFragmentManager(), "change_url"); break; } return super.onOptionsItemSelected(item); } /** Object to listen for RoboSpice task completion. */ private class FeedsRequestListener implements RequestListener<Feed[]> { @Override public void onRequestSuccess(Feed[] feed) { setProgressBarIndeterminateVisibility(false); masterFeedsList = feed; listItems.clear(); for (Feed f : feed) listItems.add(f.getTitle()); primary.notifyDataSetChanged(); if (getFragmentManager().findFragmentById(R.id.content_frame) instanceof StartFragment && current < 0) { mDrawerLayout.closeDrawer(infoDrawerLayout); mDrawerLayout.openDrawer(navDrawerList); } if (isOnline()) Toast.makeText(getApplicationContext(), "Feed list reloaded.", Toast.LENGTH_SHORT).show(); else Toast.makeText(getApplicationContext(), "Feed list reloaded from cache. Please check internet connection.", Toast.LENGTH_LONG).show(); /* if (mSpiceManager.isStarted()) mSpiceManager.shouldStop(); */ } @Override public void onRequestFailure(SpiceException e) { setProgressBarIndeterminateVisibility(false); Log.d(getString(R.string.app_tag), "Feeds list load fail! " + e.getMessage() + "\n" + Arrays.toString(e.getStackTrace())); Toast.makeText(getApplicationContext(), "Feed list load fail!", Toast.LENGTH_SHORT).show(); } } private class URLChanger extends DialogFragment { View v; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { v = getLayoutInflater().inflate(R.layout.dialog_change_url, null); AlertDialog.Builder b = new AlertDialog.Builder(this.getActivity()); b.setView(v).setTitle("Enter Base URL").setNeutralButton("Dismiss", null).setPositiveButton("Accept", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String s = ((EditText) v.findViewById(R.id.newBaseURL)).getText().toString(); if (!s.equals("")) mSpiceRequest.baseURL = s; mSpiceManager.removeAllDataFromCache(); listItems.clear(); refreshFeedsList(DurationInMillis.ALWAYS_EXPIRED); } }); return b.create(); } } /** * Method that loads a feed into a fragment. * @param position Index of feed to be loaded. */ private void openPreviewFragment(int position) { current = position; ImageFeedFragment iFrag = new ImageFeedFragment(); Bundle intel = new Bundle(); intel.putInt("position", position); intel.putString("title", masterFeedsList[position].getTitle()); intel.putString("entries", masterFeedsList[position].getEntries()); intel.putString("slug", masterFeedsList[position].getSlug()); intel.putBoolean("status", masterFeedsList[position].getStatus()); intel.putString("description", masterFeedsList[current].getDescription()); intel.putString("info", masterFeedsList[current].getMoreinfo()); if (getActionBar() != null) getActionBar().setTitle(masterFeedsList[position].getTitle()); iFrag.setArguments(intel); getFragmentManager().beginTransaction().replace(R.id.content_frame, iFrag, "grid").addToBackStack(null).commit(); ((TextView) findViewById(R.id.description_body)).setText(masterFeedsList[current].getDescription()); if (masterFeedsList[current].getMoreinfo() == null) findViewById(R.id.more_info_button).setVisibility(View.GONE); else findViewById(R.id.more_info_button).setVisibility(View.VISIBLE); } /** * Reloads the list of the feeds. * @param expiration_time Time if its been at least this long since last update, do it. */ void refreshFeedsList(long expiration_time) { setProgressBarIndeterminateVisibility(true); if (!mSpiceManager.isStarted()) mSpiceManager.start(this.getBaseContext()); mSpiceManager.execute(mSpiceRequest, JSON_CACHE_KEY, expiration_time, new FeedsRequestListener()); } /** * Returns whether the device is actively connected to a network. * @return "true" if yes, "false" otherwise. */ boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo nFo = cm.getActiveNetworkInfo(); return (nFo != null && nFo.isConnectedOrConnecting()); } }