118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/* 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Copyright (C) 2013 The Android Open Source Project 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * you may not use this file except in compliance with the License. 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * You may obtain a copy of the License at 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Unless required by applicable law or agreed to in writing, software 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See the License for the specific language governing permissions and 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * limitations under the License. 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupackage com.android.testing.alarmservice; 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.AlarmManager; 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.PendingIntent; 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Context; 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Intent; 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.RemoteException; 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.SystemClock; 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.util.Log; 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport com.android.testing.alarmservice.Alarm.Stub; 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic class AlarmImpl extends Stub { 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private static final String LOG_TAG = AlarmImpl.class.getSimpleName(); 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private Context mContext; 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public AlarmImpl(Context context) { 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu super(); 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mContext = context; 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int prepare() throws RemoteException { 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu WakeUpController.getController().getWakeLock().acquire(); 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.d(LOG_TAG, "AlarmService prepared, wake lock acquired"); 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int setAlarmAndWait(long timeoutMills) throws RemoteException { 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // calculate when device should be waken up 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long atTime = SystemClock.elapsedRealtime() + timeoutMills; 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Intent wakupIntent = new Intent(WakeUpCall.WAKEUP_CALL); 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, wakupIntent, 0); 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // set alarm, which will be delivered in form of the wakeupIntent 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, atTime, pi); 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.d(LOG_TAG, String.format("Alarm set: %d, giving up wake lock", atTime)); 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Object lock = WakeUpController.getController().getWakeSync(); 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // release wakelock and wait for the lock to be poked from the broadcast receiver 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu WakeUpController.getController().getWakeLock().release(); 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // does not really matter if device enters suspend before we start waiting on lock 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu synchronized (lock) { 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu lock.wait(); 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (InterruptedException e) { 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.d(LOG_TAG, String.format("Alarm triggered, done waiting")); 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int done() throws RemoteException { 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu WakeUpController.getController().getWakeLock().release(); 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 78