diff options
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.java | 186 |
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; + } +} + |