summaryrefslogtreecommitdiffstats
path: root/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java
diff options
context:
space:
mode:
Diffstat (limited to 'packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java')
-rw-r--r--packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java186
1 files changed, 186 insertions, 0 deletions
diff --git a/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java b/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java
new file mode 100644
index 0000000..1932f43
--- /dev/null
+++ b/packages/StatusBarPhone/src/com/android/policy/statusbar/phone/StatusBarIconData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.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 StatusBarIconData {
+ // 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 StatusBarIconData(Context context, IconData data, ViewGroup parent) {
+ mData = data.clone();
+
+ switch (data.type) {
+ case IconData.TEXT: {
+ TextView t;
+ t = new TextView(context);
+ mTextView = t;
+ LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.MATCH_PARENT);
+ t.setTextSize(16);
+ t.setTextColor(0xff000000);
+ t.setTypeface(Typeface.DEFAULT_BOLD);
+ 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(R.layout.status_bar_icon, parent, false);
+ this.view = v;
+
+ // icon
+ 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(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(PhoneStatusBarService.TAG, "Icon package not found: " + data.iconPackage, ex);
+ return null;
+ }
+ } else {
+ r = context.getResources();
+ }
+
+ if (data.iconId == 0) {
+ Slog.w(PhoneStatusBarService.TAG, "No icon ID for slot " + data.slot);
+ return null;
+ }
+
+ try {
+ return r.getDrawable(data.iconId);
+ } catch (RuntimeException e) {
+ Slog.w(PhoneStatusBarService.TAG, "Icon not found in "
+ + (data.iconPackage != null ? data.iconId : "<system>")
+ + ": " + Integer.toHexString(data.iconId));
+ }
+
+ return null;
+ }
+
+ int getNumber() {
+ return mData.number;
+ }
+}
+