淘先锋技术网

首页 1 2 3 4 5 6 7

1:修改frameworks/base/packages/SystemUI/src/com/Android/systemui/SystemUIService.Java

      import android.content.IntentFilter;      

  1. @Override  
  2.     public void onCreate() {  
  3.         // Pick status bar or system bar.  
  4.         IWindowManager wm = IWindowManager.Stub.asInterface(  
  5.                 ServiceManager.getService(Context.WINDOW_SERVICE));  
  6.         try {  
  7.             SERVICES[0] = wm.canStatusBarHide()  
  8.                     ? R.string.config_statusBarComponent  
  9.                     : R.string.config_systemBarComponent;  
  10.         } catch (RemoteException e) {  
  11.             Slog.w(TAG, "Failing checking whether status bar can hide", e);  
  12.         }  
  13.   
  14.         final int N = SERVICES.length;  
  15.         mServices = new SystemUI[N];  
  16.         for (int i=0; i<N; i++) {  
  17.             Class cl = chooseClass(SERVICES[i]);  
  18.             Slog.d(TAG, "loading: " + cl);  
  19.             try {  
  20.                 mServices[i] = (SystemUI)cl.newInstance();  
  21.             } catch (IllegalAccessException ex) {  
  22.                 throw new RuntimeException(ex);  
  23.             } catch (InstantiationException ex) {  
  24.                 throw new RuntimeException(ex);  
  25.             }  
  26.             mServices[i].mContext = this;  
  27.             Slog.d(TAG, "running: " + mServices[i]);  
  28.             mServices[i].start();  
  29.         }  
  30.         //add by xiaoge  
  31.         IntentFilter intentFilter = new IntentFilter();  
  32.         intentFilter.addAction(Intent.ACTION_DISPLAY_STATUS_BAR);  
  33.         intentFilter.addAction(Intent.ACTION_HIDE_STATUS_BAR);  
  34.         registerReceiver(mStatusBarReceiver, intentFilter);  
  35.     }  
  36.     //add by xiaoge  
  37.     BroadcastReceiver mStatusBarReceiver = new BroadcastReceiver() {  
  38.         @Override  
  39.         public void onReceive(Context context, Intent intent) {  
  40.             if (intent != null) {  
  41.                 String action = intent.getAction();  
  42.   
  43.                 final int N = SERVICES.length;  
  44.                 for (int i = 0; i < N; i++) {  
  45.                     Slog.d(TAG, "invoke: " + mServices[i] + "'s onReceive()");  
  46.                     mServices[i].onReceive(action);  
  47.                 }  
  48.             }  
  49.         }  
  50.     };  

2:修改frameworks/base/core/java/android/content/Intent.java
  1. //add by xiaoge  
  2.     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)  
  3.     public static final String ACTION_DISPLAY_STATUS_BAR = "android.intent.action.DISPLAY_STATUS_BAR";  
  4.   
  5.     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)  
  6.     public static final String ACTION_HIDE_STATUS_BAR = "android.intent.action.HIDE_STATUS_BAR";  
  7.     //add ends  

