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