diff options
3 files changed, 63 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java index 9ac6077ad180..28f111fce4eb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java @@ -69,7 +69,8 @@ import java.util.List; * Navigation bar contains both pinned and unpinned apps: pinned in the left part, unpinned in the * right part, with no separator in between. */ -class NavigationBarApps extends LinearLayout { +class NavigationBarApps extends LinearLayout + implements NavigationBarAppsModel.OnAppsChangedListener { public final static boolean DEBUG = false; private final static String TAG = "NavigationBarApps"; @@ -131,7 +132,9 @@ class NavigationBarApps extends LinearLayout { public NavigationBarApps(Context context, AttributeSet attrs) { super(context, attrs); - sAppsModel = new NavigationBarAppsModel(context); + if (sAppsModel == null) { + sAppsModel = new NavigationBarAppsModel(context); + } mPackageManager = context.getPackageManager(); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); @@ -285,6 +288,7 @@ class NavigationBarApps extends LinearLayout { mContext.registerReceiver(mBroadcastReceiver, filter); mAppPackageMonitor.register(mContext, null, UserHandle.ALL, true); + sAppsModel.addOnAppsChangedListener(this); } @Override @@ -292,6 +296,7 @@ class NavigationBarApps extends LinearLayout { super.onDetachedFromWindow(); mContext.unregisterReceiver(mBroadcastReceiver); mAppPackageMonitor.unregister(); + sAppsModel.removeOnAppsChangedListener(this); } @Override @@ -315,6 +320,19 @@ class NavigationBarApps extends LinearLayout { new GetActivityIconTask(mPackageManager, button).execute(appButtonData); } + private List<AppInfo> getPinnedApps() { + List<AppInfo> apps = new ArrayList<AppInfo>(); + int childCount = getChildCount(); + for (int i = 0; i != childCount; ++i) { + View child = getChildAt(i); + AppButtonData appButtonData = (AppButtonData)child.getTag(); + if (appButtonData == null) continue; // Skip the drag placeholder. + if(!appButtonData.pinned) continue; + apps.add(appButtonData.appInfo); + } + return apps; + } + /** * Creates an ImageView icon for each pinned app. Removes any existing icons. May be called * to synchronize the current view with the shared data mode. @@ -335,16 +353,7 @@ class NavigationBarApps extends LinearLayout { * Saves pinned apps stored in app icons into the data model. */ private void savePinnedApps() { - List<AppInfo> apps = new ArrayList<AppInfo>(); - int childCount = getChildCount(); - for (int i = 0; i != childCount; ++i) { - View child = getChildAt(i); - AppButtonData appButtonData = (AppButtonData)child.getTag(); - if (appButtonData == null) continue; // Skip the drag placeholder. - if(!appButtonData.pinned) continue; - apps.add(appButtonData.appInfo); - } - sAppsModel.setApps(apps); + sAppsModel.setApps(getPinnedApps()); } /** @@ -1102,4 +1111,11 @@ class NavigationBarApps extends LinearLayout { }); } } + + @Override + public void onPinnedAppsChanged() { + if (getPinnedApps().equals(sAppsModel.getApps())) return; + recreatePinnedAppButtons(); + updateRecentApps(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java index 832a3e9f38bb..badb846694c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java @@ -44,6 +44,10 @@ import java.util.Set; * ComponentName. */ class NavigationBarAppsModel { + public interface OnAppsChangedListener { + void onPinnedAppsChanged(); + } + private final static String TAG = "NavigationBarAppsModel"; // Default number of apps to load initially. @@ -79,6 +83,9 @@ class NavigationBarAppsModel { // Apps are represented as an ordered list of app infos. private List<AppInfo> mApps = new ArrayList<AppInfo>(); + private List<OnAppsChangedListener> mOnAppsChangedListeners = + new ArrayList<OnAppsChangedListener>(); + // Id of the current user. private int mCurrentUserId = -1; @@ -167,6 +174,14 @@ class NavigationBarAppsModel { return null; } + public void addOnAppsChangedListener(OnAppsChangedListener listener) { + mOnAppsChangedListeners.add(listener); + } + + public void removeOnAppsChangedListener(OnAppsChangedListener listener) { + mOnAppsChangedListeners.remove(listener); + } + /** * Reinitializes the model for a new user. */ @@ -239,6 +254,11 @@ class NavigationBarAppsModel { public void setApps(List<AppInfo> apps) { mApps = apps; savePrefs(); + + int size = mOnAppsChangedListeners.size(); + for (int i = 0; i < size; ++i) { + mOnAppsChangedListeners.get(i).onPinnedAppsChanged(); + } } /** Saves the current model to disk. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java index e7a40d7fc10b..0ae0cf674644 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java @@ -412,4 +412,19 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { verify(mMockEdit).apply(); verifyNoMoreInteractions(mMockEdit); } + + /** Tests the apps-changed listener. */ + public void testAppsChangedListeners() { + NavigationBarAppsModel.OnAppsChangedListener listener = + mock(NavigationBarAppsModel.OnAppsChangedListener.class); + + mModel.addOnAppsChangedListener(listener); + mModel.setApps(new ArrayList<AppInfo>()); + verify(listener).onPinnedAppsChanged(); + verifyNoMoreInteractions(listener); + + mModel.removeOnAppsChangedListener(listener); + mModel.setApps(new ArrayList<AppInfo>()); + verifyNoMoreInteractions(listener); + } } |