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