1package com.jme3.system.android;
2
3import android.app.Activity;
4import android.content.res.Resources;
5import android.os.Environment;
6import com.jme3.asset.AndroidAssetManager;
7import com.jme3.asset.AssetManager;
8import com.jme3.audio.AudioRenderer;
9import com.jme3.audio.android.AndroidAudioRenderer;
10import com.jme3.system.AppSettings;
11import com.jme3.system.JmeContext;
12import com.jme3.system.JmeContext.Type;
13import com.jme3.system.JmeSystemDelegate;
14import com.jme3.system.Platform;
15import com.jme3.util.AndroidLogHandler;
16import com.jme3.util.JmeFormatter;
17import java.io.File;
18import java.net.URL;
19import java.util.logging.Handler;
20import java.util.logging.Level;
21
22public class JmeAndroidSystem extends JmeSystemDelegate {
23
24    private static Resources res;
25    private static Activity activity;
26
27    @Override
28    public AssetManager newAssetManager(URL configFile) {
29        logger.log(Level.INFO, "newAssetManager({0})", configFile);
30        return new AndroidAssetManager(configFile);
31    }
32
33    @Override
34    public AssetManager newAssetManager() {
35        logger.log(Level.INFO, "newAssetManager()");
36        return new AndroidAssetManager(null);
37    }
38
39    @Override
40    public boolean showSettingsDialog(AppSettings sourceSettings, boolean loadFromRegistry) {
41        return true;
42    }
43
44    @Override
45    public JmeContext newContext(AppSettings settings, Type contextType) {
46        initialize(settings);
47        return new OGLESContext();
48    }
49
50    @Override
51    public AudioRenderer newAudioRenderer(AppSettings settings) {
52        return new AndroidAudioRenderer(activity);
53    }
54
55    @Override
56    public void initialize(AppSettings settings) {
57        if (initialized) {
58            return;
59        }
60
61        initialized = true;
62        try {
63            JmeFormatter formatter = new JmeFormatter();
64
65            Handler consoleHandler = new AndroidLogHandler();
66            consoleHandler.setFormatter(formatter);
67        } catch (SecurityException ex) {
68            logger.log(Level.SEVERE, "Security error in creating log file", ex);
69        }
70        logger.log(Level.INFO, "Running on {0}", getFullName());
71    }
72
73    @Override
74    public Platform getPlatform() {
75        String arch = System.getProperty("os.arch").toLowerCase();
76        if (arch.contains("arm")) {
77            if (arch.contains("v5")) {
78                return Platform.Android_ARM5;
79            } else if (arch.contains("v6")) {
80                return Platform.Android_ARM6;
81            } else if (arch.contains("v7")) {
82                return Platform.Android_ARM7;
83            } else {
84                return Platform.Android_ARM5; // unknown ARM
85            }
86        } else {
87            throw new UnsupportedOperationException("Unsupported Android Platform");
88        }
89    }
90
91    @Override
92    public synchronized File getStorageFolder() {
93        //http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir
94        //http://developer.android.com/guide/topics/data/data-storage.html
95
96        boolean mExternalStorageWriteable = false;
97        String state = Environment.getExternalStorageState();
98        if (Environment.MEDIA_MOUNTED.equals(state)) {
99            mExternalStorageWriteable = true;
100        } else {
101            mExternalStorageWriteable = false;
102        }
103
104        if (mExternalStorageWriteable) {
105            //getExternalFilesDir automatically creates the directory if necessary.
106            //directory structure should be: /mnt/sdcard/Android/data/<packagename>/files
107            //when created this way, the directory is automatically removed by the Android
108            //  system when the app is uninstalled
109            storageFolder = activity.getApplicationContext().getExternalFilesDir(null);
110            logger.log(Level.INFO, "Storage Folder Path: {0}", storageFolder.getAbsolutePath());
111
112            return storageFolder;
113        } else {
114            return null;
115        }
116
117    }
118
119    public static void setResources(Resources res) {
120        JmeAndroidSystem.res = res;
121    }
122
123    public static Resources getResources() {
124        return res;
125    }
126
127    public static void setActivity(Activity activity) {
128        JmeAndroidSystem.activity = activity;
129    }
130
131    public static Activity getActivity() {
132        return activity;
133    }
134}
135