package uk.ac.cam.echo.activities;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.SearchView;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import uk.ac.cam.echo.R;
import uk.ac.cam.echo.Toaster;
import uk.ac.cam.echo.client.ClientApi;
import uk.ac.cam.echo.fragments.AddConversationDialog;
import uk.ac.cam.echo.fragments.ConversationDialog;
import uk.ac.cam.echo.fragments.ConversationListFragment;
import uk.ac.cam.echo.fragments.ConversationListFragment.Communicator;
import uk.ac.cam.echo.onListLoadedListener;
import uk.ac.cam.echo.services.EchoService;
public class ConversationListActivity extends Activity
implements Communicator, onListLoadedListener {
private EchoService echoService;
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
echoService = ((EchoService.LocalBinder)service).getService();
api = echoService.getApi();
clf.setApi(api);
clf.getAllConversations();
openDialog();
}
public void onServiceDisconnected(ComponentName className) {
echoService = null;
}
};
private static ClientApi api;
private MenuItem qrScan;
private FragmentManager manager;
private boolean dualPane; //to manage orientations/different screensizes
private ConversationListFragment clf;
private boolean isSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.conv_list_detail_layout);
manager = getFragmentManager();
View detailsFrame = findViewById(R.id.convFrame);
dualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
clf = (ConversationListFragment) manager.findFragmentById(R.id.convListFragment);
clf.setCommunicator(this);
Log.d("SEARCH", "onCreate");
isSearch = false;
handleIntent(getIntent());
}
@Override
protected void onResume() {
super.onResume();
Log.d("SEARCH", "binding again");
Intent service = new Intent(this, EchoService.class);
bindService(service, connection, Context.BIND_AUTO_CREATE);
}
private void openDialog() {
long id = getIntent().getLongExtra("_id", -1L);
if(id != -1){
respond(id);
}
}
@Override
protected void onPause() {
super.onPause();
unbindService(connection);
}
public EchoService getService() { return echoService; }
// If current view is dual-pane, update the fragment,
// otherwise start the stand-alone conversation activity
@Override
public void respond(long id) {
if(dualPane) {
Log.d("RESPOND", "respond called " + id);
ConversationDialog convFrag =
(ConversationDialog)manager.findFragmentById(R.id.convFrame);
if(convFrag == null || convFrag.getShownIndex() != id) {
convFrag = ConversationDialog.newInstance(id, getService());
convFrag.setId(id);
convFrag.setApi(getService().getApi());
Log.d("RESPOND", "new instance created");
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.convFrame, convFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
} else {
if(id != getService().getConversationId()) {
getService().listenToConversation(id);
}
Intent intent = new Intent(this, ConversationDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.putExtra("_id", id);
startActivity(intent);
}
}
// Set up action-bar and Search functionality
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
getMenuInflater().inflate(R.menu.list_activity_actions, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
// Attaching functionality to menu-items
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_scan:
openScan();
return true;
case R.id.action_add_conv:
addConversation();
return true;
case R.id.action_user:
openUserSettings();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// Methods to handle search queries to the same activity
@Override
protected void onNewIntent(Intent intent) {
Log.d("SEARCH", "onNewIntent");
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
isSearch = true;
clf.performSearch(query);
Log.d("SEARCH", "handleIntent");
}
}
// Opening a Dialog form to add new Conversation
private void addConversation() {
AddConversationDialog addDialog = AddConversationDialog.newInstance();
addDialog.setApi(getService().getApi());
addDialog.show(manager, "add_conv");
}
// Methods to handle QR code scanning and retrieving results
private void openScan() {
IntentIntegrator scanIntegrator = new IntentIntegrator(this);
scanIntegrator.initiateScan();
}
private void openUserSettings() {
Intent intent = new Intent(this, UserSettingsActivity.class);
startActivity(intent);
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
//retrieve scan result
IntentResult scanningResult =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if(scanningResult != null) {
String scanContent = scanningResult.getContents();
//String scanFormat = scanningResult.getFormatName();
int position = -1;
try {
position = Integer.parseInt(scanContent);
}catch(Exception e) {
Log.e("CLF", e.getMessage());
}
if (position != -1)
respond(position);
}else {
Toaster.displayLong(this, "No scan data received!");
}
}
// Callback method when ListView has fully rendered
@Override
public void onRendered() {
if(dualPane) respond(clf.getAdapter().getItem(0).getId());
}
}