public abstract class StatusBar extends SystemUI implements CommandQueue.Callbacks {
static final String TAG = "StatusBar" ;
private static final boolean SPEW = false ;
protected CommandQueue mCommandQueue;
protected IStatusBarService mBarService;
// Up-call methods
protected abstract View makeStatusBarView();
protected abstract int getStatusBarGravity();
public abstract int getStatusBarHeight();
public abstract void animateCollapse();
private DoNotDisturb mDoNotDisturb;
<font color= "\"#ff00ff\"" > private View mStatusBarView;
private int mStatusBarHeight;
private WindowManager.LayoutParams mStatusBarLayoutParams;</font>
public void start() {
// First set up our views and stuff.
View sb = makeStatusBarView();
// 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));
int [] switches = new int [ 7 ];
ArrayList<IBinder> binders = new ArrayList<IBinder>();
try {
mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications,
switches, binders);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
disable(switches[ 0 ]);
setSystemUiVisibility(switches[ 1 ]);
topAppWindowChanged(switches[ 2 ] != 0 );
// StatusBarManagerService has a back up of IME token and it's restored here.
setImeWindowStatus(binders.get( 0 ), switches[ 3 ], switches[ 4 ]);
setHardKeyboardStatus(switches[ 5 ] != 0 , switches[ 6 ] != 0 );
// 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
final int height = getStatusBarHeight();
<font color= "\"#ff00ff\"" > mStatusBarHeight = height;</font>
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
height,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
PixelFormat.OPAQUE);
// the status bar should be in an overlay if possible
final Display defaultDisplay
= ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
if (ActivityManager.isHighEndGfx(defaultDisplay)) {
lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
}
lp.gravity = getStatusBarGravity();
lp.setTitle( "StatusBar" );
lp.packageName = mContext.getPackageName();
lp.windowAnimations = R.style.Animation_StatusBar;
<font color= "\"#ff00ff\"" > mStatusBarLayoutParams = lp;
mStatusBarView = sb;</font>
WindowManagerImpl.getDefault().addView(sb, lp);
if (SPEW) {
Slog.d(TAG, "Added status bar view: gravity=0x" + Integer.toHexString(lp.gravity)
+ " icons=" + iconList.size()
+ " disabled=0x" + Integer.toHexString(switches[ 0 ])
+ " lights=" + switches[ 1 ]
+ " menu=" + switches[ 2 ]
+ " imeButton=" + switches[ 3 ]
);
}
mDoNotDisturb = new DoNotDisturb(mContext);
}
protected View updateNotificationVetoButton(View row, StatusBarNotification n) {
View vetoButton = row.findViewById(R.id.veto);
if (n.isClearable()) {
final String _pkg = n.pkg;
final String _tag = n.tag;
final int _id = n.id;
vetoButton.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
try {
mBarService.onNotificationClear(_pkg, _tag, _id);
} catch (RemoteException ex) {
// system process is dead if we're here.
}
}
});
vetoButton.setVisibility(View.VISIBLE);
} else {
vetoButton.setVisibility(View.GONE);
}
return vetoButton;
}
<font color= "\"#ff00ff\"" > @Override
public void onReceive(String action) {
Log.d(TAG, "*** onReceive(), action = " + action + " ***" );
if (SystemUIService.ACTION_DISPLAY_STATUS_BAR.equals(action)) {
mStatusBarLayoutParams.height = mStatusBarHeight;
WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,
mStatusBarLayoutParams);
} else if (SystemUIService.ACTION_HIDE_STATUS_BAR.equals(action)) {
mStatusBarLayoutParams.height = 0 ;
WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,
mStatusBarLayoutParams);
}</font>
}
}
|