diff options
author | Holly Sun <jiuyu@google.com> | 2023-06-28 15:14:02 -0700 |
---|---|---|
committer | Holly Jiuyu Sun <jiuyu@google.com> | 2023-06-30 20:49:33 +0000 |
commit | 1a9a98005d7b9e5f913c87b6bdcc51f55787e89b (patch) | |
tree | d236b9cf0ca254974a42181dbf42d4dc94753d46 /src/com/android | |
parent | 206821cee6a3d3665de095fb9692165f4efed903 (diff) | |
download | Launcher3-1a9a98005d7b9e5f913c87b6bdcc51f55787e89b.tar.gz |
[a11y] Fix crash when using talkback to add to home screen.
1. Fix a crash from http://cs/android-internal/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java;l=1928;rcl=d677caa75de74f1c3a88367cad67ae405fd2903d. It can also be `ITEM_TYPE_SEARCH_ACTION`. Remove the `itemType` check and just use the `PendingAddItemInfo` class type.
2. Override `startConfigActivity` in `PinShortcutRequestActivityInfo`, so that `Launcher#onActivityResult` can be triggered properly from `Launcher#processShortcutFromDrop` (http://cs/android-internal/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java;l=1939;rcl=d677caa75de74f1c3a88367cad67ae405fd2903d )
3. Then we call to `Launcher#completeAdd` -> `completeAddShortcut`. The original `info` passed to `processShortcutFromDrop` doesn’t have a `componentName` (new code), so remove the component non-null check from `completeAddShortcut`.
Bug: 287166186
Bug: 287167527
Bug: 287166771
Test: manual
Flag: N/A
Change-Id: Id3e1444de188f2d2af760f58e3d9814a2b7abd88
Merged-In: Id3e1444de188f2d2af760f58e3d9814a2b7abd88
(cherry picked from commit 35b9960b638ab4b27f64a66bf8c527192269c6e9)
Diffstat (limited to 'src/com/android')
3 files changed, 131 insertions, 13 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index fed123f1b3..ce8d25a12c 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1418,8 +1418,7 @@ public class Launcher extends StatefulActivity<LauncherState> */ protected void completeAddShortcut(Intent data, int container, int screenId, int cellX, int cellY, PendingRequestArgs args) { - if (args.getRequestCode() != REQUEST_CREATE_SHORTCUT - || args.getPendingIntent().getComponent() == null) { + if (args.getRequestCode() != REQUEST_CREATE_SHORTCUT) { return; } @@ -1928,16 +1927,10 @@ public class Launcher extends StatefulActivity<LauncherState> info.spanX = spanX; info.spanY = spanY; - switch (info.itemType) { - case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - addAppWidgetFromDrop((PendingAddWidgetInfo) info); - break; - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - processShortcutFromDrop((PendingAddShortcutInfo) info); - break; - default: - throw new IllegalStateException("Unknown item type: " + info.itemType); + if (info instanceof PendingAddWidgetInfo) { + addAppWidgetFromDrop((PendingAddWidgetInfo) info); + } else { // info can only be PendingAddShortcutInfo + processShortcutFromDrop((PendingAddShortcutInfo) info); } } diff --git a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java index 7bdec1cfde..0f3cad66a2 100644 --- a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java +++ b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java @@ -16,6 +16,8 @@ package com.android.launcher3.dragndrop; +import static android.content.pm.LauncherApps.EXTRA_PIN_ITEM_REQUEST; + import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.SPRING_LOADED; @@ -25,6 +27,7 @@ import android.annotation.TargetApi; import android.app.Activity; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.LauncherApps.PinItemRequest; import android.content.pm.PackageManager; @@ -41,6 +44,7 @@ import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.pm.PinRequestHelper; import com.android.launcher3.pm.ShortcutConfigActivityInfo; +import com.android.launcher3.util.StartActivityParams; import java.util.function.Supplier; @@ -105,7 +109,11 @@ public class PinShortcutRequestActivityInfo extends ShortcutConfigActivityInfo { @Override public boolean startConfigActivity(Activity activity, int requestCode) { - return false; + new StartActivityParams(activity, requestCode).deliverResult( + activity, + Activity.RESULT_OK, + new Intent().putExtra(EXTRA_PIN_ITEM_REQUEST, mRequestSupplier.get())); + return true; } @Override diff --git a/src/com/android/launcher3/util/StartActivityParams.java b/src/com/android/launcher3/util/StartActivityParams.java new file mode 100644 index 0000000000..6e60b2a0d1 --- /dev/null +++ b/src/com/android/launcher3/util/StartActivityParams.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2019 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 com.android.launcher3.util; + +import static android.app.PendingIntent.FLAG_MUTABLE; +import static android.app.PendingIntent.FLAG_ONE_SHOT; +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; + +import android.app.Activity; +import android.app.PendingIntent; +import android.app.PendingIntent.CanceledException; +import android.content.Context; +import android.content.Intent; +import android.content.IntentSender; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +/** + * Wrapper class for parameters to start an activity. + */ +public class StartActivityParams implements Parcelable { + + private static final String TAG = "StartActivityParams"; + + private final PendingIntent mPICallback; + public final int requestCode; + + public Intent intent; + + public IntentSender intentSender; + public Intent fillInIntent; + public int flagsMask; + public int flagsValues; + public int extraFlags; + public Bundle options; + + public StartActivityParams(Activity activity, int requestCode) { + this(activity.createPendingResult(requestCode, new Intent(), + FLAG_ONE_SHOT | FLAG_UPDATE_CURRENT | FLAG_MUTABLE), requestCode); + } + + public StartActivityParams(PendingIntent pendingIntent, int requestCode) { + this.mPICallback = pendingIntent; + this.requestCode = requestCode; + } + + private StartActivityParams(Parcel parcel) { + mPICallback = parcel.readTypedObject(PendingIntent.CREATOR); + requestCode = parcel.readInt(); + intent = parcel.readTypedObject(Intent.CREATOR); + + intentSender = parcel.readTypedObject(IntentSender.CREATOR); + fillInIntent = parcel.readTypedObject(Intent.CREATOR); + flagsMask = parcel.readInt(); + flagsValues = parcel.readInt(); + extraFlags = parcel.readInt(); + options = parcel.readBundle(); + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeTypedObject(mPICallback, flags); + parcel.writeInt(requestCode); + parcel.writeTypedObject(intent, flags); + + parcel.writeTypedObject(intentSender, flags); + parcel.writeTypedObject(fillInIntent, flags); + parcel.writeInt(flagsMask); + parcel.writeInt(flagsValues); + parcel.writeInt(extraFlags); + parcel.writeBundle(options); + } + + /** Perform the operation on the pendingIntent. */ + public void deliverResult(Context context, int resultCode, Intent data) { + try { + if (mPICallback != null) { + mPICallback.send(context, resultCode, data); + } + } catch (CanceledException e) { + Log.e(TAG, "Unable to send back result", e); + } + } + + public static final Parcelable.Creator<StartActivityParams> CREATOR = + new Parcelable.Creator<>() { + public StartActivityParams createFromParcel(Parcel source) { + return new StartActivityParams(source); + } + + public StartActivityParams[] newArray(int size) { + return new StartActivityParams[size]; + } + }; +} |