Merge branch 'master' into 4.0.x

Conflicts:
	framework/src/org/apache/cordova/CordovaActivity.java
This commit is contained in:
Ian Clelland 2014-09-11 10:18:35 -04:00
commit dd5a337a49
8 changed files with 244 additions and 28 deletions

View File

@ -48,20 +48,21 @@ function tryCommand(cmd, errMsg) {
// Get valid target from framework/project.properties // Get valid target from framework/project.properties
module.exports.get_target = function() { module.exports.get_target = function() {
if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { function extractFromFile(filePath) {
var target = shelljs.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); var target = shelljs.grep(/\btarget=/, filePath);
return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); if (!target) {
} else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { throw new Error('Could not find android target within: ' + filePath);
}
return target.split('=')[1].trim();
}
if (fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) {
return extractFromFile(path.join(ROOT, 'framework', 'project.properties'));
}
if (fs.existsSync(path.join(ROOT, 'project.properties'))) {
// if no target found, we're probably in a project and project.properties is in ROOT. // if no target found, we're probably in a project and project.properties is in ROOT.
// this is called on the project itself, and can support Google APIs AND Vanilla Android return extractFromFile(path.join(ROOT, 'project.properties'));
var target = shelljs.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')) ||
shelljs.grep(/target=Google Inc.:Google APIs:[\d+]/, path.join(ROOT, 'project.properties'));
if(target == "" || !target) {
// Try Google Glass APIs
target = shelljs.grep(/target=Google Inc.:Glass Development Kit Preview:[\d+]/, path.join(ROOT, 'project.properties'));
}
return target.split('=')[1].replace('\n', '').replace('\r', '');
} }
throw new Error('Could not find android target. File missing: ' + path.join(ROOT, 'project.properties'));
} }
// Returns a promise. Called only by build and clean commands. // Returns a promise. Called only by build and clean commands.
@ -141,6 +142,20 @@ module.exports.check_android = function() {
var androidCmdPath = forgivingWhichSync('android'); var androidCmdPath = forgivingWhichSync('android');
var adbInPath = !!forgivingWhichSync('adb'); var adbInPath = !!forgivingWhichSync('adb');
var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']); var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']);
function maybeSetAndroidHome(value) {
if (fs.existsSync(value)) {
hasAndroidHome = true;
process.env['ANDROID_HOME'] = value;
}
}
if (!hasAndroidHome && !androidCmdPath) {
if (isWindows) {
maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-studio', 'sdk'));
maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-studio', 'sdk'));
} else if (process.platform == 'darwin') {
maybeSetAndroidHome('/Applications/Android Studio.app/sdk');
}
}
if (hasAndroidHome && !androidCmdPath) { if (hasAndroidHome && !androidCmdPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools'); process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools');
} }
@ -166,12 +181,17 @@ module.exports.check_android = function() {
}; };
module.exports.check_android_target = function(valid_target) { module.exports.check_android_target = function(valid_target) {
// valid_target can look like:
// android-19
// android-L
// Google Inc.:Google APIs:20
// Google Inc.:Glass Development Kit Preview:20
var msg = 'Failed to run "android". Make sure you have the latest Android SDK installed, and that the "android" command (inside the tools/ folder) is added to your PATH.'; var msg = 'Failed to run "android". Make sure you have the latest Android SDK installed, and that the "android" command (inside the tools/ folder) is added to your PATH.';
return tryCommand('android list targets', msg) return tryCommand('android list targets --compact', msg)
.then(function(output) { .then(function(output) {
if (!output.match(valid_target)) { if (output.split('\n').indexOf(valid_target) == -1) {
throw new Error('Please install Android target "' + valid_target + '".\n' + throw new Error('Please install Android target: "' + valid_target + '".\n' +
'Hint: Run "android" from your command-line to open the SDK manager.'); 'Hint: Open the SDK manager by running: ' + forgivingWhichSync('android'));
} }
}); });
}; };

View File

