Browse Source

SDL bug workaround, restart app it surface was destroyed out of order

dmuratshin 9 years ago
parent
commit
4e9c111f46

+ 13 - 0
oxygine/SDL/android/lib/src/org/oxygine/lib/Utils.java

@@ -1,12 +1,14 @@
 package org.oxygine.lib;
 package org.oxygine.lib;
 
 
 import android.app.Activity;
 import android.app.Activity;
+import android.app.AlarmManager;
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo;
 import android.net.Uri;
 import android.net.Uri;
 import android.provider.Settings;
 import android.provider.Settings;
+import android.app.PendingIntent;
 
 
 import java.io.File;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.FileOutputStream;
@@ -50,11 +52,22 @@ public class Utils {
         _context.moveTaskToBack(true);
         _context.moveTaskToBack(true);
     }
     }
 
 
+    public static void restartApp() {
+        Intent mStartActivity = new Intent(_context, OxygineActivity.instance.getClass());
+		int mPendingIntentId = 123456;
+		PendingIntent mPendingIntent = PendingIntent.getActivity(_context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+		AlarmManager mgr = (AlarmManager)_context.getSystemService(Context.ALARM_SERVICE);
+		mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+		System.exit(0);
+    }
+
     public static void browse(String url) {
     public static void browse(String url) {
         Intent browseIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         Intent browseIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         _context.startActivity(browseIntent);
         _context.startActivity(browseIntent);
     }
     }
 
 
+
+
     public static void writeBuffer2InternalStorage(String path, byte[] data) {
     public static void writeBuffer2InternalStorage(String path, byte[] data) {
         File file = new File(_context.getFilesDir() + File.separator + path);
         File file = new File(_context.getFilesDir() + File.separator + path);
 
 

+ 1 - 1
oxygine/src/VisualStyle.cpp

@@ -38,7 +38,7 @@ namespace oxygine
         std::stringstream stream;
         std::stringstream stream;
         if (_color != def.getColor())
         if (_color != def.getColor())
         {
         {
-            stream << "color=(" << (int)_color.r << ", " << (int)_color.g << ", " << (int)_color.b << ", " << (int)_color.a << ")";
+            stream << "color=" << color2hex(_color);
         }
         }
 
 
         if (_blend != def.getBlendMode())
         if (_blend != def.getBlendMode())

+ 13 - 1
oxygine/src/core/android/jniUtils.cpp

@@ -137,9 +137,21 @@ namespace oxygine
 
 
             jmethodID m = env->GetStaticMethodID(_jUtils, "exit", "()V");
             jmethodID m = env->GetStaticMethodID(_jUtils, "exit", "()V");
             JNI_NOT_NULL(m);
             JNI_NOT_NULL(m);
-            env->CallStaticVoidMethod(_jUtils, m);
+            env->CallStaticVoidMethod(_jUtils, m);            
         }
         }
         catch (const notFound&) {}
         catch (const notFound&) {}
+
+        return true;
+    }
+
+    void            jniRestartApp()
+    {
+        JNIEnv* env = jniGetEnv();
+        LOCAL_REF_HOLDER(env);
+
+        jmethodID m = env->GetStaticMethodID(_jUtils, "restartApp", "()V");
+        JNI_NOT_NULL(m);
+        env->CallStaticVoidMethod(_jUtils, m);
     }
     }
 
 
     void            jniMoveTaskToBack()
     void            jniMoveTaskToBack()

+ 1 - 0
oxygine/src/core/android/jniUtils.h

@@ -19,6 +19,7 @@ namespace oxygine
     bool            jniIsNetworkAvailable();
     bool            jniIsNetworkAvailable();
 
 
     bool            jniExit();
     bool            jniExit();
+    void            jniRestartApp();
     void            jniMoveTaskToBack();
     void            jniMoveTaskToBack();
     void            jniBrowse(const char* url);
     void            jniBrowse(const char* url);
 
 

+ 11 - 3
oxygine/src/core/oxygine.cpp

@@ -239,7 +239,7 @@ namespace oxygine
                 _dispatcher = new EventDispatcher;
                 _dispatcher = new EventDispatcher;
         }
         }
 
 
-        void init(init_desc* desc_ptr)
+        int init(init_desc* desc_ptr)
         {
         {
             std::string t;
             std::string t;
 
 
@@ -380,13 +380,19 @@ namespace oxygine
             if (!_window)
             if (!_window)
             {
             {
                 log::error("can't create window: %s", SDL_GetError());
                 log::error("can't create window: %s", SDL_GetError());
-                return;
+#ifdef __ANDROID__
+                jniRestartApp();
+#endif
+                return -1;
             }
             }
             _context = SDL_GL_CreateContext(_window);
             _context = SDL_GL_CreateContext(_window);
             if (!_context)
             if (!_context)
             {
             {
                 log::error("can't create gl context: %s", SDL_GetError());
                 log::error("can't create gl context: %s", SDL_GetError());
-                return;
+#ifdef __ANDROID__
+                jniRestartApp();
+#endif
+                return -1;
             }
             }
 
 
             SDL_GL_SetSwapInterval(desc.vsync ? 1 : 0);
             SDL_GL_SetSwapInterval(desc.vsync ? 1 : 0);
@@ -415,6 +421,8 @@ namespace oxygine
 #endif
 #endif
             LoadResourcesContext::init();
             LoadResourcesContext::init();
             init2();
             init2();
+
+            return 1;
         }
         }
 
 
 
 

+ 1 - 1
oxygine/src/core/oxygine.h

@@ -70,7 +70,7 @@ namespace oxygine
         void init0();
         void init0();
 
 
         /** Initializes Oxygine*/
         /** Initializes Oxygine*/
-        void init(init_desc* desc = 0);
+        int init(init_desc* desc = 0);
 
 
         /** Releases all internal components*/
         /** Releases all internal components*/
         void release();
         void release();