diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/hardware/SerialPort.java | 8 | ||||
-rw-r--r-- | core/java/android/net/EthernetDataTracker.java | 26 | ||||
-rw-r--r-- | core/java/android/provider/Settings.java | 6 | ||||
-rw-r--r-- | core/jni/android_hardware_SerialPort.cpp | 10 | ||||
-rw-r--r-- | core/jni/android_view_Display.cpp | 29 |
5 files changed, 66 insertions, 13 deletions
diff --git a/core/java/android/hardware/SerialPort.java b/core/java/android/hardware/SerialPort.java index 0889790..5ef122b 100644 --- a/core/java/android/hardware/SerialPort.java +++ b/core/java/android/hardware/SerialPort.java @@ -113,10 +113,18 @@ public class SerialPort { } } + /** + * Sends a stream of zero valued bits for 0.25 to 0.5 seconds + */ + public void sendBreak() { + native_send_break(); + } + private native void native_open(FileDescriptor pfd, int speed) throws IOException; private native void native_close(); private native int native_read_array(byte[] buffer, int length) throws IOException; private native int native_read_direct(ByteBuffer buffer, int length) throws IOException; private native void native_write_array(byte[] buffer, int length) throws IOException; private native void native_write_direct(ByteBuffer buffer, int length) throws IOException; + private native void native_send_break(); } diff --git a/core/java/android/net/EthernetDataTracker.java b/core/java/android/net/EthernetDataTracker.java index 21ecc22..02e81b6 100644 --- a/core/java/android/net/EthernetDataTracker.java +++ b/core/java/android/net/EthernetDataTracker.java @@ -79,10 +79,7 @@ public class EthernetDataTracker implements NetworkStateTracker { if (up) { mTracker.reconnect(); } else { - NetworkUtils.stopDhcp(mIface); - mTracker.mNetworkInfo.setIsAvailable(false); - mTracker.mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, - null, null); + mTracker.disconnect(); } } } @@ -129,11 +126,7 @@ public class EthernetDataTracker implements NetworkStateTracker { runDhcp(); } - private void interfaceRemoved(String iface) { - if (!iface.equals(mIface)) - return; - - Log.d(TAG, "Removing " + iface); + public void disconnect() { NetworkUtils.stopDhcp(mIface); @@ -147,6 +140,21 @@ public class EthernetDataTracker implements NetworkStateTracker { msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo); msg.sendToTarget(); + IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); + INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); + try { + service.clearInterfaceAddresses(mIface); + } catch (Exception e) { + Log.e(TAG, "Failed to clear addresses or disable ipv6" + e); + } + } + + private void interfaceRemoved(String iface) { + if (!iface.equals(mIface)) + return; + + Log.d(TAG, "Removing " + iface); + disconnect(); mIface = ""; } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 8f59484..0aad64a 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1836,6 +1836,12 @@ public final class Settings { public static final String LOCKSCREEN_SOUNDS_ENABLED = "lockscreen_sounds_enabled"; /** + * Whether the lockscreen should be completely disabled. + * @hide + */ + public static final String LOCKSCREEN_DISABLED = "lockscreen.disabled"; + + /** * URI for the low battery sound file. * @hide */ diff --git a/core/jni/android_hardware_SerialPort.cpp b/core/jni/android_hardware_SerialPort.cpp index e67153b..7f40a5c 100644 --- a/core/jni/android_hardware_SerialPort.cpp +++ b/core/jni/android_hardware_SerialPort.cpp @@ -146,6 +146,8 @@ android_hardware_SerialPort_open(JNIEnv *env, jobject thiz, jobject fileDescript memset(&tio, 0, sizeof(tio)); tio.c_cflag = speed | CS8 | CLOCAL | CREAD; + // Disable output processing, including messing with end-of-line characters. + tio.c_oflag &= ~OPOST; tio.c_iflag = IGNPAR; tio.c_lflag = 0; /* turn of CANON, ECHO*, etc */ /* no timeout but request at least one character per read */ @@ -234,6 +236,13 @@ android_hardware_SerialPort_write_direct(JNIEnv *env, jobject thiz, jobject buff jniThrowException(env, "java/io/IOException", NULL); } +static void +android_hardware_SerialPort_send_break(JNIEnv *env, jobject thiz) +{ + int fd = env->GetIntField(thiz, field_context); + tcsendbreak(fd, 0); +} + static JNINativeMethod method_table[] = { {"native_open", "(Ljava/io/FileDescriptor;I)V", (void *)android_hardware_SerialPort_open}, @@ -246,6 +255,7 @@ static JNINativeMethod method_table[] = { (void *)android_hardware_SerialPort_write_array}, {"native_write_direct", "(Ljava/nio/ByteBuffer;I)V", (void *)android_hardware_SerialPort_write_direct}, + {"native_send_break", "()V", (void *)android_hardware_SerialPort_send_break}, }; int register_android_hardware_SerialPort(JNIEnv *env) diff --git a/core/jni/android_view_Display.cpp b/core/jni/android_view_Display.cpp index 366a52e..f076cc8 100644 --- a/core/jni/android_view_Display.cpp +++ b/core/jni/android_view_Display.cpp @@ -28,6 +28,7 @@ #include <android_runtime/AndroidRuntime.h> #include <utils/misc.h> #include <utils/Log.h> +#include <cutils/properties.h> // ---------------------------------------------------------------------------- @@ -44,6 +45,7 @@ struct offsets_t { jfieldID ydpi; }; static offsets_t offsets; +static bool headless = false; // ---------------------------------------------------------------------------- @@ -51,10 +53,19 @@ static void android_view_Display_init( JNIEnv* env, jobject clazz, jint dpy) { DisplayInfo info; - status_t err = SurfaceComposerClient::getDisplayInfo(DisplayID(dpy), &info); - if (err < 0) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return; + if (headless) { + // initialize dummy display with reasonable values + info.pixelFormatInfo.format = 1; // RGB_8888 + info.fps = 60; + info.density = 160; + info.xdpi = 160; + info.ydpi = 160; + } else { + status_t err = SurfaceComposerClient::getDisplayInfo(DisplayID(dpy), &info); + if (err < 0) { + jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + return; + } } env->SetIntField(clazz, offsets.pixelFormat,info.pixelFormatInfo.format); env->SetFloatField(clazz, offsets.fps, info.fps); @@ -66,6 +77,7 @@ static void android_view_Display_init( static jint android_view_Display_getRawWidthNative( JNIEnv* env, jobject clazz) { + if (headless) return 640; DisplayID dpy = env->GetIntField(clazz, offsets.display); return SurfaceComposerClient::getDisplayWidth(dpy); } @@ -73,6 +85,7 @@ static jint android_view_Display_getRawWidthNative( static jint android_view_Display_getRawHeightNative( JNIEnv* env, jobject clazz) { + if (headless) return 480; DisplayID dpy = env->GetIntField(clazz, offsets.display); return SurfaceComposerClient::getDisplayHeight(dpy); } @@ -80,6 +93,7 @@ static jint android_view_Display_getRawHeightNative( static jint android_view_Display_getOrientation( JNIEnv* env, jobject clazz) { + if (headless) return 0; // Surface.ROTATION_0 DisplayID dpy = env->GetIntField(clazz, offsets.display); return SurfaceComposerClient::getDisplayOrientation(dpy); } @@ -87,6 +101,7 @@ static jint android_view_Display_getOrientation( static jint android_view_Display_getDisplayCount( JNIEnv* env, jclass clazz) { + if (headless) return 1; return SurfaceComposerClient::getNumberOfDisplays(); } @@ -113,6 +128,12 @@ static JNINativeMethod gMethods[] = { void nativeClassInit(JNIEnv* env, jclass clazz) { + char value[PROPERTY_VALUE_MAX]; + + property_get("ro.config.headless", value, "0"); + if (strcmp(value, "1") == 0) + headless = true; + offsets.display = env->GetFieldID(clazz, "mDisplay", "I"); offsets.pixelFormat = env->GetFieldID(clazz, "mPixelFormat", "I"); offsets.fps = env->GetFieldID(clazz, "mRefreshRate", "F"); |