118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/* 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Copyright (C) 2014 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 android.test.wakeuploop; 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.AlarmManager; 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.PendingIntent; 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.Service; 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Context; 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Intent; 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.Environment; 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.Handler; 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.IBinder; 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.Message; 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.Messenger; 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.SystemClock; 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.util.Log; 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport java.io.File; 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic class WakeLoopService extends Service { 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private static final String LOG_TAG = WakeLoopService.class.getSimpleName(); 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu static final String WAKEUP_INTERNAL = "WAKEUP_INTERVAL"; 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu static final String MAX_LOOP = "MAX_LOOP"; 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu static final String STOP_CALLBACK = "STOP_CALLBACK"; 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu static final String THIS_LOOP = "THIS_LOOP"; 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu static final int MSG_STOP_SERVICE = 0xd1ed1e; 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private final Handler mHandler = new Handler() { 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void handleMessage(Message msg) { 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (msg.what == MSG_STOP_SERVICE) { 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu stopSelf(); 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } else { 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu super.handleMessage(msg); 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu }; 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu }; 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public IBinder onBind(Intent intent) { 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // no binding, just start via intent 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return null; 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int onStartCommand(Intent intent, int flags, int startId) { 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // get wakeup interval from intent 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long wakeupInterval = intent.getLongExtra(WAKEUP_INTERNAL, 0); 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long maxLoop = intent.getLongExtra(MAX_LOOP, 0); 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (wakeupInterval == 0) { 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // stop and error 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.e(LOG_TAG, "No wakeup interval specified, not starting the service"); 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu stopSelf(); 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return START_NOT_STICKY; 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu FileUtil.get().writeDateToFile(new File(Environment.getExternalStorageDirectory(), 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu "wakeup-loop-start.txt")); 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.d(LOG_TAG, String.format("WakeLoop: STARTED interval = %d, total loop = %d", 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu wakeupInterval, maxLoop)); 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // calculate when device should be waken up 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long atTime = SystemClock.elapsedRealtime() + wakeupInterval; 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 7818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Intent wakupIntent = new Intent(WakeUpCall.WAKEUP_CALL) 7918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu .putExtra(WAKEUP_INTERNAL, wakeupInterval) 8018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu .putExtra(MAX_LOOP, maxLoop) 8118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu .putExtra(THIS_LOOP, 0L) 8218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu .putExtra(STOP_CALLBACK, new Messenger(mHandler)); 8318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu PendingIntent pi = PendingIntent.getBroadcast(this, 0, wakupIntent, 8418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu PendingIntent.FLAG_UPDATE_CURRENT); 8518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // set alarm, which will be delivered in form of the wakeupIntent 8618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, atTime, pi); 8718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return START_NOT_STICKY; 8818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 9018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 9118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void onDestroy() { 9218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.d(LOG_TAG, "WakeLoop: STOPPED"); 9318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // cancel alarms first 9418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Intent intent = new Intent(WakeUpCall.WAKEUP_CALL) 9518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu .putExtra(WakeUpCall.CANCEL, "true"); 9618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu sendBroadcast(intent); 9718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 99