From c5bb55689b559f641eec440c69f62f95d5471b3c Mon Sep 17 00:00:00 2001 From: tom hsu Date: Mon, 16 May 2022 18:42:25 +0800 Subject: [PATCH] [Panlingual] Fix the item clicked is not match target application - Remove unnecessary action of shift poistion. Bug: b/232754527 Test: local and see b/232754527#2 Change-Id: Ief8655661dd3cc468e68a085dede528694ede33c --- .../ManageApplications.java | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 24328a277e4..9796454bbfc 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -1480,6 +1480,10 @@ public class ManageApplications extends InstrumentedFragment } } + /** + * Item count include all items. If UI has a header on the app list, it shall shift 1 to + * application count for the total item count. + */ @Override public int getItemCount() { int count = getApplicationCount(); @@ -1493,29 +1497,42 @@ public class ManageApplications extends InstrumentedFragment return mEntries != null ? mEntries.size() : 0; } - public AppEntry getAppEntry(int position) { - return mEntries.get( - getApplicationPosition(mManageApplications.mListType, position)); + public AppEntry getAppEntry(int applicationPosition) { + return mEntries.get(applicationPosition); } + /** + * Item Id follows all item on the app list. If UI has a header on the list, it shall + * shift 1 to the position for correct app entry. + */ @Override public long getItemId(int position) { int applicationPosition = getApplicationPosition(mManageApplications.mListType, position); - if (applicationPosition == mEntries.size()) { + if (applicationPosition == mEntries.size() + || applicationPosition == RecyclerView.NO_POSITION) { return -1; } return mEntries.get(applicationPosition).id; } + /** + * Check item in the list shall enable or disable. + * @param position The item position in the list + */ public boolean isEnabled(int position) { - if (getItemViewType(position) == VIEW_TYPE_EXTRA_VIEW + int itemViewType = getItemViewType(position); + if (itemViewType == VIEW_TYPE_EXTRA_VIEW || itemViewType == VIEW_TYPE_APP_HEADER || mManageApplications.mListType != LIST_TYPE_HIGH_POWER) { return true; } - ApplicationsState.AppEntry entry = - mEntries.get( - getApplicationPosition(mManageApplications.mListType, position)); + + int applicationPosition = + getApplicationPosition(mManageApplications.mListType, position); + if (applicationPosition == RecyclerView.NO_POSITION) { + return true; + } + ApplicationsState.AppEntry entry = mEntries.get(applicationPosition); return !mBackend.isSysAllowlisted(entry.info.packageName) && !mBackend.isDefaultActiveApp(entry.info.packageName); @@ -1528,10 +1545,16 @@ public class ManageApplications extends InstrumentedFragment return; } + int applicationPosition = + getApplicationPosition(mManageApplications.mListType, position); + if (applicationPosition == RecyclerView.NO_POSITION) { + return; + } // Bind the data efficiently with the holder - final ApplicationsState.AppEntry entry = - mEntries.get( - getApplicationPosition(mManageApplications.mListType, position)); + // If there is a header on the list, the position shall be shifted. Thus, it shall use + // #getApplicationPosition to get real application position for the app entry. + final ApplicationsState.AppEntry entry = mEntries.get(applicationPosition); + synchronized (entry) { mState.ensureLabelDescription(entry); holder.setTitle(entry.label, entry.labelDescription); @@ -1641,8 +1664,8 @@ public class ManageApplications extends InstrumentedFragment public static int getApplicationPosition(int listType, int position) { int applicationPosition = position; // Adjust position due to header added. - if (position > 0 && listType == LIST_TYPE_APPS_LOCALE) { - applicationPosition = position - 1; + if (listType == LIST_TYPE_APPS_LOCALE) { + applicationPosition = position > 0 ? position - 1 : RecyclerView.NO_POSITION; } return applicationPosition; }