1 /* 2 * Copyright (C) 2021 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 package android.app.smartspace; 17 18 import android.annotation.CurrentTimeMillisLong; 19 import android.annotation.IntDef; 20 import android.annotation.NonNull; 21 import android.annotation.Nullable; 22 import android.annotation.SystemApi; 23 import android.appwidget.AppWidgetProviderInfo; 24 import android.content.ComponentName; 25 import android.net.Uri; 26 import android.os.Parcel; 27 import android.os.Parcelable; 28 import android.os.UserHandle; 29 30 import java.lang.annotation.Retention; 31 import java.lang.annotation.RetentionPolicy; 32 import java.util.ArrayList; 33 import java.util.List; 34 import java.util.Objects; 35 36 /** 37 * A {@link SmartspaceTarget} is a data class which holds all properties necessary to inflate a 38 * smartspace card. It contains data and related metadata which is supposed to be utilized by 39 * smartspace clients based on their own UI/UX requirements. Some of the properties have 40 * {@link SmartspaceAction} as their type because they can have associated actions. 41 * 42 * <p><b>NOTE: </b> 43 * If {@link mWidget} is set, it should be preferred over all other properties. 44 * Else, if {@link mSliceUri} is set, it should be preferred over all other data properties. 45 * Otherwise, the instance should be treated as a data object. 46 * 47 * @hide 48 */ 49 @SystemApi 50 public final class SmartspaceTarget implements Parcelable { 51 52 /** A unique Id for an instance of {@link SmartspaceTarget}. */ 53 @NonNull 54 private final String mSmartspaceTargetId; 55 56 /** A {@link SmartspaceAction} for the header in the Smartspace card. */ 57 @Nullable 58 private final SmartspaceAction mHeaderAction; 59 60 /** A {@link SmartspaceAction} for the base action in the Smartspace card. */ 61 @Nullable 62 private final SmartspaceAction mBaseAction; 63 64 /** A timestamp indicating when the card was created. */ 65 @CurrentTimeMillisLong 66 private final long mCreationTimeMillis; 67 68 /** 69 * A timestamp indicating when the card should be removed from view, in case the service 70 * disconnects or restarts. 71 */ 72 @CurrentTimeMillisLong 73 private final long mExpiryTimeMillis; 74 75 /** A score assigned to a target. */ 76 private final float mScore; 77 78 /** A {@link List<SmartspaceAction>} containing all action chips. */ 79 @NonNull 80 private final List<SmartspaceAction> mActionChips; 81 82 /** A {@link List<SmartspaceAction>} containing all icons for the grid. */ 83 @NonNull 84 private final List<SmartspaceAction> mIconGrid; 85 86 /** 87 * {@link FeatureType} indicating the feature type of this card. 88 * 89 * @see FeatureType 90 */ 91 @FeatureType 92 private final int mFeatureType; 93 94 /** 95 * Indicates whether the content is sensitive. Certain UI surfaces may choose to skip rendering 96 * real content until the device is unlocked. 97 */ 98 private final boolean mSensitive; 99 100 /** Indicating if the UI should show this target in its expanded state. */ 101 private final boolean mShouldShowExpanded; 102 103 /** A Notification key if the target was generated using a notification. */ 104 @Nullable 105 private final String mSourceNotificationKey; 106 107 /** {@link ComponentName} for this target. */ 108 @NonNull 109 private final ComponentName mComponentName; 110 111 /** {@link UserHandle} for this target. */ 112 @NonNull 113 private final UserHandle mUserHandle; 114 115 /** 116 * Target Id of other {@link SmartspaceTarget}s if it is associated with this target. This 117 * association is added to tell the UI that a card would be more useful if displayed with the 118 * associated smartspace target. This field is supposed to be taken as a suggestion and the 119 * association can be ignored based on the situation in the UI. It is possible to have a one way 120 * card association. In other words, Card B can be associated with Card A but not the other way 121 * around. 122 */ 123 @Nullable 124 private final String mAssociatedSmartspaceTargetId; 125 126 /** {@link Uri} Slice Uri if this target is a slice. */ 127 @Nullable 128 private final Uri mSliceUri; 129 130 /** {@link AppWidgetProviderInfo} if this target is a widget. */ 131 @Nullable 132 private final AppWidgetProviderInfo mWidget; 133 134 public static final int FEATURE_UNDEFINED = 0; 135 public static final int FEATURE_WEATHER = 1; 136 public static final int FEATURE_CALENDAR = 2; 137 public static final int FEATURE_COMMUTE_TIME = 3; 138 public static final int FEATURE_FLIGHT = 4; 139 public static final int FEATURE_TIPS = 5; 140 public static final int FEATURE_REMINDER = 6; 141 public static final int FEATURE_ALARM = 7; 142 public static final int FEATURE_ONBOARDING = 8; 143 public static final int FEATURE_SPORTS = 9; 144 public static final int FEATURE_WEATHER_ALERT = 10; 145 public static final int FEATURE_CONSENT = 11; 146 public static final int FEATURE_STOCK_PRICE_CHANGE = 12; 147 public static final int FEATURE_SHOPPING_LIST = 13; 148 public static final int FEATURE_LOYALTY_CARD = 14; 149 public static final int FEATURE_MEDIA = 15; 150 public static final int FEATURE_BEDTIME_ROUTINE = 16; 151 public static final int FEATURE_FITNESS_TRACKING = 17; 152 public static final int FEATURE_ETA_MONITORING = 18; 153 public static final int FEATURE_MISSED_CALL = 19; 154 public static final int FEATURE_PACKAGE_TRACKING = 20; 155 public static final int FEATURE_TIMER = 21; 156 public static final int FEATURE_STOPWATCH = 22; 157 public static final int FEATURE_UPCOMING_ALARM = 23; 158 159 /** 160 * @hide 161 */ 162 @IntDef(prefix = {"FEATURE_"}, value = { 163 FEATURE_UNDEFINED, 164 FEATURE_WEATHER, 165 FEATURE_CALENDAR, 166 FEATURE_COMMUTE_TIME, 167 FEATURE_FLIGHT, 168 FEATURE_TIPS, 169 FEATURE_REMINDER, 170 FEATURE_ALARM, 171 FEATURE_ONBOARDING, 172 FEATURE_SPORTS, 173 FEATURE_WEATHER_ALERT, 174 FEATURE_CONSENT, 175 FEATURE_STOCK_PRICE_CHANGE, 176 FEATURE_SHOPPING_LIST, 177 FEATURE_LOYALTY_CARD, 178 FEATURE_MEDIA, 179 FEATURE_BEDTIME_ROUTINE, 180 FEATURE_FITNESS_TRACKING, 181 FEATURE_ETA_MONITORING, 182 FEATURE_MISSED_CALL, 183 FEATURE_PACKAGE_TRACKING, 184 FEATURE_TIMER, 185 FEATURE_STOPWATCH, 186 FEATURE_UPCOMING_ALARM 187 }) 188 @Retention(RetentionPolicy.SOURCE) 189 public @interface FeatureType { 190 } 191 SmartspaceTarget(Parcel in)192 private SmartspaceTarget(Parcel in) { 193 this.mSmartspaceTargetId = in.readString(); 194 this.mHeaderAction = in.readTypedObject(SmartspaceAction.CREATOR); 195 this.mBaseAction = in.readTypedObject(SmartspaceAction.CREATOR); 196 this.mCreationTimeMillis = in.readLong(); 197 this.mExpiryTimeMillis = in.readLong(); 198 this.mScore = in.readFloat(); 199 this.mActionChips = in.createTypedArrayList(SmartspaceAction.CREATOR); 200 this.mIconGrid = in.createTypedArrayList(SmartspaceAction.CREATOR); 201 this.mFeatureType = in.readInt(); 202 this.mSensitive = in.readBoolean(); 203 this.mShouldShowExpanded = in.readBoolean(); 204 this.mSourceNotificationKey = in.readString(); 205 this.mComponentName = in.readTypedObject(ComponentName.CREATOR); 206 this.mUserHandle = in.readTypedObject(UserHandle.CREATOR); 207 this.mAssociatedSmartspaceTargetId = in.readString(); 208 this.mSliceUri = in.readTypedObject(Uri.CREATOR); 209 this.mWidget = in.readTypedObject(AppWidgetProviderInfo.CREATOR); 210 } 211 SmartspaceTarget(String smartspaceTargetId, SmartspaceAction headerAction, SmartspaceAction baseAction, long creationTimeMillis, long expiryTimeMillis, float score, List<SmartspaceAction> actionChips, List<SmartspaceAction> iconGrid, int featureType, boolean sensitive, boolean shouldShowExpanded, String sourceNotificationKey, ComponentName componentName, UserHandle userHandle, String associatedSmartspaceTargetId, Uri sliceUri, AppWidgetProviderInfo widget)212 private SmartspaceTarget(String smartspaceTargetId, 213 SmartspaceAction headerAction, SmartspaceAction baseAction, long creationTimeMillis, 214 long expiryTimeMillis, float score, 215 List<SmartspaceAction> actionChips, 216 List<SmartspaceAction> iconGrid, int featureType, boolean sensitive, 217 boolean shouldShowExpanded, String sourceNotificationKey, 218 ComponentName componentName, UserHandle userHandle, 219 String associatedSmartspaceTargetId, Uri sliceUri, 220 AppWidgetProviderInfo widget) { 221 mSmartspaceTargetId = smartspaceTargetId; 222 mHeaderAction = headerAction; 223 mBaseAction = baseAction; 224 mCreationTimeMillis = creationTimeMillis; 225 mExpiryTimeMillis = expiryTimeMillis; 226 mScore = score; 227 mActionChips = actionChips; 228 mIconGrid = iconGrid; 229 mFeatureType = featureType; 230 mSensitive = sensitive; 231 mShouldShowExpanded = shouldShowExpanded; 232 mSourceNotificationKey = sourceNotificationKey; 233 mComponentName = componentName; 234 mUserHandle = userHandle; 235 mAssociatedSmartspaceTargetId = associatedSmartspaceTargetId; 236 mSliceUri = sliceUri; 237 mWidget = widget; 238 } 239 240 /** 241 * Returns the Id of the target. 242 */ 243 @NonNull getSmartspaceTargetId()244 public String getSmartspaceTargetId() { 245 return mSmartspaceTargetId; 246 } 247 248 /** 249 * Returns the header action of the target. 250 */ 251 @Nullable getHeaderAction()252 public SmartspaceAction getHeaderAction() { 253 return mHeaderAction; 254 } 255 256 /** 257 * Returns the base action of the target. 258 */ 259 @Nullable getBaseAction()260 public SmartspaceAction getBaseAction() { 261 return mBaseAction; 262 } 263 264 /** 265 * Returns the creation time of the target. 266 */ 267 @CurrentTimeMillisLong getCreationTimeMillis()268 public long getCreationTimeMillis() { 269 return mCreationTimeMillis; 270 } 271 272 /** 273 * Returns the expiry time of the target. 274 */ 275 @CurrentTimeMillisLong getExpiryTimeMillis()276 public long getExpiryTimeMillis() { 277 return mExpiryTimeMillis; 278 } 279 280 /** 281 * Returns the score of the target. 282 */ getScore()283 public float getScore() { 284 return mScore; 285 } 286 287 /** 288 * Return the action chips of the target. 289 */ 290 @NonNull getActionChips()291 public List<SmartspaceAction> getActionChips() { 292 return mActionChips; 293 } 294 295 /** 296 * Return the icons of the target. 297 */ 298 @NonNull getIconGrid()299 public List<SmartspaceAction> getIconGrid() { 300 return mIconGrid; 301 } 302 303 /** 304 * Returns the feature type of the target. 305 */ 306 @FeatureType getFeatureType()307 public int getFeatureType() { 308 return mFeatureType; 309 } 310 311 /** 312 * Returns whether the target is sensitive or not. 313 */ isSensitive()314 public boolean isSensitive() { 315 return mSensitive; 316 } 317 318 /** 319 * Returns whether the target should be shown in expanded state. 320 */ shouldShowExpanded()321 public boolean shouldShowExpanded() { 322 return mShouldShowExpanded; 323 } 324 325 /** 326 * Returns the source notification key of the target. 327 */ 328 @Nullable getSourceNotificationKey()329 public String getSourceNotificationKey() { 330 return mSourceNotificationKey; 331 } 332 333 /** 334 * Returns the component name of the target. 335 */ 336 @NonNull getComponentName()337 public ComponentName getComponentName() { 338 return mComponentName; 339 } 340 341 /** 342 * Returns the user handle of the target. 343 */ 344 @NonNull getUserHandle()345 public UserHandle getUserHandle() { 346 return mUserHandle; 347 } 348 349 /** 350 * Returns the id of a target associated with this instance. 351 */ 352 @Nullable getAssociatedSmartspaceTargetId()353 public String getAssociatedSmartspaceTargetId() { 354 return mAssociatedSmartspaceTargetId; 355 } 356 357 /** 358 * Returns the slice uri, if the target is a slice. 359 */ 360 @Nullable getSliceUri()361 public Uri getSliceUri() { 362 return mSliceUri; 363 } 364 365 /** 366 * Returns the AppWidgetProviderInfo, if the target is a widget. 367 */ 368 @Nullable getWidget()369 public AppWidgetProviderInfo getWidget() { 370 return mWidget; 371 } 372 373 /** 374 * @see Parcelable.Creator 375 */ 376 @NonNull 377 public static final Creator<SmartspaceTarget> CREATOR = new Creator<SmartspaceTarget>() { 378 @Override 379 public SmartspaceTarget createFromParcel(Parcel source) { 380 return new SmartspaceTarget(source); 381 } 382 383 @Override 384 public SmartspaceTarget[] newArray(int size) { 385 return new SmartspaceTarget[size]; 386 } 387 }; 388 389 @Override writeToParcel(@onNull Parcel dest, int flags)390 public void writeToParcel(@NonNull Parcel dest, int flags) { 391 dest.writeString(this.mSmartspaceTargetId); 392 dest.writeTypedObject(this.mHeaderAction, flags); 393 dest.writeTypedObject(this.mBaseAction, flags); 394 dest.writeLong(this.mCreationTimeMillis); 395 dest.writeLong(this.mExpiryTimeMillis); 396 dest.writeFloat(this.mScore); 397 dest.writeTypedList(this.mActionChips); 398 dest.writeTypedList(this.mIconGrid); 399 dest.writeInt(this.mFeatureType); 400 dest.writeBoolean(this.mSensitive); 401 dest.writeBoolean(this.mShouldShowExpanded); 402 dest.writeString(this.mSourceNotificationKey); 403 dest.writeTypedObject(this.mComponentName, flags); 404 dest.writeTypedObject(this.mUserHandle, flags); 405 dest.writeString(this.mAssociatedSmartspaceTargetId); 406 dest.writeTypedObject(this.mSliceUri, flags); 407 dest.writeTypedObject(this.mWidget, flags); 408 } 409 410 @Override describeContents()411 public int describeContents() { 412 return 0; 413 } 414 415 @Override toString()416 public String toString() { 417 return "SmartspaceTarget{" 418 + "mSmartspaceTargetId='" + mSmartspaceTargetId + '\'' 419 + ", mHeaderAction=" + mHeaderAction 420 + ", mBaseAction=" + mBaseAction 421 + ", mCreationTimeMillis=" + mCreationTimeMillis 422 + ", mExpiryTimeMillis=" + mExpiryTimeMillis 423 + ", mScore=" + mScore 424 + ", mActionChips=" + mActionChips 425 + ", mIconGrid=" + mIconGrid 426 + ", mFeatureType=" + mFeatureType 427 + ", mSensitive=" + mSensitive 428 + ", mShouldShowExpanded=" + mShouldShowExpanded 429 + ", mSourceNotificationKey='" + mSourceNotificationKey + '\'' 430 + ", mComponentName=" + mComponentName 431 + ", mUserHandle=" + mUserHandle 432 + ", mAssociatedSmartspaceTargetId='" + mAssociatedSmartspaceTargetId + '\'' 433 + ", mSliceUri=" + mSliceUri 434 + ", mWidget=" + mWidget 435 + '}'; 436 } 437 438 @Override equals(Object o)439 public boolean equals(Object o) { 440 if (this == o) return true; 441 if (o == null || getClass() != o.getClass()) return false; 442 SmartspaceTarget that = (SmartspaceTarget) o; 443 return mCreationTimeMillis == that.mCreationTimeMillis 444 && mExpiryTimeMillis == that.mExpiryTimeMillis 445 && Float.compare(that.mScore, mScore) == 0 446 && mFeatureType == that.mFeatureType 447 && mSensitive == that.mSensitive 448 && mShouldShowExpanded == that.mShouldShowExpanded 449 && mSmartspaceTargetId.equals(that.mSmartspaceTargetId) 450 && Objects.equals(mHeaderAction, that.mHeaderAction) 451 && Objects.equals(mBaseAction, that.mBaseAction) 452 && Objects.equals(mActionChips, that.mActionChips) 453 && Objects.equals(mIconGrid, that.mIconGrid) 454 && Objects.equals(mSourceNotificationKey, that.mSourceNotificationKey) 455 && mComponentName.equals(that.mComponentName) 456 && mUserHandle.equals(that.mUserHandle) 457 && Objects.equals(mAssociatedSmartspaceTargetId, 458 that.mAssociatedSmartspaceTargetId) 459 && Objects.equals(mSliceUri, that.mSliceUri) 460 && Objects.equals(mWidget, that.mWidget); 461 } 462 463 @Override hashCode()464 public int hashCode() { 465 return Objects.hash(mSmartspaceTargetId, mHeaderAction, mBaseAction, mCreationTimeMillis, 466 mExpiryTimeMillis, mScore, mActionChips, mIconGrid, mFeatureType, mSensitive, 467 mShouldShowExpanded, mSourceNotificationKey, mComponentName, mUserHandle, 468 mAssociatedSmartspaceTargetId, mSliceUri, mWidget); 469 } 470 471 /** 472 * A builder for {@link SmartspaceTarget} object. 473 * 474 * @hide 475 */ 476 @SystemApi 477 public static final class Builder { 478 private final String mSmartspaceTargetId; 479 private SmartspaceAction mHeaderAction; 480 private SmartspaceAction mBaseAction; 481 private long mCreationTimeMillis; 482 private long mExpiryTimeMillis; 483 private float mScore; 484 private List<SmartspaceAction> mActionChips = new ArrayList<>(); 485 private List<SmartspaceAction> mIconGrid = new ArrayList<>(); 486 private int mFeatureType; 487 private boolean mSensitive; 488 private boolean mShouldShowExpanded; 489 private String mSourceNotificationKey; 490 private final ComponentName mComponentName; 491 private final UserHandle mUserHandle; 492 private String mAssociatedSmartspaceTargetId; 493 private Uri mSliceUri; 494 private AppWidgetProviderInfo mWidget; 495 496 /** 497 * A builder for {@link SmartspaceTarget}. 498 * 499 * @param smartspaceTargetId the id of this target 500 * @param componentName the componentName of this target 501 * @param userHandle the userHandle of this target 502 */ Builder(@onNull String smartspaceTargetId, @NonNull ComponentName componentName, @NonNull UserHandle userHandle)503 public Builder(@NonNull String smartspaceTargetId, 504 @NonNull ComponentName componentName, @NonNull UserHandle userHandle) { 505 this.mSmartspaceTargetId = smartspaceTargetId; 506 this.mComponentName = componentName; 507 this.mUserHandle = userHandle; 508 } 509 510 /** 511 * Sets the header action. 512 */ 513 @NonNull setHeaderAction(@onNull SmartspaceAction headerAction)514 public Builder setHeaderAction(@NonNull SmartspaceAction headerAction) { 515 this.mHeaderAction = headerAction; 516 return this; 517 } 518 519 /** 520 * Sets the base action. 521 */ 522 @NonNull setBaseAction(@onNull SmartspaceAction baseAction)523 public Builder setBaseAction(@NonNull SmartspaceAction baseAction) { 524 this.mBaseAction = baseAction; 525 return this; 526 } 527 528 /** 529 * Sets the creation time. 530 */ 531 @NonNull setCreationTimeMillis(@urrentTimeMillisLong long creationTimeMillis)532 public Builder setCreationTimeMillis(@CurrentTimeMillisLong long creationTimeMillis) { 533 this.mCreationTimeMillis = creationTimeMillis; 534 return this; 535 } 536 537 /** 538 * Sets the expiration time. 539 */ 540 @NonNull setExpiryTimeMillis(@urrentTimeMillisLong long expiryTimeMillis)541 public Builder setExpiryTimeMillis(@CurrentTimeMillisLong long expiryTimeMillis) { 542 this.mExpiryTimeMillis = expiryTimeMillis; 543 return this; 544 } 545 546 /** 547 * Sets the score. 548 */ 549 @NonNull setScore(float score)550 public Builder setScore(float score) { 551 this.mScore = score; 552 return this; 553 } 554 555 /** 556 * Sets the action chips. 557 */ 558 @NonNull setActionChips(@onNull List<SmartspaceAction> actionChips)559 public Builder setActionChips(@NonNull List<SmartspaceAction> actionChips) { 560 this.mActionChips = actionChips; 561 return this; 562 } 563 564 /** 565 * Sets the icon grid. 566 */ 567 @NonNull setIconGrid(@onNull List<SmartspaceAction> iconGrid)568 public Builder setIconGrid(@NonNull List<SmartspaceAction> iconGrid) { 569 this.mIconGrid = iconGrid; 570 return this; 571 } 572 573 /** 574 * Sets the feature type. 575 */ 576 @NonNull setFeatureType(int featureType)577 public Builder setFeatureType(int featureType) { 578 this.mFeatureType = featureType; 579 return this; 580 } 581 582 /** 583 * Sets whether the contents are sensitive. 584 */ 585 @NonNull setSensitive(boolean sensitive)586 public Builder setSensitive(boolean sensitive) { 587 this.mSensitive = sensitive; 588 return this; 589 } 590 591 /** 592 * Sets whether to show the card as expanded. 593 */ 594 @NonNull setShouldShowExpanded(boolean shouldShowExpanded)595 public Builder setShouldShowExpanded(boolean shouldShowExpanded) { 596 this.mShouldShowExpanded = shouldShowExpanded; 597 return this; 598 } 599 600 /** 601 * Sets the source notification key. 602 */ 603 @NonNull setSourceNotificationKey(@onNull String sourceNotificationKey)604 public Builder setSourceNotificationKey(@NonNull String sourceNotificationKey) { 605 this.mSourceNotificationKey = sourceNotificationKey; 606 return this; 607 } 608 609 /** 610 * Sets the associated smartspace target id. 611 */ 612 @NonNull setAssociatedSmartspaceTargetId( @onNull String associatedSmartspaceTargetId)613 public Builder setAssociatedSmartspaceTargetId( 614 @NonNull String associatedSmartspaceTargetId) { 615 this.mAssociatedSmartspaceTargetId = associatedSmartspaceTargetId; 616 return this; 617 } 618 619 /** 620 * Sets the slice uri. 621 * 622 * <p><b>NOTE: </b> If {@link mWidget} is also set, {@link mSliceUri} should be ignored. 623 */ 624 @NonNull setSliceUri(@onNull Uri sliceUri)625 public Builder setSliceUri(@NonNull Uri sliceUri) { 626 this.mSliceUri = sliceUri; 627 return this; 628 } 629 630 /** 631 * Sets the widget id. 632 * 633 * <p><b>NOTE: </b> If {@link mWidget} is set, all other @Nullable params should be 634 * ignored. 635 */ 636 @NonNull setWidget(@onNull AppWidgetProviderInfo widget)637 public Builder setWidget(@NonNull AppWidgetProviderInfo widget) { 638 this.mWidget = widget; 639 return this; 640 } 641 642 /** 643 * Builds a new {@link SmartspaceTarget}. 644 * 645 * @throws IllegalStateException when non null fields are set as null. 646 */ 647 @NonNull build()648 public SmartspaceTarget build() { 649 if (mSmartspaceTargetId == null 650 || mComponentName == null 651 || mUserHandle == null) { 652 throw new IllegalStateException("Please assign a value to all @NonNull args."); 653 } 654 return new SmartspaceTarget(mSmartspaceTargetId, 655 mHeaderAction, mBaseAction, mCreationTimeMillis, mExpiryTimeMillis, mScore, 656 mActionChips, mIconGrid, mFeatureType, mSensitive, mShouldShowExpanded, 657 mSourceNotificationKey, mComponentName, mUserHandle, 658 mAssociatedSmartspaceTargetId, mSliceUri, mWidget); 659 } 660 } 661 } 662