@ -225,10 +225,6 @@ exports.createProject = function(project_path, package_name, project_name, proje
return validatePackageName(package_name) return validatePackageName(package_name)
.then(function() { .then(function() {
validateProjectName(project_name); validateProjectName(project_name);
})
// Check that requirements are met and proper targets are installed
.then(function() {
return check_reqs.run();
}).then(function() { }).then(function() {
// Log the given values for the project // Log the given values for the project
console.log('Creating Cordova project for the Android platform:'); console.log('Creating Cordova project for the Android platform:');
@ -304,8 +300,7 @@ function extractProjectNameFromManifest(projectPath) {
// Returns a promise. // Returns a promise.
exports.updateProject = function(projectPath, shared) { exports.updateProject = function(projectPath, shared) {
var newVersion = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim(); var newVersion = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim();
// Check that requirements are met and proper targets are installed return Q()
return check_reqs.run()
.then(function() { .then(function() {
var projectName = extractProjectNameFromManifest(projectPath); var projectName = extractProjectNameFromManifest(projectPath);
var target_api = check_reqs.get_target(); var target_api = check_reqs.get_target();

View File

@ -1,5 +1,26 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.util.regex.Pattern import java.util.regex.Pattern
ext.cordova = {}
apply from: 'cordova.gradle', to: ext.cordova
apply plugin: 'android' apply plugin: 'android'
buildscript { buildscript {
@ -38,8 +59,8 @@ android {
versionCode Integer.parseInt("" + getVersionCodeFromManifest() + "0") versionCode Integer.parseInt("" + getVersionCodeFromManifest() + "0")
} }
compileSdkVersion 19 compileSdkVersion cordova.cordovaSdkVersion
buildToolsVersion "19.0.0" buildToolsVersion cordova.cordovaBuildToolsVersion
if (multiarch || System.env.BUILD_MULTIPLE_APKS) { if (multiarch || System.env.BUILD_MULTIPLE_APKS) {
productFlavors { productFlavors {

View File

@ -0,0 +1,123 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.util.regex.Pattern
String getProjectTarget(String defaultTarget) {
def manifestFile = file("project.properties")
def pattern = Pattern.compile("target\\s*=\\s*(.*)")
def matcher = pattern.matcher(manifestFile.getText())
if (matcher.find()) {
matcher.group(1)
} else {
defaultTarget
}
}
String[] getAvailableBuildTools() {
def buildToolsDir = new File(getAndroidSdkDir(), "build-tools")
buildToolsDir.list()
.findAll { it ==~ /[0-9.]+/ }
.sort { a, b -> compareVersions(b, a) }
}
String latestBuildToolsAvailable(String minBuildToolsVersion) {
def availableBuildToolsVersions
try {
availableBuildToolsVersions = getAvailableBuildTools()
} catch (e) {
println "An exception occurred while trying to find the Android build tools."
throw e
}
if (availableBuildToolsVersions.length > 0) {
def highestBuildToolsVersion = availableBuildToolsVersions[0]
if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) {
throw new RuntimeException(
"No usable Android build tools found. Highest installed version is " +
highestBuildToolsVersion + "; minimum version required is " +
minBuildToolsVersion + ".")
}
highestBuildToolsVersion
} else {
throw new RuntimeException(
"No installed build tools found. Please install the Android build tools version " +
minBuildToolsVersion + " or higher.")
}
}
// Return the first non-zero result of subtracting version list elements
// pairwise. If they are all identical, return the difference in length of
// the two lists.
int compareVersionList(Collection aParts, Collection bParts) {
def pairs = ([aParts, bParts]).transpose()
pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null}
}
// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched
// elements are identical, the longer version is the largest by this method.
// Examples:
// "19.0.0" > "19"
// "19.0.1" > "19.0.0"
// "19.1.0" > "19.0.1"
// "19" > "18.999.999"
int compareVersions(String a, String b) {
def aParts = a.tokenize('.').collect {it.toInteger()}
def bParts = b.tokenize('.').collect {it.toInteger()}
compareVersionList(aParts, bParts)
}
String getAndroidSdkDir() {
def rootDir = project.rootDir
def localProperties = new File(rootDir, 'local.properties')
def androidSdkDir = ""
if (localProperties.exists()) {
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
def sdkDirProp = properties.getProperty('sdk.dir')
if (sdkDirProp != null) {
androidSdkDir = sdkDirProp
} else {
sdkDirProp = properties.getProperty('android.dir')
if (sdkDirProp != null) {
androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath()
} else {
throw new RuntimeException(
"No sdk.dir property defined in local.properties file.")
}
}
} else {
String envVar = System.getenv("ANDROID_HOME")
if (envVar != null) {
androidSdkDir = envVar
} else {
String property = System.getProperty("android.home")
if (property != null) {
androidSdkDir = property
}
}
}
println androidSdkDir
androidSdkDir
}
cordovaSdkVersion = getProjectTarget("android-19")
cordovaBuildToolsVersion = latestBuildToolsAvailable("19.0.0")

View File

@ -1,3 +1,24 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
buildscript { buildscript {
repositories { repositories {
mavenCentral() mavenCentral()
@ -11,8 +32,8 @@ buildscript {
apply plugin: 'android-library' apply plugin: 'android-library'
android { android {
compileSdkVersion 19 compileSdkVersion cordova.cordovaSdkVersion
buildToolsVersion "19.0.0" buildToolsVersion cordova.cordovaBuildToolsVersion
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7 sourceCompatibility JavaVersion.VERSION_1_7

View File

@ -212,10 +212,8 @@ public class CordovaActivity extends Activity implements CordovaInterface {
root.addView(appView.getView()); root.addView(appView.getView());
setContentView(root); setContentView(root);
// TODO: Setting this on the appView causes it to show when <html style="opacity:0">.
int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK); int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK);
root.setBackgroundColor(backgroundColor); root.setBackgroundColor(backgroundColor);
appView.getView().setBackgroundColor(backgroundColor);
} }
/** /**

View File

@ -1,3 +1,22 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package org.apache.cordova.test; package org.apache.cordova.test;
import java.io.IOException; import java.io.IOException;

View File

@ -1,3 +1,22 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package org.apache.cordova.test.junit; package org.apache.cordova.test.junit;
import org.apache.cordova.CordovaWebView; import org.apache.cordova.CordovaWebView;