package com.android.systemui.statusbar;
import com.android.systemui.statusbar.SeviceSocket;
import android.content.ComponentName;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import java.io.File;
import java.io.FileReader;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
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.internal.statusbar.StatusBarNotification;
import android.app.ActivityManagerNative;
import android.app.Dialog;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Binder;
import android.os.Handler;
import android.os.Message;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Slog;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.FrameLayout;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.StatusBarPolicy;
public class StatusBarService extends Service implements CommandQueue.Callbacks {
static final String TAG = "StatusBarService";
static final boolean SPEW_ICONS = false;
static final boolean SPEW = false;
public static final String ACTION_STATUSBAR_START
= "com.android.internal.policy.statusbar.START";
static final int EXPANDED_LEAVE_ALONE = -10000;
static final int EXPANDED_FULL_OPEN = -10001;
private static final int MSG_ANIMATE = 1000;
private static final int MSG_ANIMATE_REVEAL = 1001;
StatusBarPolicy mIconPolicy;
CommandQueue mCommandQueue;
IStatusBarService mBarService;
int mIconSize;
Display mDisplay;
StatusBarView mStatusBarView;
int mPixelFormat;
H mHandler = new H();
Object mQueueLock = new Object();
// icons
LinearLayout mIcons;
IconMerger mNotificationIcons;
LinearLayout mStatusIcons;
// expanded notifications
Dialog mExpandedDialog;
ExpandedView mExpandedView;
WindowManager.LayoutParams mExpandedParams;
ScrollView mScrollView;
View mNotificationLinearLayout;
View mExpandedContents;
// top bar
TextView mNoNotificationsTitle;
TextView mClearButton;
// drag bar
CloseDragHandle mCloseView;
// ongoing
NotificationData mOngoing = new NotificationData();
TextView mOngoingTitle;
LinearLayout mOngoingItems;
// latest
NotificationData mLatest = new NotificationData();
TextView mLatestTitle;
LinearLayout mLatestItems;
// position
int[] mPositionTmp = new int[2];
boolean mExpanded;
boolean mExpandedVisible;
// the date view
DateView mDateView;
// the tracker view
TrackingView mTrackingView;
WindowManager.LayoutParams mTrackingParams;
int mTrackingPosition; // the position of the top of the tracking view.
private boolean mPanelSlightlyVisible;
// ticker
private Ticker mTicker;
private View mTickerView;
private boolean mTicking;
// Tracking finger for opening/closing.
int mEdgeBorder; // corresponds to R.dimen.status_bar_edge_ignore
boolean mTracking;
VelocityTracker mVelocityTracker;
static final int ANIM_FRAME_DURATION = (1000/60);
boolean mAnimating;
long mCurAnimationTime;
float mDisplayHeight;
float mAnimY;
float mAnimVel;
float mAnimAccel;
long mAnimLastTime;
boolean mAnimatingReveal = false;
int mViewDelta;
int[] mAbsPos = new int[2];
// for disabling the status bar
int mDisabled = 0;
//F/r/i/e/n/d/l/y/A/R/M
private static SeviceSocket seviceSocket = null;
private NotificationManager myNotiManager;
private class ExpandedDialog extends Dialog {
ExpandedDialog(Context context) {
super(context, com.android.internal.R.style.Theme_Light_NoTitleBar);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BACK:
if (!down) {
animateCollapse();
}
return true;
}
return super.dispatchKeyEvent(event);
}
}
@Override
public void onCreate() {
// First set up our views and stuff.
mDisplay = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
makeStatusBarView(this);
// Connect in to the status bar manager service
StatusBarIconList iconList = new StatusBarIconList();
ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
mCommandQueue = new CommandQueue(this, iconList);
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
try {
mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
// Set up the initial icon state
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++;
}
}
// Set up the initial notification state
N = notificationKeys.size();
if (N == notifications.size()) {
for (int i=0; i<N; i++) {
addNotification(notificationKeys.get(i), notifications.get(i));
}
} else {
Log.wtf(TAG, "Notification list length mismatch: keys=" + N
+ " notifications=" + notifications.size());
}
// Put up the view
addStatusBarView();
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new StatusBarPolicy(this);
//F/r/i/e/n/d/l/y/A/R/M
myNotiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
seviceSocket = new SeviceSocket(new SeviceSocket.RecvCallBack() {
public void responseIncoming(String response) {
processNETStatusResponse(response);
}
});
timerToConnService.schedule(taskConnectService,1,8000);
}
//{{F-r-i-e-n-d-l-y-A-R-M
private void setStatusI