am 4ad2547f: Merge "Ongoing notification for GPS use." into honeycomb

* commit '4ad2547fe08bab430d7d9f9cc4b789410856c9c3':
  Ongoing notification for GPS use.
This commit is contained in:
Daniel Sandler
2011-02-03 20:51:00 -08:00
committed by Android Git Automerger
8 changed files with 197 additions and 6 deletions

View File

@ -33,6 +33,7 @@ interface INotificationManager
void enqueueToast(String pkg, ITransientNotification callback, int duration);
void cancelToast(String pkg, ITransientNotification callback);
void enqueueNotificationWithTag(String pkg, String tag, int id, in Notification notification, inout int[] idReceived);
void enqueueNotificationWithTagPriority(String pkg, String tag, int id, int priority, in Notification notification, inout int[] idReceived);
void cancelNotificationWithTag(String pkg, String tag, int id);
}

View File

@ -63,8 +63,7 @@ public class StatusBarNotification implements Parcelable {
this.initialPid = initialPid;
this.notification = notification;
this.priority = ((notification.flags & Notification.FLAG_ONGOING_EVENT) != 0)
? PRIORITY_ONGOING : PRIORITY_NORMAL;
this.priority = PRIORITY_NORMAL;
}
public StatusBarNotification(Parcel in) {

View File

@ -22,4 +22,10 @@
<string name="status_bar_clear_all_button" msgid="4722520806446512408">"Eliminar todos"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Sin conexión a Int."</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"WiFi conectado"</string>
<!-- manually translated -->
<string name="gps_notification_searching_text">Buscando señal de GPS</string>
<!-- manually translated -->
<string name="gps_notification_found_text">Ubicación establecida por el GPS</string>
</resources>

View File

@ -38,4 +38,9 @@
<!-- Separator for PLMN and SPN in network name. -->
<string name="status_bar_network_name_separator" translatable="false">" "</string>
<!-- Notification text: when GPS is getting a fix [CHAR LIMIT=50] -->
<string name="gps_notification_searching_text">Searching for GPS</string>
<!-- Notification text: when GPS has found a fix [CHAR LIMIT=50] -->
<string name="gps_notification_found_text">Location set by GPS</string>
</resources>

View File

@ -0,0 +1,114 @@
/*
* Copyright (C) 2008 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.systemui.statusbar.policy;
import java.util.ArrayList;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.util.Slog;
import android.view.View;
import android.widget.ImageView;
// private NM API
import android.app.INotificationManager;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.systemui.R;
public class LocationController extends BroadcastReceiver {
private static final String TAG = "StatusBar.LocationController";
private static final int GPS_NOTIFICATION_ID = 374203-122084;
private Context mContext;
private INotificationManager mNotificationService;
public LocationController(Context context) {
mContext = context;
IntentFilter filter = new IntentFilter();
filter.addAction(LocationManager.GPS_ENABLED_CHANGE_ACTION);
filter.addAction(LocationManager.GPS_FIX_CHANGE_ACTION);
context.registerReceiver(this, filter);
NotificationManager nm = (NotificationManager)context.getSystemService(
Context.NOTIFICATION_SERVICE);
mNotificationService = nm.getService();
}
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final boolean enabled = intent.getBooleanExtra(LocationManager.EXTRA_GPS_ENABLED, false);
boolean visible;
int iconId, textResId;
if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) {
// GPS is getting fixes
iconId = com.android.internal.R.drawable.stat_sys_gps_on;
textResId = R.string.gps_notification_found_text;
visible = true;
} else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
// GPS is off
visible = false;
iconId = textResId = 0;
} else {
// GPS is on, but not receiving fixes
iconId = R.drawable.stat_sys_gps_acquiring_anim;
textResId = R.string.gps_notification_searching_text;
visible = true;
}
try {
if (visible) {
Notification n = new Notification.Builder(mContext)
.setSmallIcon(iconId)
.setContentTitle(mContext.getText(textResId))
.setOngoing(true)
.getNotification();
// Notification.Builder will helpfully fill these out for you no matter what you do
n.tickerView = null;
n.tickerText = null;
int[] idOut = new int[1];
mNotificationService.enqueueNotificationWithTagPriority(
mContext.getPackageName(),
null,
GPS_NOTIFICATION_ID,
StatusBarNotification.PRIORITY_SYSTEM, // !!!1!one!!!
n,
idOut);
} else {
mNotificationService.cancelNotification(
mContext.getPackageName(),
GPS_NOTIFICATION_ID);
}
} catch (android.os.RemoteException ex) {
// well, it was worth a shot
}
}
}

View File

@ -65,6 +65,7 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.*;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.recent.RecentApplicationsActivity;
@ -135,6 +136,7 @@ public class TabletStatusBar extends StatusBar implements
HeightReceiver mHeightReceiver;
BatteryController mBatteryController;
BluetoothController mBluetoothController;
LocationController mLocationController;
NetworkController mNetworkController;
View mBarContents;
@ -359,6 +361,8 @@ public class TabletStatusBar extends StatusBar implements
mTicker = new TabletTicker(this);
// The icons
mLocationController = new LocationController(mContext); // will post a notification
mBatteryController = new BatteryController(mContext);
mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery));
mBluetoothController = new BluetoothController(mContext);

View File

@ -156,10 +156,11 @@ public class NotificationManagerService extends INotificationManager.Stub
final int id;
final int uid;
final int initialPid;
final int priority;
final Notification notification;
IBinder statusBarKey;
NotificationRecord(String pkg, String tag, int id, int uid, int initialPid,
NotificationRecord(String pkg, String tag, int id, int uid, int initialPid, int priority,
Notification notification)
{
this.pkg = pkg;
@ -167,6 +168,7 @@ public class NotificationManagerService extends INotificationManager.Stub
this.id = id;
this.uid = uid;
this.initialPid = initialPid;
this.priority = priority;
this.notification = notification;
}
@ -194,7 +196,9 @@ public class NotificationManagerService extends INotificationManager.Stub
+ Integer.toHexString(System.identityHashCode(this))
+ " pkg=" + pkg
+ " id=" + Integer.toHexString(id)
+ " tag=" + tag + "}";
+ " tag=" + tag
+ " pri=" + priority
+ "}";
}
}
@ -649,10 +653,26 @@ public class NotificationManagerService extends INotificationManager.Stub
tag, id, notification, idOut);
}
public void enqueueNotificationWithTagPriority(String pkg, String tag, int id, int priority,
Notification notification, int[] idOut)
{
enqueueNotificationInternal(pkg, Binder.getCallingUid(), Binder.getCallingPid(),
tag, id, priority, notification, idOut);
}
// Not exposed via Binder; for system use only (otherwise malicious apps could spoof the
// uid/pid of another application)
public void enqueueNotificationInternal(String pkg, int callingUid, int callingPid,
String tag, int id, Notification notification, int[] idOut)
{
enqueueNotificationInternal(pkg, callingUid, callingPid, tag, id,
((notification.flags & Notification.FLAG_ONGOING_EVENT) != 0)
? StatusBarNotification.PRIORITY_ONGOING
: StatusBarNotification.PRIORITY_NORMAL,
notification, idOut);
}
public void enqueueNotificationInternal(String pkg, int callingUid, int callingPid,
String tag, int id, int priority, Notification notification, int[] idOut)
{
checkIncomingCall(pkg);
@ -695,8 +715,10 @@ public class NotificationManagerService extends INotificationManager.Stub
}
synchronized (mNotificationList) {
NotificationRecord r = new NotificationRecord(pkg, tag, id,
callingUid, callingPid, notification);
NotificationRecord r = new NotificationRecord(pkg, tag, id,
callingUid, callingPid,
priority,
notification);
NotificationRecord old = null;
int index = indexOfNotificationLocked(pkg, tag, id);
@ -722,6 +744,8 @@ public class NotificationManagerService extends INotificationManager.Stub
if (notification.icon != 0) {
StatusBarNotification n = new StatusBarNotification(pkg, id, tag,
r.uid, r.initialPid, notification);
n.priority = r.priority;
if (old != null && old.statusBarKey != null) {
r.statusBarKey = old.statusBarKey;
long identity = Binder.clearCallingIdentity();
@ -743,6 +767,7 @@ public class NotificationManagerService extends INotificationManager.Stub
}
sendAccessibilityEvent(notification, pkg);
} else {
Slog.e(TAG, "Ignoring notification with icon==0: " + notification);
if (old != null && old.statusBarKey != null) {
long identity = Binder.clearCallingIdentity();
try {

View File

@ -35,6 +35,10 @@ import android.widget.TextView;
import android.widget.ProgressBar;
import android.os.PowerManager;
// private NM API
import android.app.INotificationManager;
import com.android.internal.statusbar.StatusBarNotification;
public class NotificationTestList extends TestActivity
{
private final static String TAG = "NotificationTestList";
@ -205,6 +209,15 @@ public class NotificationTestList extends TestActivity
}
},
new Test("Null Icon #1 (when=now)") {
public void run() {
Notification n = new Notification(0, null, System.currentTimeMillis());
n.setLatestEventInfo(NotificationTestList.this, "Persistent #1",
"This is the same notification!!!", makeIntent());
mNM.notify(1, n);
}
},
new Test("Bad resource #1 (when=create)") {
public void run() {
Notification n = new Notification(R.drawable.icon2,
@ -752,6 +765,30 @@ public class NotificationTestList extends TestActivity
}
},
new Test("System priority notification") {
public void run() {
Notification n = new Notification.Builder(NotificationTestList.this)
.setSmallIcon(R.drawable.notification1)
.setContentTitle("System priority")
.setContentText("This should appear before all others")
.getNotification();
int[] idOut = new int[1];
try {
INotificationManager directLine = mNM.getService();
directLine.enqueueNotificationWithTagPriority(
getPackageName(),
null,
1,
StatusBarNotification.PRIORITY_SYSTEM,
n,
idOut);
} catch (android.os.RemoteException ex) {
// oh well
}
}
},
new Test("Crash") {
public void run()
{