am 6e0f65fd
: Adding focus change notification
Merge commit '6e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1' into gingerbread-plus-aosp * commit '6e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1': Adding focus change notification
This commit is contained in:
@ -216,8 +216,11 @@ class ViewServer implements Runnable {
|
||||
class ViewServerWorker implements Runnable, WindowManagerService.WindowChangeListener {
|
||||
private Socket mClient;
|
||||
private boolean mNeedWindowListUpdate;
|
||||
private boolean mNeedFocusedWindowUpdate;
|
||||
public ViewServerWorker(Socket client) {
|
||||
mClient = client;
|
||||
mNeedWindowListUpdate = false;
|
||||
mNeedFocusedWindowUpdate = false;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
@ -285,20 +288,42 @@ class ViewServer implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
public void focusChanged() {
|
||||
synchronized(this) {
|
||||
mNeedFocusedWindowUpdate = true;
|
||||
notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean windowManagerAutolistLoop() {
|
||||
mWindowManager.addWindowChangeListener(this);
|
||||
BufferedWriter out = null;
|
||||
try {
|
||||
out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream()));
|
||||
while (!Thread.interrupted()) {
|
||||
boolean needWindowListUpdate = false;
|
||||
boolean needFocusedWindowUpdate = false;
|
||||
synchronized (this) {
|
||||
while (!mNeedWindowListUpdate) {
|
||||
while (!mNeedWindowListUpdate && !mNeedFocusedWindowUpdate) {
|
||||
wait();
|
||||
}
|
||||
mNeedWindowListUpdate = false;
|
||||
if (mNeedWindowListUpdate) {
|
||||
mNeedWindowListUpdate = false;
|
||||
needWindowListUpdate = true;
|
||||
}
|
||||
if (mNeedFocusedWindowUpdate) {
|
||||
mNeedFocusedWindowUpdate = false;
|
||||
needFocusedWindowUpdate = true;
|
||||
}
|
||||
}
|
||||
if(needWindowListUpdate) {
|
||||
out.write("LIST UPDATE\n");
|
||||
out.flush();
|
||||
}
|
||||
if(needFocusedWindowUpdate) {
|
||||
out.write("FOCUS UPDATE\n");
|
||||
out.flush();
|
||||
}
|
||||
out.write("UPDATE\n");
|
||||
out.flush();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.w(LOG_TAG, "Connection error: ", e);
|
||||
|
@ -495,6 +495,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
public interface WindowChangeListener {
|
||||
public void windowsChanged();
|
||||
public void focusChanged();
|
||||
}
|
||||
|
||||
final Configuration mTempConfiguration = new Configuration();
|
||||
@ -4831,6 +4832,21 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyFocusChanged() {
|
||||
WindowChangeListener[] windowChangeListeners;
|
||||
synchronized(mWindowMap) {
|
||||
if(mWindowChangeListeners.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
|
||||
windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
|
||||
}
|
||||
int N = windowChangeListeners.length;
|
||||
for(int i = 0; i < N; i++) {
|
||||
windowChangeListeners[i].focusChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private WindowState findWindow(int hashCode) {
|
||||
if (hashCode == -1) {
|
||||
return getFocusedWindow();
|
||||
@ -7720,7 +7736,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
public static final int ENABLE_SCREEN = 16;
|
||||
public static final int APP_FREEZE_TIMEOUT = 17;
|
||||
public static final int SEND_NEW_CONFIGURATION = 18;
|
||||
public static final int WINDOWS_CHANGED = 19;
|
||||
public static final int REPORT_WINDOWS_CHANGE = 19;
|
||||
|
||||
private Session mLastReportedHold;
|
||||
|
||||
@ -7772,6 +7788,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
// Ignore if process has died.
|
||||
}
|
||||
}
|
||||
notifyFocusChanged();
|
||||
}
|
||||
} break;
|
||||
|
||||
@ -8052,7 +8069,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
break;
|
||||
}
|
||||
|
||||
case WINDOWS_CHANGED: {
|
||||
case REPORT_WINDOWS_CHANGE: {
|
||||
if (mWindowsChanged) {
|
||||
synchronized (mWindowMap) {
|
||||
mWindowsChanged = false;
|
||||
@ -8283,8 +8300,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
|
||||
mH.removeMessages(H.WINDOWS_CHANGED);
|
||||
mH.sendMessage(mH.obtainMessage(H.WINDOWS_CHANGED));
|
||||
mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
|
||||
mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
mInLayout = false;
|
||||
|
Reference in New Issue
Block a user