package com.conference.app.lib.ui;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONException;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.conference.app.lib.R;
import com.conference.app.lib.database.DatabaseHelper;
import com.conference.app.lib.database.tables.ConferenceTable;
import com.conference.app.lib.network.Downloader;
import com.conference.app.lib.util.ImageCache;
import com.conference.app.lib.util.Preferences;
import com.conference.app.lib.util.TimeUtil;
public class Dashboard extends Activity {
private static final int AD_ROTATE_TIMEOUT = 4000;
private static final String TAG = Dashboard.class.getName();
private static final boolean DEBUG = false;
private static final int DIALOG_DOWNLOAD_PROGRESS = 1;
private static final int DIALOG_NOT_CONNECTED = 2;
private static final int DIALOG_DOWNLOAD_NO_WLAN = 3;
private static final int COUNTER_UPDATE_INTERVALL_IN_MS = 1000;
private static final int TIME_10 = 10;
private TextView countdown;
// private ImageView banner;
// private ImageView advertisment;
private View dashboardRoot;
private Preferences pref;
private SQLiteDatabase db;
private Handler handler1;
private Handler handler2;
private Handler handler3;
private Runnable r1;
private Runnable r2;
private Runnable r3;
private ImageView ad1;
private ImageView ad2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dashboard);
final DatabaseHelper helper = new DatabaseHelper(Dashboard.this);
db = helper.getReadableDatabase();
pref = new Preferences(this);
initViews();
initAppStart();
}
private void initViews() {
countdown = (TextView) findViewById(R.id.countdown);
countdown.setText("");
ad1 = (ImageView) findViewById(R.id.ad1);
ad2 = (ImageView) findViewById(R.id.ad2);
// banner = (ImageView) findViewById(R.id.logo);
// advertisment = (ImageView) findViewById(R.id.DashboardAdvertisment);
dashboardRoot = findViewById(R.id.dashboardRoot);
handler1 = new Handler();
handler2 = new Handler();
handler3 = new Handler();
r1 = new Runnable() {
@Override
public void run() {
// TODO animate view opacity before setting to gone/visible
countdown.setVisibility(View.GONE);
ad1.setVisibility(View.VISIBLE);
handler2.postDelayed(r2, AD_ROTATE_TIMEOUT);
}
};
r2 = new Runnable() {
@Override
public void run() {
// TODO animate view opacity before setting to gone/visible
ad1.setVisibility(View.GONE);
ad2.setVisibility(View.VISIBLE);
handler3.postDelayed(r3, AD_ROTATE_TIMEOUT);
}
};
r3 = new Runnable() {
@Override
public void run() {
// TODO animate view opacity before setting to gone/visible
ad2.setVisibility(View.GONE);
countdown.setVisibility(View.VISIBLE);
handler1.postDelayed(r1, AD_ROTATE_TIMEOUT);
}
};
handler1.postDelayed(r1, AD_ROTATE_TIMEOUT);
}
private void initAppStart() {
if (!pref.isFirstStart() && pref.isDownloadFinished()) {
dashboardRoot.setVisibility(View.VISIBLE);
new DownloaderTask().execute(isOnline());
} else {
if (isOnline()) {
if (isWifiOn()) {
new DownloaderTask().execute();
} else {
showDialog(DIALOG_DOWNLOAD_NO_WLAN);
}
} else {
showDialog(DIALOG_NOT_CONNECTED);
}
}
}
public void onClickSchedule(final View view) {
startActivity(new Intent(this, Schedule.class));
}
public void onClickSessions(final View view) {
startActivity(new Intent(this, Session.class));
}
public void onClickSpeakers(final View view) {
startActivity(new Intent(this, Speaker.class));
}
public void onClickTwitter(final View view) {
if (isOnline()) {
startActivity(new Intent(this, TweetReader.class));
} else {
Toast.makeText(this, R.string.dashboard_toast_no_inet, Toast.LENGTH_LONG).show();
}
}
public void onClickFav(final View view) {
startActivity(new Intent(this, Favorites.class));
}
public void onClickMap(final View view) {
startActivity(new Intent(this, LocationAndFeedback.class));
}
public void onClickAdvertisment(final View view) {
// final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.jaxenter.de"));
// startActivity(browserIntent);
}
public void onClickCountdown(final View view) {
// can be implemented if needed
}
public void onClickAd1(final View view) {
String url = "http://entwickler.de/mobile-technology";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
public void onClickAd2(final View view) {
String url = "http://www.arconsis.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
@Override
protected void onDestroy() {
super.onDestroy();
new ImageCache().clearCache();
if (db != null && db.isOpen()) {
db.close();
}
}
@Override
protected Dialog onCreateDialog(final int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
final ProgressDialog dia = new ProgressDialog(this);
dia.setCancelable(false);
dia.setMessage(getString(R.string.dashboard_dialog_download));
return dia;
case DIALOG_NOT_CONNECTED:
final AlertDialog.Builder notConnectedDia = new AlertDialog.Builder(this);
notConnectedDia.setMessage(R.string.dashboard_dia_no_net_msg).setTitle(R.string.dashboard_dia_no_net_title)
.setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
Dashboard.this.finish();
}
});
return notConnectedDia.create();
case DIALOG_DOWNLOAD_NO_WLAN:
final AlertDialog.Builder notWlanDia = new AlertDialog.Builder(this);
notWlanDia.setMessage(R.string.dashboard_dia_no_wlan_msg).setTitle(R.string.dashboard_dia_no_wlan_title)
.setIcon(android.R.drawable.ic_dialog_info).setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
new DownloaderTask().execute();
}
}).setNegativeButton(R.string.later, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
Dashboard.this.finish();
}
});
return notWlanDia.create();
default:
break;
}
return super.onCreateDialog(id);
}
private void setCountdown(final Calendar calendar) {
final long datetime = calendar.getTimeInMillis() - System.currentTimeMillis();
new CountDownTimer(datetime, COUNTER_UPDATE_INTERVALL_IN_MS) {
@Override
public void onTick(final long millisUntilFinished) {
final long sec = (millisUntilFinished / TimeUtil.SECOND_IN_MS) % TimeUtil.SECONDS_PER_MINUTE;
final long min = (millisUntilFinished / TimeUtil.MINUTE_IN_MS) % TimeUtil.MINUTES_PER_HOUR;
final long hours = (millisUntilFinished / TimeUtil.HOUR_IN_MS) % TimeUtil.HOURS_PER_DAY;
final long days = (millisUntilFinished / TimeUtil.DAY_IN_MS) % TimeUtil.DAYS_PER_WEEK;
final long weeks = (millisUntilFinished / TimeUtil.WEEK_IN_MS);
final StringBuilder sb = new StringBuilder();
if (weeks > 0) {
sb.append(weeks);
sb.append(" ");
if (weeks == 1) {
sb.append(getString(R.string.dashboard_counter_week));
} else {
sb.append(getString(R.string.dashboard_counter_weeks));
}
sb.append(" ");
}
if (days > 0) {
sb.append(days);
sb.append(" ");
if (days == 1) {
sb.append(getString(R.string.dashboard_counter_day));
} else {
sb.append(getString(R.string.dashboard_counter_days));
}
sb.append(" ");
}
if (days > 0 || weeks > 0) {
sb.append(getString(R.string.dashboard_counter_and));
sb.append(" ");
}
if (hours < TIME_10) {
sb.append("0");
}
sb.append(hours + " ");
sb.append(getString(R.string.dashboard_counter_hours));
sb.append(" ");
// sb.append(":");
// if (min < TIME_10) {
// sb.append("0");
// }
// sb.append(min);
// sb.append(":");
// if (sec < TIME_10) {
// sb.append("0");
// }
// sb.append(sec);
sb.append(getString(R.string.dashboard_counter_until));
String when = getString(R.string.dashboard_date);
SpannableString spannablecontent = new SpannableString(when + "\n" + sb.toString());
spannablecontent.setSpan(new ForegroundColorSpan(Color.RED), 0, when.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablecontent.setSpan(new AbsoluteSizeSpan(31), 0, when.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
countdown.setText(spannablecontent);
}
@Override
public void onFinish() {
countdown.setText(getString(R.string.dashboard_counter_ready));
}
}.start();
}
private boolean isOnline() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
final NetworkInfo info = cm.getActiveNetworkInfo();
return info != null && info.isConnectedOrConnecting();
}
private boolean isWifiOn() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
final NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return info != null && info.isConnected();
}
private class DownloaderTask extends AsyncTask<Boolean, Integer, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
if (pref.isFirstStart() || !pref.isDownloadFinished()) {
showDialog(DIALOG_DOWNLOAD_PROGRESS);
} else {
if (pref.isDownloadFinished()) {
loadBannerAndCounter();
dashboardRoot.setVisibility(View.VISIBLE);
}
}
}
@Override
protected Boolean doInBackground(final Boolean... params) {
boolean result = false;
try {
if (params != null && params.length > 0 && params[0] != null) {
if (params[0]) {
result = new Downloader(Dashboard.this).downloadData();
}
} else {
result = new Downloader(Dashboard.this).downloadData();
}
} catch (ClientProtocolException e) {
Log.e(TAG, e.getMessage(), e);
result = false;
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
result = false;
} catch (JSONException e) {
Log.e(TAG, e.getMessage(), e);
result = false;
}
return result;
}
private void loadBannerAndCounter() {
final Cursor cursor = db.query(ConferenceTable.TABLE_NAME, new String[] { ConferenceTable.LOGO_IMAGE_LARGE,
ConferenceTable.START_DATE, ConferenceTable.AD_IMAGE }, null, null, null, null, null);
if (cursor == null) {
return;
}
cursor.moveToFirst();
// final int columnIndexImageLarge = cursor.getColumnIndex(ConferenceTable.LOGO_IMAGE_LARGE);
// if (!cursor.isNull(columnIndexImageLarge)) {
// byte[] binaryImage = cursor.getBlob(columnIndexImageLarge);
// banner.setImageBitmap(BitmapFactory.decodeByteArray(binaryImage, 0, binaryImage.length));
// }
// if (cursor.isNull(cursor.getColumnIndex(ConferenceTable.AD_IMAGE))) {
// advertisment.setVisibility(View.GONE);
// } else {
// advertisment.setVisibility(View.VISIBLE);
// byte[] bb2 = cursor.getBlob(cursor.getColumnIndex(ConferenceTable.AD_IMAGE));
// advertisment.setImageBitmap(BitmapFactory.decodeByteArray(bb2, 0, bb2.length));
// }
try {
final SimpleDateFormat formater = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.GERMAN);
final Date date = formater.parse(cursor.getString(cursor.getColumnIndex(ConferenceTable.START_DATE)));
final Calendar c = new GregorianCalendar(Locale.GERMAN);
c.setTime(date);
setCountdown(c);
} catch (ParseException e) {
Log.e(TAG, e.getMessage(), e);
}
cursor.close();
}
@Override
protected void onPostExecute(final Boolean result) {
super.onPostExecute(result);
if (pref.isFirstStart() || !pref.isDownloadFinished()) {
removeDialog(DIALOG_DOWNLOAD_PROGRESS);
pref.setFirstStart(false);
if (result) {
loadBannerAndCounter();
}
}
if (result || pref.isDownloadFinished()) {
dashboardRoot.setVisibility(View.VISIBLE);
}
if (!pref.isDownloadFinished()) {
pref.setDownloadFinished(result);
}
}
}
}