The status bar draws its icons now.

This commit is contained in:
Joe Onorato
2010-05-02 16:28:15 -07:00
parent 503007dd02
commit 0cbda99f87
43 changed files with 829 additions and 4409 deletions

View File

@ -86,8 +86,6 @@ LOCAL_SRC_FILES += \
core/java/android/app/ISearchManager.aidl \
core/java/android/app/ISearchManagerCallback.aidl \
core/java/android/app/IServiceConnection.aidl \
core/java/android/app/IStatusBar.aidl \
core/java/android/app/IStatusBarService.aidl \
core/java/android/app/IThumbnailReceiver.aidl \
core/java/android/app/ITransientNotification.aidl \
core/java/android/app/IUiModeManager.aidl \
@ -156,6 +154,8 @@ LOCAL_SRC_FILES += \
core/java/com/android/internal/backup/IBackupTransport.aidl \
core/java/com/android/internal/os/IDropBoxManagerService.aidl \
core/java/com/android/internal/os/IResultReceiver.aidl \
core/java/com/android/internal/statusbar/IStatusBar.aidl \
core/java/com/android/internal/statusbar/IStatusBarService.aidl \
core/java/com/android/internal/view/IInputContext.aidl \
core/java/com/android/internal/view/IInputContextCallback.aidl \
core/java/com/android/internal/view/IInputMethod.aidl \

View File

@ -53,6 +53,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/FrameworkTest_intermediates/)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.policy*)
$(call add-clean-step, rm -rf $(TARGET_OUT_JAVA_LIBRARIES)/android.policy.jar)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates)
# ************************************************

View File

@ -23,6 +23,8 @@ import android.os.RemoteException;
import android.os.IBinder;
import android.os.ServiceManager;
import com.android.internal.statusbar.IStatusBarService;
/**
* Allows an app to control the status bar.
*
@ -116,27 +118,18 @@ public class StatusBarManager {
}
}
public IBinder addIcon(String slot, int iconId, int iconLevel) {
public void setIcon(String slot, int iconId, int iconLevel) {
try {
return mService.addIcon(slot, mContext.getPackageName(), iconId, iconLevel);
mService.setIcon(slot, mContext.getPackageName(), iconId, iconLevel);
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
}
}
public void updateIcon(IBinder key, String slot, int iconId, int iconLevel) {
public void removeIcon(String slot) {
try {
mService.updateIcon(key, slot, mContext.getPackageName(), iconId, iconLevel);
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
}
}
public void removeIcon(IBinder key) {
try {
mService.removeIcon(key);
mService.removeIcon(slot);
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);

View File

@ -14,10 +14,14 @@
* limitations under the License.
*/
package android.app;
package com.android.internal.statusbar;
import com.android.internal.statusbar.StatusBarIcon;
/** @hide */
interface IStatusBar
oneway interface IStatusBar
{
void setIcon(int index, in StatusBarIcon icon);
void removeIcon(int index);
}

View File

@ -14,9 +14,11 @@
* limitations under the License.
*/
package android.app;
package com.android.internal.statusbar;
import android.app.IStatusBar;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
/** @hide */
interface IStatusBarService
@ -25,10 +27,10 @@ interface IStatusBarService
void deactivate();
void toggle();
void disable(int what, IBinder token, String pkg);
IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel);
void updateIcon(IBinder key, String slot, String iconPackage, int iconId, int iconLevel);
void removeIcon(IBinder key);
void setIcon(String slot, String iconPackage, int iconId, int iconLevel);
void setIconVisibility(String slot, boolean visible);
void removeIcon(String slot);
// ---- Methods below are for use by the status bar policy services ----
void registerStatusBar(IStatusBar callbacks);
void registerStatusBar(IStatusBar callbacks, out StatusBarIconList state);
}

View File

@ -0,0 +1,20 @@
/*
* Copyright (c) 2010, 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.internal.statusbar;
parcelable StatusBarIcon;

View File

@ -0,0 +1,83 @@
/*
* Copyright (C) 2010 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.internal.statusbar;
import android.os.Parcel;
import android.os.Parcelable;
/**
* @hide
*/
public class StatusBarIcon implements Parcelable {
public String iconPackage;
public int iconId;
public int iconLevel;
private StatusBarIcon() {
}
public StatusBarIcon(String iconPackage, int iconId, int iconLevel) {
this.iconPackage = iconPackage;
this.iconId = iconId;
this.iconLevel = iconLevel;
}
public StatusBarIcon clone() {
return new StatusBarIcon(this.iconPackage, this.iconId, this.iconLevel);
}
/**
* Unflatten the StatusBarIcon from a parcel.
*/
public StatusBarIcon(Parcel in) {
readFromParcel(in);
}
public void readFromParcel(Parcel in) {
this.iconPackage = in.readString();
this.iconId = in.readInt();
this.iconLevel = in.readInt();
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(this.iconPackage);
out.writeInt(this.iconId);
out.writeInt(this.iconLevel);
}
public int describeContents() {
return 0;
}
/**
* Parcelable.Creator that instantiates StatusBarIcon objects
*/
public static final Parcelable.Creator<StatusBarIcon> CREATOR
= new Parcelable.Creator<StatusBarIcon>()
{
public StatusBarIcon createFromParcel(Parcel parcel)
{
return new StatusBarIcon(parcel);
}
public StatusBarIcon[] newArray(int size)
{
return new StatusBarIcon[size];
}
};
}

View File

@ -0,0 +1,20 @@
/*
* Copyright (c) 2010, 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.internal.statusbar;
parcelable StatusBarIconList;

View File

@ -0,0 +1,167 @@
/*
* Copyright (C) 2007 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.internal.statusbar;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.PrintWriter;
public class StatusBarIconList implements Parcelable {
private String[] mSlots;
private StatusBarIcon[] mIcons;
public StatusBarIconList() {
}
public StatusBarIconList(Parcel in) {
readFromParcel(in);
}
public void readFromParcel(Parcel in) {
this.mSlots = in.readStringArray();
final int N = in.readInt();
if (N < 0) {
mIcons = null;
} else {
mIcons = new StatusBarIcon[N];
for (int i=0; i<N; i++) {
if (in.readInt() != 0) {
mIcons[i] = new StatusBarIcon(in);
}
}
}
}
public void writeToParcel(Parcel out, int flags) {
out.writeStringArray(mSlots);
if (mIcons == null) {
out.writeInt(-1);
} else {
final int N = mIcons.length;
out.writeInt(N);
for (int i=0; i<N; i++) {
StatusBarIcon ic = mIcons[i];
if (ic == null) {
out.writeInt(0);
} else {
out.writeInt(1);
ic.writeToParcel(out, flags);
}
}
}
}
public int describeContents() {
return 0;
}
/**
* Parcelable.Creator that instantiates StatusBarIconList objects
*/
public static final Parcelable.Creator<StatusBarIconList> CREATOR
= new Parcelable.Creator<StatusBarIconList>()
{
public StatusBarIconList createFromParcel(Parcel parcel)
{
return new StatusBarIconList(parcel);
}
public StatusBarIconList[] newArray(int size)
{
return new StatusBarIconList[size];
}
};
public void defineSlots(String[] slots) {
final int N = slots.length;
String[] s = mSlots = new String[N];
for (int i=0; i<N; i++) {
s[i] = slots[i];
}
mIcons = new StatusBarIcon[N];
}
public int getSlotIndex(String slot) {
final int N = mSlots.length;
for (int i=0; i<N; i++) {
if (slot.equals(mSlots[i])) {
return i;
}
}
return -1;
}
public int size() {
return mSlots.length;
}
public void setIcon(int index, StatusBarIcon icon) {
mIcons[index] = icon.clone();
}
public void removeIcon(int index) {
mIcons[index] = null;
}
public String getSlot(int index) {
return mSlots[index];
}
public StatusBarIcon getIcon(int index) {
return mIcons[index];
}
public int getViewIndex(int index) {
int count = 0;
for (int i=0; i<index; i++) {
if (mIcons[i] != null) {
count++;
}
}
return count;
}
public void copyFrom(StatusBarIconList that) {
if (that.mSlots == null) {
this.mSlots = null;
this.mIcons = null;
} else {
final int N = that.mSlots.length;
this.mSlots = new String[N];
this.mIcons = new StatusBarIcon[N];
for (int i=0; i<N; i++) {
this.mSlots[i] = that.mSlots[i];
this.mIcons[i] = that.mIcons[i] != null ? that.mIcons[i].clone() : null;
}
}
}
public void dump(PrintWriter pw) {
final int N = mSlots.length;
pw.println("Icon list:");
for (int i=0; i<N; i++) {
final StatusBarIcon icon = mIcons[i];
if (icon == null) {
pw.printf(" %2d: (%s) null\n", i, mSlots[i]);
} else {
pw.printf(" %2d: (%s) pkg=%s id=0x%08x level=%d\n", i, mSlots[i], icon.iconPackage,
icon.iconId, icon.iconLevel);
}
}
}
}

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/drawable/status_icon_background.xml
**
** Copyright 2007, 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.
*/
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/icon_highlight_rectangle" />
<item android:drawable="@color/transparent" />
</selector>

View File

