Search in sources :

Example 91 with StatusBarNotification

use of android.service.notification.StatusBarNotification in project platform_frameworks_base by android.

the class NotificationManagerService method handleGroupedNotificationLocked.

/**
     * Ensures that grouped notification receive their special treatment.
     *
     * <p>Cancels group children if the new notification causes a group to lose
     * its summary.</p>
     *
     * <p>Updates mSummaryByGroupKey.</p>
     */
private void handleGroupedNotificationLocked(NotificationRecord r, NotificationRecord old, int callingUid, int callingPid) {
    StatusBarNotification sbn = r.sbn;
    Notification n = sbn.getNotification();
    if (n.isGroupSummary() && !sbn.isAppGroup()) {
        // notifications without a group shouldn't be a summary, otherwise autobundling can
        // lead to bugs
        n.flags &= ~Notification.FLAG_GROUP_SUMMARY;
    }
    String group = sbn.getGroupKey();
    boolean isSummary = n.isGroupSummary();
    Notification oldN = old != null ? old.sbn.getNotification() : null;
    String oldGroup = old != null ? old.sbn.getGroupKey() : null;
    boolean oldIsSummary = old != null && oldN.isGroupSummary();
    if (oldIsSummary) {
        NotificationRecord removedSummary = mSummaryByGroupKey.remove(oldGroup);
        if (removedSummary != old) {
            String removedKey = removedSummary != null ? removedSummary.getKey() : "<null>";
            Slog.w(TAG, "Removed summary didn't match old notification: old=" + old.getKey() + ", removed=" + removedKey);
        }
    }
    if (isSummary) {
        mSummaryByGroupKey.put(group, r);
    }
    // notification was a summary and its group key changed.
    if (oldIsSummary && (!isSummary || !oldGroup.equals(group))) {
        cancelGroupChildrenLocked(old, callingUid, callingPid, null, REASON_GROUP_SUMMARY_CANCELED, false);
    }
}
Also used : StatusBarNotification(android.service.notification.StatusBarNotification) ITransientNotification(android.app.ITransientNotification) Notification(android.app.Notification) StatusBarNotification(android.service.notification.StatusBarNotification)

Example 92 with StatusBarNotification

use of android.service.notification.StatusBarNotification in project platform_frameworks_base by android.

the class NotificationGroupManager method onHeadsUpStateChanged.

@Override
public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
    final StatusBarNotification sbn = entry.notification;
    if (entry.row.isHeadsUp()) {
        if (shouldIsolate(sbn)) {
            // We will be isolated now, so lets update the groups
            onEntryRemovedInternal(entry, entry.notification);
            mIsolatedEntries.put(sbn.getKey(), sbn);
            onEntryAdded(entry);
            // We also need to update the suppression of the old group, because this call comes
            // even before the groupManager knows about the notification at all.
            // When the notification gets added afterwards it is already isolated and therefore
            // it doesn't lead to an update.
            updateSuppression(mGroupMap.get(entry.notification.getGroupKey()));
            mListener.onGroupsChanged();
        } else {
            handleSuppressedSummaryHeadsUpped(entry);
        }
    } else {
        if (mIsolatedEntries.containsKey(sbn.getKey())) {
            // not isolated anymore, we need to update the groups
            onEntryRemovedInternal(entry, entry.notification);
            mIsolatedEntries.remove(sbn.getKey());
            onEntryAdded(entry);
            mListener.onGroupsChanged();
        }
    }
}
Also used : StatusBarNotification(android.service.notification.StatusBarNotification)

Example 93 with StatusBarNotification

use of android.service.notification.StatusBarNotification in project platform_frameworks_base by android.

the class NotificationGroupManager method handleSuppressedSummaryHeadsUpped.

private void handleSuppressedSummaryHeadsUpped(NotificationData.Entry entry) {
    StatusBarNotification sbn = entry.notification;
    if (!isGroupSuppressed(sbn.getGroupKey()) || !sbn.getNotification().isGroupSummary() || !entry.row.isHeadsUp()) {
        return;
    }
    // The parent of a suppressed group got huned, lets hun the child!
    NotificationGroup notificationGroup = mGroupMap.get(sbn.getGroupKey());
    if (notificationGroup != null) {
        Iterator<NotificationData.Entry> iterator = notificationGroup.children.iterator();
        NotificationData.Entry child = iterator.hasNext() ? iterator.next() : null;
        if (child == null) {
            child = getIsolatedChild(sbn.getGroupKey());
        }
        if (child != null) {
            if (mHeadsUpManager.isHeadsUp(child.key)) {
                mHeadsUpManager.updateNotification(child, true);
            } else {
                mHeadsUpManager.showNotification(child);
            }
        }
    }
    mHeadsUpManager.releaseImmediately(entry.key);
}
Also used : StatusBarNotification(android.service.notification.StatusBarNotification) NotificationData(com.android.systemui.statusbar.NotificationData)

