From 15c4ce9e2232b454821515d45922bc48b7c269f3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 11 Jul 2019 13:03:31 +0200 Subject: [PATCH] ui/app,cmd/gio: support edge-to-edge layout on Android Implement recomendations from https://developer.android.com/preview/features/gesturalnav#java While here, give up on providing translucent top and bottom bars on Android 4.4 and below. It's simpler to use the app drawn system backgrounds from 5.0 and newer. Signed-off-by: Elias Naur --- cmd/gio/androidbuild.go | 56 ++++++++++++++++++++++++++++++++++++----- cmd/gio/iosbuild.go | 6 ++--- ui/app/GioActivity.java | 6 ++--- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/cmd/gio/androidbuild.go b/cmd/gio/androidbuild.go index c7a0906f..d173fb7e 100644 --- a/cmd/gio/androidbuild.go +++ b/cmd/gio/androidbuild.go @@ -233,6 +233,49 @@ func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) { return err } } + + // Compile resources. + resDir := filepath.Join(tmpDir, "res") + valDir := filepath.Join(resDir, "values") + v21Dir := filepath.Join(resDir, "values-v21") + for _, dir := range []string{valDir, v21Dir} { + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + } + themes := ` + + +` + err = ioutil.WriteFile(filepath.Join(valDir, "themes.xml"), []byte(themes), 0660) + if err != nil { + return err + } + themesV21 := ` + + +` + err = ioutil.WriteFile(filepath.Join(v21Dir, "themes.xml"), []byte(themesV21), 0660) + if err != nil { + return err + } + resZip := filepath.Join(tmpDir, "resources.zip") + aapt2 := filepath.Join(tools.buildtools, "aapt2") + _, err = runCmd(exec.Command( + aapt2, + "compile", + "-o", resZip, + "--dir", resDir)) + if err != nil { + return err + } + + // Link APK. appName := strings.Title(filepath.Base(bi.pkg)) manifestSrc := fmt.Sprintf(` @@ -256,18 +299,19 @@ func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) { `, *appID, appName) manifest := filepath.Join(tmpDir, "AndroidManifest.xml") - if err := ioutil.WriteFile(manifest, []byte(manifestSrc), 0600); err != nil { + if err := ioutil.WriteFile(manifest, []byte(manifestSrc), 0660); err != nil { return err } tmpapk := filepath.Join(tmpDir, "link.apk") - _, err = runCmd(exec.Command( - filepath.Join(tools.buildtools, "aapt2"), + link := exec.Command( + aapt2, "link", "--manifest", manifest, "-I", tools.androidjar, "-o", tmpapk, - )) - if err != nil { + resZip, + ) + if _, err := runCmd(link); err != nil { return err } // The Go standard library archive/zip doesn't support appending to zip diff --git a/cmd/gio/iosbuild.go b/cmd/gio/iosbuild.go index 63d41b0a..0af45f87 100644 --- a/cmd/gio/iosbuild.go +++ b/cmd/gio/iosbuild.go @@ -115,7 +115,7 @@ func signIOS(tmpDir, app, ipa string) error { return err } entFile := filepath.Join(tmpDir, "entitlements.plist") - if err := ioutil.WriteFile(entFile, []byte(entitlements), 0600); err != nil { + if err := ioutil.WriteFile(entFile, []byte(entitlements), 0660); err != nil { return err } signIdentity := cert.Subject.CommonName @@ -144,7 +144,7 @@ int main(int argc, char * argv[]) { return UIApplicationMain(argc, argv, nil, NSStringFromClass([GioAppDelegate class])); } }` - if err := ioutil.WriteFile(mainm, []byte(mainmSrc), 0600); err != nil { + if err := ioutil.WriteFile(mainm, []byte(mainmSrc), 0660); err != nil { return err } exe := filepath.Join(app, "app") @@ -200,7 +200,7 @@ int main(int argc, char * argv[]) { `, *appID, appName) infoPlist := filepath.Join(app, "Info.plist") - if err := ioutil.WriteFile(infoPlist, []byte(infoPlistSrc), 0600); err != nil { + if err := ioutil.WriteFile(infoPlist, []byte(infoPlistSrc), 0660); err != nil { return err } if _, err := runCmd(exec.Command("plutil", "-convert", "binary1", infoPlist)); err != nil { diff --git a/ui/app/GioActivity.java b/ui/app/GioActivity.java index 1b97c51d..2813d80e 100644 --- a/ui/app/GioActivity.java +++ b/ui/app/GioActivity.java @@ -17,11 +17,11 @@ public class GioActivity extends Activity { super.onCreate(state); Window w = getWindow(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - w.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - } this.view = new GioView(this); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + this.view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } this.view.setLayoutParams(new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT)); setContentView(view); }