diff options
-rw-r--r-- | core/java/android/os/SystemProperties.java | 2 | ||||
-rw-r--r-- | core/java/com/android/internal/app/ActivityTrigger.java | 72 | ||||
-rw-r--r-- | core/jni/Android.mk | 6 | ||||
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 8 | ||||
-rw-r--r-- | core/jni/com_android_internal_app_ActivityTrigger.cpp | 165 | ||||
-rwxr-xr-x | services/java/com/android/server/am/ActivityStack.java | 19 |
6 files changed, 272 insertions, 0 deletions
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java index 5a79122..a9584d0 100644 --- a/core/java/android/os/SystemProperties.java +++ b/core/java/android/os/SystemProperties.java @@ -33,6 +33,8 @@ public class SystemProperties public static final int PROP_NAME_MAX = 31; public static final int PROP_VALUE_MAX = 91; + public static final boolean QCOM_HARDWARE = native_get_boolean("com.qc.hardware", false); + private static final ArrayList<Runnable> sChangeCallbacks = new ArrayList<Runnable>(); private static native String native_get(String key); diff --git a/core/java/com/android/internal/app/ActivityTrigger.java b/core/java/com/android/internal/app/ActivityTrigger.java new file mode 100644 index 0000000..71aeff3 --- /dev/null +++ b/core/java/com/android/internal/app/ActivityTrigger.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2011, Code Aurora Forum. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Code Aurora nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.internal.app; + +import android.content.ComponentName; +import android.content.Intent; +import android.util.Log; + +public class ActivityTrigger +{ + private static final String TAG = "ActivityTrigger"; + + /** &hide */ + public ActivityTrigger() { + //Log.d(TAG, "ActivityTrigger initialized"); + } + + /** &hide */ + protected void finalize() { + native_at_deinit(); + } + + /** &hide */ + public void activityStartTrigger(Intent intent) { + ComponentName cn = intent.getComponent(); + String activity = null; + + if (cn != null) + activity = cn.flattenToString(); + native_at_startActivity(activity); + } + + /** &hide */ + public void activityResumeTrigger(Intent intent) { + ComponentName cn = intent.getComponent(); + String activity = null; + + if (cn != null) + activity = cn.flattenToString(); + native_at_resumeActivity(activity); + } + + private native void native_at_startActivity(String activity); + private native void native_at_resumeActivity(String activity); + private native void native_at_deinit(); +} diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 0312e73..de1fb4e 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -152,6 +152,12 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp +ifeq ($(BOARD_USES_QCOM_HARDWARE),true) + LOCAL_CFLAGS += -DQCOM_HARDWARE + LOCAL_SRC_FILES += \ + com_android_internal_app_ActivityTrigger.cpp +endif + LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ $(LOCAL_PATH)/android/graphics \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index d0068ec..01ad2f0 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -174,6 +174,9 @@ extern int register_android_content_res_Configuration(JNIEnv* env); extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env); extern int register_android_content_res_PackageRedirectionMap(JNIEnv* env); +#ifdef QCOM_HARDWARE +extern int register_com_android_internal_app_ActivityTrigger(JNIEnv *env); +#endif static AndroidRuntime* gCurRuntime = NULL; @@ -1214,6 +1217,11 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_animation_PropertyValuesHolder), REG_JNI(register_com_android_internal_content_NativeLibraryHelper), REG_JNI(register_android_content_res_PackageRedirectionMap), + +#ifdef QCOM_HARDWARE + REG_JNI(register_com_android_internal_app_ActivityTrigger), +#endif + }; /* diff --git a/core/jni/com_android_internal_app_ActivityTrigger.cpp b/core/jni/com_android_internal_app_ActivityTrigger.cpp new file mode 100644 index 0000000..90ede58 --- /dev/null +++ b/core/jni/com_android_internal_app_ActivityTrigger.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2011, Code Aurora Forum. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Code Aurora nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_TAG "ActTriggerJNI" + +#include "jni.h" +#include "JNIHelp.h" +#include <android_runtime/AndroidRuntime.h> + +#include <dlfcn.h> +#include <limits.h> +#include <string.h> + +#include <cutils/properties.h> +#include <utils/Log.h> + +#define LIBRARY_PATH_PREFIX "/system/lib/" + +namespace android +{ + +// ---------------------------------------------------------------------------- + +static void (*startActivity)(const char *) = NULL; +static void (*resumeActivity)(const char *) = NULL; +static void *dlhandle = NULL; + +// ---------------------------------------------------------------------------- + +static void +com_android_internal_app_ActivityTrigger_native_at_init() +{ + const char *rc; + void (*init)(void); + char buf[PROPERTY_VALUE_MAX]; + int len; + + /* Retrieve name of vendor extension library */ + if (property_get("ro.vendor.extension_library", buf, NULL) <= 0) { + return; + } + + /* Sanity check - ensure */ + buf[PROPERTY_VALUE_MAX-1] = '\0'; + if ((strncmp(buf, LIBRARY_PATH_PREFIX, sizeof(LIBRARY_PATH_PREFIX) - 1) != 0) + || + (strstr(buf, "..") != NULL)) { + return; + } + + dlhandle = dlopen(buf, RTLD_NOW | RTLD_LOCAL); + if (dlhandle == NULL) { + return; + } + + dlerror(); + + *(void **) (&startActivity) = dlsym(dlhandle, "activity_trigger_start"); + if ((rc = dlerror()) != NULL) { + goto cleanup; + } + *(void **) (&resumeActivity) = dlsym(dlhandle, "activity_trigger_resume"); + if ((rc = dlerror()) != NULL) { + goto cleanup; + } + *(void **) (&init) = dlsym(dlhandle, "activity_trigger_init"); + if ((rc = dlerror()) != NULL) { + goto cleanup; + } + (*init)(); + return; + +cleanup: + startActivity = NULL; + resumeActivity = NULL; + if (dlhandle) { + dlclose(dlhandle); + dlhandle = NULL; + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_deinit(JNIEnv *env, jobject clazz) +{ + void (*deinit)(void); + + if (dlhandle) { + startActivity = NULL; + resumeActivity = NULL; + + *(void **) (&deinit) = dlsym(dlhandle, "activity_trigger_deinit"); + if (deinit) { + (*deinit)(); + } + + dlclose(dlhandle); + dlhandle = NULL; + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_startActivity(JNIEnv *env, jobject clazz, jstring activity) +{ + if (startActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (actStr) { + (*startActivity)(actStr); + } + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_resumeActivity(JNIEnv *env, jobject clazz, jstring activity) +{ + if (resumeActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (actStr) { + (*resumeActivity)(actStr); + } + } +} + +// ---------------------------------------------------------------------------- + +static JNINativeMethod gMethods[] = { + {"native_at_startActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_startActivity}, + {"native_at_resumeActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_resumeActivity}, + {"native_at_deinit", "()V", (void *)com_android_internal_app_ActivityTrigger_native_at_deinit}, +}; + + +int register_com_android_internal_app_ActivityTrigger(JNIEnv *env) +{ + com_android_internal_app_ActivityTrigger_native_at_init(); + + return AndroidRuntime::registerNativeMethods(env, + "com/android/internal/app/ActivityTrigger", gMethods, NELEM(gMethods)); +} + +} // namespace android diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 4546dc3..2fd3c0c 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -54,12 +54,14 @@ import android.os.ParcelFileDescriptor; import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; +import android.os.SystemProperties; import android.os.UserHandle; import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.view.Display; import android.view.WindowManagerPolicy; +import com.android.internal.app.ActivityTrigger; import java.io.IOException; import java.lang.ref.WeakReference; @@ -306,6 +308,16 @@ final class ActivityStack { } } + private static final ActivityTrigger mActivityTrigger; + + static { + if (SystemProperties.QCOM_HARDWARE) { + mActivityTrigger = new ActivityTrigger(); + } else { + mActivityTrigger = null; + } + } + final Handler mHandler = new Handler() { //public Handler() { // if (localLOGV) Slog.v(TAG, "Handler started!"); @@ -1468,6 +1480,10 @@ final class ActivityStack { if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); + if (mActivityTrigger != null) { + mActivityTrigger.activityResumeTrigger(next.intent); + } + // If we are currently pausing an activity, then don't do anything // until that is done. if (mPausingActivity != null) { @@ -2478,6 +2494,9 @@ final class ActivityStack { final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); + if (mActivityTrigger != null) { + mActivityTrigger.activityStartTrigger(intent); + } } ActivityRecord sourceRecord = null; |