Subclassing NativeActivity makes two things possible. Firstly, we can implement an InputConnection to offer good support for IMEs, necessary for good keyboard support. Secondly, we can use it to overlay WebViews onto the NativeActivity. But to sublcass NativeActivity, we need to compile Java. To keep the toolchain go gettable, this is done with go generate. While here, check the exception after FindClass. Apparently it can throw an exception. Updates golang/go#9361. Updates golang/go#10247. Change-Id: I672545997f0c9a7580f06988a273c03404772247 Reviewed-on: https://go-review.googlesource.com/11980 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"errors"
|
|
"fmt"
|
|
"html/template"
|
|
)
|
|
|
|
type manifestXML struct {
|
|
Activity activityXML `xml:"application>activity"`
|
|
}
|
|
|
|
type activityXML struct {
|
|
Name string `xml:"name,attr"`
|
|
MetaData []metaDataXML `xml:"meta-data"`
|
|
}
|
|
|
|
type metaDataXML struct {
|
|
Name string `xml:"name,attr"`
|
|
Value string `xml:"value,attr"`
|
|
}
|
|
|
|
// manifestLibName parses the AndroidManifest.xml and finds the library
|
|
// name of the NativeActivity.
|
|
func manifestLibName(data []byte) (string, error) {
|
|
manifest := new(manifestXML)
|
|
if err := xml.Unmarshal(data, manifest); err != nil {
|
|
return "", err
|
|
}
|
|
if manifest.Activity.Name != "android.app.NativeActivity" {
|
|
return "", fmt.Errorf("can only build an .apk for NativeActivity, not %q", manifest.Activity.Name)
|
|
}
|
|
libName := ""
|
|
for _, md := range manifest.Activity.MetaData {
|
|
if md.Name == "android.app.lib_name" {
|
|
libName = md.Value
|
|
break
|
|
}
|
|
}
|
|
if libName == "" {
|
|
return "", errors.New("AndroidManifest.xml missing meta-data android.app.lib_name")
|
|
}
|
|
return libName, nil
|
|
}
|
|
|
|
type manifestTmplData struct {
|
|
JavaPkgPath string
|
|
Name string
|
|
LibName string
|
|
}
|
|
|
|
var manifestTmpl = template.Must(template.New("manifest").Parse(`
|
|
<manifest
|
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
package="{{.JavaPkgPath}}"
|
|
android:versionCode="1"
|
|
android:versionName="1.0">
|
|
|
|
<uses-sdk android:minSdkVersion="9" />
|
|
<application android:label="{{.Name}}" android:debuggable="true">
|
|
<activity android:name="org.golang.app.GoNativeActivity"
|
|
android:label="{{.Name}}"
|
|
android:configChanges="orientation|keyboardHidden">
|
|
<meta-data android:name="android.app.lib_name" android:value="{{.LibName}}" />
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
</application>
|
|
</manifest>`))
|