summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java15
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);
+ }
}