Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android WebViews documentation update #904

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
137 changes: 48 additions & 89 deletions www/docs/en/dev/guide/platforms/android/webview.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,97 +38,56 @@ legacy `CordovaActivity` component that pre-dates the 1.9 release.
[cordova.apache.org](http://cordova.apache.org) and unzip its
Android package.

1. Navigate to the Android package's `/framework` directory and run
`ant jar`. It creates the Cordova `.jar` file, formed as
`/framework/cordova-x.x.x.jar`.

1. Copy the `.jar` file into the Android project's `/libs` directory.

1. Add the following to the application's `/res/xml/main.xml` file,
with the `layout_height`, `layout_width` and `id` modified to suit
the application:

<org.apache.cordova.CordovaWebView
android:id="@+id/tutorialView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

1. Modify the activity so that it implements the `CordovaInterface`.
It should implement the included methods. You may wish to copy
them from `/framework/src/org/apache/cordova/CordovaActivity.java`,
or else implement them on your own. The following code fragment
shows a basic application that relies on the interface. Note how
the referenced view id matches the `id` attribute specified in the
XML fragment shown above:

public class CordovaViewTestActivity extends Activity implements CordovaInterface {
CordovaWebView cwv;
/* Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
cwv = (CordovaWebView) findViewById(R.id.tutorialView);
Config.init(this);
cwv.loadUrl(Config.getStartUrl());
}

1. If the application needs to use the camera, implement the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this still apply?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Config.getStartUrl() is marked as deprecated and has changed. I didn't touch the camera but assume it has changed as well.

following:

@Override
public void setActivityResultCallback(CordovaPlugin plugin) {
this.activityResultCallback = plugin;
}
/**
* Launch an activity for which you would like a result when it finished. When this activity exits,
* your onActivityResult() method is called.
*
* @param command The command object
* @param intent The intent to start
* @param requestCode The request code that is passed to callback to identify the activity
*/
public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) {
this.activityResultCallback = command;
this.activityResultKeepRunning = this.keepRunning;

// If multitasking turned on, then disable it for activities that return results
if (command != null) {
this.keepRunning = false;
}

// Start activity
super.startActivityForResult(intent, requestCode);
}

@Override
/**
* Called when an activity you launched exits, giving you the requestCode you started it with,
* the resultCode it returned, and any additional data from it.
*
* @param requestCode The request code originally supplied to startActivityForResult(),
* allowing you to identify who this result came from.
* @param resultCode The integer result code returned by the child activity through its setResult().
* @param data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
*/
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
CordovaPlugin callback = this.activityResultCallback;
if (callback != null) {
callback.onActivityResult(requestCode, resultCode, intent);
}
}

1. Finally, remember to add the thread pool, otherwise plugins
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, not sure if this still applicable. I can look into this when I work on the plugin for the native-to-cordova-bridge

have no threads on which to run:

@Override
public ExecutorService getThreadPool() {
return threadPool;
}
1. Follow the instructions here to build your first cordova app [CreateYourFirstApp](https://cordova.apache.org/docs/en/8.x/guide/cli/index.html)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does one do that? Just to get the files to your harddisk from where you can copy them?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My interpretation (and use case) was to embed a cordova app into another Android app that was developed with native code. As this is a getting started documentation, I assumed it's a good starting point to build a first app. Everyone having a working cordova app by hand will obviously skip the step. Does this make sense?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Almost. What do you need the Cordova app for when actually embedding the Cordova Android webview in the native app?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of my customers has the requirement to develop two native apps within a larger project. He also needs to have geospatial capabilities (like Google maps) but without the restrictions of the popular SDK's provided by Mapbox, Google,... The organization that will be offering the apps has licenses for the "Hexagon Mapworks SDK". But this is more a ready-to-use app than a SDK so I needed to run it within the native target app.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I get that. You have a native app and want a Cordova webview inside that can run a web app.

My question is more about this process you describe here: Why do you need an actual Cordova app created with cordova create to start the embedding process in the native app?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I've seen and learned is that the cordova build applies some magic to the html sources when copying them into the platform(s). I didn't look into this further but without a build for android, no assets/www sources are available.
The same applies to all other files and folders as only the full cordova build (cordova create + cordova add platform + cordova build) creates the android project sources.

So the scenario(s) are two different ones:

  1. User has a native app AND a working cordova app that needs to be integrated. (Described here)
  2. User has nothing, wants to create a cordova app and then do some native work in the app

With two different starting points, it's quite difficult to described it in general :-)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep - I have never build an app that uses Cordova in that way at all, that's why I am asking such dumb questions.


1. Copy Cordova framework files

* `platforms/android/CordovaLib/src/.*` to `<AndroidAppRoot>/app/main/java/`
* `platforms/android/src/*` to `<AndroidAppRoot>/app/main/java/`

1. Modify the layout file of the activity that shall host the Cordova view e.g.
```
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<org.apache.cordova.engine.SystemWebView
android:id="@+id/cordovaWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout
```
1. Modify your activity so that the class extends CordovaActivity (found at app/main/java/org/apache/cordova/CordovaActivity.java)
```
public class TestActivity extends CordovaActivity {

}
```

1. Override `onCreate`, `makeWebView` and `createViews` to use your defined layout
```
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test); //this is the layout file for your activity
super.init();
loadUrl(launchUrl);
}

@Override
protected CordovaWebView makeWebView() {
SystemWebView appView = (SystemWebView) findViewById(R.id.cordovaWebView); //this is the id for the SystemWebView in step 4
return new CordovaWebViewImpl(new SystemWebViewEngine(appView));
}

@Override
protected void createViews() {
// leave empty so the layout is used
}
```

1. Copy the application's HTML and JavaScript files to the Android
project's `/assets/www` directory.

1. Copy the `config.xml` file from `/framework/res/xml` to the
1. Copy the `config.xml` file from `/res/xml` to the
project's `/res/xml` directory.