Java tutorial
/* * Copyright (C) 2013 - Gareth Llewellyn * * This file is part of Rhybudd - http://blog.NetworksAreMadeOfString.co.uk/Rhybudd/ * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/> */ package net.networksaremadeofstring.rhybudd; import android.app.Activity; import android.app.ProgressDialog; import android.content.*; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.preference.PreferenceManager; import android.support.v4.app.ListFragment; import android.util.Log; import android.view.*; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import com.bugsense.trace.BugSenseHandler; import java.util.ArrayList; import java.util.List; public class ViewZenossEventsListFragment extends ListFragment { private static final int EVENTSLISTHANDLER_ERROR = 0; private static final int EVENTSLISTHANDLER_SUCCESS = 1; private static final int EVENTSLISTHANDLER_DIALOGUPDATE = 2; private static final int EVENTSLISTHANDLER_DB_EMPTY = 3; private static final int EVENTSLISTHANDLER_TOTAL_FAILURE = 4; private static final int EVENTSLISTHANDLER_NO_EVENTS = 5; private static final int EVENTSLISTHANDLER_SERVICE_FAILURE = 6; private static final int EVENTSLISTHANDLER_REDOREFRESH = 7; private static final int EVENTSLISTHANDLER_DISMISS = 8; private static final int ACKEVENTHANDLER_SUCCESS = 9; private static final int ACKEVENTHANDLER_FAILURE = 10; private static final int ACKEVENTHANDLER_PROGRESS = 11; private static final int EVENTSLISTHANDLER_DELAYED_AB_STATUS = 12; private static final int EVENTSLISTHANDLER_SERVICE_NOT_STARTED = 13; ZenossAPI API = null; List<ZenossEvent> listOfZenossEvents = new ArrayList<ZenossEvent>(); ZenossPoller mService; boolean mBound = false; private static final String STATE_ACTIVATED_POSITION = "activated_position"; private Callbacks mCallbacks = sDummyCallbacks; private int mActivatedPosition = ListView.INVALID_POSITION; ProgressDialog dialog; int retryCount = 0; Handler eventsListHandler, AckEventsHandler, AckSingleEventHandler; ZenossEventsAdaptor adapter; SwipeDismissListViewTouchListener touchListener = null; ActionMode mActionMode; MenuItem refreshStatus = null; View abprogress = null; int cabNumSelected = 0; public List<ZenossEvent> getListOfEvents() { return listOfZenossEvents; } public interface Callbacks { public void onItemSelected(ZenossEvent event, int position); public void fetchError(); } private static Callbacks sDummyCallbacks = new Callbacks() { public void onItemSelected(ZenossEvent event, int position) { } public void fetchError() { } }; public void onItemAcknowledged(int position) { try { listOfZenossEvents.get(position).setAcknowledged(); adapter.notifyDataSetChanged(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onItemAcknowledged", e); } } public void setInProgress(int position) { try { listOfZenossEvents.get(position).setProgress(true); adapter.notifyDataSetChanged(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "setInProgress", e); } } public void acknowledgeSingleEvent(final int position) { //Log.e("acknowledgeSingleEvent","Am in acknowledgeSingleEvent with position " + Integer.toString(position)); setInProgress(position); new Thread() { public void run() { Message msg = new Message(); Bundle bndle = new Bundle(); msg.what = ACKEVENTHANDLER_FAILURE; bndle.putInt("position", position); msg.setData(bndle); try { if (null != mService && mBound) { try { if (null == mService.API) { //Log.e("acknowledgeSingleEvent","mService.API was null"); mService.PrepAPI(true, true); } //Log.e("acknowledgeSingleEvent","Logging in..."); ZenossCredentials credentials = new ZenossCredentials(getActivity()); mService.API.Login(credentials); //Log.e("acknowledgeSingleEvent","Acknowledging event"); mService.API.AcknowledgeEvent(listOfZenossEvents.get(position).getEVID()); } catch (Exception e) { e.printStackTrace(); BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e); msg.what = ACKEVENTHANDLER_FAILURE; } } else { //AckSingleEventHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); msg.what = ACKEVENTHANDLER_FAILURE; } //TODO Check it actually succeeded //AckSingleEventHandler.sendEmptyMessage(ACKEVENTHANDLER_SUCCESS); msg.what = ACKEVENTHANDLER_SUCCESS; } catch (Exception e) { e.printStackTrace(); //AckSingleEventHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); msg.what = ACKEVENTHANDLER_FAILURE; BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread outer catch", e); } //Log.e("acknowledgeSingleEvent","Sending Handler message"); if (null != AckSingleEventHandler) AckSingleEventHandler.sendMessage(msg); } }.start(); } public ViewZenossEventsListFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LayoutInflater inflater2 = (LayoutInflater) getActivity() .getSystemService(ViewZenossEventsListActivity.LAYOUT_INFLATER_SERVICE); abprogress = inflater2.inflate(R.layout.progress_wheel, null); configureHandlers(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // Restore the previously serialized activated item position. if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); } ListView listView = getListView(); touchListener = new SwipeDismissListViewTouchListener(listView, new SwipeDismissListViewTouchListener.DismissCallbacks() { @Override public boolean canDismiss(int position) { return true; } @Override public void onDismiss(ListView listView, int[] reverseSortedPositions) { for (int position : reverseSortedPositions) { //Log.e("onDismiss",Integer.toString(position)); if (null != adapter) { DimissEvent((ZenossEvent) adapter.getItem(position)); adapter.remove(position); } //listOfZenossEvents.remove(position); RhybuddDataSource datasource = null; try { datasource = new RhybuddDataSource(getActivity()); datasource.open(); datasource.UpdateRhybuddEvents(listOfZenossEvents); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "SwipetoDismiss", e); e.printStackTrace(); } finally { if (null != datasource) datasource.close(); } } if (null != adapter) adapter.notifyDataSetChanged(); } }); listView.setOnTouchListener(touchListener); // Setting this scroll listener is required to ensure that during ListView scrolling, // we don't look for swipes. listView.setOnScrollListener(touchListener.makeScrollListener()); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { //Log.e("setOnItemLongClickListener","In long click!"); try { if (listOfZenossEvents.get(i).isSelected()) { cabNumSelected--; listOfZenossEvents.get(i).SetSelected(false); } else { cabNumSelected++; listOfZenossEvents.get(i).SetSelected(true); } adapter.notifyDataSetChanged(); if (null == mActionMode) { mActionMode = getActivity().startActionMode(mActionModeCallback); } else { mActionMode.invalidate(); } return true; } catch (Exception e) { Toast.makeText(getActivity(), "There was an internal error. A report has been sent.", Toast.LENGTH_SHORT).show(); BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "long item press", e); return false; } } }); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // Activities containing this fragment must implement its callbacks. if (!(activity instanceof Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } //Log.e("onAttach","Attached"); mCallbacks = (Callbacks) activity; } @Override public void onDetach() { super.onDetach(); // Reset the active callbacks interface to the dummy implementation. mCallbacks = sDummyCallbacks; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.home_menu, menu); super.onCreateOptionsMenu(menu, inflater); refreshStatus = menu.findItem(R.id.refresh); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.resolveall: { AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_PROGRESS); final List<String> EventIDs = new ArrayList<String>(); if (null != listOfZenossEvents) { try { for (ZenossEvent evt : listOfZenossEvents) { if (!evt.getEventState().equals("Acknowledged")) { evt.setProgress(true); EventIDs.add(evt.getEVID()); } } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "resolveall", e); } } new Thread() { public void run() { try { if (null != mService && mBound) { try { if (null == mService.API) { mService.PrepAPI(true, true); } ZenossCredentials credentials = new ZenossCredentials(getActivity()); mService.API.Login(credentials); mService.API.AcknowledgeEvents(EventIDs); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e); } } else { if (null != AckEventsHandler) AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); } //TODO Check it actually succeeded if (null != AckEventsHandler) AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_SUCCESS); } catch (Exception e) { //e.printStackTrace(); if (null != AckEventsHandler) AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "resolve all outer catch", e); } } }.start(); return true; } case R.id.refresh: { Refresh(); return true; } case R.id.escalate: { try { Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); // Add data to the intent, the receiving app will decide what to do with it. intent.putExtra(Intent.EXTRA_SUBJECT, "Escalation of Zenoss Events"); String Events = ""; for (ZenossEvent evt : listOfZenossEvents) { Events += evt.getDevice() + " - " + evt.getSummary() + "\r\n\r\n"; } intent.putExtra(Intent.EXTRA_TEXT, Events); startActivity(Intent.createChooser(intent, "How would you like to escalate these events?")); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "escalate", e); } } } return false; } @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); //Log.e("onListItemClick","I got clicked"); // Notify the active callbacks interface (the activity, if the // fragment is attached to one) that an item has been selected. try { mCallbacks.onItemSelected(listOfZenossEvents.get(position), position); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onListItemClick onItemSelected", e); } //We want to keep track of this for our own purposes //mSelectedDevice = listOfZenossEvents.get(position).getname(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.events_list_fragment, null); return view; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mActivatedPosition != ListView.INVALID_POSITION) { // Serialize and persist the activated item position. if (null != outState) outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); } } /** * Turns on activate-on-click mode. When this mode is on, list items will be * given the 'activated' state when touched. */ public void setActivateOnItemClick(boolean activateOnItemClick) { // When setting CHOICE_MODE_SINGLE, ListView will automatically // give items the 'activated' state when touched. getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE); } private void setActivatedPosition(int position) { try { if (position == ListView.INVALID_POSITION) { getListView().setItemChecked(mActivatedPosition, false); } else { getListView().setItemChecked(position, true); } mActivatedPosition = position; } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "setActivatedPosition", e); } } private void configureHandlers() { AckSingleEventHandler = new Handler() { public void handleMessage(Message msg) { //Log.e("AckSingleEventHandler",Integer.toString(msg.what) + " / " + Integer.toString(msg.getData().getInt("position"))); switch (msg.what) { case ACKEVENTHANDLER_PROGRESS: { listOfZenossEvents.get(msg.getData().getInt("position")).setProgress(true); if (adapter != null) adapter.notifyDataSetChanged(); } break; case ACKEVENTHANDLER_SUCCESS: { if (null != listOfZenossEvents) { listOfZenossEvents.get(msg.getData().getInt("position")).setProgress(false); listOfZenossEvents.get(msg.getData().getInt("position")).setAcknowledged(); listOfZenossEvents.get(msg.getData().getInt("position")).setownerID("by you"); } RhybuddDataSource datasource = null; try { //TODO maybe do this with the bunch of ack id's we have in the thread? datasource = new RhybuddDataSource(getActivity()); datasource.open(); datasource.UpdateRhybuddEvents(listOfZenossEvents); } catch (Exception e) { e.printStackTrace(); BugSenseHandler.sendExceptionMessage("RhybuddHome", "AckEventHandler", e); } finally { if (null != datasource) datasource.close(); } if (adapter != null) adapter.notifyDataSetChanged(); } break; case ACKEVENTHANDLER_FAILURE: { if (null != listOfZenossEvents) listOfZenossEvents.get(msg.getData().getInt("position")).setProgress(false); if (adapter != null) adapter.notifyDataSetChanged(); try { Toast.makeText(getActivity(), "There was an error trying to ACK those events.", Toast.LENGTH_SHORT).show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("RhybuddHome", "ACKEVENTHANDLER_FAILURE", e); } } break; } } }; AckEventsHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case ACKEVENTHANDLER_PROGRESS: { if (null != listOfZenossEvents) { for (ZenossEvent evt : listOfZenossEvents) { if (!evt.getEventState().equals("Acknowledged")) { evt.setProgress(true); } } } if (adapter != null) adapter.notifyDataSetChanged(); } break; case ACKEVENTHANDLER_SUCCESS: { if (null != listOfZenossEvents) { for (ZenossEvent evt : listOfZenossEvents) { //if(!evt.getEventState().equals("Acknowledged") && evt.getProgress()) if (evt.getProgress()) { evt.setProgress(false); evt.setAcknowledged(); evt.setownerID("by you"); } } } RhybuddDataSource datasource = null; try { //TODO maybe do this with the bunch of ack id's we have in the thread? datasource = new RhybuddDataSource(getActivity()); datasource.open(); datasource.UpdateRhybuddEvents(listOfZenossEvents); } catch (Exception e) { e.printStackTrace(); BugSenseHandler.sendExceptionMessage("RhybuddHome", "AckEventsHandler", e); } finally { if (null != datasource) datasource.close(); } if (adapter != null) adapter.notifyDataSetChanged(); } break; case ACKEVENTHANDLER_FAILURE: { if (null != listOfZenossEvents) { for (ZenossEvent evt : listOfZenossEvents) { if (!evt.getEventState().equals("Acknowledged") && evt.getProgress()) { evt.setProgress(false); } } } if (adapter != null) adapter.notifyDataSetChanged(); try { Toast.makeText(getActivity(), "There was an error trying to ACK that event.", Toast.LENGTH_SHORT).show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("RhybuddHome", "ACKEVENTHANDLER_FAILURE", e); } } break; } } }; eventsListHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case EVENTSLISTHANDLER_DISMISS: { } break; case EVENTSLISTHANDLER_DELAYED_AB_STATUS: { try { if (null != refreshStatus) { refreshStatus.setActionView(abprogress); } else { if (dialog == null || !dialog.isShowing()) { dialog = new ProgressDialog(getActivity()); } dialog.setTitle("Querying Zenoss Directly"); dialog.setMessage("Refreshing Events..."); //ToDo set cancellable if (!dialog.isShowing()) dialog.show(); } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_DELAYED_AB_STATUS", e); } } break; case EVENTSLISTHANDLER_ERROR: { try { Toast.makeText(getActivity(), "An error was encountered;\r\n" + msg.getData().getString("exception"), Toast.LENGTH_LONG).show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_ERROR", e); } } break; case EVENTSLISTHANDLER_DIALOGUPDATE: { if (dialog != null && dialog.isShowing()) { try { dialog.setMessage("Refresh Complete!"); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_DIALOGUPDATE", e); } try { this.sendEmptyMessageDelayed(EVENTSLISTHANDLER_SUCCESS, 1000); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_DIALOGUPDATE", e); } } else { if (null != refreshStatus) { try { refreshStatus.setIcon(R.drawable.ic_action_refresh); getActivity().invalidateOptionsMenu(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_DIALOGUPDATE", e); } } } } break; case EVENTSLISTHANDLER_SUCCESS: { if (null != refreshStatus) { try { refreshStatus.setIcon(R.drawable.ic_action_refresh); getActivity().invalidateOptionsMenu(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_SUCCESS", e); } } if (dialog != null && dialog.isShowing()) { try { dialog.dismiss(); } catch (Exception e) { e.printStackTrace(); } } try { adapter = new ZenossEventsAdaptor(getActivity(), listOfZenossEvents); setListAdapter(adapter); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_SUCCESS", e); } } break; case EVENTSLISTHANDLER_DB_EMPTY: { if (null != refreshStatus) { refreshStatus.setActionView(abprogress); getActivity().invalidateOptionsMenu(); } else { // Log.e("refreshStatus","refreshStatus was null reverting to using dialog"); try { if (dialog != null && dialog.isShowing()) { dialog.setMessage( "DB Cache incomplete.\r\nQuerying Zenoss directly.\r\nPlease wait...."); } else { dialog = new ProgressDialog(getActivity()); dialog.setMessage( "DB Cache incomplete.\r\nQuerying Zenoss directly.\r\nPlease wait...."); //dialog.setCancelable(false); //Log.e("EVENTSLISTHANDLER_DB_EMPTY", "Showing a dialog"); dialog.show(); } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "EVENTSLISTHANDLER_DB_EMPTY", e); } } } break; case EVENTSLISTHANDLER_NO_EVENTS: { if (null != refreshStatus) { try { refreshStatus.setIcon(R.drawable.ic_action_refresh); getActivity().invalidateOptionsMenu(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EVENTSLISTHANDLER_NO_EVENTS", "invalidateOptionsMenu", e); } } if (dialog != null && dialog.isShowing()) { try { dialog.dismiss(); } catch (Exception e) { e.printStackTrace(); } } try { listOfZenossEvents.clear(); adapter.notifyDataSetChanged(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "no events adapter notify", e); } try { Toast.makeText(getActivity(), "No events found. Must be a quiet day!", Toast.LENGTH_LONG) .show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "Quiet day Toast", e); } } break; case EVENTSLISTHANDLER_TOTAL_FAILURE: { if (null != refreshStatus) { try { refreshStatus.setIcon(R.drawable.ic_action_refresh); getActivity().invalidateOptionsMenu(); } catch (NullPointerException npe) { //Don't care } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "RefreshThreadSleep", e); } } if (null != dialog && dialog.isShowing()) { try { dialog.dismiss(); } catch (Exception e) { e.printStackTrace(); } } try { Toast.makeText(getActivity(), "Last Error: " + API.getLastException(), Toast.LENGTH_LONG); } catch (Exception e) { try { Toast.makeText(getActivity(), "Attempted to show the last received error but it was null.", Toast.LENGTH_LONG); } catch (Exception e1) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "Error toast", e1); } } try { mCallbacks.fetchError(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "Calling mCallbacks.fetchError()", e); } } break; case EVENTSLISTHANDLER_SERVICE_NOT_STARTED: { try { dialog = new ProgressDialog(getActivity()); dialog.setTitle("Querying Zenoss Directly"); //Log.e("Refresh","The service wasn't running for some reason"); dialog.setMessage("The backend service wasn't running.\n\nStarting..."); //ToDo set cancellable if (!dialog.isShowing()) dialog.show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "EVENTSLISTHANDLER_SERVICE_NOT_STARTED", e); } } break; case EVENTSLISTHANDLER_SERVICE_FAILURE: { if (null != refreshStatus) { refreshStatus.setIcon(R.drawable.ic_action_refresh); getActivity().invalidateOptionsMenu(); } if (null != dialog && dialog.isShowing()) { try { dialog.dismiss(); } catch (Exception e) { e.printStackTrace(); } } Toast.makeText(getActivity(), "Rhybudd was unable to reach its internal service.\n\nThis will cause some issues with fetching events", Toast.LENGTH_LONG).show(); } break; case EVENTSLISTHANDLER_REDOREFRESH: { Refresh(); } break; } } }; } public void DBGetThread() { //Log.e("DBGetThread", "Doing a DB lookup"); if ((PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("URL", "").equals("") || PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("userName", "").equals("") || PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("passWord", "") .equals(""))) { //Log.e("DBGetThread", "Well we can't do this because we don't have any credentials "); return; } if (null != refreshStatus) { refreshStatus.setActionView(abprogress); } else { //Log.e("DBGetThread", "refreshStatus was null!"); } listOfZenossEvents.clear(); new Thread() { public void run() { Message msg = new Message(); Bundle bndle = new Bundle(); List<ZenossEvent> tempZenossEvents = null; try { RhybuddDataSource datasource = new RhybuddDataSource(getActivity()); datasource.open(); tempZenossEvents = datasource.GetRhybuddEvents(); datasource.close(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "DBGetThread", e); e.printStackTrace(); if (tempZenossEvents != null) tempZenossEvents.clear(); } if (tempZenossEvents != null && tempZenossEvents.size() > 0) { try { listOfZenossEvents = tempZenossEvents; eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_SUCCESS); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("RhybuddHome", "DBGetThread", e); bndle.putString("exception", e.getMessage()); msg.setData(bndle); msg.what = EVENTSLISTHANDLER_ERROR; eventsListHandler.sendMessage(msg); } } else { //Log.i("EventList","No DB data found, querying API directly"); try { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_DB_EMPTY); if (tempZenossEvents != null) tempZenossEvents.clear(); //Can we get away with just calling refresh now? getActivity().runOnUiThread(new Runnable() { public void run() { //TODO This needs to be sent as a runnable or something Refresh(); } }); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("RhybuddHome", "DBGetThread", e); bndle.putString("exception", e.getMessage()); msg.setData(bndle); msg.what = EVENTSLISTHANDLER_ERROR; eventsListHandler.sendMessage(msg); } } } }.start(); } private void DimissEvent(final ZenossEvent thisEvent) { new Thread() { public void run() { //This is a bit dirty but hell it saves an extra API call if (null == mService && !mBound) { //Log.e("Refresh","Service was dead or something so sleeping"); try { sleep(500); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("RhybuddHome", "RefreshThreadSleep", e); } } if (null != mService && mBound) { //Log.e("Refresh","yay not dead"); try { if (null == mService.API) { mService.PrepAPI(true, true); } ZenossCredentials credentials = new ZenossCredentials(getActivity()); mService.API.Login(credentials); mService.API.DismissEvent(thisEvent.getEVID()); //TODO maybe do something? } catch (Exception e) { e.printStackTrace(); BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "DimissEvent", e); //TODO Create a handler //eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_TOTAL_FAILURE); } } else { //TODO Lets warn them with a toast //TODO Or make it more resiliant } } }.start(); } private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.events_cab, menu); mode.setTitle("Manage " + cabNumSelected + " Events"); mode.setSubtitle("Select multiple events for mass acknowledgement"); return true; } // Called each time the action mode is shown. Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { mode.setTitle("Manage " + cabNumSelected + " Events"); mode.setSubtitle("Select multiple events for mass acknowledgement"); return true; //return false; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.Acknowledge: { //AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_PROGRESS); final List<String> EventIDs = new ArrayList<String>(); try { for (ZenossEvent evt : listOfZenossEvents) { if (evt.isSelected()) { evt.setProgress(true); evt.SetSelected(false); EventIDs.add(evt.getEVID()); } } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onActionItemClicked", e); } if (null != adapter) adapter.notifyDataSetChanged(); new Thread() { public void run() { try { if (null != mService && mBound) { try { if (null == mService.API) { mService.PrepAPI(true, true); } ZenossCredentials credentials = new ZenossCredentials(getActivity()); mService.API.Login(credentials); mService.API.AcknowledgeEvents(EventIDs); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e); } } else { try { AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e); } } try { //TODO Check it actually succeeded AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_SUCCESS); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e); } } catch (Exception e) { try { AckEventsHandler.sendEmptyMessage(ACKEVENTHANDLER_FAILURE); } catch (Exception e1) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "AckAllThread", e1); } } } }.start(); mode.finish(); return true; } case R.id.escalate: { try { Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); // Add data to the intent, the receiving app will decide what to do with it. intent.putExtra(Intent.EXTRA_SUBJECT, "Escalation of " + cabNumSelected + " Zenoss Events"); String Events = "Escalated events;"; int size = listOfZenossEvents.size(); for (Integer i = 0; i < size; i++) { if (listOfZenossEvents.get(i).isSelected()) Events += "\r\n" + listOfZenossEvents.get(i).getDevice() + " - " + listOfZenossEvents.get(i).getSummary(); } intent.putExtra(Intent.EXTRA_TEXT, Events); startActivity(Intent.createChooser(intent, "How would you like to escalate these events?")); mode.finish(); return true; } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "escalate", e); return false; } } default: { if (null != adapter) adapter.notifyDataSetChanged(); return false; } } } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { try { //Log.e("onDestroyActionMode","Called"); int size = listOfZenossEvents.size(); for (Integer i = 0; i < size; i++) { listOfZenossEvents.get(i).SetSelected(false); } adapter.notifyDataSetChanged(); cabNumSelected = 0; mActionMode = null; } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onDestroyActionMode", e); } } }; public void Refresh() { try { if ((PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("URL", "").equals("") || PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("userName", "") .equals("") || PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("passWord", "") .equals(""))) { //Log.e("Refresh()", "Well we can't do this because we don't have any credentials "); return; } } catch (Exception e) { try { if (null == getActivity()) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Refresh getActivity was null", e); } else { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Refresh getActivity not null", e); } } catch (Exception ie) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Refresh checking activity", e); } return; } try { if (null != refreshStatus) { refreshStatus.setActionView(abprogress); } else { Log.e("Refresh", "refreshStatus was null"); try { eventsListHandler.sendEmptyMessageDelayed(EVENTSLISTHANDLER_DELAYED_AB_STATUS, 500); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "eventsListHandler", e); } /*if(dialog == null || !dialog.isShowing()) { dialog = new ProgressDialog(getActivity()); } dialog.setTitle("Querying Zenoss Directly"); dialog.setMessage("Refreshing Events..."); //ToDo set cancellable if(!dialog.isShowing()) dialog.show();*/ } } catch (Exception e) { //e.printStackTrace(); //TODO Handle this and tell the user BugSenseHandler.sendExceptionMessage("RhybuddHome", "Refresh", e); } new Thread() { public void run() { //If we wait just a little bit then the UI should catch up try { sleep(500); } catch (InterruptedException ie) { ie.printStackTrace(); } List<ZenossEvent> tempZenossEvents = null; //This is a bit dirty but hell it saves an extra API call if (null == mService && !mBound) { //Log.e("Refresh","Service was dead or something so sleeping"); try { sleep(500); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "RefreshThreadSleep", e); } } if (null != mService && mBound) { //Log.e("Refresh","yay not dead"); try { if (null == mService.API) { mService.PrepAPI(true, true); } ZenossCredentials credentials = null; try { credentials = new ZenossCredentials(getActivity()); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("EventsListFragment", "ZenossCredentials", e); } if (null != credentials && mService.API.Login(credentials)) { tempZenossEvents = mService.API.GetRhybuddEvents(getActivity()); if (null == tempZenossEvents) { //Log.e("Refresh","We got a null return from the service API, lets try ourselves"); ZenossAPI API; if (PreferenceManager.getDefaultSharedPreferences(getActivity()) .getBoolean(ZenossAPI.PREFERENCE_IS_ZAAS, false)) { API = new ZenossAPIZaas(); } else { API = new ZenossAPICore(); } credentials = new ZenossCredentials(getActivity()); API.Login(credentials); tempZenossEvents = API.GetRhybuddEvents(getActivity()); } if (tempZenossEvents != null && tempZenossEvents.size() > 0) { retryCount = 0; listOfZenossEvents = tempZenossEvents; eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_DIALOGUPDATE); RhybuddDataSource datasource = new RhybuddDataSource(getActivity()); datasource.open(); datasource.UpdateRhybuddEvents(listOfZenossEvents); datasource.close(); try { ZenossAPI.updateLastChecked(getActivity()); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Updating last setting", e); } try { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_SUCCESS); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Sending EVENTSLISTHANDLER_SUCCESS", e); } } else if (tempZenossEvents != null && tempZenossEvents.size() == 0) { try { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_NO_EVENTS); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Sending EVENTSLISTHANDLER_NO_EVENTS", e); } } else { // TODO Send a proper message try { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_TOTAL_FAILURE); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Sending EVENTSLISTHANDLER_TOTAL_FAILURE", e); } } } else { try { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_TOTAL_FAILURE); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Sending EVENTSLISTHANDLER_TOTAL_FAILURE", e); } } } catch (Exception e) { e.printStackTrace(); BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Refresh", e); try { if (null != eventsListHandler) eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_TOTAL_FAILURE); } catch (Exception e1) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Sending EVENTSLISTHANDLER_TOTAL_FAILURE from within catch", e1); } } } else { if (null == refreshStatus) { if (dialog == null || !dialog.isShowing()) { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_SERVICE_NOT_STARTED); } } try { Intent intent = new Intent(getActivity(), ZenossPoller.class); getActivity().startService(intent); retryCount++; if (retryCount > 5) { eventsListHandler.sendEmptyMessage(EVENTSLISTHANDLER_SERVICE_FAILURE); } else { doBindService(); eventsListHandler.sendEmptyMessageDelayed(EVENTSLISTHANDLER_REDOREFRESH, 300); } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "Start Service / bind service", e); } } } }.start(); } //------------------------------------------------------------------// // // // Connection to the the ZenossPoller Service // // // //------------------------------------------------------------------// void doUnbindService() { try { if (mBound) { // Detach our existing connection. getActivity().unbindService(mConnection); mBound = false; } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "doUnbindService", e); } } void doBindService() { try { getActivity().bindService(new Intent(getActivity(), ZenossPoller.class), mConnection, Context.BIND_AUTO_CREATE); mBound = true; } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "doBindService", e); } } @Override public void onResume() { super.onResume(); //Lets try and bind to our service (if it's alive) doBindService(); //If we've binded let's try and do a refresh //If it's been more than 15 minutes since we last updated we should do a full refresh if (ZenossAPI.shouldRefresh(getActivity())) { //Log.i("onResume","shouldRefresh() says we should do a full refresh"); Refresh(); } else { //Log.i("onResume","shouldRefresh() says we're good to do a DB fetch"); DBGetThread(); } } @Override public void onPause() { super.onPause(); // Unbind from the service doUnbindService(); try { //Log.e("onPause","Checking if dialog is null"); if (null != dialog) { //Log.e("onPause","it wasn't"); try { //Log.e("onPause","Dismissing"); dialog.dismiss(); //Log.e("onPause","dismissed"); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onPause", e); } } else { //Log.e("onPause","dialog was null"); } } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onPause outer", e); e.printStackTrace(); } } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { try { // We've bound to LocalService, cast the IBinder and get LocalService instance ZenossPoller.LocalBinder binder = (ZenossPoller.LocalBinder) service; mService = binder.getService(); mBound = true; //Toast.makeText(RhybuddHome.this, "Connected to Service", Toast.LENGTH_SHORT).show(); } catch (Exception e) { BugSenseHandler.sendExceptionMessage("ViewZenossEventsListFragment", "onServiceConnected", e); mBound = false; } } @Override public void onServiceDisconnected(ComponentName arg0) { //Toast.makeText(RhybuddHome.this, "Disconnected to Service", Toast.LENGTH_SHORT).show(); mBound = false; } }; }