Correctly resize terminal, hook up colors.

Resize needed to kick the vterm library.  Hook up colors to CellRun
and cluster cells into single run until style changes.

Change-Id: Ib2984d8eedaf6085aba98df7997104b59a832967
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp
index 9133e46..2439346 100644
--- a/jni/com_android_terminal_Terminal.cpp
+++ b/jni/com_android_terminal_Terminal.cpp
@@ -69,6 +69,9 @@
 static jfieldID cellRunDataField;
 static jfieldID cellRunDataSizeField;
 static jfieldID cellRunColSizeField;
+static jfieldID cellRunFgField;
+static jfieldID cellRunBgField;
+
 /*
  * Terminal session
  */
@@ -229,7 +232,7 @@
         return 0;
     }
 
-    return env->CallIntMethod(term->getCallbacks(), resizeMethod);
+    return env->CallIntMethod(term->getCallbacks(), resizeMethod, rows, cols);
 }
 
 static VTermScreenCallbacks cb = {
@@ -313,7 +316,7 @@
 
         char *shell = "/system/bin/sh"; //getenv("SHELL");
 #ifdef USE_TEST_SHELL
-        char *args[4] = {shell, "-c", "x=1; while true; do echo \"stop echoing yourself! ($x)\"; x=$(( $x + 1 )); sleep 0.5; done", NULL};
+        char *args[4] = {shell, "-c", "x=1; c=0; while true; do echo -e \"stop \e[00;3${c}mechoing\e[00m yourself! ($x)\"; x=$(( $x + 1 )); c=$((($c+1)%7)); sleep 0.5; done", NULL};
 #else
         char *args[2] = {shell, NULL};
 #endif
@@ -323,6 +326,7 @@
         _exit(1);
     }
 
+    ALOGD("entering read() loop");
     while (1) {
         char buffer[4096];
         ssize_t bytes = ::read(mMasterFd, buffer, sizeof buffer);
@@ -356,12 +360,16 @@
 
 int Terminal::resize(short unsigned int rows, short unsigned int cols) {
     ALOGD("resize(%d, %d)", rows, cols);
-    // TODO: wait for resize event to propegate back from shell?
+
     mRows = rows;
     mCols = cols;
+
     struct winsize size = { rows, cols, 0, 0 };
     ioctl(mMasterFd, TIOCSWINSZ, &size);
-    // TODO: vterm_set_size?
+
+    vterm_set_size(mVt, rows, cols);
+    vterm_screen_flush_damage(mVts);
+
     return 0;
 }
 
@@ -406,6 +414,21 @@
     return term->resize(rows, cols);
 }
 
+static int toArgb(VTermColor* color) {
+    return 0xff << 24 | color->red << 16 | color->green << 8 | color->blue;
+}
+
+static bool isCellStyleEqual(VTermScreenCell* a, VTermScreenCell* b) {
+    // TODO: check other attrs beyond just color
+    if (toArgb(&a->fg) != toArgb(&b->fg)) {
+        return false;
+    }
+    if (toArgb(&a->bg) != toArgb(&b->bg)) {
+        return false;
+    }
+    return true;
+}
+
 static jint com_android_terminal_Terminal_nativeGetCellRun(JNIEnv* env,
         jclass clazz, jint ptr, jint row, jint col, jobject run) {
     Terminal* term = reinterpret_cast<Terminal*>(ptr);
@@ -416,7 +439,8 @@
         return -1;
     }
 
-    VTermScreenCell cell;
+    VTermScreenCell prevCell, cell;
+    memset(&prevCell, 0, sizeof(VTermScreenCell));
     memset(&cell, 0, sizeof(VTermScreenCell));
 
     VTermPos pos = {
@@ -429,7 +453,15 @@
     while (pos.col < term->getCols()) {
         int res = term->getCell(pos, &cell);
 
-        // TODO: terminate this loop once text style changes
+        if (colSize == 0) {
+            env->SetIntField(run, cellRunFgField, toArgb(&cell.fg));
+            env->SetIntField(run, cellRunBgField, toArgb(&cell.bg));
+        } else {
+            if (!isCellStyleEqual(&cell, &prevCell)) {
+                break;
+            }
+        }
+        memcpy(&prevCell, &cell, sizeof(VTermScreenCell));
 
         // TODO: remove this once terminal is resized
         if (cell.width == 0) {
@@ -505,6 +537,8 @@
     cellRunDataField = env->GetFieldID(cellRunClass, "data", "[C");
     cellRunDataSizeField = env->GetFieldID(cellRunClass, "dataSize", "I");
     cellRunColSizeField = env->GetFieldID(cellRunClass, "colSize", "I");
+    cellRunFgField = env->GetFieldID(cellRunClass, "fg", "I");
+    cellRunBgField = env->GetFieldID(cellRunClass, "bg", "I");
 
     env->GetJavaVM(&gJavaVM);
 
diff --git a/src/com/android/terminal/Terminal.java b/src/com/android/terminal/Terminal.java
index ff325a8..d37e6a8 100644
--- a/src/com/android/terminal/Terminal.java
+++ b/src/com/android/terminal/Terminal.java
@@ -44,8 +44,8 @@
         boolean strike;
         int font;
 
-        int fgColor = Color.RED;
-        int bgColor = Color.BLUE;
+        int fg = Color.RED;
+        int bg = Color.BLUE;
     }
 
     public interface TerminalClient {
diff --git a/src/com/android/terminal/TerminalView.java b/src/com/android/terminal/TerminalView.java
index 79b5bb4..35192e9 100644
--- a/src/com/android/terminal/TerminalView.java
+++ b/src/com/android/terminal/TerminalView.java
@@ -189,8 +189,8 @@
             for (int col = startCol; col <= endCol;) {
                 mTerm.getCellRun(row, col, run);
 
-                mBgPaint.setColor(run.bgColor);
-                mTextPaint.setColor(run.fgColor);
+                mBgPaint.setColor(run.bg);
+                mTextPaint.setColor(run.fg);
 
                 final int y = row * mCharHeight;
                 final int x = col * mCharWidth;