package com.iwedia.gui.components.dialogs;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;
import com.iwedia.comm.enums.DateFormatOrder;
import com.iwedia.comm.system.date_time.IDateTimeSettings;
import com.iwedia.comm.system.date_time.TimeZone;
import com.iwedia.dtv.types.TimeDate;
import com.iwedia.gui.MainActivity;
import com.iwedia.gui.R;
import com.iwedia.gui.components.A4TVButton;
import com.iwedia.gui.components.A4TVButtonSwitch;
import com.iwedia.gui.components.A4TVDatePicker;
import com.iwedia.gui.components.A4TVDialog;
import com.iwedia.gui.components.A4TVSpinner;
import com.iwedia.gui.components.A4TVSpinner.OnSelectA4TVSpinnerListener;
import com.iwedia.gui.components.A4TVTimePicker;
import com.iwedia.gui.config_handler.ConfigHandler;
import com.iwedia.gui.mainmenu.DialogManager;
import com.iwedia.gui.mainmenu.MainMenuContent;
import com.iwedia.gui.util.DateTimeConversions;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Time & date settings dialog
*
* @author Branimir Pavlovic
*/
public class TimeAndDateSettingsDialog extends A4TVDialog implements
A4TVDialogInterface, android.view.View.OnClickListener {
/** IDs for buttons */
public static final int TV_MENU_TIME_AND_DATE_SETTINGS_AUTOMATIC = 48,
TV_MENU_TIME_AND_DATE_SETTINGS_SET_DATE = 49,
TV_MENU_TIME_AND_DATE_SETTINGS_SET_TIME = 50,
TV_MENU_TIME_AND_DATE_SETTINGS_USE_24_HOUR_FORMAT = 51,
TV_MENU_TIME_AND_DATE_SETTINGS_TIMER = 52;
/** IDs for spinner */
public static final int TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_TIME_ZONE = 11,
TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_DATE_FORMAT = 15;
// private final int HOURS_TO_ADD_FOR_PM_TIME = 12;
// fields for creating dialogs
private ArrayList<ArrayList<Integer>> contentList = new ArrayList<ArrayList<Integer>>(),
contentListIDs = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> titleIDs = new ArrayList<Integer>();
private Context ctx;
private IDateTimeSettings dateTime;
private boolean is24HourFormat;
// private Timer timer;
private Date date;
// views from dialogs
private A4TVButtonSwitch btnAutomatic, btn24Format;
private A4TVButton btnSetDate, btnSetTime;
private A4TVSpinner spinnerSelectTimeZone, spinnerSelectDateFormat;
private Thread backgroundThread;
private Runnable run;
private Handler handler;
private static SimpleDateFormat formatMDY = new SimpleDateFormat(
"MM/dd/yyyy");
private static SimpleDateFormat formatDMY = new SimpleDateFormat(
"dd/MM/yyyy");
private static SimpleDateFormat formatYMD = new SimpleDateFormat(
"yyyy/MM/dd");
public TimeAndDateSettingsDialog(Context context) {
super(context, checkTheme(context), 0);
ctx = context;
// fill lists
returnArrayListsWithDialogContents(contentList, contentListIDs,
titleIDs);
// set content to dialog
fillDialog();
// set attributes
setDialogAttributes();
init();
}
@Override
public void show() {
startThread(run);
// fillViewsWithData(true);
super.show();
}
@Override
public void onBackPressed() {
stopThread();
super.onBackPressed();
}
@Override
public void cancel() {
stopThread();
super.cancel();
}
private void init() {
btnAutomatic = (A4TVButtonSwitch) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_AUTOMATIC);
btn24Format = (A4TVButtonSwitch) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_USE_24_HOUR_FORMAT);
btnSetDate = (A4TVButton) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_SET_DATE);
spinnerSelectTimeZone = (A4TVSpinner) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_TIME_ZONE);
spinnerSelectDateFormat = (A4TVSpinner) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_DATE_FORMAT);
btnSetTime = (A4TVButton) findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_SET_TIME);
spinnerSelectDateFormat
.setOnSelectA4TVSpinnerListener(new OnSelectA4TVSpinnerListener() {
@Override
public void onSelect(A4TVSpinner spinner, int index,
String[] contents) {
try {
MainActivity.service.getSystemControl()
.getDateAndTimeControl()
.setDateFormat(index);
} catch (Exception e) {
e.printStackTrace();
}
}
});
spinnerSelectTimeZone
.setOnSelectA4TVSpinnerListener(new OnSelectA4TVSpinnerListener() {
@Override
public void onSelect(A4TVSpinner spinner, int index,
String[] contents) {
List<TimeZone> timeZones = null;
try {
timeZones = MainActivity.service.getSystemControl()
.getDateAndTimeControl().getTimeZones();
} catch (RemoteException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
if (timeZones != null) {
String buttonText = contents[index];
for (int i = 0; i < timeZones.size(); i++) {
if (buttonText.contains(timeZones.get(i)
.getDisplayName())
&& buttonText.contains(timeZones.get(i)
.getGmt())) {
// set custom text to button
spinner.setText(timeZones.get(i)
.getDisplayName());
// set time zone to service
try {
MainActivity.service
.getSystemControl()
.getDateAndTimeControl()
.setTimeZone(
timeZones.get(i)
.getId());
} catch (RemoteException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
// exit for loop
break;
}
}
}
fillViewsWithData(true);
}
});
// init runnable to be run in thread
run = new Runnable() {
@Override
public void run() {
while (true) {
Thread thisThread = Thread.currentThread();
if (thisThread.equals(backgroundThread)) {
handler.sendEmptyMessage(0);
try {
// Sleep 5 seconds
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
};
// init handler
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
fillViewsWithData(true);
super.handleMessage(msg);
}
};
}
/**
* Fill views with data from service
*/
public void fillViewsWithData(boolean refreshAll) {
dateTime = null;
try {
dateTime = MainActivity.service.getSystemControl()
.getDateAndTimeControl();
} catch (Exception e) {
e.printStackTrace();
}
// if service returns real object
if (dateTime != null) {
boolean hourAutomatic = false;
try {
hourAutomatic = dateTime.isAutomatic();
} catch (Exception e) {
e.printStackTrace();
}
if (refreshAll) {
/**************************************************************/
/** Automatic time update */
if (hourAutomatic) {
btnAutomatic.setSelectedStateAndText(true,
R.string.button_text_yes);
} else {
btnAutomatic.setSelectedStateAndText(false,
R.string.button_text_no);
}
/**************************************************************/
/** Use 24 hour format button */
boolean hourFormat = true;
try {
hourFormat = dateTime.is24HourFormat();
} catch (Exception e) {
e.printStackTrace();
}
/** Fill 24 hour format button */
if (hourFormat) {
btn24Format.setSelectedStateAndText(true,
R.string.button_text_yes);
} else {
btn24Format.setSelectedStateAndText(false,
R.string.button_text_no);
}
/**************************************************************/
int dateFormatIndex = 0;
try {
dateFormatIndex = dateTime.getDateFormat();
} catch (Exception e1) {
e1.printStackTrace();
}
spinnerSelectDateFormat.setSelection(dateFormatIndex);
/**************************************************************/
if (hourAutomatic) {
setLayoutDisplayMode(
R.string.tv_menu_time_and_date_settings_set_date,
DisplayMode.DISABLE);
} else {
setLayoutDisplayMode(
R.string.tv_menu_time_and_date_settings_set_date,
DisplayMode.SHOW);
}
Date date = null;
try {
date = MainActivity.service.getSystemControl()
.getDateAndTimeControl().getTimeDate()
.getCalendar().getTime();
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (date != null) {
switch (spinnerSelectDateFormat.getCHOOSEN_ITEM_INDEX()) {
case DateFormatOrder.DMY: {
btnSetDate.setText(formatDMY.format(date));
break;
}
case DateFormatOrder.MDY: {
btnSetDate.setText(formatMDY.format(date));
break;
}
case DateFormatOrder.YMD: {
btnSetDate.setText(formatYMD.format(date));
break;
}
default:
break;
}
}
/**************************************************************/
// if (hourAutomatic) {
// spinnerSelectTimeZone.setEnabled(false);
// } else {
// spinnerSelectTimeZone.setEnabled(true);
// }
int zoneId = -1;
List<TimeZone> zones = null;
try {
zones = dateTime.getTimeZones();
zoneId = dateTime.getActiveTimeZoneIndex();
} catch (Exception e) {
e.printStackTrace();
}
if (zoneId >= 0
&& zones != null
&& spinnerSelectTimeZone.getCHOOSEN_ITEM_INDEX() != zoneId) {
spinnerSelectTimeZone.setSelection(zoneId);
spinnerSelectTimeZone.setText(zones.get(zoneId)
.getTimeZoneName());
}
/**************************************************************/
}
if (hourAutomatic) {
setLayoutDisplayMode(
R.string.tv_menu_time_and_date_settings_set_time,
DisplayMode.DISABLE);
} else {
setLayoutDisplayMode(
R.string.tv_menu_time_and_date_settings_set_time,
DisplayMode.SHOW);
}
date = null;
try {
date = dateTime.getTimeDate().getCalendar().getTime();
} catch (Exception e) {
e.printStackTrace();
}
String hour = "";
if (date != null) {
try {
btnSetTime.setText(DateTimeConversions.getTimeSting(date));
} catch (Exception e) {
e.printStackTrace();
}
}
/**************************************************************/
}
}
@Override
public void fillDialog() {
View view = DialogManager.dialogCreator.fillDialogWithContents(
contentList, contentListIDs, titleIDs, null, this, null);// ,
// pictureBackgroundID);
setContentView(view);
}
@Override
public void setDialogAttributes() {
getWindow().getAttributes().width = MainActivity.dialogWidth;
getWindow().getAttributes().height = MainActivity.dialogHeight;
}
/**
* Function that load theme
*
* @param ctx
* @return
*/
private static int checkTheme(Context ctx) {
TypedArray atts = ctx.getTheme().obtainStyledAttributes(
new int[] { R.attr.A4TVDialog });
int i = atts.getResourceId(0, 0);
atts.recycle();
return i;
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case TV_MENU_TIME_AND_DATE_SETTINGS_AUTOMATIC: {
if (v.isSelected()) {
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
} else {
((A4TVButtonSwitch) v).setSelectedStateAndText(true,
R.string.button_text_yes);
}
try {
MainActivity.service.getSystemControl()
.getDateAndTimeControl()
.setAutomatic(v.isSelected());
} catch (Exception e) {
e.printStackTrace();
}
fillViewsWithData(true);
break;
}
case TV_MENU_TIME_AND_DATE_SETTINGS_USE_24_HOUR_FORMAT: {
if (v.isSelected()) {
((A4TVButtonSwitch) v).setSelectedStateAndText(false,
R.string.button_text_no);
} else {
((A4TVButtonSwitch) v).setSelectedStateAndText(true,
R.string.button_text_yes);
}
try {
MainActivity.service.getSystemControl()
.getDateAndTimeControl()
.set24HourFormat(v.isSelected());
} catch (Exception e) {
e.printStackTrace();
}
fillViewsWithData(true);
break;
}
case TV_MENU_TIME_AND_DATE_SETTINGS_SET_DATE: {
dateTime = null;
try {
dateTime = MainActivity.service.getSystemControl()
.getDateAndTimeControl();
} catch (Exception e1) {
e1.printStackTrace();
}
try {
if (dateTime != null) {
date = dateTime.getTimeDate().getCalendar().getTime();
}
} catch (Exception e) {
e.printStackTrace();
}
if (date != null) {
try {
A4TVDatePicker datePicker = new A4TVDatePicker(ctx,
new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view,
int year, int monthOfYear,
int dayOfMonth) {
view.clearFocus();
try {
dateTime.setDate(dayOfMonth,
monthOfYear, year);
} catch (Exception e) {
e.printStackTrace();
}
TimeAndDateSettingsDialog.this.show();
}
}, date.getYear() - 1900, date.getMonth(),
date.getDay());
datePicker.show();
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
case TV_MENU_TIME_AND_DATE_SETTINGS_SET_TIME: {
dateTime = null;
try {
dateTime = MainActivity.service.getSystemControl()
.getDateAndTimeControl();
} catch (Exception e1) {
e1.printStackTrace();
}
date = null;
try {
if (dateTime != null) {
date = dateTime.getTimeDate().getCalendar().getTime();
}
} catch (Exception e) {
e.printStackTrace();
}
if (date != null) {
is24HourFormat = true;
try {
is24HourFormat = dateTime.is24HourFormat();
} catch (Exception e1) {
e1.printStackTrace();
}
A4TVTimePicker timePicker = new A4TVTimePicker(
ctx,
new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
Log.d("A4TV2.0",
"CALL BACK SET TIME RETURNED: "
+ hourOfDay + " " + minute);
view.clearFocus();
try {
dateTime.setTime(hourOfDay, minute);
((A4TVButton) TimeAndDateSettingsDialog.this
.findViewById(TV_MENU_TIME_AND_DATE_SETTINGS_SET_TIME))
.setText(DateTimeConversions
.getTimeSting(date));
} catch (Exception e) {
e.printStackTrace();
}
TimeAndDateSettingsDialog.this.show();
}
}, date.getHours(), date.getMinutes(),
is24HourFormat);
timePicker.show();
}
break;
}
default:
break;
}
}
/**
* Start background thread
*
* @param run
* Runnable to run in thread
*/
public void startThread(Runnable run) {
Log.d(MainActivity.TAG, "start thread entered");
if (backgroundThread == null) {
backgroundThread = new Thread(run);
backgroundThread.setPriority(Thread.MIN_PRIORITY);
backgroundThread.start();
}
}
/**
* Stops background thread
*/
public void stopThread() {
Log.d(MainActivity.TAG, "stop thread entered");
if (backgroundThread != null) {
Thread moribund = backgroundThread;
backgroundThread = null;
moribund.interrupt();
}
}
@Override
public void returnArrayListsWithDialogContents(
ArrayList<ArrayList<Integer>> contentList,
ArrayList<ArrayList<Integer>> contentListIDs,
ArrayList<Integer> titleIDs) {
// clear old data in lists
contentList.clear();
contentListIDs.clear();
titleIDs.clear();
// title
titleIDs.add(R.drawable.settings_icon);
titleIDs.add(R.string.tv_menu_time_and_date_settings);
// automatic******************************************
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButtonSwitch);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_automatic);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_AUTOMATIC);
contentListIDs.add(list);
// set date******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_set_date);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_SET_DATE);
contentListIDs.add(list);
// select time zone******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVSpinner);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_select_time_zone);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_TIME_ZONE);
contentListIDs.add(list);
// set time******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_set_time);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_SET_TIME);
contentListIDs.add(list);
// use 24 hour format******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButtonSwitch);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_use_24_hour_format);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_USE_24_HOUR_FORMAT);
contentListIDs.add(list);
// select date format******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVSpinner);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_select_date_format);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_SELECT_DATE_FORMAT);
contentListIDs.add(list);
if (ConfigHandler.TV_FEATURES) {
// timer******************************************
list = new ArrayList<Integer>();
list.add(MainMenuContent.TAGA4TVTextView);
list.add(MainMenuContent.TAGA4TVButton);
contentList.add(list);
list = new ArrayList<Integer>();
list.add(R.string.tv_menu_time_and_date_settings_timer);
list.add(TV_MENU_TIME_AND_DATE_SETTINGS_TIMER);
contentListIDs.add(list);
}
}
}