package com.conference.app.lib.ui;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.concurrent.ExecutionException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ToggleButton;
import com.conference.app.lib.R;
import com.conference.app.lib.database.DatabaseAdapter;
import com.conference.app.lib.database.DatabaseHelper;
import com.conference.app.lib.database.tables.SessionSpeakerTable;
import com.conference.app.lib.database.tables.SessionTable;
import com.conference.app.lib.database.tables.SpeakerTable;
import com.conference.app.lib.ui.adapter.SpeakerAdapter;
import com.conference.app.lib.util.DeviceUtil;
public class SessionDetails extends Activity {
private static final String TAG = SessionDetails.class.getName();
private static final boolean DEBUG = false;
public static final String EXTRA_SESSION_ID = "sessionid";
private ImageView sessionImg;
private TextView sessionTrack;
private TextView sessionTitle;
private WebView sessionDesc;
private TextView sessionTime;
private TextView sessionLocation;
private ListView speakerList;
private ToggleButton sessionFav;
private DatabaseAdapter dbAdapter;
private String uniqueSessionId;
private SQLiteDatabase db;
private boolean isFirstInit = true;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sessiondetails);
final DatabaseHelper helper = new DatabaseHelper(this);
db = helper.getReadableDatabase();
}
@Override
protected void onResume() {
super.onResume();
if (!isFirstInit) {
return;
}
isFirstInit = false;
initViews();
extractAndInitIntentValues(getIntent());
}
@Override
protected void onDestroy() {
super.onDestroy();
if (db != null && db.isOpen()) {
db.close();
}
isFirstInit = true;
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
extractAndInitIntentValues(intent);
}
private void extractAndInitIntentValues(final Intent intent) {
if (intent.hasExtra(EXTRA_SESSION_ID)) {
uniqueSessionId = intent.getStringExtra(EXTRA_SESSION_ID);
initViewValues(uniqueSessionId);
}
}
private void initViews() {
dbAdapter = new DatabaseAdapter(this);
sessionTitle = (TextView) findViewById(R.id.sessionDetailTitle);
sessionTitle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sessionTitle.setSingleLine(false);
sessionTitle.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
sessionTitle.setCompoundDrawables(null, null, null, null);
}
});
sessionDesc = (WebView) findViewById(R.id.sessionDetailDesc);
sessionTrack = (TextView) findViewById(R.id.sessionDetailTrack);
sessionTime = (TextView) findViewById(R.id.sessionDetailTime);
sessionImg = (ImageView) findViewById(R.id.sessionDetailImg);
sessionLocation = (TextView) findViewById(R.id.sessionDetailLocation);
speakerList = (ListView) findViewById(R.id.sessionDetailSpeakerlist);
speakerList.setScrollbarFadingEnabled(false);
speakerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Cursor cursor = (Cursor) parent.getItemAtPosition(position);
final String uniqueSpeakerId = cursor.getString(cursor.getColumnIndex(SpeakerTable.UNIQUE_ID));
final Intent intent = new Intent(SessionDetails.this, SpeakerDetails.class);
intent.putExtra(SpeakerDetails.EXTRA_SPEAKER_ID, uniqueSpeakerId);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
sessionFav = (ToggleButton) findViewById(R.id.sessionDetailFavorite);
sessionFav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
dbAdapter.setFavorite(uniqueSessionId, isChecked);
}
});
}
private void initViewValues(final String uniqueSessionId) {
try {
new LoadSessionDetailValues().execute(uniqueSessionId).get();
new LoadSpeakers().execute(uniqueSessionId).get();
} catch (InterruptedException e) {
Log.e(TAG, e.getMessage(), e);
} catch (ExecutionException e) {
Log.e(TAG, e.getMessage(), e);
}
}
public void onClickActionBarHome(final View view) {
final Intent intent = new Intent(this, Dashboard.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
// overridePendingTransition(R.anim.home_enter, R.anim.home_exit);
}
private class LoadSessionDetailValues extends AsyncTask<String, Void, Cursor> {
private String trackName;
private String room;
@Override
protected Cursor doInBackground(final String... params) {
final Cursor cursor = db.query(SessionTable.TABLE_NAME, SessionTable.ALL_COLUMNS, SessionTable.UNIQUE_ID + "='"
+ params[0] + "'", null, null, null, null);
// final String query = "select s." + TrackTable.ID + ", s." + TrackTable.NAME + ", s." +
// TrackTable.UNIQUE_ID + " from "
// + TrackTable.TABLE_NAME + " s, " + SessionTrackTable.TABLE_NAME + " st where st." +
// SessionTrackTable.TRACK_ID
// + "=s." + TrackTable.UNIQUE_ID + " AND st." + SessionTrackTable.SESSION_ID + "=? ORDER BY s." +
// TrackTable.ID
// + " ASC";
// final Cursor trackCursor = db.rawQuery(query, new String[] { params[0] });
// trackCursor.moveToFirst();
// trackCursor.close();
cursor.moveToFirst();
trackName = cursor.getString(cursor.getColumnIndex(SessionTable.TYPE));
final String roomName = cursor.getString(cursor.getColumnIndex(SessionTable.ROOM_NAME));
final String roomFloor = cursor.getString(cursor.getColumnIndex(SessionTable.ROOM_FLOOR));
if (roomFloor != null && !"null".equals(roomFloor) && roomFloor.length() > 0) {
room = roomName + "(" + roomFloor + ")";
} else {
room = roomName;
}
return cursor;
}
@Override
protected void onPostExecute(final Cursor result) {
if (result != null) {
sessionTrack.setText(trackName);
sessionLocation.setText(getString(R.string.room_label) + " " + room);
sessionFav.setChecked(result.getInt(result.getColumnIndex(SessionTable.FAVORITE)) != 0);
sessionTitle.setText(result.getString(result.getColumnIndex(SessionTable.NAME)));
sessionDesc.loadDataWithBaseURL("", result.getString(result.getColumnIndex(SessionTable.DETAILS)), "text/html",
"utf-8", "");
String session = "SESSION".toLowerCase();
String workshop = "WORKSHOP".toLowerCase();
String keynote = "KEYNOTE".toLowerCase();
String sessionType = result.getString(result.getColumnIndex(SessionTable.TYPE)).toLowerCase();
if (session.toLowerCase().equals(sessionType)) {
sessionImg.setImageResource(R.drawable.session_icon);
} else if (workshop.toLowerCase().equals(sessionType)) {
sessionImg.setImageResource(R.drawable.workshop_icon);
} else if (keynote.toLowerCase().equals(sessionType)) {
sessionImg.setImageResource(R.drawable.keynote_icon);
}
try {
final SimpleDateFormat formater = new SimpleDateFormat("EEE dd/MM/yyyy / HH:mm", Locale.getDefault());
final SimpleDateFormat formater2 = new SimpleDateFormat("HH:mm", Locale.getDefault());
final SimpleDateFormat dbEntryFormater = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.getDefault());
final String time = formater.format(dbEntryFormater.parse(result.getString(result
.getColumnIndex(SessionTable.START_DATE))))
+ " - "
+ formater2.format(dbEntryFormater.parse(result.getString(result.getColumnIndex(SessionTable.END_DATE))));
sessionTime.setText(time);
} catch (ParseException e) {
Log.e(TAG, e.getMessage(), e);
}
result.close();
}
}
}
private class LoadSpeakers extends AsyncTask<String, Void, Cursor> {
@Override
protected Cursor doInBackground(final String... params) {
final String query = "select s." + SpeakerTable.ID + ", s." + SpeakerTable.UNIQUE_ID + ", s." + SpeakerTable.DISPLAY_NAME
+ ", s." + SpeakerTable.COMPANY + ", s." + SpeakerTable.LAST_NAME + " from " + SpeakerTable.TABLE_NAME + " s, "
+ SessionSpeakerTable.TABLE_NAME + " st where st." + SessionSpeakerTable.SPEAKER_ID + "=s."
+ SpeakerTable.UNIQUE_ID + " AND st." + SessionSpeakerTable.SESSION_ID + "=? ORDER BY s." + SpeakerTable.LAST_NAME
+ " ASC";
final Cursor cursor = db.rawQuery(query, new String[] { params[0] });
startManagingCursor(cursor);
return cursor;
}
@Override
protected void onPostExecute(final Cursor result) {
if (result != null) {
final SpeakerAdapter adapter = new SpeakerAdapter(SessionDetails.this, result);
speakerList.setAdapter(adapter);
speakerList.invalidate();
adapter.notifyDataSetChanged();
setListViewHeightBasedOnChildren(speakerList);
}
}
}
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
int totalHeight = DeviceUtil.dip2px(listView.getContext(), 10);
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0) {
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT + DeviceUtil.dip2px(listView.getContext(), 5)));
}
view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
int padding = DeviceUtil.dip2px(listView.getContext(), 5);
listView.setPadding(padding, padding, padding, padding);
listView.requestLayout();
}
}