@ -1,144 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* apps/common/assets/default/default/skins/StatusBar.xml
**
** Copyright 2006, 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.
*/
-->
<com.android.server.status.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:focusable="true"
android:descendantFocusability="afterDescendants"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="3dp"
android:paddingBottom="5dp"
android:paddingRight="3dp"
android:background="@drawable/status_bar_header_background"
>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="1dp"
android:layout_marginLeft="5dp"
android:layout_gravity="center_vertical"
android:paddingBottom="1dp"
android:orientation="vertical"
>
<TextView android:id="@+id/plmnLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorSecondary"
android:paddingLeft="4dp"
/>
<TextView android:id="@+id/spnLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorSecondary"
android:paddingLeft="4dp"
/>
</LinearLayout>
<TextView android:id="@+id/clear_all_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="4dp"
android:layout_marginBottom="1dp"
android:textSize="14sp"
android:textColor="?android:attr/textColorPrimaryInverse"
android:text="@string/status_bar_clear_all_button"
style="?android:attr/buttonStyle"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@drawable/btn_default_small"
/>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
>
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="none"
>
<com.android.server.status.NotificationLinearLayout
android:id="@+id/notificationLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView android:id="@+id/noNotificationsTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_no_notifications_title"
/>
<TextView android:id="@+id/ongoingTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_ongoing_events_title"
/>
<LinearLayout android:id="@+id/ongoingItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>
<TextView android:id="@+id/latestTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_latest_events_title"
/>
<LinearLayout android:id="@+id/latestItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>
</com.android.server.status.NotificationLinearLayout>
</ScrollView>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/title_bar_shadow"
android:scaleType="fitXY"
/>
</FrameLayout>
</com.android.server.status.ExpandedView>

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2008 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.
-->
<com.android.server.status.TrackingView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:visibility="gone"
android:focusable="true"
android:descendantFocusability="afterDescendants"
android:paddingBottom="0px"
android:paddingLeft="0px"
android:paddingRight="0px"
>
<com.android.server.status.TrackingPatternView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<com.android.server.status.CloseDragHandle android:id="@+id/close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:scaleType="fitXY"
android:src="@drawable/status_bar_close_on"/>
</com.android.server.status.CloseDragHandle>
</com.android.server.status.TrackingView>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -19,7 +19,7 @@
-->
<!-- android:background="@drawable/status_bar_closed_default_background" -->
<com.android.server.status.StatusBarView xmlns:android="http://schemas.android.com/apk/res/android"
<com.android.policy.statusbar.phone.StatusBarView xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/statusbar_background"
android:orientation="vertical"
android:focusable="true"
@ -31,7 +31,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<com.android.server.status.IconMerger android:id="@+id/notificationIcons"
<com.android.policy.statusbar.phone.IconMerger android:id="@+id/notificationIcons"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
@ -60,16 +60,16 @@
android:layout_height="match_parent"
android:layout_marginRight="8dip"
>
<com.android.server.status.AnimatedImageView
<com.android.policy.statusbar.phone.AnimatedImageView
android:layout_width="25dip"
android:layout_height="25dip"
/>
<com.android.server.status.AnimatedImageView
<com.android.policy.statusbar.phone.AnimatedImageView
android:layout_width="25dip"
android:layout_height="25dip"
/>
</ImageSwitcher>
<com.android.server.status.TickerView android:id="@+id/tickerText"
<com.android.policy.statusbar.phone.TickerView android:id="@+id/tickerText"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
@ -87,10 +87,10 @@
android:layout_height="wrap_content"
android:singleLine="true"
/>
</com.android.server.status.TickerView>
</com.android.policy.statusbar.phone.TickerView>
</LinearLayout>
<com.android.server.status.DateView android:id="@+id/date"
<com.android.policy.statusbar.phone.DateView android:id="@+id/date"
android:textAppearance="@style/TextAppearance.StatusBar.Icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -100,4 +100,4 @@
android:paddingRight="6px"
android:background="@drawable/statusbar_background"
/>
</com.android.server.status.StatusBarView>
</com.android.policy.statusbar.phone.StatusBarView>

View File

@ -18,7 +18,7 @@
*/
-->
<com.android.server.status.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android"
<com.android.policy.statusbar.phone.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:focusable="true"
android:descendantFocusability="afterDescendants"
@ -87,7 +87,7 @@
android:layout_height="match_parent"
android:fadingEdge="none"
>
<com.android.server.status.NotificationLinearLayout
<com.android.policy.statusbar.phone.NotificationLinearLayout
android:id="@+id/notificationLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -130,7 +130,7 @@
android:layout_height="wrap_content"
android:orientation="vertical"
/>
</com.android.server.status.NotificationLinearLayout>
</com.android.policy.statusbar.phone.NotificationLinearLayout>
</ScrollView>
<ImageView
@ -141,4 +141,4 @@
/>
</FrameLayout>
</com.android.server.status.ExpandedView>
</com.android.policy.statusbar.phone.ExpandedView>

View File

@ -25,7 +25,7 @@
android:layout_height="25dp"
>
<com.android.server.status.AnimatedImageView android:id="@+id/image"
<com.android.policy.statusbar.phone.AnimatedImageView android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

View File

@ -15,7 +15,8 @@
limitations under the License.
-->
<com.android.server.status.TrackingView xmlns:android="http://schemas.android.com/apk/res/android"
<com.android.policy.statusbar.phone.TrackingView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:visibility="gone"
android:focusable="true"
@ -25,13 +26,13 @@
android:paddingRight="0px"
>
<com.android.server.status.TrackingPatternView
<com.android.policy.statusbar.phone.TrackingPatternView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<com.android.server.status.CloseDragHandle android:id="@+id/close"
<com.android.policy.statusbar.phone.CloseDragHandle android:id="@+id/close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@ -43,6 +44,6 @@
android:scaleType="fitXY"
android:src="@drawable/status_bar_close_on"/>
</com.android.server.status.CloseDragHandle>
</com.android.policy.statusbar.phone.CloseDragHandle>
</com.android.server.status.TrackingView>
</com.android.policy.statusbar.phone.TrackingView>

View File

@ -0,0 +1,103 @@
/*
* Copyright (C) 2010 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.policy.statusbar.phone;
import android.os.Handler;
import android.os.Message;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
class CommandQueue extends IStatusBar.Stub {
private static final int MSG_MASK = 0xffff0000;
private static final int INDEX_MASK = 0x0000ffff;
private static final int MSG_ICON = 0x00010000;
private static final int OP_SET_ICON = 1;
private static final int OP_REMOVE_ICON = 2;
private StatusBarIconList mList;
private Callbacks mCallbacks;
private Handler mHandler = new H();
/**
* These methods are called back on the main thread.
*/
public interface Callbacks {
public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon);
public void updateIcon(String slot, int index, int viewIndex,
StatusBarIcon old, StatusBarIcon icon);
public void removeIcon(String slot, int index, int viewIndex);
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
mCallbacks = callbacks;
mList = list;
}
public void setIcon(int index, StatusBarIcon icon) {
synchronized (mList) {
int what = MSG_ICON | index;
mHandler.removeMessages(what);
mHandler.obtainMessage(what, OP_SET_ICON, 0, icon.clone()).sendToTarget();
}
}
public void removeIcon(int index) {
synchronized (mList) {
int what = MSG_ICON | index;
mHandler.removeMessages(what);
mHandler.obtainMessage(what, OP_REMOVE_ICON, 0, null).sendToTarget();
}
}
private final class H extends Handler {
public void handleMessage(Message msg) {
int what = msg.what & MSG_MASK;
switch (msg.what) {
case MSG_ICON: {
int index = msg.what & INDEX_MASK;
int viewIndex = mList.getViewIndex(index);
switch (msg.arg1) {
case OP_SET_ICON: {
StatusBarIcon icon = (StatusBarIcon)msg.obj;
StatusBarIcon old = mList.getIcon(index);
if (old == null) {
mList.setIcon(index, icon);
mCallbacks.addIcon(mList.getSlot(index), index, viewIndex, icon);
} else {
mList.setIcon(index, icon);
mCallbacks.updateIcon(mList.getSlot(index), index, viewIndex,
old, icon);
}
break;
}
case OP_REMOVE_ICON:
mList.removeIcon(index);
mCallbacks.removeIcon(mList.getSlot(index), index, viewIndex);
break;
}
break;
}
}
}
}
}

View File

