package com.integreight.onesheeld.shields.controller;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import com.integreight.onesheeld.enums.UIShield;
import com.integreight.onesheeld.sdk.ShieldFrame;
import com.integreight.onesheeld.shields.ControllerParent;
import com.integreight.onesheeld.utils.Log;
import java.util.Calendar;
public class ClockShield extends
ControllerParent<ControllerParent<ClockShield>> {
private static final byte CLOCK_COMMAND = (byte) 0x21;
private static final byte CLOCK_VALUE = (byte) 0x01;
private static final byte BEGIN_METHOD = (byte) 0x01;
private Calendar calendar;
private static int seconds, minutes, hour, day, month, year;
private ClockEventHandler eventHandler;
private IntentFilter intentFilter;
Handler handler;
int PERIOD = 1000;
boolean isClockBegin = false;
private final Runnable updateClockSeconds = new Runnable() {
Calendar calendar;
@Override
public void run() {
// Do work
ShieldFrame frame = new ShieldFrame(UIShield.CLOCK_SHIELD.getId(), CLOCK_VALUE);
calendar = Calendar.getInstance();
if (frame != null && calendar != null) {
if (isClockBegin) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
sendShieldFrame(frame);
}
String hour = calendar.get(Calendar.HOUR_OF_DAY) + "";
String min = calendar.get(Calendar.MINUTE) + "";
String sec = calendar.get(Calendar.SECOND) + "";
if (eventHandler != null)
eventHandler.onTimeChanged(""
+ (hour.length() == 1 ? "0" + hour : hour) + ":"
+ (min.length() == 1 ? "0" + min : min) + ":"
+ (sec.length() == 1 ? "0" + sec : sec) + "",
calendar.get(Calendar.AM_PM) == Calendar.AM);
}
if (handler != null)
handler.postDelayed(this, PERIOD);
}
};
@Override
public ControllerParent<ControllerParent<ClockShield>> init(String tag) {
// TODO Auto-generated method stub
intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_TIME_TICK);
getApplication().registerReceiver(m_timeChangedReceiver, intentFilter);
isClockBegin = true;
ShieldFrame frame = new ShieldFrame(UIShield.CLOCK_SHIELD.getId(), CLOCK_VALUE);
if (frame != null) {
setTime();
frame.addArgument((byte) seconds);
frame.addArgument((byte) minutes);
frame.addArgument((byte) hour);
frame.addArgument((byte) day);
frame.addArgument((byte) month);
frame.addArgument(2, Math.round(year));
// frame.addArgument((byte) year);
sendShieldFrame(frame);
String hour = calendar.get(Calendar.HOUR_OF_DAY) + "";
String min = calendar.get(Calendar.MINUTE) + "";
String sec = calendar.get(Calendar.SECOND) + "";
if (eventHandler != null)
eventHandler.onTimeChanged(""
+ (hour.length() == 1 ? "0" + hour : hour) + ":"
+ (min.length() == 1 ? "0" + min : min) + ":"
+ (sec.length() == 1 ? "0" + sec : sec) + "",
calendar.get(Calendar.AM_PM) == Calendar.AM);
handler = new Handler();
if (updateClockSeconds != null)
handler.post(updateClockSeconds);
}
//handler = new Handler();
//if (updateClockSeconds != null)
// handler.post(updateClockSeconds);
return super.init(tag);
}
public ClockShield(Activity activity, String tag) {
super(activity, tag);
}
public ClockShield() {
super();
}
@Override
public void onNewShieldFrameReceived(ShieldFrame clock_frame) {
if (clock_frame.getShieldId() == CLOCK_COMMAND&&clock_frame.getFunctionId()==BEGIN_METHOD) {
isClockBegin = true;
ShieldFrame frame = new ShieldFrame(UIShield.CLOCK_SHIELD.getId(), CLOCK_VALUE);
if (frame != null) {
setTime();
frame.addArgument((byte) seconds);
frame.addArgument((byte) minutes);
frame.addArgument((byte) hour);
frame.addArgument((byte) day);
frame.addArgument((byte) month);
frame.addArgument(2, Math.round(year));
// frame.addArgument((byte) year);
sendShieldFrame(frame);
String hour = calendar.get(Calendar.HOUR_OF_DAY) + "";
String min = calendar.get(Calendar.MINUTE) + "";
String sec = calendar.get(Calendar.SECOND) + "";
if (eventHandler != null)
eventHandler.onTimeChanged(""
+ (hour.length() == 1 ? "0" + hour : hour) + ":"
+ (min.length() == 1 ? "0" + min : min) + ":"
+ (sec.length() == 1 ? "0" + sec : sec) + "",
calendar.get(Calendar.AM_PM) == Calendar.AM);
handler = new Handler();
if (updateClockSeconds != null)
handler.post(updateClockSeconds);
}
}
}
public void setClockEventHandler(ClockEventHandler clockEventHandler) {
this.eventHandler = clockEventHandler;
}
public static interface ClockEventHandler {
void onTimeChanged(String Time, boolean isAM);
}
private void setTime() {
calendar = Calendar.getInstance();
seconds = calendar.get(Calendar.SECOND);
minutes = calendar.get(Calendar.MINUTE);
hour = calendar.get(Calendar.HOUR_OF_DAY);
day = calendar.get(Calendar.DAY_OF_MONTH);
month = (calendar.get(Calendar.MONTH) + 1);
year = calendar.get(Calendar.YEAR);
}
@Override
public void reset() {
// TODO Auto-generated method stub
if (handler != null) {
if (updateClockSeconds != null)
handler.removeCallbacks(updateClockSeconds);
handler.removeCallbacksAndMessages(null);
}
if (m_timeChangedReceiver != null)
getApplication().unregisterReceiver(m_timeChangedReceiver);
if (calendar != null)
calendar = null;
}
@Override
public void preConfigChange() {
// if (m_timeChangedReceiver != null)
// getActivity().unregisterReceiver(m_timeChangedReceiver);
super.preConfigChange();
}
@Override
public void postConfigChange() {
super.postConfigChange();
// intentFilter = new IntentFilter();
// intentFilter.addAction(Intent.ACTION_TIME_TICK);
// getActivity().registerReceiver(m_timeChangedReceiver, intentFilter);
}
private BroadcastReceiver m_timeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// check on hour and day...
ShieldFrame frame = new ShieldFrame(UIShield.CLOCK_SHIELD.getId(), CLOCK_VALUE);
calendar = Calendar.getInstance();
Log.d("ClockShield:: old time", seconds + " " + minutes + " "
+ hour + " " + day + " " + month + " " + year);
Log.d("ClockShield:: new time",
calendar.get(Calendar.SECOND) + " "
+ calendar.get(Calendar.MINUTE) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + " "
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ (calendar.get(Calendar.MONTH) + 1) + " "
+ calendar.get(Calendar.YEAR));
// compare between the old and new hour&&day and send new frame
if (hour != calendar.get(Calendar.HOUR_OF_DAY)
&& day != calendar.get(Calendar.DAY_OF_MONTH)
&& month != (calendar.get(Calendar.MONTH) + 1)
&& year != calendar.get(Calendar.YEAR)) {
// send frame year + month + day + hour + min + sec
if (frame != null) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
frame.addArgument((byte) calendar.get(Calendar.MINUTE));
frame.addArgument((byte) calendar
.get(Calendar.HOUR_OF_DAY));
frame.addArgument((byte) calendar
.get(Calendar.DAY_OF_MONTH));
frame.addArgument((byte) (calendar.get(Calendar.MONTH) + 1));
frame.addArgument((byte) calendar.get(Calendar.YEAR));
if (isClockBegin)
sendShieldFrame(frame);
}
} else if (hour != calendar.get(Calendar.HOUR_OF_DAY)
&& day != calendar.get(Calendar.DAY_OF_MONTH)
&& month != (calendar.get(Calendar.MONTH) + 1)) {
// send frame month + day + hour + min + sec
if (frame != null) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
frame.addArgument((byte) calendar.get(Calendar.MINUTE));
frame.addArgument((byte) calendar
.get(Calendar.HOUR_OF_DAY));
frame.addArgument((byte) calendar
.get(Calendar.DAY_OF_MONTH));
frame.addArgument((byte) (calendar.get(Calendar.MONTH) + 1));
if (isClockBegin)
sendShieldFrame(frame);
}
} else if (hour != calendar.get(Calendar.HOUR_OF_DAY)
&& day != calendar.get(Calendar.DAY_OF_MONTH)) {
// send hour + day + min + secon
if (frame != null) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
frame.addArgument((byte) calendar.get(Calendar.MINUTE));
frame.addArgument((byte) calendar
.get(Calendar.HOUR_OF_DAY));
frame.addArgument((byte) calendar
.get(Calendar.DAY_OF_MONTH));
sendShieldFrame(frame);
}
} else if (hour != calendar.get(Calendar.HOUR_OF_DAY)) {
// send hour + min + sec
if (frame != null) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
frame.addArgument((byte) calendar.get(Calendar.MINUTE));
frame.addArgument((byte) calendar
.get(Calendar.HOUR_OF_DAY));
if (isClockBegin)
sendShieldFrame(frame);
}
} else {
if (frame != null) {
frame.addArgument((byte) calendar.get(Calendar.SECOND));
frame.addArgument((byte) calendar.get(Calendar.MINUTE));
if (isClockBegin)
sendShieldFrame(frame);
}
}
setTime();
String hour = calendar.get(Calendar.HOUR_OF_DAY) + "";
String min = calendar.get(Calendar.MINUTE) + "";
String sec = calendar.get(Calendar.SECOND) + "";
if (eventHandler != null)
eventHandler.onTimeChanged(
"" + (hour.length() == 1 ? "0" + hour : hour) + ":"
+ (min.length() == 1 ? "0" + min : min) + ":"
+ (sec.length() == 1 ? "0" + sec : sec) + "",
calendar.get(Calendar.AM_PM) == Calendar.AM);
calendar = null;
frame = null;
// set new time
}
};
}