Переглянути джерело

-Added android immersive mode, fixes #303

Juan Linietsky 10 роки тому
батько
коміт
b56badf77b

+ 4 - 0
demos/2d/lights_shadows/engine.cfg

@@ -3,6 +3,10 @@
 name="2D Lighting"
 main_scene="res://light_shadows.scn"
 
+[display]
+
+stretch_mode="2d"
+
 [rasterizer]
 
 shadow_filter=2

+ 1 - 1
platform/android/AndroidManifest.xml.template

@@ -200,6 +200,6 @@ $$ADD_PERMISSION_CHUNKS$$
 <uses-permission android:name="godot.custom.18"/>
 <uses-permission android:name="godot.custom.19"/>
 
-<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15"/>
+<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19"/>
          
 </manifest> 

+ 9 - 0
platform/android/export/export.cpp

@@ -186,6 +186,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
 	bool apk_expansion;
 	bool remove_prev;
 	bool use_32_fb;
+	bool immersive;
 	String apk_expansion_salt;
 	String apk_expansion_pkey;
 	int orientation;
@@ -282,6 +283,8 @@ bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant&
 		_signed=p_value;
 	else if (n=="screen/use_32_bits_view")
 		use_32_fb=p_value;
+	else if (n=="screen/immersive_mode")
+		immersive=p_value;
 	else if (n=="screen/orientation")
 		orientation=p_value;
 	else if (n=="screen/support_small")
@@ -349,6 +352,8 @@ bool EditorExportPlatformAndroid::_get(const StringName& p_name,Variant &r_ret)
 		r_ret=_signed;
 	else if (n=="screen/use_32_bits_view")
 		r_ret=use_32_fb;
+	else if (n=="screen/immersive_mode")
+		r_ret=immersive;
 	else if (n=="screen/orientation")
 		r_ret=orientation;
 	else if (n=="screen/support_small")
@@ -399,6 +404,7 @@ void EditorExportPlatformAndroid::_get_property_list( List<PropertyInfo> *p_list
 	p_list->push_back( PropertyInfo( Variant::STRING, "package/icon",PROPERTY_HINT_FILE,"png") );
 	p_list->push_back( PropertyInfo( Variant::BOOL, "package/signed") );
 	p_list->push_back( PropertyInfo( Variant::BOOL, "screen/use_32_bits_view") );
+	p_list->push_back( PropertyInfo( Variant::BOOL, "screen/immersive_mode") );
 	p_list->push_back( PropertyInfo( Variant::INT, "screen/orientation",PROPERTY_HINT_ENUM,"Landscape,Portrait") );
 	p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_small") );
 	p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_normal") );
@@ -1171,6 +1177,8 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d
 	if (use_32_fb)
 		cl.push_back("-use_depth_32");
 
+	if (immersive)
+		cl.push_back("-use_immersive");
 
 	if (cl.size()) {
 		//add comandline
@@ -1547,6 +1555,7 @@ EditorExportPlatformAndroid::EditorExportPlatformAndroid() {
 	orientation=0;
 	remove_prev=true;
 	use_32_fb=true;
+	immersive=true;
 
 	device_thread=Thread::create(_device_poll_thread,this);
 	devices_changed=true;

+ 44 - 0
platform/android/java/src/com/android/godot/Godot.java

@@ -110,6 +110,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
     private Button mWiFiSettingsButton;
 
     private boolean use_32_bits=false;
+    private boolean use_immersive=false;
     private boolean mStatePaused;
     private int mState;
 
@@ -374,6 +375,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
 	    mRemoteService.onClientUpdated(mDownloaderClientStub.getMessenger());
 	}
 
+
+
 	@Override 
 	protected void onCreate(Bundle icicle) {
 
@@ -402,6 +405,19 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
 				boolean has_extra = i< command_line.length -1;
 				if (command_line[i].equals("-use_depth_32")) {
 					use_32_bits=true;
+				} else if (command_line[i].equals("-use_immersive")) {
+					use_immersive=true;
+					if(Build.VERSION.SDK_INT >= 19.0){ // check if the application runs on an android 4.4+
+						window.getDecorView().setSystemUiVisibility(
+								    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+									    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+									    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+									    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
+									    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
+									    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+
+						UiChangeListener();
+					}
 				} else if (command_line[i].equals("-use_apk_expansion")) {
 					use_apk_expansion=true;
 				} else if (has_extra && command_line[i].equals("-apk_expansion_md5")) {
@@ -560,6 +576,16 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
 		mView.onResume();
 		mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
 		GodotLib.focusin();
+		if(use_immersive && Build.VERSION.SDK_INT >= 19.0){ // check if the application runs on an android 4.4+
+			Window window = getWindow();
+			window.getDecorView().setSystemUiVisibility(
+					    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+						    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+						    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+						    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
+						    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
+						    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+		}
 
 		for(int i=0;i<singleton_count;i++) {
 
@@ -570,6 +596,24 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
 
 	}
 
+	public void UiChangeListener() {
+		final View decorView = getWindow().getDecorView();
+		decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
+			@Override
+			public void onSystemUiVisibilityChange(int visibility) {
+				if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
+					decorView.setSystemUiVisibility(
+					View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+					| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+					| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+					| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+					| View.SYSTEM_UI_FLAG_FULLSCREEN
+					| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+				}
+			}
+		});
+	}
+
 	@Override public void onSensorChanged(SensorEvent event) {
 		Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
 		int displayRotation = display.getRotation();

+ 1 - 1
platform/android/project.properties.template

@@ -12,4 +12,4 @@
 
 # Project target.
 #android.library=true
-target=android-15
+target=android-19