package com.example.dreamsdemo;
import java.util.Random;
import android.animation.TimeAnimator;
import android.content.Context;
import android.service.dreams.DreamService;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.TextView;
/**
* Androids Do Dream of Electric Sleep, But Only While Charging
*/
public class DreamsDemo extends DreamService {
static final String TAG = "MyDream";
final static int YINCR = 2;
final static int POINT_SIZE = 18;
private static final Random RANDOM = new Random();
String[] data;
@Override
public void onCreate() {
Log.d(TAG, "MyDream.onCreate()");
super.onCreate();
data = getResources().getStringArray(R.array.reminders);
}
@Override
public void onAttachedToWindow() {
Log.d(TAG, "MyDream.onAttachedToWindow()");
super.onAttachedToWindow();
// ready the Runner
final Runner runner = new Runner(this);
setContentView(runner);
// Exit dream upon user touch
setInteractive(false);
// Don't hide system UI - leaves time and battery etc showing.
setFullscreen(false);
}
/**
* A little animator.
*/
class Runner extends FrameLayout implements TimeAnimator.TimeListener {
private TextView ta;
private final TimeAnimator mAnimator;
public Runner(Context context) {
this(context, null);
}
public Runner(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public Runner(Context context, AttributeSet attrs, int flags) {
super(context, attrs, flags);
mAnimator = new TimeAnimator();
mAnimator.setTimeListener(this);
ta = new TextView(context, attrs);
ta.setTextSize(POINT_SIZE);
final FrameLayout.LayoutParams params =
new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
addView(ta, params);
}
@Override
public void onAttachedToWindow() {
Log.d(TAG, "MyDream.Runner.onAttachedToWindow()");
super.onAttachedToWindow();
mAnimator.start();
}
@Override
public void onDetachedFromWindow() {
Log.d(TAG, "MyDream.Runner.onDetachedFromWindow()");
mAnimator.cancel();
super.onDetachedFromWindow();
}
/** Tick! */
@Override
public void onTimeUpdate(TimeAnimator animation, long elapsed, long dt_ms) {
// At the top of screen, pick a new reminder
if (ta.getY() < YINCR) {
int ix = RANDOM.nextInt(data.length);
ta.setText(data[ix]);
}
// move that baby along!
int y = (int)(ta.getY() + YINCR);
if (getHeight() > 0) {
y %= getHeight();
}
// If we've gone off the bottom, give up; next call or few will reset it
if (y > getHeight()) {
return;
}
ta.setY(y);
}
}
}