package com.v7lin.android.widget;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import com.v7lin.android.env.widget.CompatTextView;
/**
* 刚刚
* 1分钟前
* 1天前
* 1周前
* 1月前
*
* @author v7lin E-mail:v7lin@qq.com
*/
public class RelativeTimeTextView extends CompatTextView {
private static final int TICK_WHAT = 2;
private long mReferenceTime;
private CharSequence mJustNow;
private boolean mVisible;
private boolean mStarted;
private boolean mRunning;
public RelativeTimeTextView(Context context) {
super(context);
}
public RelativeTimeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RelativeTimeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setJustNow(CharSequence justnow) {
this.mJustNow = justnow;
}
public void setReferenceTime(long referenceTime) {
this.mReferenceTime = referenceTime;
updateDisplay();
}
public void start() {
mStarted = true;
updateRunning();
}
public void stop() {
mStarted = false;
updateRunning();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mVisible = false;
updateRunning();
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mVisible = visibility == VISIBLE;
updateRunning();
}
private synchronized void updateDisplay() {
long now = System.currentTimeMillis();
long difference = now - mReferenceTime;
CharSequence desc = null;
if (difference >= 0 && difference <= DateUtils.MINUTE_IN_MILLIS && !TextUtils.isEmpty(mJustNow)) {
desc = mJustNow;
} else {
desc = DateUtils.getRelativeTimeSpanString(mReferenceTime, now, DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
}
setText(desc);
}
private void updateRunning() {
boolean running = mVisible && mStarted;
if (running != mRunning) {
if (running) {
updateDisplay();
mHandler.sendMessageDelayed(Message.obtain(mHandler, TICK_WHAT), 1000);
} else {
mHandler.removeMessages(TICK_WHAT);
}
mRunning = running;
}
}
private Handler mHandler = new Handler() {
public void handleMessage(Message m) {
if (mRunning) {
updateDisplay();
sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);
}
}
};
}