LocationController.java revision 4120375d46091df8527bb701882e056fbb0e6b06
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; 294120375d46091df8527bb701882e056fbb0e6b06Dianne Hackbornimport android.os.UserHandle; 30e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guyimport android.provider.Settings; 31e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.util.Slog; 32e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.view.View; 33e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.widget.ImageView; 34e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 35e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler// private NM API 36e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport android.app.INotificationManager; 37e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport com.android.internal.statusbar.StatusBarNotification; 38e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 39e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport com.android.systemui.R; 40e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 41e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerpublic class LocationController extends BroadcastReceiver { 42e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private static final String TAG = "StatusBar.LocationController"; 43e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 44e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private static final int GPS_NOTIFICATION_ID = 374203-122084; 45e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 46e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private Context mContext; 47e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 48e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler private INotificationManager mNotificationService; 49e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 50e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler public LocationController(Context context) { 51e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mContext = context; 52e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 53e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler IntentFilter filter = new IntentFilter(); 54e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler filter.addAction(LocationManager.GPS_ENABLED_CHANGE_ACTION); 55e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler filter.addAction(LocationManager.GPS_FIX_CHANGE_ACTION); 56e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler context.registerReceiver(this, filter); 57e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 58e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler NotificationManager nm = (NotificationManager)context.getSystemService( 59e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler Context.NOTIFICATION_SERVICE); 60e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mNotificationService = nm.getService(); 61e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 62e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 63e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler @Override 64e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler public void onReceive(Context context, Intent intent) { 65e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler final String action = intent.getAction(); 66e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler final boolean enabled = intent.getBooleanExtra(LocationManager.EXTRA_GPS_ENABLED, false); 67e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 68e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler boolean visible; 69e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler int iconId, textResId; 70e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 71e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) { 72e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is getting fixes 73e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = com.android.internal.R.drawable.stat_sys_gps_on; 74e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler textResId = R.string.gps_notification_found_text; 75e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = true; 76e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) { 77e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is off 78e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = false; 79e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = textResId = 0; 80e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else { 81e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // GPS is on, but not receiving fixes 82e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler iconId = R.drawable.stat_sys_gps_acquiring_anim; 83e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler textResId = R.string.gps_notification_searching_text; 84e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler visible = true; 85e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 86e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 87e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler try { 884120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn // XXX WHAT TO DO ABOUT MULTI-USER? 89e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler if (visible) { 90e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 91e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy gpsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 924120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0, 934120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn gpsIntent, 0, null, UserHandle.CURRENT); 94e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy 95e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler Notification n = new Notification.Builder(mContext) 96e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setSmallIcon(iconId) 97e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setContentTitle(mContext.getText(textResId)) 98e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .setOngoing(true) 99e5e764ad0bb74d8c1405d018b4e0fe92d6554660Romain Guy .setContentIntent(pendingIntent) 100e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler .getNotification(); 101e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 102e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // Notification.Builder will helpfully fill these out for you no matter what you do 103e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n.tickerView = null; 104e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n.tickerText = null; 1052561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler 1062561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler n.priority = Notification.PRIORITY_HIGH; 107e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 108e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler int[] idOut = new int[1]; 1092561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler mNotificationService.enqueueNotificationWithTag( 110e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler mContext.getPackageName(), 111e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler null, 112e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler GPS_NOTIFICATION_ID, 113e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler n, 1144120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn idOut, 1154120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn UserHandle.USER_CURRENT); 116e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } else { 1174120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn mNotificationService.cancelNotificationWithTag( 1184120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn mContext.getPackageName(), null, 1194120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn GPS_NOTIFICATION_ID, UserHandle.USER_CURRENT); 120e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 121e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } catch (android.os.RemoteException ex) { 122e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler // well, it was worth a shot 123e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 124e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler } 125e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler} 126e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler 127