package esri.mrm.mobile.activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import com.esri.android.map.ags.ArcGISFeatureLayer;
import com.esri.core.map.CallbackListener;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.Field;
import com.esri.core.map.Graphic;
import com.esri.core.tasks.ags.query.Query;
import esri.mrm.mobile.AGSObjects;
import esri.mrm.mobile.LayerUtility;
import esri.mrm.mobile.Notification;
import esri.mrm.mobile.R;
import esri.mrm.mobile.adapter.MessageAdapter;
public class MessagesActivity extends Activity
{
// Graphic route;
final List<Notification> notifications = new ArrayList<Notification>();
private Toast toast;
private long lastBackPressTime = 0;
private ArcGISFeatureLayer messagesLayer;
private AGSObjects agsObjects;
private ListView list;
private Context context;
private ScheduledExecutorService scheduledTaskExecutor;
private int reloadInterval;
private SharedPreferences sharedPrefs;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.message_list);
context = this;
list = (ListView) findViewById(R.id.messages);
list.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> av, View v, int position, long id)
{
MessageAdapter messageAdapter = (MessageAdapter) av.getAdapter();
ShowItemClick(messageAdapter, v, position);
}
});
agsObjects = ((AGSObjects) getApplicationContext());
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if (scheduledTaskExecutor == null)
{
scheduledTaskExecutor = Executors.newScheduledThreadPool(1);
scheduledTaskExecutor.scheduleAtFixedRate(new Runnable()
{
public void run()
{
loadMessages();
}
}, 0, 20, TimeUnit.SECONDS);
}
}
private void loadPreferences()
{
reloadInterval = Integer.parseInt(sharedPrefs.getString("wo_update_interval", "10000"));
}
private void scheduleLoadMessages()
{
notifications.clear();
if (scheduledTaskExecutor != null)
{
scheduledTaskExecutor.shutdown();
scheduledTaskExecutor = null;
}
scheduledTaskExecutor = Executors.newScheduledThreadPool(1);
scheduledTaskExecutor.scheduleAtFixedRate(new Runnable()
{
public void run()
{
loadMessages();
}
}, 0, reloadInterval / 1000, TimeUnit.SECONDS);
}
public void loadMessages()
{
messagesLayer = agsObjects.getMessagesLayer();
if (messagesLayer == null)
{
MessagesActivity.this.runOnUiThread(new Runnable()
{
public void run()
{
SetMessageAdapter(notifications);
}
});
return;
}
Query query = new Query();
String routeFieldName = LayerUtility.getFieldNamebyAlias(messagesLayer, getResources().getString(R.string.ALIAS_MESSAGESLAYER_MESSAGE_TO));
String whereClause = routeFieldName + "='" + agsObjects.getRouteId() + "'";
query.setWhere(whereClause);
query.setOutFields(new String[] { "*" });
messagesLayer.queryFeatures(query, new CallbackListener<FeatureSet>()
{
public void onError(Throwable e)
{
Log.d("MessagesActivity", "Select Features Error" + e.getLocalizedMessage());
}
public void onCallback(FeatureSet result)
{
notifications.clear();
Graphic[] grs = result.getGraphics();
Map<String, String> fieldAliases = new HashMap<String, String>();
for (Field field : result.getFields())
{
fieldAliases.put(field.getName(), field.getAlias());
}
for (int i = 0; i < grs.length; i++)
{
Graphic graphic = grs[i];
Notification notification = new Notification(graphic, context, result.getObjectIdFieldName(), fieldAliases);
notifications.add(notification);
}
Collections.sort(notifications, new messageComparator());
MessagesActivity.this.runOnUiThread(new Runnable()
{
public void run()
{
SetMessageAdapter(notifications);
}
});
}
});
}
@Override
public void onBackPressed()
{
if (this.lastBackPressTime < System.currentTimeMillis() - 4000)
{
toast = Toast.makeText(this, "Press Back button agian to close the app", Toast.LENGTH_LONG);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
}
else
{
if (toast != null)
{
toast.cancel();
}
super.onBackPressed();
}
}
private void ShowItemClick(MessageAdapter messageAdapter, View v, int position)
{
Notification message = messageAdapter.getItem(position);
Class<?> cls = ExitedTerritoryReasonActivity.class;
String activity = "";
if (message.getType().equals("Notification") && message.getSubject().equals("Dispatch"))
{
activity = "DispatchActivity";
cls = DispatchActivity.class;
}
// Toast.makeText(this, message.getName(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getParent(), cls);
Bundle b = new Bundle();
b.putParcelable("Notification", message);
intent.putExtras(b);
TabGroupActivity parentActivity = (TabGroupActivity) getParent();
parentActivity.startChildActivity(activity, intent);
}
public void SetMessageAdapter(List<Notification> notifications)
{
// ListView list=(ListView)findViewById(R.id.messages);
MessageAdapter adapter = (MessageAdapter) list.getAdapter();
if (adapter == null)
{
adapter = new MessageAdapter(this, notifications);
list.setAdapter(adapter);
}
adapter.notifyDataSetChanged();
updateTab();
}
private void updateTab()
{
try
{
boolean hasOpenMsg = false;
MessagesTabGroupActivity p = (MessagesTabGroupActivity) getParent();
EsriMrmActivity gp = (EsriMrmActivity) p.getParent();
ViewGroup msgTab = (ViewGroup) gp.getTabWidget().getChildAt(0);
ImageView v = (ImageView) msgTab.getChildAt(0);
for (Notification n : notifications)
{
if (!n.getStatus().equals("Complete"))
{
hasOpenMsg = true;
}
}
if (hasOpenMsg)
{
v.setImageDrawable(getResources().getDrawable(R.drawable.ic_tab_messages_ex));
}
else
{
v.setImageDrawable(getResources().getDrawable(R.drawable.ic_tab_messages));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
protected void onDestroy()
{
super.onDestroy();
if (scheduledTaskExecutor != null)
{
scheduledTaskExecutor.shutdownNow();
scheduledTaskExecutor = null;
}
}
@Override
protected void onStop()
{
super.onStop();
}
public void doSomething()
{
Log.d("DoSomething", "Doing Something");
}
@Override
protected void onResume()
{
super.onResume();
loadPreferences();
scheduleLoadMessages();
}
private class messageComparator implements Comparator<Notification>
{
public int compare(Notification lhs, Notification rhs)
{
Long lhs_time = lhs.getTime();
Long rhs_time = rhs.getTime();
//return lhs_time.compareTo(rhs_time);
return rhs_time.compareTo(lhs_time);
}
}
}