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; 3498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.WindowManagerGlobal; 3558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 36f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 37f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratopublic class SystemUIService extends Service { 38f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato static final String TAG = "SystemUIService"; 39f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 40f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 41f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * The class names of the stuff to start. 42f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 43f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final Object[] SERVICES = new Object[] { 4481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 0, // system bar or status bar, filled in below. 4510523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato com.android.systemui.power.PowerUI.class, 46098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey com.android.systemui.media.RingtonePlayer.class, 47f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato }; 48f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 49f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 50f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Hold a reference on the stuff we start. 51f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 52f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato SystemUI[] mServices; 53f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 54f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato private Class chooseClass(Object o) { 55f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato if (o instanceof Integer) { 56f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final String cl = getString((Integer)o); 57f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 58f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return getClassLoader().loadClass(cl); 59f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (ClassNotFoundException ex) { 60f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 61f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 62f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else if (o instanceof Class) { 63f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return (Class)o; 64f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else { 65f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException("Unknown system ui service: " + o); 66f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 67f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 68f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 69f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 70f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onCreate() { 7158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov // Tell the accessibility layer that this process will 7258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov // run as the current user, i.e. run across users. 7358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager.createAsSharedAcrossUsers(this); 7458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov 7581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn // Pick status bar or system bar. 7698365d7663cbd82979a5700faf0050220b01084dJeff Brown IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); 7781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn try { 78f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn SERVICES[0] = wm.hasSystemNavBar() 79f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn ? R.string.config_systemBarComponent 80f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn : R.string.config_statusBarComponent; 8181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } catch (RemoteException e) { 8281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn Slog.w(TAG, "Failing checking whether status bar can hide", e); 8381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } 8481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 85f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final int N = SERVICES.length; 86f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices = new SystemUI[N]; 87f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato for (int i=0; i<N; i++) { 88f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Class cl = chooseClass(SERVICES[i]); 89f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "loading: " + cl); 90f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 91f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i] = (SystemUI)cl.newInstance(); 92f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (IllegalAccessException ex) { 93f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 94f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (InstantiationException ex) { 95f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 96f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 97f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].mContext = this; 98f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "running: " + mServices[i]); 99f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].start(); 100f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 101f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 102f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 1030ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler @Override 1040ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public void onConfigurationChanged(Configuration newConfig) { 1050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler for (SystemUI ui: mServices) { 1060ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ui.onConfigurationChanged(newConfig); 1070ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 1080ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 1090ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 110f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 111f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Nobody binds to us. 112f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 113f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 114f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public IBinder onBind(Intent intent) { 115f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return null; 116f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 117f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 118f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 119f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 12010523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato if (args == null || args.length == 0) { 12110523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato for (SystemUI ui: mServices) { 12210523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato pw.println("dumping service: " + ui.getClass().getName()); 12310523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato ui.dump(fd, pw, args); 12410523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 12510523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } else { 12610523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato String svc = args[0]; 12710523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato for (SystemUI ui: mServices) { 12810523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato String name = ui.getClass().getName(); 12910523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato if (name.endsWith(svc)) { 13010523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato ui.dump(fd, pw, args); 13110523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 13210523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato } 133f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 134f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 135f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato} 136f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 137