The status bar draws its icons now.
This commit is contained in:
@ -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 \
|
||||
|
@ -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)
|
||||
|
||||
|
||||
# ************************************************
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
20
core/java/com/android/internal/statusbar/StatusBarIcon.aidl
Normal file
20
core/java/com/android/internal/statusbar/StatusBarIcon.aidl
Normal 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;
|
||||
|
83
core/java/com/android/internal/statusbar/StatusBarIcon.java
Normal file
83
core/java/com/android/internal/statusbar/StatusBarIcon.java
Normal 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];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -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;
|
||||
|
167
core/java/com/android/internal/statusbar/StatusBarIconList.java
Normal file
167
core/java/com/android/internal/statusbar/StatusBarIconList.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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>
|
@ -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>
|
@ -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 |
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
/>
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
@ -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;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
};
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user