3:修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java

  1.   
  2.   
  3. package com.android.systemui.statusbar;  
  4.   
  5. import com.android.systemui.statusbar.SeviceSocket;  
  6. import android.content.ComponentName;  
  7. import android.app.Notification;  
  8. import android.app.NotificationManager;  
  9. import android.app.PendingIntent;  
  10. import java.io.File;  
  11. import java.io.FileReader;  
  12. import java.util.Timer;  
  13. import java.util.TimerTask;  
  14. import android.os.Handler;  
  15. import android.os.Message;  
  16. import android.os.ServiceManager;  
  17. import android.app.Notification;  
  18. import android.app.PendingIntent;  
  19.   
  20. import android.app.ActivityManager;  
  21. import android.app.Service;  
  22. import android.content.Context;  
  23. import android.content.Intent;  
  24. import android.content.res.Resources;  
  25. import android.graphics.PixelFormat;  
  26. import android.os.IBinder;  
  27. import android.os.RemoteException;  
  28. import android.os.ServiceManager;  
  29. import android.util.Slog;  
  30. import android.util.Log;  
  31. import android.view.Display;  
  32. import android.view.Gravity;  
  33. import android.view.View;  
  34. import android.view.ViewGroup;  
  35. import android.view.WindowManager;  
  36. import android.view.WindowManagerImpl;  
  37.   
  38. import java.util.ArrayList;  
  39.   
  40. import com.android.internal.statusbar.IStatusBarService;  
  41. import com.android.internal.statusbar.StatusBarIcon;  
  42. import com.android.internal.statusbar.StatusBarIconList;  
  43. import com.android.internal.statusbar.StatusBarNotification;  
  44.   
  45. import com.android.systemui.SystemUI;  
  46. import com.android.systemui.R;  
  47.   
  48. public abstract class StatusBar extends SystemUI implements CommandQueue.Callbacks {  
  49.     static final String TAG = "StatusBar";  
  50.     private static final boolean SPEW = false;  
  51.     //add by xiaoge  
  52.     private View mStatusBarView;  
  53.     private int mStatusBarHeight;  
  54.     private WindowManager.LayoutParams mStatusBarLayoutParams;  
  55.   
  56.     protected CommandQueue mCommandQueue;  
  57.     protected IStatusBarService mBarService;  
  58.   
  59.     //F/r/i/e/n/d/l/y/A/R/M  
  60.     private static SeviceSocket seviceSocket = null;  
  61.     private NotificationManager myNotiManager;  
  62.   
  63.     // Up-call methods  
  64.     protected abstract View makeStatusBarView();  
  65.     protected abstract int getStatusBarGravity();  
  66.     public abstract int getStatusBarHeight();  
  67.     public abstract void animateCollapse();  
  68.   
  69.     private DoNotDisturb mDoNotDisturb;  
  70.   
  71.    
  72.     //{{F-r-i-e-n-d-l-y-A-R-M  
  73.     private void setStatusIcon(int iconId, String text) {  
  74.         Intent notifyIntent=new Intent();  
  75.         notifyIntent.setComponent(new ComponentName("com.friendlyarm.net3gdialup""com.friendlyarm.net3gdialup.ActivityMain"));  
  76.         notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  77.         PendingIntent appIntent = PendingIntent.getActivity(mContext, 0,  
  78.             notifyIntent, 0);  
  79.         Notification myNoti = new Notification();  
  80.         myNoti.icon = iconId;  
  81.         myNoti.tickerText = text;  
  82.         myNoti.defaults = Notification.DEFAULT_LIGHTS;  
  83.         myNoti.setLatestEventInfo(mContext, "3G Network Status",text, appIntent);  
  84.         myNotiManager.notify(0, myNoti);  
  85.     }  
  86.   
  87.     private void removeStatusIcon() {  
  88.         myNotiManager.cancelAll();  
  89.     }  
  90.   
  91.     private int lastNetworkStatus = -1;  
  92.     private boolean isConnectService = false;  
  93.   
  94.     private final int CONNECT_TO_SERVICE_MSG = 100;  
  95.     private final int REQUEST_NETSTATUS_MSG = 101;  
  96.   
  97.     private Timer timerToConnService = new Timer();  
  98.     private Timer timerToRequestStatus = new Timer();  
  99.   
  100.     private Handler handler = new Handler() {  
  101.         public void handleMessage(Message msg) {  
  102.             switch (msg.what) {  
  103.             case CONNECT_TO_SERVICE_MSG:  
  104.                 timerToConnService.cancel();  
  105.                 seviceSocket.connectToService();  
  106.                 break;  
  107.             case REQUEST_NETSTATUS_MSG:  
  108.                 seviceSocket.sendRequest("REQUEST NETSTATUS\n");  
  109.                 seviceSocket.recvResponse();  
  110.                 break;  
  111.             }  
  112.             super.handleMessage(msg);  
  113.         }  
  114.     };  
  115.   
  116.     private TimerTask taskConnectService = new TimerTask() {  
  117.         public void run() {  
  118.             Message message = new Message();  
  119.             message.what = CONNECT_TO_SERVICE_MSG;  
  120.             handler.sendMessage(message);  
  121.         }  
  122.     };  
  123.   
  124.     private TimerTask taskRequestNetStatus = new TimerTask() {  
  125.         public void run() {  
  126.             Message message = new Message();  
  127.             message.what = REQUEST_NETSTATUS_MSG;  
  128.             handler.sendMessage(message);  
  129.         }  
  130.     };  
  131.   
  132.     private void processNETStatusResponse(String response) {  
  133.         String[] results = response.split(" ");  
  134.   
  135.         if (response.startsWith("RESPONSE CONNECT OK")) {  
  136.              seviceSocket.sendRequest("REQUEST 3GAUTOCONNECT GETSTATUS");  
  137.              seviceSocket.recvResponse();  
  138.         } else if (response.startsWith(new String("RESPONSE 3GAUTOCONNECT")) && results.length == 6) {  
  139.             if (Integer.parseInt(results[2]) == 1 && results[3].startsWith(new String("3GNET"))) {  
  140.                 timerToRequestStatus.schedule(taskRequestNetStatus,1,3000);  
  141.             } else {  
  142.                 seviceSocket.disconnect();  
  143.             }  
  144.         } else if (response.startsWith(new String("RESPONSE NETSTATUS"))  
  145.             && results.length >= 5) {  
  146.             if (results[2].startsWith(new String("DOWN"))) {  
  147.                 if (lastNetworkStatus != 0) {  
  148.                     removeStatusIcon();  
  149.                 }  
  150.                 lastNetworkStatus = 0;  
  151.             } else if (results[2].startsWith(new String("UP"))  
  152.                 && results.length == 8) {  
  153.                 if (lastNetworkStatus != 1) {  
  154.                     setStatusIcon(com.android.internal.R.drawable.net3g, "Connected. (FriendlyARM-3G)");  
  155.                 }  
  156.                 lastNetworkStatus = 1;  
  157.             }  
  158.         }  
  159.     }  
  160.     //}}  
  161.   
  162.   
  163.   
  164.    public void start() {  
  165.         // First set up our views and stuff.  
  166.   
  167.   
  168.        View sb = makeStatusBarView();  
  169.   
  170.         //F/r/i/e/n/d/l/y/A/R/M  
  171.         myNotiManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);  
  172.         seviceSocket = new SeviceSocket(new SeviceSocket.RecvCallBack() {  
  173.             public void responseIncoming(String response) {  
  174.             processNETStatusResponse(response);  
  175.             }  
  176.             });  
  177.   
  178.   
  179.         // Connect in to the status bar manager service  
  180.         StatusBarIconList iconList = new StatusBarIconList();  
  181.         ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();  
  182.         ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();  
  183.         mCommandQueue = new CommandQueue(this, iconList);  
  184.         mBarService = IStatusBarService.Stub.asInterface(  
  185.                 ServiceManager.getService(Context.STATUS_BAR_SERVICE));  
  186.         int[] switches = new int[7];  
  187.         ArrayList<IBinder> binders = new ArrayList<IBinder>();  
  188.         try {  
  189.             mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications,  
  190.                     switches, binders);  
  191.         } catch (RemoteException ex) {  
  192.             // If the system process isn't there we're doomed anyway.  
  193.         }  
  194.   
  195.         disable(switches[0]);  
  196.         setSystemUiVisibility(switches[1]);  
  197.         topAppWindowChanged(switches[2] != 0);  
  198.         // StatusBarManagerService has a back up of IME token and it's restored here.  
  199.         setImeWindowStatus(binders.get(0), switches[3], switches[4]);  
  200.         setHardKeyboardStatus(switches[5] != 0, switches[6] != 0);  
  201.   
  202.         // Set up the initial icon state  
  203.         int N = iconList.size();  
  204.         int viewIndex = 0;  
  205.         for (int i=0; i<N; i++) {  
  206.             StatusBarIcon icon = iconList.getIcon(i);  
  207.             if (icon != null) {  
  208.                 addIcon(iconList.getSlot(i), i, viewIndex, icon);  
  209.                 viewIndex++;  
  210.             }  
  211.         }  
  212.   
  213.         // Set up the initial notification state  
  214.         N = notificationKeys.size();  
  215.         if (N == notifications.size()) {  
  216.             for (int i=0; i<N; i++) {  
  217.                 addNotification(notificationKeys.get(i), notifications.get(i));  
  218.             }  
  219.         } else {  
  220.             Log.wtf(TAG, "Notification list length mismatch: keys=" + N  
  221.                     + " notifications=" + notifications.size());  
  222.         }  
  223.   
  224.         // Put up the view  
  225.         final int height = getStatusBarHeight();  
  226.         mStatusBarHeight = height;//add by xiaoge  
  227.         final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(  
  228.                 ViewGroup.LayoutParams.MATCH_PARENT,  
  229.                 height,  
  230.                 WindowManager.LayoutParams.TYPE_STATUS_BAR,  
  231.                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
  232.                     | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING  
  233.                     | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,  
  234.                 // We use a pixel format of RGB565 for the status bar to save memory bandwidth and  
  235.                 // to ensure that the layer can be handled by HWComposer.  On some devices the  
  236.                 // HWComposer is unable to handle SW-rendered RGBX_8888 layers.  
  237.                 PixelFormat.RGB_565);  
  238.           
  239.         // the status bar should be in an overlay if possible  
  240.         final Display defaultDisplay   
  241.             = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))  
  242.                 .getDefaultDisplay();  
  243.   
  244.         // We explicitly leave FLAG_HARDWARE_ACCELERATED out of the flags.  The status bar occupies  
  245.         // very little screen real-estate and is updated fairly frequently.  By using CPU rendering  
  246.         // for the status bar, we prevent the GPU from having to wake up just to do these small  
  247.         // updates, which should help keep power consumption down.  
  248.   
  249.         lp.gravity = getStatusBarGravity();  
  250.         lp.setTitle("StatusBar");  
  251.         lp.packageName = mContext.getPackageName();  
  252.         lp.windowAnimations = R.style.Animation_StatusBar;  
  253.         //add by xiaoge  
  254.         mStatusBarLayoutParams = lp;  
  255.         mStatusBarView = sb;  
  256.   
  257.         WindowManagerImpl.getDefault().addView(sb, lp);  
  258.   
  259.         if (SPEW) {  
  260.             Slog.d(TAG, "Added status bar view: gravity=0x" + Integer.toHexString(lp.gravity)   
  261.                    + " icons=" + iconList.size()  
  262.                    + " disabled=0x" + Integer.toHexString(switches[0])  
  263.                    + " lights=" + switches[1]  
  264.                    + " menu=" + switches[2]  
  265.                    + " imeButton=" + switches[3]  
  266.                    );  
  267.         }  
  268.   
  269.         mDoNotDisturb = new DoNotDisturb(mContext);  
  270.     }  
  271.   
  272.     protected View updateNotificationVetoButton(View row, StatusBarNotification n) {  
  273.         View vetoButton = row.findViewById(R.id.veto);  
  274.         if (n.isClearable()) {  
  275.             final String _pkg = n.pkg;  
  276.             final String _tag = n.tag;  
  277.             final int _id = n.id;  
  278.             vetoButton.setOnClickListener(new View.OnClickListener() {  
  279.                     public void onClick(View v) {  
  280.                         try {  
  281.                             mBarService.onNotificationClear(_pkg, _tag, _id);  
  282.                         } catch (RemoteException ex) {  
  283.                             // system process is dead if we're here.  
  284.                         }  
  285.                     }  
  286.                 });  
  287.             vetoButton.setVisibility(View.VISIBLE);  
  288.         } else {  
  289.             vetoButton.setVisibility(View.GONE);  
  290.         }  
  291.         return vetoButton;  
  292.     }  
  293.     //add by xiaoge  
  294.     public void onReceive(String action) {  
  295.         Log.d(TAG, "*** onReceive(), action = " + action + " ***");  
  296.         if (Intent.ACTION_DISPLAY_STATUS_BAR.equals(action)) {  
  297.                 mStatusBarLayoutParams.height = mStatusBarHeight;  
  298.                 WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,  
  299.                                 mStatusBarLayoutParams);  
  300.         } else if (Intent.ACTION_HIDE_STATUS_BAR.equals(action)) {  
  301.                 mStatusBarLayoutParams.height = 0;  
  302.                 WindowManagerImpl.getDefault().updateViewLayout(mStatusBarView,  
  303.                                 mStatusBarLayoutParams);  
  304.         }  
  305.     }  
  306. }  

4:修改frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI.java
  1. package com.android.systemui;  
  2.   
  3. import java.io.FileDescriptor;  
  4. import java.io.PrintWriter;  
  5.   
  6. import android.content.Context;  
  7. import android.content.res.Configuration;  
  8.   
  9. public abstract class SystemUI {  
  10.     public Context mContext;  
  11.   
  12.     public abstract void start();  
  13.     public abstract void onReceive(String action);//add by xiaoge  
  14.     protected void onConfigurationChanged(Configuration newConfig) {  
  15.     }  
  16.   
  17.     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {  
  18.     }  
  19. }  

5:修改frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java,添加函数
  1. //add by xiaoge  
  2. public void onReceive(String action) {  
  3.          
  4.    }  

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"));