184 lines
6.2 KiB
Java
184 lines
6.2 KiB
Java
/*
|
|
* 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;
|
|
|
|
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;
|
|
}
|
|
}
|
|
|