1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import android.annotation.NonNull;
20 import android.graphics.drawable.Icon;
21 import android.os.Parcel;
22 import android.os.Parcelable;
23 import android.text.TextUtils;
24 
25 import java.io.PrintWriter;
26 
27 /**
28  * Represents a remote action that can be called from another process.  The action can have an
29  * associated visualization including metadata like an icon or title.
30  */
31 public final class RemoteAction implements Parcelable {
32 
33     private static final String TAG = "RemoteAction";
34 
35     private final Icon mIcon;
36     private final CharSequence mTitle;
37     private final CharSequence mContentDescription;
38     private final PendingIntent mActionIntent;
39     private boolean mEnabled;
40     private boolean mShouldShowIcon;
41 
RemoteAction(Parcel in)42     RemoteAction(Parcel in) {
43         mIcon = Icon.CREATOR.createFromParcel(in);
44         mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
45         mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
46         mActionIntent = PendingIntent.CREATOR.createFromParcel(in);
47         mEnabled = in.readBoolean();
48         mShouldShowIcon = in.readBoolean();
49     }
50 
RemoteAction(@onNull Icon icon, @NonNull CharSequence title, @NonNull CharSequence contentDescription, @NonNull PendingIntent intent)51     public RemoteAction(@NonNull Icon icon, @NonNull CharSequence title,
52             @NonNull CharSequence contentDescription, @NonNull PendingIntent intent) {
53         if (icon == null || title == null || contentDescription == null || intent == null) {
54             throw new IllegalArgumentException("Expected icon, title, content description and " +
55                     "action callback");
56         }
57         mIcon = icon;
58         mTitle = title;
59         mContentDescription = contentDescription;
60         mActionIntent = intent;
61         mEnabled = true;
62         mShouldShowIcon = true;
63     }
64 
65     /**
66      * Sets whether this action is enabled.
67      */
setEnabled(boolean enabled)68     public void setEnabled(boolean enabled) {
69         mEnabled = enabled;
70     }
71 
72     /**
73      * Return whether this action is enabled.
74      */
isEnabled()75     public boolean isEnabled() {
76         return mEnabled;
77     }
78 
79     /**
80      * Sets whether the icon should be shown.
81      */
setShouldShowIcon(boolean shouldShowIcon)82     public void setShouldShowIcon(boolean shouldShowIcon) {
83         mShouldShowIcon = shouldShowIcon;
84     }
85 
86     /**
87      * Return whether the icon should be shown.
88      */
shouldShowIcon()89     public boolean shouldShowIcon() {
90         return mShouldShowIcon;
91     }
92 
93     /**
94      * Return an icon representing the action.
95      */
getIcon()96     public @NonNull Icon getIcon() {
97         return mIcon;
98     }
99 
100     /**
101      * Return an title representing the action.
102      */
getTitle()103     public @NonNull CharSequence getTitle() {
104         return mTitle;
105     }
106 
107     /**
108      * Return a content description representing the action.
109      */
getContentDescription()110     public @NonNull CharSequence getContentDescription() {
111         return mContentDescription;
112     }
113 
114     /**
115      * Return the action intent.
116      */
getActionIntent()117     public @NonNull PendingIntent getActionIntent() {
118         return mActionIntent;
119     }
120 
121     @Override
clone()122     public RemoteAction clone() {
123         RemoteAction action = new RemoteAction(mIcon, mTitle, mContentDescription, mActionIntent);
124         action.setEnabled(mEnabled);
125         action.setShouldShowIcon(mShouldShowIcon);
126         return action;
127     }
128 
129     @Override
describeContents()130     public int describeContents() {
131         return 0;
132     }
133 
134     @Override
writeToParcel(Parcel out, int flags)135     public void writeToParcel(Parcel out, int flags) {
136         mIcon.writeToParcel(out, 0);
137         TextUtils.writeToParcel(mTitle, out, flags);
138         TextUtils.writeToParcel(mContentDescription, out, flags);
139         mActionIntent.writeToParcel(out, flags);
140         out.writeBoolean(mEnabled);
141         out.writeBoolean(mShouldShowIcon);
142     }
143 
dump(String prefix, PrintWriter pw)144     public void dump(String prefix, PrintWriter pw) {
145         pw.print(prefix);
146         pw.print("title=" + mTitle);
147         pw.print(" enabled=" + mEnabled);
148         pw.print(" contentDescription=" + mContentDescription);
149         pw.print(" icon=" + mIcon);
150         pw.print(" action=" + mActionIntent.getIntent());
151         pw.print(" shouldShowIcon=" + mShouldShowIcon);
152         pw.println();
153     }
154 
155     public static final Parcelable.Creator<RemoteAction> CREATOR =
156             new Parcelable.Creator<RemoteAction>() {
157                 public RemoteAction createFromParcel(Parcel in) {
158                     return new RemoteAction(in);
159                 }
160                 public RemoteAction[] newArray(int size) {
161                     return new RemoteAction[size];
162                 }
163             };
164 }