I removed the compat library, and imported the NotificationConpat
classes. This will prevent compilation errors.
This commit is contained in:
388
ExceptionHandlerLib/src/anroid/v4/compat/NotificationCompat.java
Normal file
388
ExceptionHandlerLib/src/anroid/v4/compat/NotificationCompat.java
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 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 anroid.v4.compat;
|
||||||
|
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.media.AudioManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
|
public class NotificationCompat {
|
||||||
|
/**
|
||||||
|
* Bit to be bitwise-ored into the {@link Notification#flags} field that should be set if
|
||||||
|
* this notification represents a high-priority event that may be shown to the user even
|
||||||
|
* if notifications are otherwise unavailable (that is, when the status bar is hidden).
|
||||||
|
* This flag is ideally used in conjunction with fullScreenIntent.
|
||||||
|
*
|
||||||
|
* <p>This will only be respected on API level 9 and above.</p>
|
||||||
|
*/
|
||||||
|
public static final int FLAG_HIGH_PRIORITY = 0x00000080;
|
||||||
|
|
||||||
|
private static final NotificationCompatImpl IMPL;
|
||||||
|
|
||||||
|
interface NotificationCompatImpl {
|
||||||
|
public Notification getNotification(Builder b);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class NotificationCompatImplBase implements NotificationCompatImpl {
|
||||||
|
public Notification getNotification(Builder b) {
|
||||||
|
Notification result = (Notification) b.mNotification;
|
||||||
|
result.setLatestEventInfo(b.mContext, b.mContentTitle,
|
||||||
|
b.mContentText, b.mContentIntent);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class NotificationCompatImplHoneycomb implements NotificationCompatImpl {
|
||||||
|
public Notification getNotification(Builder b) {
|
||||||
|
return NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
|
||||||
|
b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
|
||||||
|
b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (Build.VERSION.SDK_INT >= 11) {
|
||||||
|
IMPL = new NotificationCompatImplHoneycomb();
|
||||||
|
} else {
|
||||||
|
IMPL = new NotificationCompatImplBase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder class for {@link Notification} objects. Allows easier control over
|
||||||
|
* all the flags, as well as help constructing the typical notification layouts.
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
Context mContext;
|
||||||
|
|
||||||
|
CharSequence mContentTitle;
|
||||||
|
CharSequence mContentText;
|
||||||
|
PendingIntent mContentIntent;
|
||||||
|
PendingIntent mFullScreenIntent;
|
||||||
|
RemoteViews mTickerView;
|
||||||
|
Bitmap mLargeIcon;
|
||||||
|
CharSequence mContentInfo;
|
||||||
|
int mNumber;
|
||||||
|
|
||||||
|
Notification mNotification = new Notification();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* Automatically sets the when field to {@link System#currentTimeMillis()
|
||||||
|
* System.currentTimeMillis()} and the audio stream to the
|
||||||
|
* {@link Notification#STREAM_DEFAULT}.
|
||||||
|
*
|
||||||
|
* @param context A {@link Context} that will be used to construct the
|
||||||
|
* RemoteViews. The Context will not be held past the lifetime of this
|
||||||
|
* Builder object.
|
||||||
|
*/
|
||||||
|
public Builder(Context context) {
|
||||||
|
mContext = context;
|
||||||
|
|
||||||
|
// Set defaults to match the defaults of a Notification
|
||||||
|
mNotification.when = System.currentTimeMillis();
|
||||||
|
mNotification.audioStreamType = Notification.STREAM_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the time that the event occurred. Notifications in the panel are
|
||||||
|
* sorted by this time.
|
||||||
|
*/
|
||||||
|
public Builder setWhen(long when) {
|
||||||
|
mNotification.when = when;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the small icon to use in the notification layouts. Different classes of devices
|
||||||
|
* may return different sizes. See the UX guidelines for more information on how to
|
||||||
|
* design these icons.
|
||||||
|
*
|
||||||
|
* @param icon A resource ID in the application's package of the drawble to use.
|
||||||
|
*/
|
||||||
|
public Builder setSmallIcon(int icon) {
|
||||||
|
mNotification.icon = icon;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
|
||||||
|
* level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
|
||||||
|
* LevelListDrawable}.
|
||||||
|
*
|
||||||
|
* @param icon A resource ID in the application's package of the drawble to use.
|
||||||
|
* @param level The level to use for the icon.
|
||||||
|
*
|
||||||
|
* @see android.graphics.drawable.LevelListDrawable
|
||||||
|
*/
|
||||||
|
public Builder setSmallIcon(int icon, int level) {
|
||||||
|
mNotification.icon = icon;
|
||||||
|
mNotification.iconLevel = level;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the title (first row) of the notification, in a standard notification.
|
||||||
|
*/
|
||||||
|
public Builder setContentTitle(CharSequence title) {
|
||||||
|
mContentTitle = title;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text (second row) of the notification, in a standard notification.
|
||||||
|
*/
|
||||||
|
public Builder setContentText(CharSequence text) {
|
||||||
|
mContentText = text;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the large number at the right-hand side of the notification. This is
|
||||||
|
* equivalent to setContentInfo, although it might show the number in a different
|
||||||
|
* font size for readability.
|
||||||
|
*/
|
||||||
|
public Builder setNumber(int number) {
|
||||||
|
mNumber = number;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the large text at the right-hand side of the notification.
|
||||||
|
*/
|
||||||
|
public Builder setContentInfo(CharSequence info) {
|
||||||
|
mContentInfo = info;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the progress this notification represents, which may be
|
||||||
|
* represented as a {@link ProgressBar}.
|
||||||
|
*/
|
||||||
|
/* TODO
|
||||||
|
public Builder setProgress(int max, int progress, boolean indeterminate) {
|
||||||
|
mProgressMax = max;
|
||||||
|
mProgress = progress;
|
||||||
|
mProgressIndeterminate = indeterminate;
|
||||||
|
return this;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supply a custom RemoteViews to use instead of the standard one.
|
||||||
|
*/
|
||||||
|
public Builder setContent(RemoteViews views) {
|
||||||
|
mNotification.contentView = views;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supply a {@link PendingIntent} to send when the notification is clicked.
|
||||||
|
* If you do not supply an intent, you can now add PendingIntents to individual
|
||||||
|
* views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
|
||||||
|
* RemoteViews.setOnClickPendingIntent(int,PendingIntent)}. Be sure to
|
||||||
|
* read {@link Notification#contentIntent Notification.contentIntent} for
|
||||||
|
* how to correctly use this.
|
||||||
|
*/
|
||||||
|
public Builder setContentIntent(PendingIntent intent) {
|
||||||
|
mContentIntent = intent;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supply a {@link PendingIntent} to send when the notification is cleared by the user
|
||||||
|
* directly from the notification panel. For example, this intent is sent when the user
|
||||||
|
* clicks the "Clear all" button, or the individual "X" buttons on notifications. This
|
||||||
|
* intent is not sent when the application calls {@link NotificationManager#cancel
|
||||||
|
* NotificationManager.cancel(int)}.
|
||||||
|
*/
|
||||||
|
public Builder setDeleteIntent(PendingIntent intent) {
|
||||||
|
mNotification.deleteIntent = intent;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An intent to launch instead of posting the notification to the status bar.
|
||||||
|
* Only for use with extremely high-priority notifications demanding the user's
|
||||||
|
* <strong>immediate</strong> attention, such as an incoming phone call or
|
||||||
|
* alarm clock that the user has explicitly set to a particular time.
|
||||||
|
* If this facility is used for something else, please give the user an option
|
||||||
|
* to turn it off and use a normal notification, as this can be extremely
|
||||||
|
* disruptive.
|
||||||
|
*
|
||||||
|
* @param intent The pending intent to launch.
|
||||||
|
* @param highPriority Passing true will cause this notification to be sent
|
||||||
|
* even if other notifications are suppressed.
|
||||||
|
*/
|
||||||
|
public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
|
||||||
|
mFullScreenIntent = intent;
|
||||||
|
setFlag(FLAG_HIGH_PRIORITY, highPriority);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text that is displayed in the status bar when the notification first
|
||||||
|
* arrives.
|
||||||
|
*/
|
||||||
|
public Builder setTicker(CharSequence tickerText) {
|
||||||
|
mNotification.tickerText = tickerText;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text that is displayed in the status bar when the notification first
|
||||||
|
* arrives, and also a RemoteViews object that may be displayed instead on some
|
||||||
|
* devices.
|
||||||
|
*/
|
||||||
|
public Builder setTicker(CharSequence tickerText, RemoteViews views) {
|
||||||
|
mNotification.tickerText = tickerText;
|
||||||
|
mTickerView = views;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the large icon that is shown in the ticker and notification.
|
||||||
|
*/
|
||||||
|
public Builder setLargeIcon(Bitmap icon) {
|
||||||
|
mLargeIcon = icon;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the sound to play. It will play on the default stream.
|
||||||
|
*/
|
||||||
|
public Builder setSound(Uri sound) {
|
||||||
|
mNotification.sound = sound;
|
||||||
|
mNotification.audioStreamType = Notification.STREAM_DEFAULT;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the sound to play. It will play on the stream you supply.
|
||||||
|
*
|
||||||
|
* @see #STREAM_DEFAULT
|
||||||
|
* @see AudioManager for the <code>STREAM_</code> constants.
|
||||||
|
*/
|
||||||
|
public Builder setSound(Uri sound, int streamType) {
|
||||||
|
mNotification.sound = sound;
|
||||||
|
mNotification.audioStreamType = streamType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the vibration pattern to use.
|
||||||
|
*
|
||||||
|
* @see android.os.Vibrator for a discussion of the <code>pattern</code>
|
||||||
|
* parameter.
|
||||||
|
*/
|
||||||
|
public Builder setVibrate(long[] pattern) {
|
||||||
|
mNotification.vibrate = pattern;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the argb value that you would like the LED on the device to blnk, as well as the
|
||||||
|
* rate. The rate is specified in terms of the number of milliseconds to be on
|
||||||
|
* and then the number of milliseconds to be off.
|
||||||
|
*/
|
||||||
|
public Builder setLights(int argb, int onMs, int offMs) {
|
||||||
|
mNotification.ledARGB = argb;
|
||||||
|
mNotification.ledOnMS = onMs;
|
||||||
|
mNotification.ledOffMS = offMs;
|
||||||
|
boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
|
||||||
|
mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
|
||||||
|
(showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether this is an ongoing notification.
|
||||||
|
*
|
||||||
|
* <p>Ongoing notifications differ from regular notifications in the following ways:
|
||||||
|
* <ul>
|
||||||
|
* <li>Ongoing notifications are sorted above the regular notifications in the
|
||||||
|
* notification panel.</li>
|
||||||
|
* <li>Ongoing notifications do not have an 'X' close button, and are not affected
|
||||||
|
* by the "Clear all" button.
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public Builder setOngoing(boolean ongoing) {
|
||||||
|
setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set this flag if you would only like the sound, vibrate
|
||||||
|
* and ticker to be played if the notification is not already showing.
|
||||||
|
*/
|
||||||
|
public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
|
||||||
|
setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setting this flag will make it so the notification is automatically
|
||||||
|
* canceled when the user clicks it in the panel. The PendingIntent
|
||||||
|
* set with {@link #setDeleteIntent} will be broadcast when the notification
|
||||||
|
* is canceled.
|
||||||
|
*/
|
||||||
|
public Builder setAutoCancel(boolean autoCancel) {
|
||||||
|
setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the default notification options that will be used.
|
||||||
|
* <p>
|
||||||
|
* The value should be one or more of the following fields combined with
|
||||||
|
* bitwise-or:
|
||||||
|
* {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
|
||||||
|
* {@link Notification#DEFAULT_LIGHTS}.
|
||||||
|
* <p>
|
||||||
|
* For all default values, use {@link Notification#DEFAULT_ALL}.
|
||||||
|
*/
|
||||||
|
public Builder setDefaults(int defaults) {
|
||||||
|
mNotification.defaults = defaults;
|
||||||
|
if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
|
||||||
|
mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setFlag(int mask, boolean value) {
|
||||||
|
if (value) {
|
||||||
|
mNotification.flags |= mask;
|
||||||
|
} else {
|
||||||
|
mNotification.flags &= ~mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Combine all of the options that have been set and return a new {@link Notification}
|
||||||
|
* object.
|
||||||
|
*/
|
||||||
|
public Notification getNotification() {
|
||||||
|
return (Notification) IMPL.getNotification(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 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 anroid.v4.compat;
|
||||||
|
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
|
class NotificationCompatHoneycomb {
|
||||||
|
static Notification add(Context context, Notification n,
|
||||||
|
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
|
||||||
|
RemoteViews tickerView, int number,
|
||||||
|
PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon) {
|
||||||
|
Notification.Builder b = new Notification.Builder(context)
|
||||||
|
.setWhen(n.when)
|
||||||
|
.setSmallIcon(n.icon, n.iconLevel)
|
||||||
|
.setContent(n.contentView)
|
||||||
|
.setTicker(n.tickerText, tickerView)
|
||||||
|
.setSound(n.sound, n.audioStreamType)
|
||||||
|
.setVibrate(n.vibrate)
|
||||||
|
.setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
|
||||||
|
.setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
|
||||||
|
.setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
|
||||||
|
.setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
|
||||||
|
.setDefaults(n.defaults)
|
||||||
|
.setContentTitle(contentTitle)
|
||||||
|
.setContentText(contentText)
|
||||||
|
.setContentInfo(contentInfo)
|
||||||
|
.setContentIntent(contentIntent)
|
||||||
|
.setDeleteIntent(n.deleteIntent)
|
||||||
|
.setFullScreenIntent(fullScreenIntent,
|
||||||
|
(n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
|
||||||
|
.setLargeIcon(largeIcon)
|
||||||
|
.setNumber(number);
|
||||||
|
|
||||||
|
return b.getNotification();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,8 +26,8 @@ import android.content.pm.PackageManager.NameNotFoundException;
|
|||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.v4.app.NotificationCompat;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import anroid.v4.compat.NotificationCompat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is Twenty Codes, LLC Exception Handler of Awesomeness!
|
* This is Twenty Codes, LLC Exception Handler of Awesomeness!
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ import android.app.Service;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.support.v4.app.NotificationCompat;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import anroid.v4.compat.NotificationCompat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This service will allow the exception handler to post reports in the backgound,
|
* This service will allow the exception handler to post reports in the backgound,
|
||||||
|
|||||||
Reference in New Issue
Block a user