Loading core/java/android/os/SystemProperties.java +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/com/android/internal/app/ActivityTrigger.java 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * 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(); } core/jni/Android.mk +6 −0 Original line number Diff line number Diff line Loading @@ -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 \ Loading core/jni/AndroidRuntime.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 }; /* Loading core/jni/com_android_internal_app_ActivityTrigger.cpp 0 → 100644 +165 −0 Original line number Diff line number Diff line /* * 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 Loading
core/java/android/os/SystemProperties.java +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/com/android/internal/app/ActivityTrigger.java 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * 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(); }
core/jni/Android.mk +6 −0 Original line number Diff line number Diff line Loading @@ -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 \ Loading
core/jni/AndroidRuntime.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 }; /* Loading
core/jni/com_android_internal_app_ActivityTrigger.cpp 0 → 100644 +165 −0 Original line number Diff line number Diff line /* * 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