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