1f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato/* 2f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Copyright (C) 2010 The Android Open Source Project 3f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * 4f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * you may not use this file except in compliance with the License. 6f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * You may obtain a copy of the License at 7f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * 8f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * 10f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Unless required by applicable law or agreed to in writing, software 11f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * See the License for the specific language governing permissions and 14f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * limitations under the License. 15f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 16f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 17f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratopackage com.android.systemui; 18f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 19f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport java.io.FileDescriptor; 20f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport java.io.PrintWriter; 21f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 22f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.app.Service; 23f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.content.BroadcastReceiver; 24f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.content.Context; 25f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.content.Intent; 26f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.content.pm.PackageManager; 270ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandlerimport android.content.res.Configuration; 28f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.os.Binder; 29f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.os.IBinder; 3081e56d535c853d73ff537357da5b935f51cb779dDianne Hackbornimport android.os.RemoteException; 3181e56d535c853d73ff537357da5b935f51cb779dDianne Hackbornimport android.os.ServiceManager; 32f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.util.Slog; 3381e56d535c853d73ff537357da5b935f51cb779dDianne Hackbornimport android.view.IWindowManager; 34f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 35f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratopublic class SystemUIService extends Service { 36f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato static final String TAG = "SystemUIService"; 37f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 38f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 39f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * The class names of the stuff to start. 40f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 41f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final Object[] SERVICES = new Object[] { 4281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 0, // system bar or status bar, filled in below. 4310523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato com.android.systemui.power.PowerUI.class, 44f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato }; 45f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 46f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 47f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Hold a reference on the stuff we start. 48f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 49f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato SystemUI[] mServices; 50f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 51f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato private Class chooseClass(Object o) { 52f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato if (o instanceof Integer) { 53f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final String cl = getString((Integer)o); 54f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 55f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return getClassLoader().loadClass(cl); 56f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (ClassNotFoundException ex) { 57f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 58f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 59f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else if (o instanceof Class) { 60f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return (Class)o; 61f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else { 62f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException("Unknown system ui service: " + o); 63f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 64f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 65f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 66f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 67f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onCreate() { 6881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn // Pick status bar or system bar. 6981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface( 7081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn ServiceManager.getService(Context.WINDOW_SERVICE)); 7181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn try { 7281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn SERVICES[0] = wm.canStatusBarHide() 7381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn ? R.string.config_statusBarComponent 7481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn : R.string.config_systemBarComponent; 7581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } catch (RemoteException e) { 7681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn Slog.w(TAG, "Failing checking whether status bar can hide", e); 7781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } 7881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 79f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final int N = SERVICES.length; 80f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices = new SystemUI[N]; 81f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato for (int i=0; i<N; i++) { 82f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Class cl = chooseClass(SERVICES[i]); 83f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "loading: " + cl); 84f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 85f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i] = (SystemUI)cl.newInstance(); 86f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (IllegalAccessException ex) { 87f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 88f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (InstantiationException ex) { 89f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 90f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 91f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].mContext = this; 92f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "running: " + mServices[i]); 93f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].start(); 94f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 95f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 96f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 970ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler @Override 980ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public void onConfigurationChanged(Configuration newConfig) { 990ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler for (SystemUI ui: mServices) { 1000ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ui.onConfigurationChanged(newConfig); 1010ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 1020ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 1030ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 104f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 105f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Nobody binds to us. 106f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 107f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 108f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public IBinder onBind(Intent intent) { 109f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return null; 110f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 111f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 112f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 113f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 114f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 115f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato != PackageManager.PERMISSION_GRANTED) { 116f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato pw.println("Permission Denial: can't dump StatusBar from from pid=" 117f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato + Binder.getCallingPid() 118f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato + ", uid=" + Binder.getCallingUid()); 119f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return; 120f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 121f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 12210523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato if (args == null || args.length == 0) { 12310523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato for (SystemUI ui: mServices) { 12410523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato pw.println("dumping service: " + ui.getClass().getName()); 12510523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato ui.dump(fd, pw, args); 12610523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 12710523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } else { 12810523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato String svc = args[0]; 12910523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato for (SystemUI ui: mServices) { 13010523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato String name = ui.getClass().getName(); 13110523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato if (name.endsWith(svc)) { 13210523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato ui.dump(fd, pw, args); 13310523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 13410523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 135f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 136f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 137f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato} 138f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 139