Example 94 with StatusBarNotification

use of android.service.notification.StatusBarNotification in project platform_frameworks_base by android.

the class BaseStatusBar method updateNotification.

public void updateNotification(StatusBarNotification notification, RankingMap ranking) {
    if (DEBUG)
        Log.d(TAG, "updateNotification(" + notification + ")");
    final String key = notification.getKey();
    Entry entry = mNotificationData.get(key);
    if (entry == null) {
        return;
    } else {
        mHeadsUpEntriesToRemoveOnSwitch.remove(entry);
        mRemoteInputEntriesToRemoveOnCollapse.remove(entry);
    }
    Notification n = notification.getNotification();
    mNotificationData.updateRanking(ranking);
    boolean applyInPlace;
    try {
        applyInPlace = entry.cacheContentViews(mContext, notification.getNotification());
    } catch (RuntimeException e) {
        Log.e(TAG, "Unable to get notification remote views", e);
        applyInPlace = false;
    }
    boolean shouldPeek = shouldPeek(entry, notification);
    boolean alertAgain = alertAgain(entry, n);
    if (DEBUG) {
        Log.d(TAG, "applyInPlace=" + applyInPlace + " shouldPeek=" + shouldPeek + " alertAgain=" + alertAgain);
    }
    final StatusBarNotification oldNotification = entry.notification;
    entry.notification = notification;
    mGroupManager.onEntryUpdated(entry, oldNotification);
    boolean updateSuccessful = false;
    if (applyInPlace) {
        if (DEBUG)
            Log.d(TAG, "reusing notification for key: " + key);
        try {
            if (entry.icon != null) {
                // Update the icon
                final StatusBarIcon ic = new StatusBarIcon(notification.getUser(), notification.getPackageName(), n.getSmallIcon(), n.iconLevel, n.number, StatusBarIconView.contentDescForNotification(mContext, n));
                entry.icon.setNotification(n);
                if (!entry.icon.set(ic)) {
                    handleNotificationError(notification, "Couldn't update icon: " + ic);
                    return;
                }
            }
            updateNotificationViews(entry, notification);
            updateSuccessful = true;
        } catch (RuntimeException e) {
            // It failed to apply cleanly.
            Log.w(TAG, "Couldn't reapply views for package " + notification.getPackageName(), e);
        }
    }
    if (!updateSuccessful) {
        if (DEBUG)
            Log.d(TAG, "not reusing notification for key: " + key);
        final StatusBarIcon ic = new StatusBarIcon(notification.getUser(), notification.getPackageName(), n.getSmallIcon(), n.iconLevel, n.number, StatusBarIconView.contentDescForNotification(mContext, n));
        entry.icon.setNotification(n);
        entry.icon.set(ic);
        if (!inflateViews(entry, mStackScroller)) {
            handleNotificationError(notification, "Couldn't update remote views for: " + notification);
        }
    }
    updateHeadsUp(key, entry, shouldPeek, alertAgain);
    updateNotifications();
    if (!notification.isClearable()) {
        // The user may have performed a dismiss action on the notification, since it's
        // not clearable we should snap it back.
        mStackScroller.snapViewIfNeeded(entry.row);
    }
    if (DEBUG) {
        // Is this for you?
        boolean isForCurrentUser = isNotificationForCurrentProfiles(notification);
        Log.d(TAG, "notification is " + (isForCurrentUser ? "" : "not ") + "for you");
    }
    setAreThereNotifications();
}
Also used : Entry(com.android.systemui.statusbar.NotificationData.Entry) StatusBarNotification(android.service.notification.StatusBarNotification) StatusBarIcon(com.android.internal.statusbar.StatusBarIcon) Notification(android.app.Notification) StatusBarNotification(android.service.notification.StatusBarNotification)

