Create holder inner class for pushing context state.
Fix bug with rsForEach corrupting parent context state.
Remove workaround from rsBalls.

Change-Id: I43a948536e70d44645d1c2ef7b97e1c5906f6943
diff --git a/rsFont.cpp b/rsFont.cpp
index 96e350d..e4d77b2 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -613,18 +613,12 @@
 }
 
 void FontState::issueDrawCommand() {
+    Context::PushState ps(mRSC);
 
-    ObjectBaseRef<const ProgramVertex> tmpV(mRSC->getVertex());
-    mRSC->setVertex(mRSC->getDefaultProgramVertex());
-
-    ObjectBaseRef<const ProgramRaster> tmpR(mRSC->getRaster());
-    mRSC->setRaster(mRSC->getDefaultProgramRaster());
-
-    ObjectBaseRef<const ProgramFragment> tmpF(mRSC->getFragment());
-    mRSC->setFragment(mFontShaderF.get());
-
-    ObjectBaseRef<const ProgramStore> tmpPS(mRSC->getFragmentStore());
-    mRSC->setFragmentStore(mFontProgramStore.get());
+    mRSC->setProgramVertex(mRSC->getDefaultProgramVertex());
+    mRSC->setProgramRaster(mRSC->getDefaultProgramRaster());
+    mRSC->setProgramFragment(mFontShaderF.get());
+    mRSC->setProgramStore(mFontProgramStore.get());
 
     if (mConstantsDirty) {
         mFontShaderFConstant->data(mRSC, &mConstants, sizeof(mConstants));
@@ -632,10 +626,6 @@
     }
 
     if (!mRSC->setupCheck()) {
-        mRSC->setVertex((ProgramVertex *)tmpV.get());
-        mRSC->setRaster((ProgramRaster *)tmpR.get());
-        mRSC->setFragment((ProgramFragment *)tmpF.get());
-        mRSC->setFragmentStore((ProgramStore *)tmpPS.get());
         return;
     }
 
@@ -651,12 +641,6 @@
     mIndexBuffer->uploadCheck(mRSC);
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID());
     glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, (uint16_t *)(0));
-
-    // Reset the state
-    mRSC->setVertex((ProgramVertex *)tmpV.get());
-    mRSC->setRaster((ProgramRaster *)tmpR.get());
-    mRSC->setFragment((ProgramFragment *)tmpF.get());
-    mRSC->setFragmentStore((ProgramStore *)tmpPS.get());
 }
 
 void FontState::appendMeshQuad(float x1, float y1, float z1,