1:修改frameworks/base/packages/SystemUI/src/com/Android/systemui/SystemUIService.Java
import android.content.IntentFilter;
- @Override
- public void onCreate() {
- // Pick status bar or system bar.
- IWindowManager wm = IWindowManager.Stub.asInterface(
- ServiceManager.getService(Context.WINDOW_SERVICE));
- try {
- SERVICES[0] = wm.canStatusBarHide()
- ? R.string.config_statusBarComponent
- : R.string.config_systemBarComponent;
- } catch (RemoteException e) {
- Slog.w(TAG, "Failing checking whether status bar can hide", e);
- }
- final int N = SERVICES.length;
- mServices = new SystemUI[N];
- for (int i=0; i<N; i++) {
- Class cl = chooseClass(SERVICES[i]);
- Slog.d(TAG, "loading: " + cl);
- try {
- mServices[i] = (SystemUI)cl.newInstance();
- } catch (IllegalAccessException ex) {
- throw new RuntimeException(ex);
- } catch (InstantiationException ex) {
- throw new RuntimeException(ex);
- }
- mServices[i].mContext = this;
- Slog.d(TAG, "running: " + mServices[i]);
- mServices[i].start();
- }
- //add by xiaoge
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intent.ACTION_DISPLAY_STATUS_BAR);
- intentFilter.addAction(Intent.ACTION_HIDE_STATUS_BAR);
- registerReceiver(mStatusBarReceiver, intentFilter);
- }
- //add by xiaoge
- BroadcastReceiver mStatusBarReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent != null) {
- String action = intent.getAction();
- final int N = SERVICES.length;
- for (int i = 0; i < N; i++) {
- Slog.d(TAG, "invoke: " + mServices[i] + "'s onReceive()");
- mServices[i].onReceive(action);
- }
- }
- }
- };
2:修改frameworks/base/core/java/android/content/Intent.java
- //add by xiaoge
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_DISPLAY_STATUS_BAR = "android.intent.action.DISPLAY_STATUS_BAR";
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_HIDE_STATUS_BAR = "android.intent.action.HIDE_STATUS_BAR";
- //add ends
3:修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
- 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.os.Handler;
- import android.os.Message;
- import android.os.ServiceManager;
- import android.app.Notification;
- import android.app.PendingIntent;
- import android.app.ActivityManager;
- import android.app.Service;
- import android.content.Context;
- import android.content.Intent;
- import android.content.res.Resources;
- import android.graphics.PixelFormat;
- import android.os.IBinder;
- import android.os.RemoteException;
- import android.os.ServiceManager;
- import android.util.Slog;
- import android.util.Log;
- import android.view.Display;
- import android.view.Gravity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.WindowManager;
- import android.view.WindowManagerImpl;
- import java.util.ArrayList;
- 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 com.android.systemui.SystemUI;
- import com.android.systemui.R;
- public abstract class StatusBar extends SystemUI implements CommandQueue.Callbacks {
- static final String TAG = "StatusBar";
- private static final boolean SPEW = false;
- //add by xiaoge
- private View mStatusBarView;
- private int mStatusBarHeight;
- private WindowManager.LayoutParams mStatusBarLayoutParams;
- protected CommandQueue mCommandQueue;
- protected IStatusBarService mBarService;
- //F/r/i/e/n/d/l/y/A/R/M
- private static SeviceSocket seviceSocket = null;
- private NotificationManager myNotiManager;
- // Up-call methods
- protected abstract View makeStatusBarView();
- protected abstract int getStatusBarGravity();
- public abstract int getStatusBarHeight();
- public abstract void animateCollapse();
- private DoNotDisturb mDoNotDisturb;
- //{{F-r-i-e-n-d-l-y-A-R-M
- private void setStatusIcon(int iconId, String text) {
- Intent notifyIntent=new Intent();
- notifyIntent.setComponent(new ComponentName("com.friendlyarm.net3gdialup", "com.friendlyarm.net3gdialup.ActivityMain"));
- notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- PendingIntent appIntent = PendingIntent.getActivity(mContext, 0,
- notifyIntent, 0);
- Notification myNoti = new Notification();
- myNoti.icon = iconId;
- myNoti.tickerText = text;
- myNoti.defaults = Notification.DEFAULT_LIGHTS;
- myNoti.setLatestEventInfo(mContext, "3G Network Status",text, appIntent);
- myNotiManager.notify(0, myNoti);
- }
- private void removeStatusIcon() {
- myNotiManager.cancelAll();
- }
- private int lastNetworkStatus = -1;
- private boolean isConnectService = false;
- private final int CONNECT_TO_SERVICE_MSG = 100;
- private final int REQUEST_NETSTATUS_MSG = 101;
- private Timer timerToConnService = new Timer();
- private Timer timerToRequestStatus = new Timer();
- private Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case CONNECT_TO_SERVICE_MSG:
- timerToConnService.cancel();
- seviceSocket.connectToService();
- break;
- case REQUEST_NETSTATUS_MSG:
- seviceSocket.sendRequest("REQUEST NETSTATUS\n");
- seviceSocket.recvResponse();
- break;
- }
- super.handleMessage(msg);
- }
- };
- private TimerTask taskConnectService = new TimerTask() {
- public void run() {
- Message message = new Message();
- message.what = CONNECT_TO_SERVICE_MSG;
- handler.sendMessage(message);
- }
- };
- private TimerTask taskRequestNetStatus = new TimerTask() {
- public void run() {
- Message message = new Message();
- message.what = REQUEST_NETSTATUS_MSG;
- handler.sendMessage(message);
- }
- };
- private void processNETStatusResponse(String response) {
- String[] results = response.split(" ");
- if (response.startsWith("RESPONSE CONNECT OK")) {
- seviceSocket.sendRequest("REQUEST 3GAUTOCONNECT GETSTATUS");
- seviceSocket.recvResponse();
- } else if (response.startsWith(new String("RESPONSE 3GAUTOCONNECT")) && results.length == 6) {
- if (Integer.parseInt(results[2]) == 1 && results[3].startsWith(new String("3GNET"))) {
- timerToRequestStatus.schedule(taskRequestNetStatus,1,3000);
- } else {
- seviceSocket.disconnect();
- }
- } else if (response.startsWith(new String("RESPONSE NETSTATUS"))
- && results.length >= 5) {
- if (results[2].startsWith(new String("DOWN"))) {
- if (lastNetworkStatus != 0) {
- removeStatusIcon();
- }
- lastNetworkStatus = 0;
- } else if (results[2].startsWith(new String("UP"))
- && results.length == 8) {
- if (lastNetworkStatus != 1) {
- setStatusIcon(com.android.internal.R.drawable.net3g, "Connected. (FriendlyARM-3G)");
- }
- lastNetworkStatus = 1;
- }
- }
- }
- //}}
- public void start() {
- // First set up our views and stuff.
- View sb = makeStatusBarView();
- //F/r/i/e/n/d/l/y/A/R/M
- myNotiManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- seviceSocket = new SeviceSocket(new SeviceSocket.RecvCallBack() {
- public void responseIncoming(String response) {
- processNETStatusResponse(response);
- }
- });
- // 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();
- mStatusBarHeight = height;//add by xiaoge
- 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,
- // We use a pixel format of RGB565 for the status bar to save memory bandwidth and
- // to ensure that the layer can be handled by HWComposer. On some devices the
- // HWComposer is unable to handle SW-rendered RGBX_8888 layers.
- PixelFormat.RGB_565);
- // the status bar should be in an overlay if possible
- final Display defaultDisplay
- = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
- .getDefaultDisplay();
- // We explicitly leave FLAG_HARDWARE_ACCELERATED out of the flags. The status bar occupies
- // very little screen real-estate and is updated fairly frequently. By using CPU rendering
- // for the status bar, we prevent the GPU from having to wake up just to do these small
- // updates, which should help keep power consumption down.
- lp.gravity = getStatusBarGravity();
- lp.setTitle("StatusBar");
- lp.packageName = mContext.getPackageName();
- lp.windowAnimations = R.style.Animation_StatusBar;
- //add by xiaoge
- mStatusBarLayoutParams = lp;
- mStatusBarView = sb;
- 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;
- }
- //add by xiaoge
- public void onReceive(String action) {
- Log.d(TAG, "*** onReceive(), action = " + action + " ***");
- if (Intent.ACTION_DISPLAY_STATUS_BAR.equals(action)) {
- mStatusBarLayoutParams.height = mStatusBarHeight;
- WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,
- mStatusBarLayoutParams);
- } else if (Intent.ACTION_HIDE_STATUS_BAR.equals(action)) {
- mStatusBarLayoutParams.height = 0;
- WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,
- mStatusBarLayoutParams);
- }
- }
- }
4:修改frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI.java
- package com.android.systemui;
- import java.io.FileDescriptor;
- import java.io.PrintWriter;
- import android.content.Context;
- import android.content.res.Configuration;
- public abstract class SystemUI {
- public Context mContext;
- public abstract void start();
- public abstract void onReceive(String action);//add by xiaoge
- protected void onConfigurationChanged(Configuration newConfig) {
- }
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- }
- }
5:修改frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java,添加函数
- //add by xiaoge
- public void onReceive(String action) {
- }
6:显示statusbar方法:sendBroadcast(new Intent(Intent.ACTION_DISPLAY_STATUS_BAR));
或者sendBroadcast(new Intent("android.intent.action.DISPLAY_STATUS_BAR"));
7:隐藏statusbar:sendBroadcast(new Intent(Intent.ACTION_HIDE_STATUS_BAR));
或者sendBroadcast(new Intent("android.intent.action.HIDE_STATUS_BAR"));