package com.jdroid.android.date; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; import android.util.AttributeSet; import android.widget.TextView; import com.jdroid.java.utils.IdGenerator; /** * A {@link TextView} that displays the current time * */ public class TimeView extends TextView implements Callback { private static final int MESSAGE_CODE = IdGenerator.getIntId(); private static final int HANDLER_DELAY = 1000; private Handler handler; private Boolean visible = false; public TimeView(Context context, AttributeSet attrs) { super(context, attrs); handler = new Handler(this); } public TimeView(Context context) { this(context, null); } /** * @see android.os.Handler.Callback#handleMessage(android.os.Message) */ @Override public boolean handleMessage(Message msg) { updateTime(); return true; } @SuppressLint("SetTextI18n") private void updateTime() { if ((visible != null) && (visible)) { if (isInEditMode()) { setText("09:34 PM"); } else { setText(AndroidDateUtils.formatTime()); } handler.sendMessageDelayed(Message.obtain(handler, MESSAGE_CODE), HANDLER_DELAY); } else { handler.removeMessages(MESSAGE_CODE); } } /** * @see android.view.View#onWindowVisibilityChanged(int) */ @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); visible = visibility == VISIBLE; updateTime(); } /** * @see android.widget.TextView#onDetachedFromWindow() */ @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); visible = false; updateTime(); } }