Also fixes brightness controller failure to unregister callbacks. BUG: 15512088 Change-Id: Ia665e006d93391d5a66d4ace614660c4e6d2d5b5
152 lines
5.1 KiB
Java
152 lines
5.1 KiB
Java
/*
|
|
* Copyright (C) 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License
|
|
*/
|
|
|
|
package com.android.systemui;
|
|
|
|
import android.app.Application;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.content.res.Configuration;
|
|
import android.os.SystemProperties;
|
|
import android.util.Log;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Application class for SystemUI.
|
|
*/
|
|
public class SystemUIApplication extends Application {
|
|
|
|
private static final String TAG = "SystemUIService";
|
|
private static final boolean DEBUG = false;
|
|
|
|
/**
|
|
* The classes of the stuff to start.
|
|
*/
|
|
private final Class<?>[] SERVICES = new Class[] {
|
|
com.android.systemui.keyguard.KeyguardViewMediator.class,
|
|
com.android.systemui.recent.Recents.class,
|
|
com.android.systemui.volume.VolumeUI.class,
|
|
com.android.systemui.statusbar.SystemBars.class,
|
|
com.android.systemui.usb.StorageNotification.class,
|
|
com.android.systemui.power.PowerUI.class,
|
|
com.android.systemui.media.RingtonePlayer.class
|
|
};
|
|
|
|
/**
|
|
* Hold a reference on the stuff we start.
|
|
*/
|
|
private final SystemUI[] mServices = new SystemUI[SERVICES.length];
|
|
private boolean mServicesStarted;
|
|
private boolean mBootCompleted;
|
|
private final Map<Class<?>, Object> mComponents = new HashMap<Class<?>, Object>();
|
|
|
|
@Override
|
|
public void onCreate() {
|
|
super.onCreate();
|
|
// Set the application theme that is inherited by all services. Note that setting the
|
|
// application theme in the manifest does only work for activities. Keep this in sync with
|
|
// the theme set there.
|
|
setTheme(R.style.systemui_theme);
|
|
|
|
IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
|
|
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
|
|
registerReceiver(new BroadcastReceiver() {
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
if (mBootCompleted) return;
|
|
|
|
if (DEBUG) Log.v(TAG, "BOOT_COMPLETED received");
|
|
unregisterReceiver(this);
|
|
mBootCompleted = true;
|
|
if (mServicesStarted) {
|
|
final int N = mServices.length;
|
|
for (int i = 0; i < N; i++) {
|
|
mServices[i].onBootCompleted();
|
|
}
|
|
}
|
|
}
|
|
}, filter);
|
|
}
|
|
|
|
/**
|
|
* Makes sure that all the SystemUI services are running. If they are already running, this is a
|
|
* no-op. This is needed to conditinally start all the services, as we only need to have it in
|
|
* the main process.
|
|
*
|
|
* <p>This method must only be called from the main thread.</p>
|
|
*/
|
|
public void startServicesIfNeeded() {
|
|
if (mServicesStarted) {
|
|
return;
|
|
}
|
|
|
|
if (!mBootCompleted) {
|
|
// check to see if maybe it was already completed long before we began
|
|
// see ActivityManagerService.finishBooting()
|
|
if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
|
|
mBootCompleted = true;
|
|
if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent");
|
|
}
|
|
}
|
|
|
|
Log.v(TAG, "Starting SystemUI services.");
|
|
final int N = SERVICES.length;
|
|
for (int i=0; i<N; i++) {
|
|
Class<?> cl = SERVICES[i];
|
|
if (DEBUG) Log.d(TAG, "loading: " + cl);
|
|
try {
|
|
mServices[i] = (SystemUI)cl.newInstance();
|
|
} catch (IllegalAccessException ex) {
|
|
throw new RuntimeException(ex);
|
|
} catch (InstantiationException ex) {
|
|
throw new RuntimeException(ex);
|
|
}
|
|
mServices[i].mContext = this;
|
|
mServices[i].mComponents = mComponents;
|
|
if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
|
|
mServices[i].start();
|
|
|
|
if (mBootCompleted) {
|
|
mServices[i].onBootCompleted();
|
|
}
|
|
}
|
|
mServicesStarted = true;
|
|
}
|
|
|
|
@Override
|
|
public void onConfigurationChanged(Configuration newConfig) {
|
|
if (mServicesStarted) {
|
|
int len = mServices.length;
|
|
for (int i = 0; i < len; i++) {
|
|
mServices[i].onConfigurationChanged(newConfig);
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public <T> T getComponent(Class<T> interfaceType) {
|
|
return (T) mComponents.get(interfaceType);
|
|
}
|
|
|
|
public SystemUI[] getServices() {
|
|
return mServices;
|
|
}
|
|
}
|