package com.conference.app.lib.ui; import java.util.concurrent.ExecutionException; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.webkit.WebView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import com.conference.app.lib.R; 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.SessionAdapter; import com.conference.app.lib.ui.adapter.SpeakerAdapter; import com.conference.app.lib.util.DeviceUtil; public class SpeakerDetails extends Activity { private static final String TAG = SpeakerDetails.class.getName(); private static final boolean DEBUG = false; public static final String EXTRA_SPEAKER_ID = "speakerID"; private static final int CURSOR_LOADER = 1; private TextView speakerName; private TextView speakerCompany; private WebView speakerDesc; private ImageView speakerImg; private ListView sessionList; private String uniqueSpeakerId; private SQLiteDatabase db; private boolean isFirstInit = true; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.speakerdetails); final DatabaseHelper helper = new DatabaseHelper(this); db = helper.getReadableDatabase(); initViews(); } @Override protected void onDestroy() { super.onDestroy(); if (db != null && db.isOpen()) { db.close(); } isFirstInit = true; } @Override protected void onResume() { super.onResume(); if (uniqueSpeakerId != null) { try { new LoadSessionsForSpeaker().execute(uniqueSpeakerId).get(); } catch (InterruptedException e) { Log.e(TAG, e.getMessage(), e); } catch (ExecutionException e) { Log.e(TAG, e.getMessage(), e); } } if (!isFirstInit) { return; } isFirstInit = false; extractAndInitIntentValues(getIntent()); } @Override protected void onNewIntent(final Intent intent) { super.onNewIntent(intent); extractAndInitIntentValues(intent); } private void extractAndInitIntentValues(final Intent intent) { if (intent.hasExtra(EXTRA_SPEAKER_ID)) { uniqueSpeakerId = intent.getStringExtra(EXTRA_SPEAKER_ID); initViewValues(uniqueSpeakerId); } } private void initViews() { speakerName = (TextView) findViewById(R.id.speakerDetailName); speakerCompany = (TextView) findViewById(R.id.speakerDetailCompany); speakerDesc = (WebView) findViewById(R.id.speakerDetailDesc); speakerImg = (ImageView) findViewById(R.id.speakerDetailImg); sessionList = (ListView) findViewById(R.id.speakerDetailSessionlist); sessionList.setScrollbarFadingEnabled(false); } private void initViewValues(final String uniqueSpeakerId) { final Cursor cursor = db.query(SpeakerTable.TABLE_NAME, SpeakerTable.ALL_COLUMNS, SpeakerTable.UNIQUE_ID + "='" + uniqueSpeakerId + "'", null, null, null, null); cursor.moveToFirst(); speakerName.setText(cursor.getString(cursor.getColumnIndex(SpeakerTable.DISPLAY_NAME))); speakerCompany.setText(cursor.getString(cursor.getColumnIndex(SpeakerTable.COMPANY))); speakerDesc.loadDataWithBaseURL("", cursor.getString(cursor.getColumnIndex(SpeakerTable.DETAILS)), "text/html", "utf-8", ""); if (SpeakerAdapter.SPEAKER_IMAGES.containsKey(uniqueSpeakerId)) { speakerImg.setImageBitmap(SpeakerAdapter.SPEAKER_IMAGES.get(uniqueSpeakerId)); } else { final byte[] binaryImage = cursor.getBlob(cursor.getColumnIndex(SpeakerTable.IMAGE)); if (binaryImage != null) { final Bitmap bitmap = BitmapFactory.decodeByteArray(binaryImage, 0, binaryImage.length); speakerImg.setImageBitmap(bitmap); SpeakerAdapter.SPEAKER_IMAGES.put(uniqueSpeakerId, bitmap); } } cursor.close(); try { new LoadSessionsForSpeaker().execute(uniqueSpeakerId).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 LoadSessionsForSpeaker extends AsyncTask<String, Void, Cursor> { @Override protected Cursor doInBackground(final String... params) { final String query = "select s." + SessionTable.ID + ", s." + SessionTable.TYPE + ", s." + SessionTable.NAME + ", s." + SessionTable.SHORT_NAME + ", s." + SessionTable.UNIQUE_ID + ", s." + SessionTable.FAVORITE + ", s." + SessionTable.SEARCH_NAME + ", s." + SessionTable.START_DATE + ", s." + SessionTable.END_DATE + " from " + SessionTable.TABLE_NAME + " s, " + SessionSpeakerTable.TABLE_NAME + " st where st." + SessionSpeakerTable.SESSION_ID + "=s." + SessionTable.UNIQUE_ID + " AND st." + SessionSpeakerTable.SPEAKER_ID + "=? ORDER BY s." + SessionTable.SEARCH_NAME + " COLLATE NOCASE"; final Cursor cursor = db.rawQuery(query, new String[] { params[0] }); return cursor; } @Override protected void onPostExecute(final Cursor result) { if (result != null) { final SessionAdapter adapter = new SessionAdapter(SpeakerDetails.this, result); sessionList.setAdapter(adapter); sessionList.invalidate(); adapter.notifyDataSetChanged(); sessionList.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 uniqueSessionId = cursor.getString(cursor.getColumnIndex(SessionTable.UNIQUE_ID)); final Intent intent = new Intent(SpeakerDetails.this, SessionDetails.class); intent.putExtra(SessionDetails.EXTRA_SESSION_ID, uniqueSessionId); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); } }); setListViewHeightBasedOnChildren(sessionList); } } } 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(); } }