Use PreferenceActivity on Android for preference edition.

This commit is contained in:
Jean-Philip Desjardins 2015-07-08 23:15:06 -04:00
parent da79ed744c
commit 4141a5b2de
15 changed files with 217 additions and 58 deletions

View File

@ -1,6 +1,5 @@
#include <jni.h>
#include <cassert>
#include <android/log.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
#include "PathUtils.h"
@ -8,30 +7,13 @@
#include "../PS2VM.h"
#include "../PS2VM_Preferences.h"
#include "../gs/GSH_Null.h"
#include "NativeShared.h"
#include "GSH_OpenGLAndroid.h"
#include "PH_Android.h"
#include "StatsManager.h"
#define LOG_NAME "Play!"
CPS2VM* g_virtualMachine = nullptr;
void Log_Print(const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
__android_log_vprint(ANDROID_LOG_INFO, LOG_NAME, fmt, ap);
va_end(ap);
}
std::string GetStringFromJstring(JNIEnv* env, jstring javaString)
{
auto nativeString = env->GetStringUTFChars(javaString, JNI_FALSE);
std::string result(nativeString);
env->ReleaseStringUTFChars(javaString, nativeString);
return result;
}
extern "C" JNIEXPORT void JNICALL Java_com_virtualapplications_play_NativeInterop_setFilesDirPath(JNIEnv* env, jobject obj, jstring dirPathString)
{
auto dirPath = env->GetStringUTFChars(dirPathString, 0);

View File

@ -0,0 +1,21 @@
#include <jni.h>
#include <android/log.h>
#include "NativeShared.h"
#define LOG_NAME "Play!"
void Log_Print(const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
__android_log_vprint(ANDROID_LOG_INFO, LOG_NAME, fmt, ap);
va_end(ap);
}
std::string GetStringFromJstring(JNIEnv* env, jstring javaString)
{
auto nativeString = env->GetStringUTFChars(javaString, JNI_FALSE);
std::string result(nativeString);
env->ReleaseStringUTFChars(javaString, nativeString);
return result;
}

View File

@ -0,0 +1,6 @@
#pragma once
#include <string>
void Log_Print(const char* fmt, ...);
std::string GetStringFromJstring(JNIEnv*, jstring);

View File

@ -0,0 +1,44 @@
#include <jni.h>
#include "SettingsManager.h"
#include "NativeShared.h"
#include "../AppConfig.h"
void CSettingsManager::Save()
{
CAppConfig::GetInstance().Save();
}
void CSettingsManager::RegisterPreferenceBoolean(const std::string& name, bool value)
{
CAppConfig::GetInstance().RegisterPreferenceBoolean(name.c_str(), value);
}
bool CSettingsManager::GetPreferenceBoolean(const std::string& name)
{
return CAppConfig::GetInstance().GetPreferenceBoolean(name.c_str());
}
void CSettingsManager::SetPreferenceBoolean(const std::string& name, bool value)
{
CAppConfig::GetInstance().SetPreferenceBoolean(name.c_str(), value);
}
extern "C" JNIEXPORT void JNICALL Java_com_virtualapplications_play_SettingsManager_save(JNIEnv* env, jobject obj)
{
CSettingsManager::GetInstance().Save();
}
extern "C" JNIEXPORT void JNICALL Java_com_virtualapplications_play_SettingsManager_registerPreferenceBoolean(JNIEnv* env, jobject obj, jstring name, jboolean value)
{
CSettingsManager::GetInstance().RegisterPreferenceBoolean(GetStringFromJstring(env, name), value == JNI_TRUE);
}
extern "C" JNIEXPORT jboolean JNICALL Java_com_virtualapplications_play_SettingsManager_getPreferenceBoolean(JNIEnv* env, jobject obj, jstring name)
{
return CSettingsManager::GetInstance().GetPreferenceBoolean(GetStringFromJstring(env, name));
}
extern "C" JNIEXPORT void JNICALL Java_com_virtualapplications_play_SettingsManager_setPreferenceBoolean(JNIEnv* env, jobject obj, jstring name, jboolean value)
{
CSettingsManager::GetInstance().SetPreferenceBoolean(GetStringFromJstring(env, name), value == JNI_TRUE);
}

View File

@ -0,0 +1,16 @@
#pragma once
#include "Singleton.h"
class CSettingsManager : public CSingleton<CSettingsManager>
{
public:
void Save();
void RegisterPreferenceBoolean(const std::string&, bool);
bool GetPreferenceBoolean(const std::string&);
void SetPreferenceBoolean(const std::string&, bool);
private:
};

View File

@ -10,11 +10,18 @@ import java.util.*;
public class EmulatorActivity extends Activity
{
private static final String PREFERENCE_UI_SHOWFPS = "ui.showfps";
private SurfaceView _renderView;
private TextView _statsTextView;
private Timer _statsTimer = new Timer();
private Handler _statsTimerHandler;
public static void RegisterPreferences()
{
SettingsManager.registerPreferenceBoolean(PREFERENCE_UI_SHOWFPS, false);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
@ -35,8 +42,7 @@ public class EmulatorActivity extends Activity
SurfaceHolder holder = _renderView.getHolder();
holder.addCallback(new SurfaceCallback());
final SharedPreferences _preferences = getSharedPreferences("prefs", MODE_PRIVATE);
if (_preferences.getBoolean("fpsValue", false))
if(SettingsManager.getPreferenceBoolean(PREFERENCE_UI_SHOWFPS))
{
_statsTextView = (TextView)findViewById(R.id.emulator_stats);
setupStatsTimer();

View File

@ -30,10 +30,11 @@ public class MainActivity extends Activity
setContentView(R.layout.main);
_preferences = getSharedPreferences("prefs", MODE_PRIVATE);
File filesDir = getFilesDir();
NativeInterop.setFilesDirPath(Environment.getExternalStorageDirectory().getAbsolutePath());
_preferences = getSharedPreferences("prefs", MODE_PRIVATE);
EmulatorActivity.RegisterPreferences();
if(!NativeInterop.isVirtualMachineCreated())
{
@ -93,6 +94,12 @@ public class MainActivity extends Activity
dialog.show();
}
private void displaySettingsActivity()
{
Intent intent = new Intent(getApplicationContext(), SettingsActivity.class);
startActivity(intent);
}
private void displayAboutDialog()
{
long buildDate = getBuildDate(this);
@ -101,23 +108,6 @@ public class MainActivity extends Activity
displaySimpleMessage("About Play!", aboutMessage);
}
private void setFps(MenuItem item)
{
SharedPreferences.Editor preferencesEditor = _preferences.edit();
if (item.isChecked())
{
preferencesEditor.putBoolean("fpsValue", false);
}
else
{
preferencesEditor.putBoolean("fpsValue", true);
}
preferencesEditor.commit();
item.setChecked(_preferences.getBoolean("fpsValue", false));
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
@ -126,24 +116,17 @@ public class MainActivity extends Activity
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
menu.getItem(1).setChecked(_preferences.getBoolean("fpsValue", false));
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.main_menu_settings:
displaySettingsActivity();
return true;
case R.id.main_menu_about:
displayAboutDialog();
return true;
case R.id.main_menu_fps:
setFps(item);
return true;
default:
return super.onOptionsItemSelected(item);
}

View File

@ -0,0 +1,67 @@
package com.virtualapplications.play;
import android.os.*;
import android.preference.*;
import android.widget.*;
import java.util.*;
public class SettingsActivity extends PreferenceActivity
{
@Override
public void onDestroy()
{
super.onDestroy();
SettingsManager.save();
}
@Override
public void onBuildHeaders(List<Header> target)
{
loadHeadersFromResource(R.xml.settings_headers, target);
}
@Override
protected boolean isValidFragment(String fragmentName)
{
return true;
}
public static class GeneralSettingsFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_general_fragment);
PreferenceGroup prefGroup = getPreferenceScreen();
for(int i = 0; i < prefGroup.getPreferenceCount(); i++)
{
Preference pref = prefGroup.getPreference(i);
if(pref instanceof CheckBoxPreference)
{
CheckBoxPreference checkBoxPref = (CheckBoxPreference)pref;
checkBoxPref.setChecked(SettingsManager.getPreferenceBoolean(checkBoxPref.getKey()));
}
}
}
@Override
public void onDestroy()
{
PreferenceGroup prefGroup = getPreferenceScreen();
for(int i = 0; i < prefGroup.getPreferenceCount(); i++)
{
Preference pref = prefGroup.getPreference(i);
if(pref instanceof CheckBoxPreference)
{
CheckBoxPreference checkBoxPref = (CheckBoxPreference)pref;
SettingsManager.setPreferenceBoolean(checkBoxPref.getKey(), checkBoxPref.isChecked());
}
}
super.onDestroy();
}
}
}

View File

@ -0,0 +1,15 @@
package com.virtualapplications.play;
public class SettingsManager
{
static
{
System.loadLibrary("Play");
}
public static native void save();
public static native void registerPreferenceBoolean(String name, boolean defaultValue);
public static native boolean getPreferenceBoolean(String name);
public static native void setPreferenceBoolean(String name, boolean value);
}

View File

@ -23,5 +23,9 @@
android:configChanges="orientation|locale|keyboard|keyboardHidden|navigation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
</activity>
<activity
android:name=".SettingsActivity"
android:configChanges="orientation|locale|keyboard|keyboardHidden|navigation">
</activity>
</application>
</manifest>

View File

@ -164,7 +164,9 @@ LOCAL_SRC_FILES := ../../Source/AppConfig.cpp \
../../Source/ui_android/GSH_OpenGLAndroid.cpp \
../../Source/ui_android/InputManager.cpp \
../../Source/ui_android/NativeInterop.cpp \
../../Source/ui_android/NativeShared.cpp \
../../Source/ui_android/PH_Android.cpp \
../../Source/ui_android/SettingsManager.cpp \
../../Source/ui_android/StatsManager.cpp \
../../Source/Utils.cpp
LOCAL_CFLAGS := -mcpu=cortex-a7 -Wno-extern-c-compat -D_IOP_EMULATE_MODULES -DDISABLE_LOGGING -DGLES_COMPATIBILITY

View File

@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/main_menu_settings"
android:title="@string/main_menu_settings"
android:showAsAction="never"
/>
<item
android:id="@+id/main_menu_about"
android:title="@string/main_menu_about"
android:showAsAction="never"
/>
<item
android:id="@+id/main_menu_fps"
android:title="@string/main_menu_fps"
android:showAsAction="never"
android:checkable="true"
/>
</menu>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Play!</string>
<string name="app_name">Play!</string>
<string name="main_menu_settings">Settings</string>
<string name="main_menu_about">About</string>
<string name="main_menu_fps">Enable FPS</string>
</resources>

View File

@ -0,0 +1,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="ui.showfps"
android:title="Display F/S &amp; DC/F"
android:summary="Show &quot;Frames Per Second&quot; and &quot;Draw Calls Per Frame&quot; on screen."
android:persistent="false"
/>
</PreferenceScreen>

View File

@ -0,0 +1,6 @@
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.virtualapplications.play.SettingsActivity$GeneralSettingsFragment"
android:title="General Settings"
/>
</preference-headers>