/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.dreams.dozetest; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Handler; import android.os.PowerManager; import android.service.dreams.DreamService; import android.text.format.DateFormat; import android.util.Log; import android.view.Display; import android.widget.TextView; import java.util.Date; /** * Simple test for doze mode. * <p> * adb shell setprop debug.doze.component com.android.dreams.dozetest/.DozeTestDream * </p> */ public class DozeTestDream extends DreamService { private static final String TAG = DozeTestDream.class.getSimpleName(); private static final boolean DEBUG = false; // Amount of time to allow to update the time shown on the screen before releasing // the wakelock. This timeout is design to compensate for the fact that we don't // currently have a way to know when time display contents have actually been // refreshed once the dream has finished rendering a new frame. private static final int UPDATE_TIME_TIMEOUT = 100; // Not all hardware supports dozing. We should use Display.STATE_DOZE but // for testing purposes it is convenient to use Display.STATE_ON so the // test still works on hardware that does not support dozing. private static final int DISPLAY_STATE_WHEN_DOZING = Display.STATE_ON; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private AlarmManager mAlarmManager; private PendingIntent mAlarmIntent; private Handler mHandler = new Handler(); private TextView mAlarmClock; private final Date mTime = new Date(); private java.text.DateFormat mTimeFormat; private boolean mDreaming; private long mLastTime = Long.MIN_VALUE; @Override public void onCreate() { super.onCreate(); mPowerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent("com.android.dreams.dozetest.ACTION_ALARM"); intent.setPackage(getPackageName()); IntentFilter filter = new IntentFilter(); filter.addAction(intent.getAction()); registerReceiver(mAlarmReceiver, filter); mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); setDozeScreenState(DISPLAY_STATE_WHEN_DOZING); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mAlarmReceiver); mAlarmIntent.cancel(); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); setInteractive(false); setLowProfile(true); setFullscreen(true); setContentView(R.layout.dream); setScreenBright(false); mAlarmClock = (TextView)findViewById(R.id.alarm_clock); mTimeFormat = DateFormat.getTimeFormat(this); } @Override public void onDreamingStarted() { super.onDreamingStarted(); mDreaming = true; Log.d(TAG, "Dream started: canDoze=" + canDoze()); performTimeUpdate(); startDozing(); } @Override public void onDreamingStopped() { super.onDreamingStopped(); mDreaming = false; Log.d(TAG, "Dream ended: isDozing=" + isDozing()); stopDozing(); cancelTimeUpdate(); } private void performTimeUpdate() { if (mDreaming) { long now = System.currentTimeMillis(); now -= now % 60000; // back up to last minute boundary if (mLastTime == now) { return; } mLastTime = now; mTime.setTime(now); mAlarmClock.setText(mTimeFormat.format(mTime)); mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, now + 60000, mAlarmIntent); mWakeLock.acquire(UPDATE_TIME_TIMEOUT + 5000 /*for testing brightness*/); // flash the screen a bit to test these functions setDozeScreenState(DISPLAY_STATE_WHEN_DOZING); setDozeScreenBrightness(200); mHandler.postDelayed(new Runnable() { @Override public void run() { setDozeScreenBrightness(50); } }, 2000); mHandler.postDelayed(new Runnable() { @Override public void run() { setDozeScreenState(Display.STATE_OFF); } }, 5000); } } private void cancelTimeUpdate() { mAlarmManager.cancel(mAlarmIntent); } private final BroadcastReceiver mAlarmReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { performTimeUpdate(); } }; }