@ -24,7 +24,7 @@ import android.widget.LinearLayout;
public class IconMerger extends LinearLayout {
PhoneStatusBarService service;
StatusBarIcon moreIcon;
StatusBarIconData moreIcon;
public IconMerger(Context context, AttributeSet attrs) {
super(context, attrs);
@ -33,6 +33,9 @@ public class IconMerger extends LinearLayout {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (true) {
return;
}
final int maxWidth = r - l;
final int N = getChildCount();
@ -90,7 +93,7 @@ public class IconMerger extends LinearLayout {
if (childLeft < breakingPoint) {
// hide this one
child.layout(0, child.getTop(), 0, child.getBottom());
int n = this.service.getIconNumberForView(child);
int n = 0; // XXX this.service.getIconNumberForView(child);
if (n == 0) {
number += 1;
} else if (n > 0) {

View File

@ -17,11 +17,12 @@
package com.android.policy.statusbar.phone;
import com.android.internal.util.CharSequences;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
import android.app.ActivityManagerNative;
import android.app.Dialog;
import android.app.IStatusBar;
import android.app.IStatusBarService;
import android.app.PendingIntent;
import android.app.Service;
import android.app.StatusBarManager;
@ -82,22 +83,6 @@ public class PhoneStatusBarService extends StatusBarService {
private static final int MSG_ANIMATE = 1000;
private static final int MSG_ANIMATE_REVEAL = 1001;
private static final int OP_ADD_ICON = 1;
private static final int OP_UPDATE_ICON = 2;
private static final int OP_REMOVE_ICON = 3;
private static final int OP_SET_VISIBLE = 4;
private static final int OP_EXPAND = 5;
private static final int OP_TOGGLE = 6;
private static final int OP_DISABLE = 7;
private class PendingOp {
IBinder key;
int code;
IconData iconData;
NotificationData notificationData;
boolean visible;
int integer;
}
private class DisableRecord implements IBinder.DeathRecipient {
String pkg;
int what;
@ -136,12 +121,14 @@ public class PhoneStatusBarService extends StatusBarService {
}
}
final Display mDisplay;
int mHeight;
int mIconWidth;
Display mDisplay;
StatusBarView mStatusBarView;
int mPixelFormat;
H mHandler = new H();
Object mQueueLock = new Object();
ArrayList<PendingOp> mQueue = new ArrayList<PendingOp>();
NotificationCallbacks mNotificationCallbacks;
// All accesses to mIconMap and mNotificationData are syncronized on those objects,
@ -150,14 +137,13 @@ public class PhoneStatusBarService extends StatusBarService {
// reads and require them to not be modified.
// icons
HashMap<IBinder,StatusBarIcon> mIconMap = new HashMap<IBinder,StatusBarIcon>();
ArrayList<StatusBarIcon> mIconList = new ArrayList<StatusBarIcon>();
HashMap<IBinder,StatusBarIconData> mIconMap = new HashMap<IBinder,StatusBarIconData>();
ArrayList<StatusBarIconData> mIconList = new ArrayList<StatusBarIconData>();
String[] mRightIconSlots;
StatusBarIcon[] mRightIcons;
StatusBarIconData[] mRightIcons;
LinearLayout mIcons;
IconMerger mNotificationIcons;
LinearLayout mStatusIcons;
StatusBarIcon mMoreIcon;
private UninstallReceiver mUninstallReceiver;
// expanded notifications
@ -219,11 +205,15 @@ public class PhoneStatusBarService extends StatusBarService {
/**
* Construct the service, add the status bar view to the window manager
*/
public PhoneStatusBarService(Context context) {
mDisplay = ((WindowManager)context.getSystemService(
Context.WINDOW_SERVICE)).getDefaultDisplay();
makeStatusBarView(context);
@Override
public void onCreate() {
// First set up our views and stuff.
mDisplay = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
makeStatusBarView(this);
mUninstallReceiver = new UninstallReceiver();
// Next, call super.onCreate(), which will populate our views.
super.onCreate();
}
public void setNotificationCallbacks(NotificationCallbacks listener) {
@ -236,10 +226,13 @@ public class PhoneStatusBarService extends StatusBarService {
private void makeStatusBarView(Context context) {
Resources res = context.getResources();
mRightIconSlots = res.getStringArray(R.array.status_bar_icon_order);
mRightIcons = new StatusBarIcon[mRightIconSlots.length];
mRightIcons = new StatusBarIconData[mRightIconSlots.length];
mHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
mIconWidth = mHeight;
ExpandedView expanded = (ExpandedView)View.inflate(context,
com.android.internal.R.layout.status_bar_expanded, null);
R.layout.status_bar_expanded, null);
expanded.mService = this;
StatusBarView sb = (StatusBarView)View.inflate(context, R.layout.status_bar, null);
sb.mService = this;
@ -282,21 +275,12 @@ public class PhoneStatusBarService extends StatusBarService {
TickerView tickerView = (TickerView)sb.findViewById(R.id.tickerText);
tickerView.mTicker = mTicker;
mTrackingView = (TrackingView)View.inflate(context,
com.android.internal.R.layout.status_bar_tracking, null);
mTrackingView = (TrackingView)View.inflate(context, R.layout.status_bar_tracking, null);
mTrackingView.mService = this;
mCloseView = (CloseDragHandle)mTrackingView.findViewById(R.id.close);
mCloseView.mService = this;
mEdgeBorder = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_edge_ignore);
// add the more icon for the notifications
IconData moreData = IconData.makeIcon(null, context.getPackageName(),
R.drawable.stat_notify_more, 0, 42);
mMoreIcon = new StatusBarIcon(context, moreData, mNotificationIcons);
mMoreIcon.view.setId(R.drawable.stat_notify_more);
mNotificationIcons.moreIcon = mMoreIcon;
mNotificationIcons.addView(mMoreIcon.view);
mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
// set the inital view visibility
setAreThereNotifications();
@ -319,17 +303,14 @@ public class PhoneStatusBarService extends StatusBarService {
@Override
protected void addStatusBarView() {
final View view = new View(this);
// TODO final StatusBarView view = mStatusBarView;
final StatusBarView view = mStatusBarView;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
view.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height),
mHeight,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING,
PixelFormat.RGB_888);
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING,
PixelFormat.RGBX_8888);
lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
lp.setTitle("StatusBar");
// TODO lp.windowAnimations = R.style.Animation_StatusBar;
@ -338,415 +319,42 @@ public class PhoneStatusBarService extends StatusBarService {
}
// ================================================================================
// From IStatusBarService
// Always called from the UI thread.
// ================================================================================
public void activate() {
enforceExpandStatusBar();
addPendingOp(OP_EXPAND, null, true);
public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ " icon=" + icon);
StatusBarIconView view = new StatusBarIconView(this, slot);
view.set(icon);
mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconWidth, mHeight));
}
public void deactivate() {
enforceExpandStatusBar();
addPendingOp(OP_EXPAND, null, false);
public void updateIcon(String slot, int index, int viewIndex,
StatusBarIcon old, StatusBarIcon icon) {
Slog.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ " old=" + old + " icon=" + icon);
StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
view.set(icon);
}
public void toggle() {
enforceExpandStatusBar();
addPendingOp(OP_TOGGLE, null, false);
}
public void disable(int what, IBinder token, String pkg) {
enforceStatusBar();
synchronized (mNotificationCallbacks) {
// This is a little gross, but I think it's safe as long as nobody else
// synchronizes on mNotificationCallbacks. It's important that the the callback
// and the pending op get done in the correct order and not interleaved with
// other calls, otherwise they'll get out of sync.
int net;
synchronized (mDisableRecords) {
manageDisableListLocked(what, token, pkg);
net = gatherDisableActionsLocked();
mNotificationCallbacks.onSetDisabled(net);
}
addPendingOp(OP_DISABLE, net);
}
}
public IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel) {
enforceStatusBar();
return addIcon(IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null);
}
public void updateIcon(IBinder key,
String slot, String iconPackage, int iconId, int iconLevel) {
enforceStatusBar();
updateIcon(key, IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null);
}
public void removeIcon(IBinder key) {
enforceStatusBar();
addPendingOp(OP_REMOVE_ICON, key, null, null, -1);
}
private void enforceStatusBar() {
enforceCallingOrSelfPermission(
android.Manifest.permission.STATUS_BAR,
"PhoneStatusBarService");
}
private void enforceExpandStatusBar() {
enforceCallingOrSelfPermission(
android.Manifest.permission.EXPAND_STATUS_BAR,
"PhoneStatusBarService");
}
public void registerStatusBar(IStatusBar bar) {
Slog.d(TAG, "registerStatusBar bar=" + bar);
public void removeIcon(String slot, int index, int viewIndex) {
Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
mStatusIcons.removeViewAt(viewIndex);
}
// ================================================================================
// Can be called from any thread
// ================================================================================
public IBinder addIcon(IconData data, NotificationData n) {
// TODO: Call onto the IStatusBar
int slot;
// assert early-on if they using a slot that doesn't exist.
if (data != null && n == null) {
slot = getRightIconIndex(data.slot);
if (slot < 0) {
throw new SecurityException("invalid status bar icon slot: "
+ (data.slot != null ? "'" + data.slot + "'" : "null"));
}
} else {
slot = -1;
}
IBinder key = new Binder();
addPendingOp(OP_ADD_ICON, key, data, n, -1);
return key;
}
public void updateIcon(IBinder key, IconData data, NotificationData n) {
addPendingOp(OP_UPDATE_ICON, key, data, n, -1);
}
public void setIconVisibility(IBinder key, boolean visible) {
addPendingOp(OP_SET_VISIBLE, key, visible);
}
private void addPendingOp(int code, IBinder key, IconData data, NotificationData n, int i) {
synchronized (mQueueLock) {
PendingOp op = new PendingOp();
op.key = key;
op.code = code;
op.iconData = data == null ? null : data.clone();
op.notificationData = n;
op.integer = i;
mQueue.add(op);
if (mQueue.size() == 1) {
mHandler.sendEmptyMessage(2);
}
}
}
private void addPendingOp(int code, IBinder key, boolean visible) {
synchronized (mQueueLock) {
PendingOp op = new PendingOp();
op.key = key;
op.code = code;
op.visible = visible;
mQueue.add(op);
if (mQueue.size() == 1) {
mHandler.sendEmptyMessage(1);
}
}
}
private void addPendingOp(int code, int integer) {
synchronized (mQueueLock) {
PendingOp op = new PendingOp();
op.code = code;
op.integer = integer;
mQueue.add(op);
if (mQueue.size() == 1) {
mHandler.sendEmptyMessage(1);
}
}
}
// lock on mDisableRecords
void manageDisableListLocked(int what, IBinder token, String pkg) {
if (SPEW) {
Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what)
+ " pkg=" + pkg);
}
// update the list
synchronized (mDisableRecords) {
final int N = mDisableRecords.size();
DisableRecord tok = null;
int i;
for (i=0; i<N; i++) {
DisableRecord t = mDisableRecords.get(i);
if (t.token == token) {
tok = t;
break;
}
}
if (what == 0 || !token.isBinderAlive()) {
if (tok != null) {
mDisableRecords.remove(i);
tok.token.unlinkToDeath(tok, 0);
}
} else {
if (tok == null) {
tok = new DisableRecord();
try {
token.linkToDeath(tok, 0);
}
catch (RemoteException ex) {
return; // give up
}
mDisableRecords.add(tok);
}
tok.what = what;
tok.token = token;
tok.pkg = pkg;
}
}
}
// lock on mDisableRecords
int gatherDisableActionsLocked() {
final int N = mDisableRecords.size();
// gather the new net flags
int net = 0;
for (int i=0; i<N; i++) {
net |= mDisableRecords.get(i).what;
}
return net;
}
private int getRightIconIndex(String slot) {
final int N = mRightIconSlots.length;
for (int i=0; i<N; i++) {
if (mRightIconSlots[i].equals(slot)) {
return i;
}
}
return -1;
}
// ================================================================================
// Always called from UI thread
// ================================================================================
/**
* All changes to the status bar and notifications funnel through here and are batched.
*/
private class H extends Handler {
public void handleMessage(Message m) {
if (m.what == MSG_ANIMATE) {
doAnimation();
return;
}
if (m.what == MSG_ANIMATE_REVEAL) {
doRevealAnimation();
return;
}
ArrayList<PendingOp> queue;
synchronized (mQueueLock) {
queue = mQueue;
mQueue = new ArrayList<PendingOp>();
}
boolean wasExpanded = mExpanded;
// for each one in the queue, find all of the ones with the same key
// and collapse that down into a final op and/or call to setVisibility, etc
boolean expand = wasExpanded;
boolean doExpand = false;
boolean doDisable = false;
int disableWhat = 0;
int N = queue.size();
while (N > 0) {
PendingOp op = queue.get(0);
boolean doOp = false;
boolean visible = false;
boolean doVisibility = false;
if (op.code == OP_SET_VISIBLE) {
doVisibility = true;
visible = op.visible;
}
else if (op.code == OP_EXPAND) {
doExpand = true;
expand = op.visible;
}
else if (op.code == OP_TOGGLE) {
doExpand = true;
expand = !expand;
}
else {
doOp = true;
}
if (alwaysHandle(op.code)) {
// coalesce these
for (int i=1; i<N; i++) {
PendingOp o = queue.get(i);
if (!alwaysHandle(o.code) && o.key == op.key) {
if (o.code == OP_SET_VISIBLE) {
visible = o.visible;
doVisibility = true;
}
else if (o.code == OP_EXPAND) {
expand = o.visible;
doExpand = true;
}
else {
op.code = o.code;
op.iconData = o.iconData;
op.notificationData = o.notificationData;
}
queue.remove(i);
i--;
N--;
}
}
}
queue.remove(0);
N--;
if (doOp) {
switch (op.code) {
case OP_ADD_ICON:
case OP_UPDATE_ICON:
performAddUpdateIcon(op.key, op.iconData, op.notificationData);
break;
case OP_REMOVE_ICON:
performRemoveIcon(op.key);
break;
case OP_DISABLE:
doDisable = true;
disableWhat = op.integer;
break;
}
}
if (doVisibility && op.code != OP_REMOVE_ICON) {
performSetIconVisibility(op.key, visible);
}
}
if (queue.size() != 0) {
throw new RuntimeException("Assertion failed: queue.size=" + queue.size());
}
if (doExpand) {
// this is last so that we capture all of the pending changes before doing it
if (expand) {
animateExpand();
} else {
animateCollapse();
}
}
if (doDisable) {
performDisableActions(disableWhat);
}
}
}
private boolean alwaysHandle(int code) {
return code == OP_DISABLE;
}
/* private */ void performAddUpdateIcon(IBinder key, IconData data, NotificationData n)
throws StatusBarException {
if (SPEW) {
Slog.d(TAG, "performAddUpdateIcon icon=" + data + " notification=" + n + " key=" + key);
}
// notification
if (n != null) {
StatusBarNotification notification = getNotification(key);
NotificationData oldData = null;
if (notification == null) {
// add
notification = new StatusBarNotification();
notification.key = key;
notification.data = n;
synchronized (mNotificationData) {
mNotificationData.add(notification);
}
addNotificationView(notification);
setAreThereNotifications();
} else {
// update
oldData = notification.data;
notification.data = n;
updateNotificationView(notification, oldData);
}
// Show the ticker if one is requested, and the text is different
// than the currently displayed ticker. Also don't do this
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
// run a ticker without being attached will crash!
if (n.tickerText != null && mStatusBarView.getWindowToken() != null
&& (oldData == null
|| oldData.tickerText == null
|| !CharSequences.equals(oldData.tickerText, n.tickerText))) {
if (0 == (mDisabled &
(StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
mTicker.addEntry(n, StatusBarIcon.getIcon(this, data), n.tickerText);
}
}
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
// icon
synchronized (mIconMap) {
StatusBarIcon icon = mIconMap.get(key);
if (icon == null) {
// add
LinearLayout v = n == null ? mStatusIcons : mNotificationIcons;
icon = new StatusBarIcon(this, data, v);
mIconMap.put(key, icon);
mIconList.add(icon);
if (n == null) {
int slotIndex = getRightIconIndex(data.slot);
StatusBarIcon[] rightIcons = mRightIcons;
if (rightIcons[slotIndex] == null) {
int pos = 0;
for (int i=mRightIcons.length-1; i>slotIndex; i--) {
StatusBarIcon ic = rightIcons[i];
if (ic != null) {
pos++;
}
}
rightIcons[slotIndex] = icon;
mStatusIcons.addView(icon.view, pos);
} else {
Slog.e(TAG, "duplicate icon in slot " + slotIndex + "/" + data.slot);
mIconMap.remove(key);
mIconList.remove(icon);
return ;
}
} else {
int iconIndex = mNotificationData.getIconIndex(n);
mNotificationIcons.addView(icon.view, iconIndex);
}
} else {
if (n == null) {
// right hand side icons -- these don't reorder
icon.update(this, data);
} else {
// remove old
ViewGroup parent = (ViewGroup)icon.view.getParent();
parent.removeView(icon.view);
// add new
icon.update(this, data);
int iconIndex = mNotificationData.getIconIndex(n);
mNotificationIcons.addView(icon.view, iconIndex);
}
switch (m.what) {
case MSG_ANIMATE:
doAnimation();
break;
case MSG_ANIMATE_REVEAL:
doRevealAnimation();
break;
}
}
}
@ -756,57 +364,11 @@ public class PhoneStatusBarService extends StatusBarService {
if (SPEW) {
Slog.d(TAG, "performSetIconVisibility key=" + key + " visible=" + visible);
}
StatusBarIcon icon = mIconMap.get(key);
StatusBarIconData icon = mIconMap.get(key);
icon.view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}
/* private */ void performRemoveIcon(IBinder key) {
synchronized (this) {
if (SPEW) {
Slog.d(TAG, "performRemoveIcon key=" + key);
}
StatusBarIcon icon = mIconMap.remove(key);
mIconList.remove(icon);
if (icon != null) {
ViewGroup parent = (ViewGroup)icon.view.getParent();
parent.removeView(icon.view);
int slotIndex = getRightIconIndex(icon.mData.slot);
if (slotIndex >= 0) {
mRightIcons[slotIndex] = null;
}
}
StatusBarNotification notification = getNotification(key);
if (notification != null) {
removeNotificationView(notification);
synchronized (mNotificationData) {
mNotificationData.remove(notification);
}
setAreThereNotifications();
}
}
}
int getIconNumberForView(View v) {
synchronized (mIconMap) {
StatusBarIcon icon = null;
final int N = mIconList.size();
for (int i=0; i<N; i++) {
StatusBarIcon ic = mIconList.get(i);
if (ic.view == v) {
icon = ic;
break;
}
}
if (icon != null) {
return icon.getNumber();
} else {
return -1;
}
}
}
StatusBarNotification getNotification(IBinder key) {
synchronized (mNotificationData) {
return mNotificationData.get(key);
@ -830,7 +392,8 @@ public class PhoneStatusBarService extends StatusBarService {
// create the row view
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(com.android.internal.R.layout.status_bar_latest_event, parent, false);
View row = inflater.inflate(com.android.internal.R.layout.status_bar_latest_event,
parent, false);
// bind the click event to the content area
ViewGroup content = (ViewGroup)row.findViewById(com.android.internal.R.id.content);
@ -1406,15 +969,6 @@ public class PhoneStatusBarService extends StatusBarService {
+ " mAnimatingReveal=" + mAnimatingReveal
+ " mViewDelta=" + mViewDelta);
pw.println(" mDisplayHeight=" + mDisplayHeight);
final int N = mQueue.size();
pw.println(" mQueue.size=" + N);
for (int i=0; i<N; i++) {
PendingOp op = mQueue.get(i);
pw.println(" [" + i + "] key=" + op.key + " code=" + op.code + " visible="
+ op.visible);
pw.println(" iconData=" + op.iconData);
pw.println(" notificationData=" + op.notificationData);
}
pw.println(" mExpandedParams: " + mExpandedParams);
pw.println(" mExpandedView: " + viewInfo(mExpandedView));
pw.println(" mExpandedDialog: " + mExpandedDialog);
@ -1437,7 +991,7 @@ public class PhoneStatusBarService extends StatusBarService {
Set<IBinder> keys = mIconMap.keySet();
int i=0;
for (IBinder key: keys) {
StatusBarIcon icon = mIconMap.get(key);
StatusBarIconData icon = mIconMap.get(key);
pw.println(" [" + i + "] key=" + key);
pw.println(" data=" + icon.mData);
i++;
@ -1681,6 +1235,10 @@ public class PhoneStatusBarService extends StatusBarService {
*/
private boolean mPanelSlightlyVisible;
void panelSlightlyVisible(boolean visible) {
if (true) {
// XXX
return;
}
if (mPanelSlightlyVisible != visible) {
mPanelSlightlyVisible = visible;
if (visible) {
@ -1727,7 +1285,7 @@ public class PhoneStatusBarService extends StatusBarService {
private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
public void onClick(View v) {
mNotificationCallbacks.onClearAll();
addPendingOp(OP_EXPAND, null, false);
//addPendingOp(OP_EXPAND, null, false);
}
};
@ -1865,7 +1423,7 @@ public class PhoneStatusBarService extends StatusBarService {
if (list != null) {
final int N = list.size();
for (int i=0; i<N; i++) {
removeIcon(list.get(i).key);
//removeIcon(list.get(i).key);
}
}
}

View File

@ -31,7 +31,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class StatusBarIcon {
public class StatusBarIconData {
// TODO: get this from a resource
private static final int ICON_GAP = 8;
private static final int ICON_WIDTH = 25;
@ -45,7 +45,7 @@ public class StatusBarIcon {
private AnimatedImageView mImageView;
private TextView mNumberView;
public StatusBarIcon(Context context, IconData data, ViewGroup parent) {
public StatusBarIconData(Context context, IconData data, ViewGroup parent) {
mData = data.clone();
switch (data.type) {
@ -71,17 +71,17 @@ public class StatusBarIcon {
// container
LayoutInflater inflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(com.android.internal.R.layout.status_bar_icon, parent, false);
View v = inflater.inflate(R.layout.status_bar_icon, parent, false);
this.view = v;
// icon
AnimatedImageView im = (AnimatedImageView)v.findViewById(com.android.internal.R.id.image);
AnimatedImageView im = (AnimatedImageView)v.findViewById(R.id.image);
im.setImageDrawable(getIcon(context, data));
im.setImageLevel(data.iconLevel);
mImageView = im;
// number
TextView nv = (TextView)v.findViewById(com.android.internal.R.id.number);
TextView nv = (TextView)v.findViewById(R.id.number);
mNumberView = nv;
if (data.number > 0) {
nv.setText("" + data.number);

View File

@ -0,0 +1,104 @@
/*
* Copyright (C) 2008 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.policy.statusbar.phone;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.Canvas;
import android.util.Slog;
import android.view.ViewDebug;
import android.widget.FrameLayout;
import com.android.internal.statusbar.StatusBarIcon;
public class StatusBarIconView extends AnimatedImageView {
private static final String TAG = "StatusBarIconView";
private StatusBarIcon mIcon;
@ViewDebug.ExportedProperty private String mSlot;
public StatusBarIconView(Context context, String slot) {
super(context);
mSlot = slot;
}
private static boolean streq(String a, String b) {
if (a == null && b != null) {
return false;
}
if (a != null && b == null) {
return false;
}
return a.equals(b);
}
public void set(StatusBarIcon icon) {
final boolean iconEquals = mIcon != null
&& streq(mIcon.iconPackage, icon.iconPackage)
&& mIcon.iconId == icon.iconId;
final boolean levelEquals = iconEquals
&& mIcon.iconLevel == icon.iconLevel;
if (!iconEquals) {
setImageDrawable(getIcon(icon));
}
if (!levelEquals) {
setImageLevel(icon.iconLevel);
}
mIcon = icon.clone();
}
/**
* Returns the right icon to use for this item, respecting the iconId and
* iconPackage (if set)
*
* @param context Context to use to get resources if iconPackage is not set
* @return Drawable for this item, or null if the package or item could not
* be found
*/
private Drawable getIcon(StatusBarIcon icon) {
Context context = getContext();
Resources r = null;
if (icon.iconPackage != null) {
try {
r = context.getPackageManager().getResourcesForApplication(icon.iconPackage);
} catch (PackageManager.NameNotFoundException ex) {
Slog.e(PhoneStatusBarService.TAG, "Icon package not found: "+icon.iconPackage, ex);
return null;
}
} else {
r = context.getResources();
}
if (icon.iconId == 0) {
Slog.w(PhoneStatusBarService.TAG, "No icon ID for slot " + mSlot);
return null;
}
try {
return r.getDrawable(icon.iconId);
} catch (RuntimeException e) {
Slog.w(PhoneStatusBarService.TAG, "Icon not found in "
+ (icon.iconPackage != null ? icon.iconId : "<system>")
+ ": " + Integer.toHexString(icon.iconId));
}
return null;
}
}

View File

@ -17,8 +17,6 @@
package com.android.policy.statusbar.phone;
import android.app.Service;
import android.app.IStatusBar;
import android.app.IStatusBarService;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
@ -26,7 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
@ -34,13 +32,18 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.server.status.IconData;
import com.android.server.status.NotificationData;
public abstract class StatusBarService extends Service {
public abstract class StatusBarService extends Service implements CommandQueue.Callbacks {
private static final String TAG = "StatusBarService";
Bar mBar = new Bar();
CommandQueue mCommandQueue;
IStatusBarService mBarService;
/* TODO
@ -52,17 +55,30 @@ public abstract class StatusBarService extends Service {
@Override
public void onCreate() {
// Put up the view
addStatusBarView();
// Connect in to the status bar manager service
StatusBarIconList iconList = new StatusBarIconList();
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
try {
mBarService.registerStatusBar(mBar);
mBarService.registerStatusBar(mCommandQueue, iconList);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
// Set up the initial icon state
mCommandQueue = new CommandQueue(this, iconList);
final int N = iconList.size();
int viewIndex = 0;
for (int i=0; i<N; i++) {
StatusBarIcon icon = iconList.getIcon(i);
if (icon != null) {
addIcon(iconList.getSlot(i), i, viewIndex, icon);
viewIndex++;
}
}
// Put up the view
addStatusBarView();
}
@Override
@ -78,9 +94,6 @@ public abstract class StatusBarService extends Service {
return null;
}
class Bar extends IStatusBar.Stub {
}
/**
* Implement this to add the main status bar view.
*/
@ -97,16 +110,5 @@ public abstract class StatusBarService extends Service {
public void disable(int what, IBinder token, String pkg) {
}
public IBinder addIcon(IconData data, NotificationData n) {
return null;
}
public void updateIcon(IBinder key, IconData data, NotificationData n) {
}
public void setIconVisibility(IBinder key, boolean visible) {
//addPendingOp(OP_SET_VISIBLE, key, visible);
}
}

View File

@ -31,7 +31,7 @@ public class StatusBarStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "StatusBarStarter onReceive intent=" + intent);
context.startService(new Intent(context, StatusBarService.class));
context.startService(new Intent(context, PhoneStatusBarService.class));
}
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.android.server.status;
package com.android.policy.statusbar.phone;
import android.content.Context;
import android.content.res.TypedArray;

View File

@ -145,8 +145,8 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
private Context mContext;
private AlarmManager mAlarmManager;
private StatusBarManager mStatusBarManager;
private boolean mShowLockIcon = false;
private IBinder mSecureLockIcon = null;
private boolean mShowLockIcon;
private boolean mShowingLockIcon;
private boolean mSystemReady;
@ -1036,14 +1036,15 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
if (mShowLockIcon) {
// Give feedback to user when secure keyguard is active and engaged
if (mShowing && isSecure()) {
if (mSecureLockIcon == null) {
mSecureLockIcon = mStatusBarManager.addIcon("secure",
com.android.internal.R.drawable.stat_sys_secure, 0);
if (!mShowingLockIcon) {
mStatusBarManager.setIcon("secure",
com.android.internal.R.drawable.stat_sys_secure, 0);
mShowingLockIcon = true;
}
} else {
if (mSecureLockIcon != null) {
mStatusBarManager.removeIcon(mSecureLockIcon);
mSecureLockIcon = null;
if (mShowingLockIcon) {
mStatusBarManager.removeIcon("secure");
mShowingLockIcon = false;
}
}
}

View File

@ -19,7 +19,6 @@ package com.android.internal.policy.impl;
import android.app.Activity;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.app.IStatusBarService;
import android.app.IUiModeManager;
import android.app.UiModeManager;
import android.content.ActivityNotFoundException;
@ -47,6 +46,7 @@ import android.os.Vibrator;
import android.provider.Settings;
import com.android.internal.policy.PolicyManager;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.telephony.ITelephony;
import com.android.internal.widget.PointerLocationView;

View File

@ -31,7 +31,6 @@ android.app.ExpandableListActivity
android.app.IActivityManager
android.app.IActivityManager$ContentProviderHolder
android.app.IAlarmManager$Stub
android.app.IStatusBar$Stub
android.app.ITransientNotification$Stub
android.app.Instrumentation
android.app.IntentService
@ -654,6 +653,11 @@ com.android.internal.policy.impl.PhoneWindow$DecorView
com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
com.android.internal.policy.impl.PhoneWindowManager
com.android.internal.policy.impl.Policy
com.android.internal.statusbar.IStatusBar
com.android.internal.statusbar.IStatusBar$Stub
com.android.internal.statusbar.IStatusBarService$Stub
com.android.internal.statusbar.IStatusBarService$Stub
com.android.internal.statusbar.StatusBarIcon
com.android.internal.telephony.GsmAlphabet
com.android.internal.telephony.ITelephony$Stub
com.android.internal.telephony.ITelephony$Stub$Proxy

View File

@ -26,7 +26,6 @@ import com.android.internal.view.IInputMethodManager;
import com.android.internal.view.IInputMethodSession;
import com.android.internal.view.InputBindResult;
import com.android.server.status.IconData;
import com.android.server.status.StatusBarManagerService;
import org.xmlpull.v1.XmlPullParserException;
@ -111,8 +110,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final Handler mHandler;
final SettingsObserver mSettingsObserver;
final StatusBarManagerService mStatusBar;
final IBinder mInputMethodIcon;
final IconData mInputMethodData;
final IWindowManager mIWindowManager;
final HandlerCaller mCaller;
@ -508,9 +505,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
mStatusBar = statusBar;
mInputMethodData = IconData.makeIcon("ime", null, 0, 0, 0);
mInputMethodIcon = statusBar.addIcon(mInputMethodData, null);
statusBar.setIconVisibility(mInputMethodIcon, false);
statusBar.setIconVisibility("ime", false);
mSettingsObserver = new SettingsObserver(mHandler);
updateFromSettingsLocked();
@ -912,7 +907,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mEnabledSession = null;
mCurMethod = null;
}
mStatusBar.setIconVisibility(mInputMethodIcon, false);
mStatusBar.setIconVisibility("ime", false);
}
public void onServiceDisconnected(ComponentName name) {
@ -946,13 +941,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
synchronized (mMethodMap) {
if (iconId == 0) {
if (DEBUG) Slog.d(TAG, "hide the small icon for the input method");
mStatusBar.setIconVisibility(mInputMethodIcon, false);
mStatusBar.setIconVisibility("ime", false);
} else if (packageName != null) {
if (DEBUG) Slog.d(TAG, "show a small icon for the input method");
mInputMethodData.iconId = iconId;
mInputMethodData.iconPackage = packageName;
mStatusBar.updateIcon(mInputMethodIcon, mInputMethodData, null);
mStatusBar.setIconVisibility(mInputMethodIcon, true);
mStatusBar.setIcon("ime", packageName, iconId, 0);
mStatusBar.setIconVisibility("ime", true);
}
}
} finally {
@ -1734,8 +1727,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
p.println(" sessionRequested=" + ci.sessionRequested);
p.println(" curSession=" + ci.curSession);
}
p.println(" mInputMethodIcon=" + mInputMethodIcon);
p.println(" mInputMethodData=" + mInputMethodData);
p.println(" mCurMethodId=" + mCurMethodId);
client = mCurClient;
p.println(" mCurClient=" + client + " mCurSeq=" + mCurSeq);

View File

@ -734,7 +734,7 @@ class NotificationManagerService extends INotificationManager.Stub
r.statusBarKey = old.statusBarKey;
long identity = Binder.clearCallingIdentity();
try {
mStatusBar.updateIcon(r.statusBarKey, icon, n);
mStatusBar.updateNotification(r.statusBarKey, icon, n);
}
finally {
Binder.restoreCallingIdentity(identity);
@ -742,7 +742,7 @@ class NotificationManagerService extends INotificationManager.Stub
} else {
long identity = Binder.clearCallingIdentity();
try {
r.statusBarKey = mStatusBar.addIcon(icon, n);
r.statusBarKey = mStatusBar.addNotification(icon, n);
mAttentionLight.pulse();
}
finally {
@ -756,7 +756,7 @@ class NotificationManagerService extends INotificationManager.Stub
if (old != null && old.statusBarKey != null) {
long identity = Binder.clearCallingIdentity();
try {
mStatusBar.removeIcon(old.statusBarKey);
mStatusBar.removeNotification(old.statusBarKey);
}
finally {
Binder.restoreCallingIdentity(identity);
@ -864,7 +864,7 @@ class NotificationManagerService extends INotificationManager.Stub
if (r.notification.icon != 0) {
long identity = Binder.clearCallingIdentity();
try {
mStatusBar.removeIcon(r.statusBarKey);
mStatusBar.removeNotification(r.statusBarKey);
}
finally {
Binder.restoreCallingIdentity(identity);

View File

@ -1,85 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RemoteViews.RemoteView;
@RemoteView
public class AnimatedImageView extends ImageView {
AnimationDrawable mAnim;
boolean mAttached;
public AnimatedImageView(Context context) {
super(context);
}
public AnimatedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private void updateAnim() {
Drawable drawable = getDrawable();
if (mAttached && mAnim != null) {
mAnim.stop();
}
if (drawable instanceof AnimationDrawable) {
mAnim = (AnimationDrawable)drawable;
if (mAttached) {
mAnim.start();
}
} else {
mAnim = null;
}
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
updateAnim();
}
@Override
@android.view.RemotableViewMethod
public void setImageResource(int resid) {
super.setImageResource(resid);
updateAnim();
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
if (mAnim != null) {
mAnim.start();
}
mAttached = true;
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mAnim != null) {
mAnim.stop();
}
mAttached = false;
}
}

View File

@ -1,51 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class CloseDragHandle extends LinearLayout {
StatusBarManagerService mService;
public CloseDragHandle(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Ensure that, if there is no target under us to receive the touch,
* that we process it ourself. This makes sure that onInterceptTouchEvent()
* is always called for the entire gesture.
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN) {
mService.interceptTouchEvent(event);
}
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return mService.interceptTouchEvent(event)
? true : super.onInterceptTouchEvent(event);
}
}

View File

@ -1,89 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.AttributeSet;
import android.util.Slog;
import android.widget.TextView;
import android.view.MotionEvent;
import java.text.DateFormat;
import java.util.Date;
public final class DateView extends TextView {
private static final String TAG = "DateView";
private boolean mUpdating = false;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_TIME_TICK)
|| action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
updateClock();
}
}
};
public DateView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
setUpdates(false);
}
@Override
protected int getSuggestedMinimumWidth() {
// makes the large background bitmap not force us to full width
return 0;
}
private final void updateClock() {
Date now = new Date();
setText(DateFormat.getDateInstance(DateFormat.LONG).format(now));
}
void setUpdates(boolean update) {
if (update != mUpdating) {
mUpdating = update;
if (update) {
// Register for Intent broadcasts for the clock and battery
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
mContext.registerReceiver(mIntentReceiver, filter, null, null);
updateClock();
} else {
mContext.unregisterReceiver(mIntentReceiver);
}
}
}
}

View File

@ -1,58 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.util.Slog;
public class ExpandedView extends LinearLayout {
StatusBarManagerService mService;
int mPrevHeight = -1;
public ExpandedView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
}
/** We want to shrink down to 0, and ignore the background. */
@Override
public int getSuggestedMinimumHeight() {
return 0;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
int height = bottom - top;
if (height != mPrevHeight) {
//Slog.d(StatusBarManagerService.TAG, "height changed old=" + mPrevHeight + " new=" + height);
mPrevHeight = height;
mService.updateExpandedViewPos(StatusBarManagerService.EXPANDED_LEAVE_ALONE);
}
}
}

View File

@ -1,66 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.graphics.drawable.Drawable;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.util.Slog;
class FixedSizeDrawable extends Drawable {
Drawable mDrawable;
int mLeft;
int mTop;
int mRight;
int mBottom;
FixedSizeDrawable(Drawable that) {
mDrawable = that;
}
public void setFixedBounds(int l, int t, int r, int b) {
mLeft = l;
mTop = t;
mRight = r;
mBottom = b;
}
public void setBounds(Rect bounds) {
mDrawable.setBounds(mLeft, mTop, mRight, mBottom);
}
public void setBounds(int l, int t, int r, int b) {
mDrawable.setBounds(mLeft, mTop, mRight, mBottom);
}
public void draw(Canvas canvas) {
mDrawable.draw(canvas);
}
public int getOpacity() {
return mDrawable.getOpacity();
}
public void setAlpha(int alpha) {
mDrawable.setAlpha(alpha);
}
public void setColorFilter(ColorFilter cf) {
mDrawable.setColorFilter(cf);
}
}

View File

@ -1,133 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
public class IconMerger extends LinearLayout {
StatusBarManagerService service;
StatusBarIcon moreIcon;
public IconMerger(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
final int maxWidth = r - l;
final int N = getChildCount();
int i;
// get the rightmost one, and see if we even need to do anything
int fitRight = -1;
for (i=N-1; i>=0; i--) {
final View child = getChildAt(i);
if (child.getVisibility() != GONE) {
fitRight = child.getRight();
break;
}
}
// find the first visible one that isn't the more icon
View moreView = null;
int fitLeft = -1;
int startIndex = -1;
for (i=0; i<N; i++) {
final View child = getChildAt(i);
if (com.android.internal.R.drawable.stat_notify_more == child.getId()) {
moreView = child;
startIndex = i+1;
}
else if (child.getVisibility() != GONE) {
fitLeft = child.getLeft();
break;
}
}
if (moreView == null || startIndex < 0) {
throw new RuntimeException("Status Bar / IconMerger moreView == null");
}
// if it fits without the more icon, then hide the more icon and update fitLeft
// so everything gets pushed left
int adjust = 0;
if (fitRight - fitLeft <= maxWidth) {
adjust = fitLeft - moreView.getLeft();
fitLeft -= adjust;
fitRight -= adjust;
moreView.layout(0, moreView.getTop(), 0, moreView.getBottom());
}
int extra = fitRight - r;
int shift = -1;
int breakingPoint = fitLeft + extra + adjust;
int number = 0;
for (i=startIndex; i<N; i++) {
final View child = getChildAt(i);
if (child.getVisibility() != GONE) {
int childLeft = child.getLeft();
int childRight = child.getRight();
if (childLeft < breakingPoint) {
// hide this one
child.layout(0, child.getTop(), 0, child.getBottom());
int n = this.service.getIconNumberForView(child);
if (n == 0) {
number += 1;
} else if (n > 0) {
number += n;
}
} else {
// decide how much to shift by
if (shift < 0) {
shift = childLeft - fitLeft;
}
// shift this left by shift
child.layout(childLeft-shift, child.getTop(),
childRight-shift, child.getBottom());
}
}
}
// BUG: Updating the text during the layout here doesn't seem to cause
// the view to be redrawn fully. The text view gets resized correctly, but the
// text contents aren't drawn properly. To work around this, we post a message
// and provide the value later. We're the only one changing this value show it
// should be ordered correctly.
if (false) {
this.moreIcon.update(number);
} else {
mBugWorkaroundNumber = number;
mBugWorkaroundHandler.post(mBugWorkaroundRunnable);
}
}
private int mBugWorkaroundNumber;
private Handler mBugWorkaroundHandler = new Handler();
private Runnable mBugWorkaroundRunnable = new Runnable() {
public void run() {
IconMerger.this.moreIcon.update(mBugWorkaroundNumber);
IconMerger.this.moreIcon.view.invalidate();
}
};
}

View File

@ -1,29 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
public class NotificationLinearLayout extends LinearLayout {
public NotificationLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
}

View File

@ -1,183 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.Slog;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class StatusBarIcon {
// TODO: get this from a resource
private static final int ICON_GAP = 8;
private static final int ICON_WIDTH = 25;
private static final int ICON_HEIGHT = 25;
public View view;
IconData mData;
private TextView mTextView;
private AnimatedImageView mImageView;
private TextView mNumberView;
public StatusBarIcon(Context context, IconData data, ViewGroup parent) {
mData = data.clone();
switch (data.type) {
case IconData.TEXT: {
TextView t;
t = new TextView(context, null, com.android.internal.R.style.TextAppearance_StatusBar_Icon);
mTextView = t;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT);
t.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
t.setPadding(6, 0, 0, 0);
t.setLayoutParams(layoutParams);
t.setText(data.text);
this.view = t;
break;
}
case IconData.ICON: {
// container
LayoutInflater inflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(com.android.internal.R.layout.status_bar_icon, parent, false);
this.view = v;
// icon
AnimatedImageView im = (AnimatedImageView)v.findViewById(com.android.internal.R.id.image);
im.setImageDrawable(getIcon(context, data));
im.setImageLevel(data.iconLevel);
mImageView = im;
// number
TextView nv = (TextView)v.findViewById(com.android.internal.R.id.number);
mNumberView = nv;
if (data.number > 0) {
nv.setText("" + data.number);
nv.setVisibility(View.VISIBLE);
} else {
nv.setVisibility(View.GONE);
}
break;
}
}
}
public void update(Context context, IconData data) throws StatusBarException {
if (mData.type != data.type) {
throw new StatusBarException("status bar entry type can't change");
}
switch (data.type) {
case IconData.TEXT:
if (!TextUtils.equals(mData.text, data.text)) {
TextView tv = mTextView;
tv.setText(data.text);
}
break;
case IconData.ICON:
if (((mData.iconPackage != null && data.iconPackage != null)
&& !mData.iconPackage.equals(data.iconPackage))
|| mData.iconId != data.iconId
|| mData.iconLevel != data.iconLevel) {
ImageView im = mImageView;
im.setImageDrawable(getIcon(context, data));
im.setImageLevel(data.iconLevel);
}
if (mData.number != data.number) {
TextView nv = mNumberView;
if (data.number > 0) {
nv.setText("" + data.number);
} else {
nv.setText("");
}
}
break;
}
mData.copyFrom(data);
}
public void update(int number) {
if (mData.number != number) {
TextView nv = mNumberView;
if (number > 0) {
nv.setText("" + number);
} else {
nv.setText("");
}
}
mData.number = number;
}
/**
* Returns the right icon to use for this item, respecting the iconId and
* iconPackage (if set)
*
* @param context Context to use to get resources if iconPackage is not set
* @return Drawable for this item, or null if the package or item could not
* be found
*/
static Drawable getIcon(Context context, IconData data) {
Resources r = null;
if (data.iconPackage != null) {
try {
r = context.getPackageManager().getResourcesForApplication(data.iconPackage);
} catch (PackageManager.NameNotFoundException ex) {
Slog.e(StatusBarManagerService.TAG, "Icon package not found: " + data.iconPackage, ex);
return null;
}
} else {
r = context.getResources();
}
if (data.iconId == 0) {
Slog.w(StatusBarManagerService.TAG, "No icon ID for slot " + data.slot);
return null;
}
try {
return r.getDrawable(data.iconId);
} catch (RuntimeException e) {
Slog.w(StatusBarManagerService.TAG, "Icon not found in "
+ (data.iconPackage != null ? data.iconId : "<system>")
+ ": " + Integer.toHexString(data.iconId));
}
return null;
}
int getNumber() {
return mData.number;
}
}

View File

@ -40,7 +40,6 @@ import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.os.storage.StorageManager;
@ -105,15 +104,11 @@ public class StatusBarPolicy {
private Calendar mCalendar;
private String mClockFormatString;
private SimpleDateFormat mClockFormat;
private IBinder mClockIcon;
private IconData mClockData;
// storage
private StorageManager mStorageManager;
// battery
private IBinder mBatteryIcon;
private IconData mBatteryData;
private boolean mBatteryFirst = true;
private boolean mBatteryPlugged;
private int mBatteryLevel;
@ -127,10 +122,9 @@ public class StatusBarPolicy {
// phone
private TelephonyManager mPhone;
private IBinder mPhoneIcon;
private int mPhoneSignalIconId;
//***** Signal strength icons
private IconData mPhoneData;
//GSM/UMTS
private static final int[] sSignalImages = new int[] {
com.android.internal.R.drawable.stat_sys_signal_0,
@ -294,19 +288,13 @@ public class StatusBarPolicy {
SignalStrength mSignalStrength;
// data connection
private IBinder mDataIcon;
private IconData mDataData;
private boolean mDataIconVisible;
private boolean mHspaDataDistinguishable;
// ringer volume
private IBinder mVolumeIcon;
private IconData mVolumeData;
private boolean mVolumeVisible;
// bluetooth device status
private IBinder mBluetoothIcon;
private IconData mBluetoothData;
private int mBluetoothHeadsetState;
private boolean mBluetoothA2dpConnected;
private int mBluetoothPbapState;
@ -324,33 +312,10 @@ public class StatusBarPolicy {
private int mLastWifiSignalLevel = -1;
private boolean mIsWifiConnected = false;
private IBinder mWifiIcon;
private IconData mWifiData;
// gps
private IBinder mGpsIcon;
private IconData mGpsEnabledIconData;
private IconData mGpsFixIconData;
// alarm clock
// Icon lit when clock is set
private IBinder mAlarmClockIcon;
private IconData mAlarmClockIconData;
// sync state
// If sync is active the SyncActive icon is displayed. If sync is not active but
// sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed.
private IBinder mSyncActiveIcon;
private IBinder mSyncFailingIcon;
// TTY mode
// Icon lit when TTY mode is enabled
private IBinder mTTYModeIcon;
private IconData mTTYModeEnableIconData;
// Cdma Roaming Indicator, ERI
private IBinder mCdmaRoamingIndicatorIcon;
private IconData mCdmaRoamingIndicatorIconData;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@ -425,8 +390,7 @@ public class StatusBarPolicy {
// clock
mCalendar = Calendar.getInstance(TimeZone.getDefault());
mClockData = IconData.makeText("clock", "");
mClockIcon = service.addIcon(mClockData, null);
service.setIcon("clock", "");
updateClock();
// storage
@ -435,15 +399,13 @@ public class StatusBarPolicy {
new com.android.server.status.StorageNotification(context));
// battery
mBatteryData = IconData.makeIcon("battery",
null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0);
mBatteryIcon = service.addIcon(mBatteryData, null);
service.setIcon("battery",
null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0);
// phone_signal
mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
mPhoneData = IconData.makeIcon("phone_signal",
null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);
mPhoneIcon = service.addIcon(mPhoneData, null);
mPhoneSignalIconId = com.android.internal.R.drawable.stat_sys_signal_null;
service.setIcon("phone_signal", null, mPhoneSignalIconId, 0);
// register for phone state notifications.
((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))
@ -455,33 +417,27 @@ public class StatusBarPolicy {
| PhoneStateListener.LISTEN_DATA_ACTIVITY);
// data_connection
mDataData = IconData.makeIcon("data_connection",
null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0);
mDataIcon = service.addIcon(mDataData, null);
service.setIconVisibility(mDataIcon, false);
service.setIcon("data_connection",
null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0);
service.setIconVisibility("data_connection", false);
// wifi
mWifiData = IconData.makeIcon("wifi", null, sWifiSignalImages[0], 0, 0);
mWifiIcon = service.addIcon(mWifiData, null);
service.setIconVisibility(mWifiIcon, false);
service.setIcon("wifi", null, sWifiSignalImages[0], 0);
service.setIconVisibility("wifi", false);
// wifi will get updated by the sticky intents
// TTY status
mTTYModeEnableIconData = IconData.makeIcon("tty",
null, com.android.internal.R.drawable.stat_sys_tty_mode, 0, 0);
mTTYModeIcon = service.addIcon(mTTYModeEnableIconData, null);
service.setIconVisibility(mTTYModeIcon, false);
service.setIcon("tty", null, com.android.internal.R.drawable.stat_sys_tty_mode, 0);
service.setIconVisibility("tty", false);
// Cdma Roaming Indicator, ERI
mCdmaRoamingIndicatorIconData = IconData.makeIcon("cdma_eri",
null, com.android.internal.R.drawable.stat_sys_roaming_cdma_0, 0, 0);
mCdmaRoamingIndicatorIcon = service.addIcon(mCdmaRoamingIndicatorIconData, null);
service.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
service.setIcon("cdma_eri",
null, com.android.internal.R.drawable.stat_sys_roaming_cdma_0, 0);
service.setIconVisibility("cdma_eri", false);
// bluetooth status
mBluetoothData = IconData.makeIcon("bluetooth",
null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);
mBluetoothIcon = service.addIcon(mBluetoothData, null);
service.setIcon("bluetooth",
null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0);
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter != null) {
mBluetoothEnabled = adapter.isEnabled();
@ -491,36 +447,26 @@ public class StatusBarPolicy {
mBluetoothA2dpConnected = false;
mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
// Gps status
mGpsEnabledIconData = IconData.makeIcon("gps",
null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0);
mGpsFixIconData = IconData.makeIcon("gps",
null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0);
mGpsIcon = service.addIcon(mGpsEnabledIconData, null);
service.setIconVisibility(mGpsIcon, false);
service.setIcon("gps",
null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0);
service.setIconVisibility("gps", false);
// Alarm clock
mAlarmClockIconData = IconData.makeIcon(
"alarm_clock",
null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0);
mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null);
service.setIconVisibility(mAlarmClockIcon, false);
service.setIcon("alarm_clock", null, com.android.internal.R.drawable.stat_notify_alarm, 0);
service.setIconVisibility("alarm_clock", false);
// Sync state
mSyncActiveIcon = service.addIcon(IconData.makeIcon("sync_active",
null, R.drawable.stat_notify_sync_anim0, 0, 0), null);
mSyncFailingIcon = service.addIcon(IconData.makeIcon("sync_failing",
null, R.drawable.stat_notify_sync_error, 0, 0), null);
service.setIconVisibility(mSyncActiveIcon, false);
service.setIconVisibility(mSyncFailingIcon, false);
service.setIcon("sync_active", null, R.drawable.stat_notify_sync_anim0, 0);
service.setIcon("sync_failing", null, R.drawable.stat_notify_sync_error, 0);
service.setIconVisibility("sync_active", false);
service.setIconVisibility("sync_failing", false);
// volume
mVolumeData = IconData.makeIcon("volume",
null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0);
mVolumeIcon = service.addIcon(mVolumeData, null);
service.setIconVisibility(mVolumeIcon, false);
service.setIcon("volume", null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0);
service.setIconVisibility("volume", false);
updateVolume();
IntentFilter filter = new IntentFilter();
@ -649,30 +595,29 @@ public class StatusBarPolicy {
private final void updateClock() {
mCalendar.setTimeInMillis(System.currentTimeMillis());
mClockData.text = getSmallTime();
mService.updateIcon(mClockIcon, mClockData, null);
mService.setIcon("clock", getSmallTime());
}
private final void updateAlarm(Intent intent) {
boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
mService.setIconVisibility(mAlarmClockIcon, alarmSet);
mService.setIconVisibility("alarm_clock", alarmSet);
}
private final void updateSyncState(Intent intent) {
boolean isActive = intent.getBooleanExtra("active", false);
boolean isFailing = intent.getBooleanExtra("failing", false);
mService.setIconVisibility(mSyncActiveIcon, isActive);
mService.setIconVisibility("sync_active", isActive);
// Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never"
//mService.setIconVisibility(mSyncFailingIcon, isFailing && !isActive);
//mService.setIconVisibility("sync_failing", isFailing && !isActive);
}
private final void updateBattery(Intent intent) {
mBatteryData.iconId = intent.getIntExtra("icon-small", 0);
mBatteryData.iconLevel = intent.getIntExtra("level", 0);
mService.updateIcon(mBatteryIcon, mBatteryData, null);
final int id = intent.getIntExtra("icon-small", 0);
int level = intent.getIntExtra("level", 0);
mService.setIcon("battery", null, id, level);
boolean plugged = intent.getIntExtra("plugged", 0) != 0;
int level = intent.getIntExtra("level", -1);
level = intent.getIntExtra("level", -1);
if (false) {
Slog.d(TAG, "updateBattery level=" + level
+ " plugged=" + plugged
@ -1003,11 +948,11 @@ public class StatusBarPolicy {
//Slog.d(TAG, "updateSignalStrength: no service");
if (Settings.System.getInt(mContext.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
mPhoneSignalIconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
} else {
mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;
mPhoneSignalIconId = com.android.internal.R.drawable.stat_sys_signal_null;
}
mService.updateIcon(mPhoneIcon, mPhoneData, null);
mService.setIcon("phone_signal", null, mPhoneSignalIconId, 0);
return;
}
@ -1045,8 +990,8 @@ public class StatusBarPolicy {
iconLevel = getCdmaLevel();
}
}
mPhoneData.iconId = iconList[iconLevel];
mService.updateIcon(mPhoneIcon, mPhoneData, null);
mPhoneSignalIconId = iconList[iconLevel];
mService.setIcon("phone_signal", null, mPhoneSignalIconId, 0);
}
private int getCdmaLevel() {
@ -1149,14 +1094,13 @@ public class StatusBarPolicy {
iconId = mDataIconList[0];
break;
}
mDataData.iconId = iconId;
mService.updateIcon(mDataIcon, mDataData, null);
mService.setIcon("data_connection", null, iconId, 0);
} else {
visible = false;
}
} else {
mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim;
mService.updateIcon(mDataIcon, mDataData, null);
iconId = com.android.internal.R.drawable.stat_sys_no_sim;
mService.setIcon("data_connection", null, iconId, 0);
}
} else {
// CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
@ -1176,8 +1120,7 @@ public class StatusBarPolicy {
iconId = mDataIconList[0];
break;
}
mDataData.iconId = iconId;
mService.updateIcon(mDataIcon, mDataData, null);
mService.setIcon("data_connection", null, iconId, 0);
} else {
visible = false;
}
@ -1192,7 +1135,7 @@ public class StatusBarPolicy {
}
if (mDataIconVisible != visible) {
mService.setIconVisibility(mDataIcon, visible);
mService.setIconVisibility("data_connection", visible);
mDataIconVisible = visible;
}
}
@ -1207,11 +1150,10 @@ public class StatusBarPolicy {
: com.android.internal.R.drawable.stat_sys_ringer_silent;
if (visible) {
mVolumeData.iconId = iconId;
mService.updateIcon(mVolumeIcon, mVolumeData, null);
mService.setIcon("volume", null, iconId, 0);
}
if (visible != mVolumeVisible) {
mService.setIconVisibility(mVolumeIcon, visible);
mService.setIconVisibility("volume", visible);
mVolumeVisible = visible;
}
}
@ -1244,9 +1186,8 @@ public class StatusBarPolicy {
iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected;
}
mBluetoothData.iconId = iconId;
mService.updateIcon(mBluetoothIcon, mBluetoothData, null);
mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
mService.setIcon("bluetooth", null, iconId, 0);
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
}
private final void updateWifi(Intent intent) {
@ -1258,14 +1199,14 @@ public class StatusBarPolicy {
if (!enabled) {
// If disabled, hide the icon. (We show icon when connected.)
mService.setIconVisibility(mWifiIcon, false);
mService.setIconVisibility("wifi", false);
}
} else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
false);
if (!enabled) {
mService.setIconVisibility(mWifiIcon, false);
mService.setIconVisibility("wifi", false);
}
} else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
@ -1282,7 +1223,7 @@ public class StatusBarPolicy {
}
// Show the icon since wi-fi is connected
mService.setIconVisibility(mWifiIcon, true);
mService.setIconVisibility("wifi", true);
} else {
mLastWifiSignalLevel = -1;
@ -1290,23 +1231,23 @@ public class StatusBarPolicy {
iconId = sWifiSignalImages[0];
// Hide the icon since we're not connected
mService.setIconVisibility(mWifiIcon, false);
mService.setIconVisibility("wifi", false);
}
mWifiData.iconId = iconId;
mService.updateIcon(mWifiIcon, mWifiData, null);
mService.setIcon("wifi", null, iconId, 0);
} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
int iconId;
final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
int newSignalLevel = WifiManager.calculateSignalLevel(newRssi,
sWifiSignalImages.length);
if (newSignalLevel != mLastWifiSignalLevel) {
mLastWifiSignalLevel = newSignalLevel;
if (mIsWifiConnected) {
mWifiData.iconId = sWifiSignalImages[newSignalLevel];
iconId = sWifiSignalImages[newSignalLevel];
} else {
mWifiData.iconId = sWifiTemporarilyNotConnectedImage;
iconId = sWifiTemporarilyNotConnectedImage;
}
mService.updateIcon(mWifiIcon, mWifiData, null);
mService.setIcon("wifi", null, iconId, 0);
}
}
}
@ -1317,15 +1258,16 @@ public class StatusBarPolicy {
if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) {
// GPS is getting fixes
mService.updateIcon(mGpsIcon, mGpsFixIconData, null);
mService.setIconVisibility(mGpsIcon, true);
mService.setIcon("gps", null, com.android.internal.R.drawable.stat_sys_gps_on, 0);
mService.setIconVisibility("gps", true);
} else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
// GPS is off
mService.setIconVisibility(mGpsIcon, false);
mService.setIconVisibility("gps", false);
} else {
// GPS is on, but not receiving fixes
mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null);
mService.setIconVisibility(mGpsIcon, true);
mService.setIcon("gps",
null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0);
mService.setIconVisibility("gps", true);
}
}
@ -1338,23 +1280,23 @@ public class StatusBarPolicy {
if (enabled) {
// TTY is on
if (false) Slog.v(TAG, "updateTTY: set TTY on");
mService.updateIcon(mTTYModeIcon, mTTYModeEnableIconData, null);
mService.setIconVisibility(mTTYModeIcon, true);
mService.setIcon("tty", null, com.android.internal.R.drawable.stat_sys_tty_mode, 0);
mService.setIconVisibility("tty", true);
} else {
// TTY is off
if (false) Slog.v(TAG, "updateTTY: set TTY off");
mService.setIconVisibility(mTTYModeIcon, false);
mService.setIconVisibility("tty", false);
}
}
private final void updateCdmaRoamingIcon(ServiceState state) {
if (!hasService()) {
mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
mService.setIconVisibility("cdma_eri", false);
return;
}
if (!isCdma()) {
mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
mService.setIconVisibility("cdma_eri", false);
return;
}
@ -1374,25 +1316,23 @@ public class StatusBarPolicy {
if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) {
if (false) Slog.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
mService.setIconVisibility("cdma_eri", false);
return;
}
switch (iconMode) {
case EriInfo.ROAMING_ICON_MODE_NORMAL:
mCdmaRoamingIndicatorIconData.iconId = iconList[iconIndex];
mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
mService.setIcon("cdma_eri", null, iconList[iconIndex], 0);
mService.setIconVisibility("cdma_eri", true);
break;
case EriInfo.ROAMING_ICON_MODE_FLASH:
mCdmaRoamingIndicatorIconData.iconId =
com.android.internal.R.drawable.stat_sys_roaming_cdma_flash;
mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
mService.setIcon("cdma_eri",
null, com.android.internal.R.drawable.stat_sys_roaming_cdma_flash, 0);
mService.setIconVisibility("cdma_eri", true);
break;
}
mService.updateIcon(mPhoneIcon, mPhoneData, null);
mService.setIcon("phone_signal", null, mPhoneSignalIconId, 0);
}

View File

@ -1,63 +0,0 @@
/*
* Copyright (C) 2008 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.server.status;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Display;
import android.view.KeyEvent;
import android.view.WindowManager;
import android.widget.LinearLayout;
public class TrackingView extends LinearLayout {
final Display mDisplay;
StatusBarManagerService mService;
boolean mTracking;
int mStartX, mStartY;
public TrackingView(Context context, AttributeSet attrs) {
super(context, attrs);
mDisplay = ((WindowManager)context.getSystemService(
Context.WINDOW_SERVICE)).getDefaultDisplay();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mService.updateExpandedHeight();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BACK:
if (down) {
mService.deactivate();
}
return true;
}
return super.dispatchKeyEvent(event);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mService.onTrackingViewAttached();
}
}