Loading src/com/android/launcher3/FolderInfo.java +24 −27 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import com.android.launcher3.compat.UserHandleCompat; import java.lang.ref.WeakReference; import java.util.ArrayList; /** Loading Loading @@ -57,7 +58,11 @@ public class FolderInfo extends ItemInfo { */ public ArrayList<ShortcutInfo> contents = new ArrayList<ShortcutInfo>(); ArrayList<FolderListener> listeners = new ArrayList<FolderListener>(); /** * A collection of listeners for folder info changes. Since this listeners are implemented by * the UI objects, using a WeakReference prevents context leaks. */ private WeakReference<FolderListener> mListener; public FolderInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_FOLDER; Loading @@ -71,8 +76,9 @@ public class FolderInfo extends ItemInfo { */ public void add(ShortcutInfo item, boolean animate) { contents.add(item); for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onAdd(item); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onAdd(item); } itemsChanged(animate); } Loading @@ -84,19 +90,13 @@ public class FolderInfo extends ItemInfo { */ public void remove(ShortcutInfo item, boolean animate) { contents.remove(item); for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onRemove(item); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onRemove(item); } itemsChanged(animate); } public void setTitle(CharSequence title) { this.title = title; for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onTitleChanged(title); } } @Override void onAddToDatabase(Context context, ContentValues values) { super.onAddToDatabase(context, values); Loading @@ -105,33 +105,30 @@ public class FolderInfo extends ItemInfo { } public void addListener(FolderListener listener) { listeners.add(listener); } void removeListener(FolderListener listener) { if (listeners.contains(listener)) { listeners.remove(listener); } /** * Registers a listener for info change events. */ public void setListener(FolderListener listener) { mListener = new WeakReference<>(listener); } public void itemsChanged(boolean animate) { for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onItemsChanged(animate); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onItemsChanged(animate); } } @Override void unbind() { super.unbind(); listeners.clear(); mListener = null; } public interface FolderListener { public void onAdd(ShortcutInfo item); public void onRemove(ShortcutInfo item); public void onTitleChanged(CharSequence title); public void onItemsChanged(boolean animate); void onAdd(ShortcutInfo item); void onRemove(ShortcutInfo item); void onItemsChanged(boolean animate); } @Override Loading src/com/android/launcher3/folder/Folder.java +5 −7 Original line number Diff line number Diff line Loading @@ -348,13 +348,14 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mFolderName.setHint(sHintText); // Convert to a string here to ensure that no other state associated with the text field // gets saved. String newTitle = mFolderName.getText().toString(); mInfo.setTitle(newTitle); mInfo.title = mFolderName.getText().toString(); mFolderIcon.onTitleChanged(mInfo.title); LauncherModel.updateItemInDatabase(mLauncher, mInfo); if (commit) { sendCustomAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, getContext().getString(R.string.folder_renamed, newTitle)); getContext().getString(R.string.folder_renamed, mInfo.title)); } // This ensures that focus is gained every time the field is clicked, which selects all Loading Loading @@ -448,7 +449,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mItemsInvalidated = true; updateTextViewFocus(); mInfo.addListener(this); if (!sDefaultFolderName.contentEquals(mInfo.title)) { mFolderName.setText(mInfo.title); Loading Loading @@ -1349,6 +1349,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); } @Override public void onRemove(ShortcutInfo item) { mItemsInvalidated = true; // If this item is being dragged from this open folder, we have already handled Loading Loading @@ -1385,9 +1386,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList updateTextViewFocus(); } public void onTitleChanged(CharSequence title) { } public ArrayList<View> getItemsInReadingOrder() { if (mItemsInvalidated) { mItemsInReadingOrder.clear(); Loading src/com/android/launcher3/folder/FolderIcon.java +4 −3 Original line number Diff line number Diff line Loading @@ -183,10 +183,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { folder.setFolderIcon(icon); folder.bind(folderInfo); icon.setFolder(folder); folderInfo.addListener(icon); icon.setOnFocusChangeListener(launcher.mFocusHandler); folderInfo.setListener(new MultiFolderListener(folder, icon)); return icon; } Loading Loading @@ -944,11 +943,13 @@ public class FolderIcon extends FrameLayout implements FolderListener { requestLayout(); } @Override public void onAdd(ShortcutInfo item) { invalidate(); requestLayout(); } @Override public void onRemove(ShortcutInfo item) { invalidate(); requestLayout(); Loading src/com/android/launcher3/folder/MultiFolderListener.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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.folder; import com.android.launcher3.FolderInfo.FolderListener; import com.android.launcher3.ShortcutInfo; /** * An implementation of {@link FolderListener} which passes the events to 2 children. */ public class MultiFolderListener implements FolderListener { private final FolderListener mListener1; private final FolderListener mListener2; public MultiFolderListener(FolderListener listener1, FolderListener listener2) { mListener1 = listener1; mListener2 = listener2; } @Override public void onAdd(ShortcutInfo item) { mListener1.onAdd(item); mListener2.onAdd(item); } @Override public void onRemove(ShortcutInfo item) { mListener1.onRemove(item); mListener2.onRemove(item); } @Override public void onItemsChanged(boolean animate) { mListener1.onItemsChanged(animate); mListener2.onItemsChanged(animate); } } Loading
src/com/android/launcher3/FolderInfo.java +24 −27 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import com.android.launcher3.compat.UserHandleCompat; import java.lang.ref.WeakReference; import java.util.ArrayList; /** Loading Loading @@ -57,7 +58,11 @@ public class FolderInfo extends ItemInfo { */ public ArrayList<ShortcutInfo> contents = new ArrayList<ShortcutInfo>(); ArrayList<FolderListener> listeners = new ArrayList<FolderListener>(); /** * A collection of listeners for folder info changes. Since this listeners are implemented by * the UI objects, using a WeakReference prevents context leaks. */ private WeakReference<FolderListener> mListener; public FolderInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_FOLDER; Loading @@ -71,8 +76,9 @@ public class FolderInfo extends ItemInfo { */ public void add(ShortcutInfo item, boolean animate) { contents.add(item); for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onAdd(item); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onAdd(item); } itemsChanged(animate); } Loading @@ -84,19 +90,13 @@ public class FolderInfo extends ItemInfo { */ public void remove(ShortcutInfo item, boolean animate) { contents.remove(item); for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onRemove(item); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onRemove(item); } itemsChanged(animate); } public void setTitle(CharSequence title) { this.title = title; for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onTitleChanged(title); } } @Override void onAddToDatabase(Context context, ContentValues values) { super.onAddToDatabase(context, values); Loading @@ -105,33 +105,30 @@ public class FolderInfo extends ItemInfo { } public void addListener(FolderListener listener) { listeners.add(listener); } void removeListener(FolderListener listener) { if (listeners.contains(listener)) { listeners.remove(listener); } /** * Registers a listener for info change events. */ public void setListener(FolderListener listener) { mListener = new WeakReference<>(listener); } public void itemsChanged(boolean animate) { for (int i = 0; i < listeners.size(); i++) { listeners.get(i).onItemsChanged(animate); FolderListener listener = mListener == null ? null : mListener.get(); if (listener != null) { listener.onItemsChanged(animate); } } @Override void unbind() { super.unbind(); listeners.clear(); mListener = null; } public interface FolderListener { public void onAdd(ShortcutInfo item); public void onRemove(ShortcutInfo item); public void onTitleChanged(CharSequence title); public void onItemsChanged(boolean animate); void onAdd(ShortcutInfo item); void onRemove(ShortcutInfo item); void onItemsChanged(boolean animate); } @Override Loading
src/com/android/launcher3/folder/Folder.java +5 −7 Original line number Diff line number Diff line Loading @@ -348,13 +348,14 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mFolderName.setHint(sHintText); // Convert to a string here to ensure that no other state associated with the text field // gets saved. String newTitle = mFolderName.getText().toString(); mInfo.setTitle(newTitle); mInfo.title = mFolderName.getText().toString(); mFolderIcon.onTitleChanged(mInfo.title); LauncherModel.updateItemInDatabase(mLauncher, mInfo); if (commit) { sendCustomAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, getContext().getString(R.string.folder_renamed, newTitle)); getContext().getString(R.string.folder_renamed, mInfo.title)); } // This ensures that focus is gained every time the field is clicked, which selects all Loading Loading @@ -448,7 +449,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mItemsInvalidated = true; updateTextViewFocus(); mInfo.addListener(this); if (!sDefaultFolderName.contentEquals(mInfo.title)) { mFolderName.setText(mInfo.title); Loading Loading @@ -1349,6 +1349,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); } @Override public void onRemove(ShortcutInfo item) { mItemsInvalidated = true; // If this item is being dragged from this open folder, we have already handled Loading Loading @@ -1385,9 +1386,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList updateTextViewFocus(); } public void onTitleChanged(CharSequence title) { } public ArrayList<View> getItemsInReadingOrder() { if (mItemsInvalidated) { mItemsInReadingOrder.clear(); Loading
src/com/android/launcher3/folder/FolderIcon.java +4 −3 Original line number Diff line number Diff line Loading @@ -183,10 +183,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { folder.setFolderIcon(icon); folder.bind(folderInfo); icon.setFolder(folder); folderInfo.addListener(icon); icon.setOnFocusChangeListener(launcher.mFocusHandler); folderInfo.setListener(new MultiFolderListener(folder, icon)); return icon; } Loading Loading @@ -944,11 +943,13 @@ public class FolderIcon extends FrameLayout implements FolderListener { requestLayout(); } @Override public void onAdd(ShortcutInfo item) { invalidate(); requestLayout(); } @Override public void onRemove(ShortcutInfo item) { invalidate(); requestLayout(); Loading
src/com/android/launcher3/folder/MultiFolderListener.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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.folder; import com.android.launcher3.FolderInfo.FolderListener; import com.android.launcher3.ShortcutInfo; /** * An implementation of {@link FolderListener} which passes the events to 2 children. */ public class MultiFolderListener implements FolderListener { private final FolderListener mListener1; private final FolderListener mListener2; public MultiFolderListener(FolderListener listener1, FolderListener listener2) { mListener1 = listener1; mListener2 = listener2; } @Override public void onAdd(ShortcutInfo item) { mListener1.onAdd(item); mListener2.onAdd(item); } @Override public void onRemove(ShortcutInfo item) { mListener1.onRemove(item); mListener2.onRemove(item); } @Override public void onItemsChanged(boolean animate) { mListener1.onItemsChanged(animate); mListener2.onItemsChanged(animate); } }