SystemUIService.java revision f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dc
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; 27f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.os.Binder; 28f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.os.IBinder; 29f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport android.util.Slog; 30f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 31f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratopublic class SystemUIService extends Service { 32f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato static final String TAG = "SystemUIService"; 33f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 34f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 35f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * The class names of the stuff to start. 36f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 37f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final Object[] SERVICES = new Object[] { 38f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato R.string.config_statusBarComponent, 39f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato }; 40f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 41f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 42f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Hold a reference on the stuff we start. 43f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 44f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato SystemUI[] mServices; 45f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 46f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato private Class chooseClass(Object o) { 47f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato if (o instanceof Integer) { 48f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final String cl = getString((Integer)o); 49f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 50f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return getClassLoader().loadClass(cl); 51f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (ClassNotFoundException ex) { 52f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 53f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 54f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else if (o instanceof Class) { 55f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return (Class)o; 56f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else { 57f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException("Unknown system ui service: " + o); 58f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 59f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 60f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 61f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 62f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onCreate() { 63f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final int N = SERVICES.length; 64f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices = new SystemUI[N]; 65f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato for (int i=0; i<N; i++) { 66f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Class cl = chooseClass(SERVICES[i]); 67f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "loading: " + cl); 68f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 69f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i] = (SystemUI)cl.newInstance(); 70f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (IllegalAccessException ex) { 71f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 72f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (InstantiationException ex) { 73f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato throw new RuntimeException(ex); 74f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 75f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].mContext = this; 76f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Slog.d(TAG, "running: " + mServices[i]); 77f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mServices[i].start(); 78f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 79f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 80f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 81f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 82f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Nobody binds to us. 83f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 84f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 85f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public IBinder onBind(Intent intent) { 86f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return null; 87f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 88f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 89f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato @Override 90f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 91f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 92f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato != PackageManager.PERMISSION_GRANTED) { 93f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato pw.println("Permission Denial: can't dump StatusBar from from pid=" 94f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato + Binder.getCallingPid() 95f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato + ", uid=" + Binder.getCallingUid()); 96f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato return; 97f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 98f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 99f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato for (SystemUI ui: mServices) { 100f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato pw.println("dumping service: " + ui.getClass().getName()); 101f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato ui.dump(fd, pw, args); 102f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 103f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 104f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato} 105f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 106