LocationController.java revision 2561b0b10a55841a08e0e1d467e73e10b1bf256d
1e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler/* 2e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * Copyright (C) 2008 The Android Open Source Project 3e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * 4e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * you may not use this file except in compliance with the License. 6e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * You may obtain a copy of the License at 7e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * 8e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * 10e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * Unless required by applicable law or agreed to in writing, software 11e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * See the License for the specific language governing permissions and 14e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler * limitations under the License. 15e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler */ 16e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 17e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerpackage com.android.systemui.statusbar.policy; 18e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 19e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport java.util.ArrayList; 20e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 21e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.app.Notification; 22e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.app.NotificationManager; 23e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guyimport android.app.PendingIntent; 24e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.content.BroadcastReceiver; 25e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.content.Context; 26e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.content.Intent; 27e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.content.IntentFilter; 28e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.location.LocationManager; 29e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guyimport android.provider.Settings; 30e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.util.Slog; 31e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.view.View; 32e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.widget.ImageView; 33e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 34e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler// private NM API 35e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.app.INotificationManager; 36e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport com.android.internal.statusbar.StatusBarNotification; 37e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 38e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport com.android.systemui.R; 39e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 40e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerpublic class LocationController extends BroadcastReceiver { 41e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private static final String TAG = "StatusBar.LocationController"; 42e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 43e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private static final int GPS_NOTIFICATION_ID = 374203-122084; 44e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 45e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private Context mContext; 46e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 47e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private INotificationManager mNotificationService; 48e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 49e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler public LocationController(Context context) { 50e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mContext = context; 51e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 52e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler IntentFilter filter = new IntentFilter(); 53e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler filter.addAction(LocationManager.GPS_ENABLED_CHANGE_ACTION); 54e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler filter.addAction(LocationManager.GPS_FIX_CHANGE_ACTION); 55e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler context.registerReceiver(this, filter); 56e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 57e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler NotificationManager nm = (NotificationManager)context.getSystemService( 58e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler Context.NOTIFICATION_SERVICE); 59e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mNotificationService = nm.getService(); 60e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 61e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 62e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler @Override 63e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler public void onReceive(Context context, Intent intent) { 64e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler final String action = intent.getAction(); 65e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler final boolean enabled = intent.getBooleanExtra(LocationManager.EXTRA_GPS_ENABLED, false); 66e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 67e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler boolean visible; 68e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler int iconId, textResId; 69e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 70e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) { 71e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is getting fixes 72e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = com.android.internal.R.drawable.stat_sys_gps_on; 73e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler textResId = R.string.gps_notification_found_text; 74e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = true; 75e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) { 76e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is off 77e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = false; 78e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = textResId = 0; 79e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else { 80e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is on, but not receiving fixes 81e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = R.drawable.stat_sys_gps_acquiring_anim; 82e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler textResId = R.string.gps_notification_searching_text; 83e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = true; 84e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 85e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 86e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler try { 87e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler if (visible) { 88e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 89e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy gpsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 90e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, gpsIntent, 0); 91e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy 92e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler Notification n = new Notification.Builder(mContext) 93e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setSmallIcon(iconId) 94e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setContentTitle(mContext.getText(textResId)) 95e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setOngoing(true) 96e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy .setContentIntent(pendingIntent) 97e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .getNotification(); 98e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 99e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // Notification.Builder will helpfully fill these out for you no matter what you do 100e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n.tickerView = null; 101e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n.tickerText = null; 1022561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler 1032561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler n.priority = Notification.PRIORITY_HIGH; 104e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 105e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler int[] idOut = new int[1]; 1062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler mNotificationService.enqueueNotificationWithTag( 107e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mContext.getPackageName(), 108e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler null, 109e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler GPS_NOTIFICATION_ID, 110e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n, 111e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler idOut); 112e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else { 113e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mNotificationService.cancelNotification( 114e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mContext.getPackageName(), 115e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler GPS_NOTIFICATION_ID); 116e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 117e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } catch (android.os.RemoteException ex) { 118e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // well, it was worth a shot 119e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 120e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 121e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler} 122e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 123