SampleApp fixes.

On Android, delete gWindow before calling application_term, avoiding a crash
each time the app closes.  Also make sure the screen is redrawn when resuming.

On Linux, delete gWindow to avoid memory leak.

In general, allow moving from sample 0 to the last sample.

Reviewed at http://codereview.appspot.com/4639060


git-svn-id: http://skia.googlecode.com/svn/trunk@1661 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 2d5d0ca..9c2b7d1 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -53,9 +53,9 @@
 ///////////////
 static const char view_inval_msg[] = "view-inval-msg";
 
-static void postInvalDelay(SkEventSinkID sinkID) {
+void SampleWindow::postInvalDelay() {
     SkEvent* evt = new SkEvent(view_inval_msg);
-    evt->post(sinkID, 1);
+    evt->post(this->getSinkID(), 1);
 }
 
 static bool isInvalEvent(const SkEvent& evt) {
@@ -844,7 +844,7 @@
     if (fMeasureFPS && fMeasureFPS_Time) {
         fMeasureFPS_Time = SkTime::GetMSecs() - fMeasureFPS_Time;
         this->updateTitle();
-        postInvalDelay(this->getSinkID());
+        this->postInvalDelay();
     }
 
     //    if ((fScrollTestX | fScrollTestY) != 0)
@@ -928,7 +928,7 @@
 }
 
 bool SampleWindow::previousSample() {
-    fCurrIndex = (fCurrIndex - 1) % fSamples.count();
+    fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count();
     this->loadView(fSamples[fCurrIndex]());
     return true;
 }
@@ -1428,7 +1428,7 @@
 #ifdef ANDROID
     // FIXME: The first draw after a size change does not work on Android, so
     // we post an invalidate.
-    postInvalDelay(this->getSinkID());
+    this->postInvalDelay();
 #endif
     this->updateTitle();    // to refresh our config
 }