Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3104157 authored by Griff Hazen's avatar Griff Hazen
Browse files

Api updates for wearable extensions to notifications

1. Move Extender outside of Builder
2. Rename apply/applyTo to extend
3. Move Wearable extenders into Notification.java
4. Collapse Builder model into single classes
5. Use Bundle for storage: no new parcelable types.

Minor fix to RemoteInput to use flags int for boolean options.

Change-Id: I40012fd0458ec103eabf75ed4c91f636e02f4c8f
parent adb0a906
Loading
Loading
Loading
Loading
+60 −80
Original line number Diff line number Diff line
@@ -4001,13 +4001,22 @@ package android.app {
    ctor public Notification.Action.Builder(android.app.Notification.Action);
    method public android.app.Notification.Action.Builder addExtras(android.os.Bundle);
    method public android.app.Notification.Action.Builder addRemoteInput(android.app.RemoteInput);
    method public android.app.Notification.Action.Builder apply(android.app.Notification.Action.Builder.Extender);
    method public android.app.Notification.Action build();
    method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Extender);
    method public android.os.Bundle getExtras();
  }
  public static abstract interface Notification.Action.Builder.Extender {
    method public abstract android.app.Notification.Action.Builder applyTo(android.app.Notification.Action.Builder);
  public static abstract interface Notification.Action.Extender {
    method public abstract android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
  }
  public static final class Notification.Action.WearableExtender implements android.app.Notification.Action.Extender {
    ctor public Notification.Action.WearableExtender();
    ctor public Notification.Action.WearableExtender(android.app.Notification.Action);
    method public android.app.Notification.Action.WearableExtender clone();
    method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
    method public boolean isAvailableOffline();
    method public android.app.Notification.Action.WearableExtender setAvailableOffline(boolean);
  }
  public static class Notification.BigPictureStyle extends android.app.Notification.Style {
@@ -4032,8 +4041,8 @@ package android.app {
    method public android.app.Notification.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
    method public android.app.Notification.Builder addAction(android.app.Notification.Action);
    method public android.app.Notification.Builder addExtras(android.os.Bundle);
    method public android.app.Notification.Builder apply(android.app.Notification.Builder.Extender);
    method public android.app.Notification build();
    method public android.app.Notification.Builder extend(android.app.Notification.Extender);
    method public android.os.Bundle getExtras();
    method public deprecated android.app.Notification getNotification();
    method public android.app.Notification.Builder setAutoCancel(boolean);
@@ -4071,8 +4080,8 @@ package android.app {
    method public android.app.Notification.Builder setWhen(long);
  }
  public static abstract interface Notification.Builder.Extender {
    method public abstract android.app.Notification.Builder applyTo(android.app.Notification.Builder);
  public static abstract interface Notification.Extender {
    method public abstract android.app.Notification.Builder extend(android.app.Notification.Builder);
  }
  public static class Notification.InboxStyle extends android.app.Notification.Style {
@@ -4094,6 +4103,51 @@ package android.app {
    field protected android.app.Notification.Builder mBuilder;
  }
  public static final class Notification.WearableExtender implements android.app.Notification.Extender {
    ctor public Notification.WearableExtender();
    ctor public Notification.WearableExtender(android.app.Notification);
    method public android.app.Notification.WearableExtender addAction(android.app.Notification.Action);
    method public android.app.Notification.WearableExtender addActions(java.util.List<android.app.Notification.Action>);
    method public android.app.Notification.WearableExtender addPage(android.app.Notification);
    method public android.app.Notification.WearableExtender addPages(java.util.List<android.app.Notification>);
    method public android.app.Notification.WearableExtender clearActions();
    method public android.app.Notification.WearableExtender clearPages();
    method public android.app.Notification.WearableExtender clone();
    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
    method public java.util.List<android.app.Notification.Action> getActions();
    method public android.graphics.Bitmap getBackground();
    method public int getContentAction();
    method public int getContentIcon();
    method public int getContentIconGravity();
    method public boolean getContentIntentAvailableOffline();
    method public int getCustomContentHeight();
    method public int getCustomSizePreset();
    method public android.app.PendingIntent getDisplayIntent();
    method public int getGravity();
    method public boolean getHintHideIcon();
    method public boolean getHintShowBackgroundOnly();
    method public java.util.List<android.app.Notification> getPages();
    method public boolean getStartScrollBottom();
    method public android.app.Notification.WearableExtender setBackground(android.graphics.Bitmap);
    method public android.app.Notification.WearableExtender setContentAction(int);
    method public android.app.Notification.WearableExtender setContentIcon(int);
    method public android.app.Notification.WearableExtender setContentIconGravity(int);
    method public android.app.Notification.WearableExtender setContentIntentAvailableOffline(boolean);
    method public android.app.Notification.WearableExtender setCustomContentHeight(int);
    method public android.app.Notification.WearableExtender setCustomSizePreset(int);
    method public android.app.Notification.WearableExtender setDisplayIntent(android.app.PendingIntent);
    method public android.app.Notification.WearableExtender setGravity(int);
    method public android.app.Notification.WearableExtender setHintHideIcon(boolean);
    method public android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean);
    method public android.app.Notification.WearableExtender setStartScrollBottom(boolean);
    field public static final int SIZE_DEFAULT = 0; // 0x0
    field public static final int SIZE_LARGE = 4; // 0x4
    field public static final int SIZE_MEDIUM = 3; // 0x3
    field public static final int SIZE_SMALL = 2; // 0x2
    field public static final int SIZE_XSMALL = 1; // 0x1
    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
  }
  public class NotificationManager {
    method public void cancel(int);
    method public void cancel(java.lang.String, int);
@@ -4661,80 +4715,6 @@ package android.app.backup {
}
package android.app.wearable {
  public final class WearableActionExtensions implements android.app.Notification.Action.Builder.Extender android.os.Parcelable {
    method public android.app.Notification.Action.Builder applyTo(android.app.Notification.Action.Builder);
    method public int describeContents();
    method public static android.app.wearable.WearableActionExtensions from(android.app.Notification.Action);
    method public boolean isAvailableOffline();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
  }
  public static final class WearableActionExtensions.Builder {
    ctor public WearableActionExtensions.Builder();
    ctor public WearableActionExtensions.Builder(android.app.wearable.WearableActionExtensions);
    method public android.app.wearable.WearableActionExtensions build();
    method public android.app.wearable.WearableActionExtensions.Builder setAvailableOffline(boolean);
  }
  public final class WearableNotificationExtensions implements android.app.Notification.Builder.Extender android.os.Parcelable {
    method public android.app.Notification.Builder applyTo(android.app.Notification.Builder);
    method public int describeContents();
    method public static android.app.wearable.WearableNotificationExtensions from(android.app.Notification);
    method public android.app.Notification.Action getAction(int);
    method public int getActionCount();
    method public android.app.Notification.Action[] getActions();
    method public android.graphics.Bitmap getBackground();
    method public int getContentAction();
    method public int getContentIcon();
    method public int getContentIconGravity();
    method public boolean getContentIntentAvailableOffline();
    method public int getCustomContentHeight();
    method public int getCustomSizePreset();
    method public android.app.PendingIntent getDisplayIntent();
    method public int getGravity();
    method public boolean getHintHideIcon();
    method public boolean getHintShowBackgroundOnly();
    method public android.app.Notification[] getPages();
    method public boolean getStartScrollBottom();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int SIZE_DEFAULT = 0; // 0x0
    field public static final int SIZE_LARGE = 4; // 0x4
    field public static final int SIZE_MEDIUM = 3; // 0x3
    field public static final int SIZE_SMALL = 2; // 0x2
    field public static final int SIZE_XSMALL = 1; // 0x1
    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
  }
  public static final class WearableNotificationExtensions.Builder {
    ctor public WearableNotificationExtensions.Builder();
    ctor public WearableNotificationExtensions.Builder(android.app.wearable.WearableNotificationExtensions);
    method public android.app.wearable.WearableNotificationExtensions.Builder addAction(android.app.Notification.Action);
    method public android.app.wearable.WearableNotificationExtensions.Builder addActions(java.util.List<android.app.Notification.Action>);
    method public android.app.wearable.WearableNotificationExtensions.Builder addPage(android.app.Notification);
    method public android.app.wearable.WearableNotificationExtensions.Builder addPages(java.util.List<android.app.Notification>);
    method public android.app.wearable.WearableNotificationExtensions build();
    method public android.app.wearable.WearableNotificationExtensions.Builder clearActions();
    method public android.app.wearable.WearableNotificationExtensions.Builder clearPages();
    method public android.app.wearable.WearableNotificationExtensions.Builder setBackground(android.graphics.Bitmap);
    method public android.app.wearable.WearableNotificationExtensions.Builder setContentAction(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setContentIcon(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setContentIconGravity(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setContentIntentAvailableOffline(boolean);
    method public android.app.wearable.WearableNotificationExtensions.Builder setCustomContentHeight(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setCustomSizePreset(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setDisplayIntent(android.app.PendingIntent);
    method public android.app.wearable.WearableNotificationExtensions.Builder setGravity(int);
    method public android.app.wearable.WearableNotificationExtensions.Builder setHintHideIcon(boolean);
    method public android.app.wearable.WearableNotificationExtensions.Builder setHintShowBackgroundOnly(boolean);
    method public android.app.wearable.WearableNotificationExtensions.Builder setStartScrollBottom(boolean);
  }
}
package android.appwidget {
  public class AppWidgetHost {
+753 −31

File changed.

Preview size limit exceeded, changes collapsed.

+23 −9
Original line number Diff line number Diff line
@@ -64,18 +64,24 @@ public final class RemoteInput implements Parcelable {
    /** Extra added to a clip data intent object to hold the results bundle. */
    public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";

    // Flags bitwise-ored to mFlags
    private static final int FLAG_ALLOW_FREE_FORM_INPUT = 0x1;

    // Default value for flags integer
    private static final int DEFAULT_FLAGS = FLAG_ALLOW_FREE_FORM_INPUT;

    private final String mResultKey;
    private final CharSequence mLabel;
    private final CharSequence[] mChoices;
    private final boolean mAllowFreeFormInput;
    private final int mFlags;
    private final Bundle mExtras;

    private RemoteInput(String resultKey, CharSequence label, CharSequence[] choices,
            boolean allowFreeFormInput, Bundle extras) {
            int flags, Bundle extras) {
        this.mResultKey = resultKey;
        this.mLabel = label;
        this.mChoices = choices;
        this.mAllowFreeFormInput = allowFreeFormInput;
        this.mFlags = flags;
        this.mExtras = extras;
    }

@@ -108,7 +114,7 @@ public final class RemoteInput implements Parcelable {
     * if you set this to false and {@link #getChoices} returns {@code null} or empty.
     */
    public boolean getAllowFreeFormInput() {
        return mAllowFreeFormInput;
        return (mFlags & FLAG_ALLOW_FREE_FORM_INPUT) != 0;
    }

    /**
@@ -125,7 +131,7 @@ public final class RemoteInput implements Parcelable {
        private final String mResultKey;
        private CharSequence mLabel;
        private CharSequence[] mChoices;
        private boolean mAllowFreeFormInput = true;
        private int mFlags = DEFAULT_FLAGS;
        private Bundle mExtras = new Bundle();

        /**
@@ -178,7 +184,7 @@ public final class RemoteInput implements Parcelable {
         * @return this object for method chaining
         */
        public Builder setAllowFreeFormInput(boolean allowFreeFormInput) {
            mAllowFreeFormInput = allowFreeFormInput;
            setFlag(mFlags, allowFreeFormInput);
            return this;
        }

@@ -205,12 +211,20 @@ public final class RemoteInput implements Parcelable {
            return mExtras;
        }

        private void setFlag(int mask, boolean value) {
            if (value) {
                mFlags |= mask;
            } else {
                mFlags &= ~mask;
            }
        }

        /**
         * Combine all of the options that have been set and return a new {@link RemoteInput}
         * object.
         */
        public RemoteInput build() {
            return new RemoteInput(mResultKey, mLabel, mChoices, mAllowFreeFormInput, mExtras);
            return new RemoteInput(mResultKey, mLabel, mChoices, mFlags, mExtras);
        }
    }

@@ -218,7 +232,7 @@ public final class RemoteInput implements Parcelable {
        mResultKey = in.readString();
        mLabel = in.readCharSequence();
        mChoices = in.readCharSequenceArray();
        mAllowFreeFormInput = in.readInt() != 0;
        mFlags = in.readInt();
        mExtras = in.readBundle();
    }

@@ -279,7 +293,7 @@ public final class RemoteInput implements Parcelable {
        out.writeString(mResultKey);
        out.writeCharSequence(mLabel);
        out.writeCharSequenceArray(mChoices);
        out.writeInt(mAllowFreeFormInput ? 1 : 0);
        out.writeInt(mFlags);
        out.writeBundle(mExtras);
    }

+0 −176
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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 android.app.wearable;

import android.app.Notification;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * Wearable extensions to notification actions. To add extensions to an action,
 * create a new {@link WearableActionExtensions} object using
 * {@link WearableActionExtensions.Builder} and apply it to a
 * {@link android.app.Notification.Action.Builder}.
 *
 * <pre class="prettyprint">
 * Notification.Action action = new Notification.Action.Builder(
 *         R.drawable.archive_all, "Archive all", actionIntent)
 *         .apply(new WearableActionExtensions.Builder()
 *                 .setAvailableOffline(false)
 *                 .build())
 *         .build();
 * </pre>
 */
public final class WearableActionExtensions implements Notification.Action.Builder.Extender,
        Parcelable {
    /** Notification action extra which contains wearable extensions */
    private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";

    // Flags bitwise-ored to mFlags
    private static final int FLAG_AVAILABLE_OFFLINE = 1 << 0;

    // Default value for flags integer
    private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;

    private final int mFlags;

    private WearableActionExtensions(int flags) {
        mFlags = flags;
    }

    private WearableActionExtensions(Parcel in) {
        mFlags = in.readInt();
    }

    /**
     * Create a {@link WearableActionExtensions} by reading wearable extensions present on an
     * existing notification action.
     * @param action the notification action to inspect.
     * @return a new {@link WearableActionExtensions} object.
     */
    public static WearableActionExtensions from(Notification.Action action) {
        WearableActionExtensions extensions = action.getExtras().getParcelable(
                EXTRA_WEARABLE_EXTENSIONS);
        if (extensions != null) {
            return extensions;
        } else {
            // Return a WearableActionExtensions with default values.
            return new Builder().build();
        }
    }

    /**
     * Get whether this action is available when the wearable device is not connected to
     * a companion device. The user can still trigger this action when the wearable device is
     * offline, but a visual hint will indicate that the action may not be available.
     * Defaults to true.
     */
    public boolean isAvailableOffline() {
        return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
    }

    @Override
    public Notification.Action.Builder applyTo(Notification.Action.Builder builder) {
        builder.getExtras().putParcelable(EXTRA_WEARABLE_EXTENSIONS, this);
        return builder;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mFlags);
    }

    /**
     * Builder for {@link WearableActionExtensions} objects, which adds wearable extensions to
     * notification actions. To extend an action, create an instance of this class, call the set
     * methods present, call {@link #build}, and finally apply the options to a
     * {@link Notification.Action.Builder} using its
     * {@link android.app.Notification.Action.Builder#apply} method.
     */
    public static final class Builder {
        private int mFlags = DEFAULT_FLAGS;

        /**
         * Construct a builder to be used for adding wearable extensions to notification actions.
         *
         * <pre class="prettyprint">
         * Notification.Action action = new Notification.Action.Builder(
         *         R.drawable.archive_all, "Archive all", actionIntent)
         *         .apply(new WearableActionExtensions.Builder()
         *                 .setAvailableOffline(false)
         *                 .build())
         *         .build();</pre>
         */
        public Builder() {
        }

        /**
         * Create a {@link Builder} by reading wearable extensions present on an
         * existing {@code WearableActionExtensions} object.
         * @param other the existing extensions to inspect.
         */
        public Builder(WearableActionExtensions other) {
            mFlags = other.mFlags;
        }

        /**
         * Set whether this action is available when the wearable device is not connected to
         * a companion device. The user can still trigger this action when the wearable device is
         * offline, but a visual hint will indicate that the action may not be available.
         * Defaults to true.
         */
        public Builder setAvailableOffline(boolean availableOffline) {
            setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
            return this;
        }

        /**
         * Build a new {@link WearableActionExtensions} object with the extensions
         * currently present on this builder.
         * @return the extensions object.
         */
        public WearableActionExtensions build() {
            return new WearableActionExtensions(mFlags);
        }

        private void setFlag(int mask, boolean value) {
            if (value) {
                mFlags |= mask;
            } else {
                mFlags &= ~mask;
            }
        }
    }

    public static final Creator<WearableActionExtensions> CREATOR =
            new Creator<WearableActionExtensions>() {
        @Override
        public WearableActionExtensions createFromParcel(Parcel in) {
            return new WearableActionExtensions(in);
        }

        @Override
        public WearableActionExtensions[] newArray(int size) {
            return new WearableActionExtensions[size];
        }
    };
}
+0 −702

File deleted.

Preview size limit exceeded, changes collapsed.