Example 95 with StatusBarNotification

use of android.service.notification.StatusBarNotification in project platform_frameworks_base by android.

the class BaseStatusBar method bindGuts.

private void bindGuts(final ExpandableNotificationRow row) {
    row.inflateGuts();
    final StatusBarNotification sbn = row.getStatusBarNotification();
    PackageManager pmUser = getPackageManagerForUser(mContext, sbn.getUser().getIdentifier());
    row.setTag(sbn.getPackageName());
    final NotificationGuts guts = row.getGuts();
    guts.setClosedListener(this);
    final String pkg = sbn.getPackageName();
    String appname = pkg;
    Drawable pkgicon = null;
    int appUid = -1;
    try {
        final ApplicationInfo info = pmUser.getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS);
        if (info != null) {
            appname = String.valueOf(pmUser.getApplicationLabel(info));
            pkgicon = pmUser.getApplicationIcon(info);
            appUid = info.uid;
        }
    } catch (NameNotFoundException e) {
        // app is gone, just show package name and generic icon
        pkgicon = pmUser.getDefaultActivityIcon();
    }
    ((ImageView) guts.findViewById(R.id.app_icon)).setImageDrawable(pkgicon);
    ((TextView) guts.findViewById(R.id.pkgname)).setText(appname);
    final TextView settingsButton = (TextView) guts.findViewById(R.id.more_settings);
    if (appUid >= 0) {
        final int appUidF = appUid;
        settingsButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTE_INFO);
                guts.resetFalsingCheck();
                startAppNotificationSettingsActivity(pkg, appUidF);
            }
        });
        settingsButton.setText(R.string.notification_more_settings);
    } else {
        settingsButton.setVisibility(View.GONE);
    }
    guts.bindImportance(pmUser, sbn, mNonBlockablePkgs, mNotificationData.getImportance(sbn.getKey()));
    final TextView doneButton = (TextView) guts.findViewById(R.id.done);
    doneButton.setText(R.string.notification_done);
    doneButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // If the user has security enabled, show challenge if the setting is changed.
            if (guts.hasImportanceChanged() && isLockscreenPublicMode() && (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)) {
                OnDismissAction dismissAction = new OnDismissAction() {

                    @Override
                    public boolean onDismiss() {
                        saveImportanceCloseControls(sbn, row, guts, v);
                        return true;
                    }
                };
                onLockedNotificationImportanceChange(dismissAction);
            } else {
                saveImportanceCloseControls(sbn, row, guts, v);
            }
        }
    });
}
Also used : NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) Drawable(android.graphics.drawable.Drawable) ApplicationInfo(android.content.pm.ApplicationInfo) OnDismissAction(com.android.keyguard.KeyguardHostView.OnDismissAction) ImageView(android.widget.ImageView) View(android.view.View) RemoteInputView(com.android.systemui.statusbar.policy.RemoteInputView) TextView(android.widget.TextView) NavigationBarView(com.android.systemui.statusbar.phone.NavigationBarView) StatusBarNotification(android.service.notification.StatusBarNotification) PackageManager(android.content.pm.PackageManager) TextView(android.widget.TextView) ImageView(android.widget.ImageView)

Aggregations

StatusBarNotification (android.service.notification.StatusBarNotification)144 Notification (android.app.Notification)61 View (android.view.View)24 PendingIntent (android.app.PendingIntent)23 TextView (android.widget.TextView)23 ApplicationInfo (android.content.pm.ApplicationInfo)21 ImageView (android.widget.ImageView)21 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)17 StatusBarIcon (com.android.internal.statusbar.StatusBarIcon)16 ITransientNotification (android.app.ITransientNotification)15 NotificationData (com.android.systemui.statusbar.NotificationData)14 Point (android.graphics.Point)13 RemoteViews (android.widget.RemoteViews)12 Entry (com.android.systemui.statusbar.NotificationData.Entry)12 PackageManager (android.content.pm.PackageManager)11 UserHandle (android.os.UserHandle)10 NavigationBarView (com.android.systemui.statusbar.phone.NavigationBarView)10 RemoteInputView (com.android.systemui.statusbar.policy.RemoteInputView)10 Drawable (android.graphics.drawable.Drawable)9 NotificationPanelView (com.android.systemui.statusbar.phone.NotificationPanelView)9