mirror of
https://github.com/apache/cordova-android.git
synced 2026-02-21 00:02:46 +08:00
Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fba87de064 | ||
|
|
576f8cba44 | ||
|
|
b9f9429542 | ||
|
|
bf0df9f3c3 | ||
|
|
1d458f2782 | ||
|
|
5ca4b4a884 | ||
|
|
5935052ead | ||
|
|
f3f2ad9144 | ||
|
|
9d1edc4554 | ||
|
|
5143b8a492 | ||
|
|
7c67f40fc4 | ||
|
|
167b600135 | ||
|
|
6c465e25d3 | ||
|
|
c183d06ed1 | ||
|
|
574731b853 | ||
|
|
94568a4ec8 | ||
|
|
b22c0e5b6d | ||
|
|
ab3347d25d | ||
|
|
66872de8e5 | ||
|
|
f6d4402fdc | ||
|
|
9f66ccb5f3 | ||
|
|
b339330592 | ||
|
|
56acd2953b | ||
|
|
6f8e13297e | ||
|
|
e9a9144098 | ||
|
|
d1905dbee8 | ||
|
|
adc88f01b7 | ||
|
|
507554b8e8 | ||
|
|
4795133daf | ||
|
|
c1c9075962 | ||
|
|
a691e9f744 | ||
|
|
8969eed506 | ||
|
|
be83095edf | ||
|
|
5c7783305a | ||
|
|
d60806bfa6 | ||
|
|
32febcb892 | ||
|
|
6c594b6f5f | ||
|
|
67d46432ed | ||
|
|
adf4166caa | ||
|
|
aa45670d87 | ||
|
|
e6d801a594 | ||
|
|
0aec2be4dd | ||
|
|
c86b618aaa | ||
|
|
dffd2deb53 | ||
|
|
8ff48b371e | ||
|
|
6de66b87cb | ||
|
|
45680a562e |
10
bin/create
10
bin/create
@@ -113,3 +113,13 @@ sed -i '' -e "s/__ID__/${PACKAGE}/g" $ACTIVITY_PATH
|
|||||||
cp $BUILD_PATH/bin/templates/project/AndroidManifest.xml $MANIFEST_PATH
|
cp $BUILD_PATH/bin/templates/project/AndroidManifest.xml $MANIFEST_PATH
|
||||||
sed -i '' -e "s/__ACTIVITY__/${ACTIVITY}/g" $MANIFEST_PATH
|
sed -i '' -e "s/__ACTIVITY__/${ACTIVITY}/g" $MANIFEST_PATH
|
||||||
sed -i '' -e "s/__PACKAGE__/${PACKAGE}/g" $MANIFEST_PATH
|
sed -i '' -e "s/__PACKAGE__/${PACKAGE}/g" $MANIFEST_PATH
|
||||||
|
|
||||||
|
# creating cordova folder and copying emulate/debug/log/launch scripts
|
||||||
|
mkdir $PROJECT_PATH/cordova
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/appinfo.jar $PROJECT_PATH/cordova/appinfo.jar
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/cordova $PROJECT_PATH/cordova/cordova
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/debug $PROJECT_PATH/cordova/debug
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/clean $PROJECT_PATH/cordova/clean
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/log $PROJECT_PATH/cordova/log
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/emulate $PROJECT_PATH/cordova/emulate
|
||||||
|
cp $BUILD_PATH/bin/templates/cordova/BOOM $PROJECT_PATH/cordova/BOOM
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ function read(filename) {
|
|||||||
f.Close();
|
f.Close();
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
function setTarget() {
|
||||||
|
var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g);
|
||||||
|
return targets[targets.length - 1].replace(/id: /, ""); // TODO: give users the option to set their target
|
||||||
|
}
|
||||||
function write(filename, contents) {
|
function write(filename, contents) {
|
||||||
var fso=WScript.CreateObject("Scripting.FileSystemObject");
|
var fso=WScript.CreateObject("Scripting.FileSystemObject");
|
||||||
var f=fso.OpenTextFile(filename, 2, true);
|
var f=fso.OpenTextFile(filename, 2, true);
|
||||||
@@ -42,12 +46,11 @@ function write(filename, contents) {
|
|||||||
function replaceInFile(filename, regexp, replacement) {
|
function replaceInFile(filename, regexp, replacement) {
|
||||||
write(filename, read(filename).replace(regexp, replacement));
|
write(filename, read(filename).replace(regexp, replacement));
|
||||||
}
|
}
|
||||||
function exec(s, output) {
|
function exec(command) {
|
||||||
var o=shell.Exec(s);
|
var oShell=shell.Exec(command);
|
||||||
while (o.Status == 0) {
|
while (oShell.Status == 0) {
|
||||||
WScript.Sleep(100);
|
WScript.sleep(100);
|
||||||
}
|
}
|
||||||
//WScript.Echo("Command exited with code " + o.Status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
@@ -125,9 +128,8 @@ if(fso.FolderExists(PROJECT_PATH)) {
|
|||||||
var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\');
|
var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\');
|
||||||
var ACTIVITY_PATH=PROJECT_PATH+'\\src\\'+PACKAGE_AS_PATH+'\\'+ACTIVITY+'.java';
|
var ACTIVITY_PATH=PROJECT_PATH+'\\src\\'+PACKAGE_AS_PATH+'\\'+ACTIVITY+'.java';
|
||||||
var MANIFEST_PATH=PROJECT_PATH+'\\AndroidManifest.xml';
|
var MANIFEST_PATH=PROJECT_PATH+'\\AndroidManifest.xml';
|
||||||
var TARGET=shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s([0-9]).*/)[1];
|
var TARGET=setTarget();
|
||||||
var VERSION=read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,'');
|
var VERSION=read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,'');
|
||||||
|
|
||||||
// create the project
|
// create the project
|
||||||
exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --package '+PACKAGE+' --activity '+ACTIVITY);
|
exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --package '+PACKAGE+' --activity '+ACTIVITY);
|
||||||
|
|
||||||
@@ -140,17 +142,32 @@ downloadCommonsCodec();
|
|||||||
exec('ant.bat -f '+ ROOT +'\\framework\\build.xml jar');
|
exec('ant.bat -f '+ ROOT +'\\framework\\build.xml jar');
|
||||||
|
|
||||||
// copy in the project template
|
// copy in the project template
|
||||||
exec('cmd /c xcopy '+ ROOT + '\\bin\\templates\\project\\* '+PROJECT_PATH+' /S /Y');
|
exec('%comspec% /c xcopy '+ ROOT + '\\bin\\templates\\project\\res '+PROJECT_PATH+'\\res\\ /E /Y');
|
||||||
|
exec('%comspec% /c xcopy '+ ROOT + '\\bin\\templates\\project\\assets '+PROJECT_PATH+'\\assets\\ /E /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\project\\AndroidManifest.xml ' + PROJECT_PATH + '\\AndroidManifest.xml /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\project\\Activity.java '+ ACTIVITY_PATH +' /Y');
|
||||||
|
|
||||||
// copy in cordova.js
|
// copy in cordova.js
|
||||||
exec('cmd /c copy '+ROOT+'\\framework\\assets\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y');
|
exec('%comspec% /c copy '+ROOT+'\\framework\\assets\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y');
|
||||||
|
|
||||||
// copy in cordova.jar
|
// copy in cordova.jar
|
||||||
exec('cmd /c copy '+ROOT+'\\framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar /Y');
|
exec('%comspec% /c copy '+ROOT+'\\framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar /Y');
|
||||||
|
|
||||||
// copy in xml
|
// copy in xml
|
||||||
exec('cmd /c copy '+ROOT+'\\framework\\res\\xml\\cordova.xml ' + PROJECT_PATH + '\\res\\xml\\cordova.xml /Y');
|
fso.CreateFolder(PROJECT_PATH + '\\res\\xml');
|
||||||
exec('cmd /c copy '+ROOT+'\\framework\\res\\xml\\plugins.xml ' + PROJECT_PATH + '\\res\\xml\\plugins.xml /Y');
|
exec('%comspec% /c copy '+ROOT+'\\framework\\res\\xml\\cordova.xml ' + PROJECT_PATH + '\\res\\xml\\cordova.xml /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\framework\\res\\xml\\plugins.xml ' + PROJECT_PATH + '\\res\\xml\\plugins.xml /Y');
|
||||||
|
|
||||||
|
// copy cordova scripts
|
||||||
|
fso.CreateFolder(PROJECT_PATH + '\\cordova');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\appinfo.jar ' + PROJECT_PATH + '\\cordova\\appinfo.jar /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\cordova.js ' + PROJECT_PATH + '\\cordova\\cordova.js /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\cordova.bat ' + PROJECT_PATH + '\\cordova\\cordova.bat /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\clean.bat ' + PROJECT_PATH + '\\cordova\\clean.bat /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\debug.bat ' + PROJECT_PATH + '\\cordova\\debug.bat /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\log.bat ' + PROJECT_PATH + '\\cordova\\log.bat /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\emulate.bat ' + PROJECT_PATH + '\\cordova\\emulate.bat /Y');
|
||||||
|
exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\BOOM.bat ' + PROJECT_PATH + '\\cordova\\BOOM.bat /Y');
|
||||||
|
|
||||||
// interpolate the activity name and package
|
// interpolate the activity name and package
|
||||||
replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY);
|
replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY);
|
||||||
|
|||||||
BIN
bin/templates/cordova/ApplicationInfo/ApplicationInfo.class
Normal file
BIN
bin/templates/cordova/ApplicationInfo/ApplicationInfo.class
Normal file
Binary file not shown.
44
bin/templates/cordova/ApplicationInfo/ApplicationInfo.java
Normal file
44
bin/templates/cordova/ApplicationInfo/ApplicationInfo.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ApplicationInfo {
|
||||||
|
private static void parseAndroidManifest(String path) {
|
||||||
|
// System.out.println(path);
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
Document dom;
|
||||||
|
try {
|
||||||
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
dom = db.parse(path);
|
||||||
|
|
||||||
|
// getting package information
|
||||||
|
Element manifest = dom.getDocumentElement();
|
||||||
|
String pakkage = manifest.getAttribute("package");
|
||||||
|
|
||||||
|
// getting activity name
|
||||||
|
String activity = ((Element)dom.getElementsByTagName("activity").item(0)).getAttribute("android:name");
|
||||||
|
System.out.println(String.format("%s/.%s", pakkage, activity.replace(".", "")));
|
||||||
|
} catch(ParserConfigurationException pce) {
|
||||||
|
pce.printStackTrace();
|
||||||
|
} catch(SAXException se) {
|
||||||
|
se.printStackTrace();
|
||||||
|
} catch(IOException ioe) {
|
||||||
|
ioe.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String path;
|
||||||
|
if(args.length > 0) {
|
||||||
|
path = args[0];
|
||||||
|
} else {
|
||||||
|
path = System.getProperty("user.dir") + "/../AndroidManifest.xml";
|
||||||
|
}
|
||||||
|
parseAndroidManifest(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
7
bin/templates/cordova/BOOM
Normal file
7
bin/templates/cordova/BOOM
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd )
|
||||||
|
|
||||||
|
bash $CORDOVA_PATH/cordova BOOM
|
||||||
1
bin/templates/cordova/BOOM.bat
Normal file
1
bin/templates/cordova/BOOM.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
%~dp0\cordova.bat BOOM
|
||||||
BIN
bin/templates/cordova/appinfo.jar
Normal file
BIN
bin/templates/cordova/appinfo.jar
Normal file
Binary file not shown.
7
bin/templates/cordova/clean
Normal file
7
bin/templates/cordova/clean
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd )
|
||||||
|
|
||||||
|
bash $CORDOVA_PATH/cordova clean
|
||||||
1
bin/templates/cordova/clean.bat
Normal file
1
bin/templates/cordova/clean.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
%~dp0\cordova.bat clean
|
||||||
91
bin/templates/cordova/cordova
Normal file
91
bin/templates/cordova/cordova
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_PATH=$( cd "$( dirname "$0" )/.." && pwd )
|
||||||
|
|
||||||
|
function check_devices {
|
||||||
|
local devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}'`
|
||||||
|
if [ -z "$devices" ] ; then
|
||||||
|
echo "1"
|
||||||
|
else
|
||||||
|
echo "0"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function emulate {
|
||||||
|
declare -a avd_list=($(android list avd | grep "Name:" | cut -f 2 -d ":" | xargs))
|
||||||
|
# we need to start adb-server
|
||||||
|
adb start-server 1>/dev/null
|
||||||
|
|
||||||
|
# Do not launch an emulator if there is already one running or if a device is attached
|
||||||
|
if [ $(check_devices) == 0 ] ; then
|
||||||
|
echo "Device attached or emulator already running"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local avd_id="1000" #FIXME: hopefully user does not have 1000 AVDs
|
||||||
|
# User has no AVDs
|
||||||
|
if [ ${#avd_list[@]} == 0 ]
|
||||||
|
then
|
||||||
|
echo "You don't have any Android Virtual Devices. Please create at least one AVD."
|
||||||
|
echo "android"
|
||||||
|
fi
|
||||||
|
# User has only one AVD
|
||||||
|
if [ ${#avd_list[@]} == 1 ]
|
||||||
|
then
|
||||||
|
emulator -cpu-delay 0 -no-boot-anim -cache /tmp/cache -avd ${avd_list[0]} 1> /dev/null 2>&1 &
|
||||||
|
# User has more than 1 AVD
|
||||||
|
elif [ ${#avd_list[@]} -gt 1 ]
|
||||||
|
then
|
||||||
|
while [ -z ${avd_list[$avd_id]} ]
|
||||||
|
do
|
||||||
|
echo "Choose from one of the following Android Virtual Devices [0 to $((${#avd_list[@]}-1))]:"
|
||||||
|
for(( i = 0 ; i < ${#avd_list[@]} ; i++ ))
|
||||||
|
do
|
||||||
|
echo "$i) ${avd_list[$i]}"
|
||||||
|
done
|
||||||
|
echo -n "> "
|
||||||
|
read avd_id
|
||||||
|
done
|
||||||
|
emulator -cpu-delay 0 -no-boot-anim -cache /tmp/cache -avd ${avd_list[$avd_id]} 1> /dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean {
|
||||||
|
ant clean
|
||||||
|
}
|
||||||
|
# has to be used independently and not in conjuction with other commands
|
||||||
|
function log {
|
||||||
|
adb logcat
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug_install {
|
||||||
|
ant debug install
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug {
|
||||||
|
ant debug
|
||||||
|
}
|
||||||
|
|
||||||
|
function launch {
|
||||||
|
local launch_str=$(java -jar $PROJECT_PATH/cordova/appinfo.jar $PROJECT_PATH/AndroidManifest.xml)
|
||||||
|
adb shell am start -n $launch_str
|
||||||
|
}
|
||||||
|
|
||||||
|
function BOOM {
|
||||||
|
clean
|
||||||
|
if [ $(check_devices) == 0 ] ; then
|
||||||
|
debug_install && launch
|
||||||
|
return
|
||||||
|
else
|
||||||
|
debug
|
||||||
|
echo "##################################################################"
|
||||||
|
echo "# Plug in your device or launch an emulator with cordova/emulate #"
|
||||||
|
echo "##################################################################"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO parse arguments
|
||||||
|
(cd $PROJECT_PATH && $1)
|
||||||
15
bin/templates/cordova/cordova.bat
Normal file
15
bin/templates/cordova/cordova.bat
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
IF NOT DEFINED JAVA_HOME GOTO MISSING
|
||||||
|
FOR %%X in (java.exe ant.bat android.bat) do (
|
||||||
|
SET FOUND=%%~$PATH:X
|
||||||
|
IF NOT DEFINED FOUND GOTO MISSING
|
||||||
|
)
|
||||||
|
cscript %~dp0\cordova.js %*
|
||||||
|
GOTO END
|
||||||
|
:MISSING
|
||||||
|
ECHO Missing one of the following:
|
||||||
|
ECHO JDK: http://java.oracle.com
|
||||||
|
ECHO Android SDK: http://developer.android.com
|
||||||
|
ECHO Apache ant: http://ant.apache.org
|
||||||
|
EXIT /B 1
|
||||||
|
:END
|
||||||
108
bin/templates/cordova/cordova.js
vendored
Normal file
108
bin/templates/cordova/cordova.js
vendored
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
var ROOT = WScript.ScriptFullName.split('\\cordova\\cordova.js').join(''),
|
||||||
|
shell=WScript.CreateObject("WScript.Shell");
|
||||||
|
|
||||||
|
function exec(command) {
|
||||||
|
var oExec=shell.Exec(command);
|
||||||
|
var output = new String();
|
||||||
|
while(oExec.Status == 0) {
|
||||||
|
if(!oExec.StdOut.AtEndOfStream) {
|
||||||
|
var line = oExec.StdOut.ReadLine();
|
||||||
|
// XXX: Change to verbose mode
|
||||||
|
//WScript.StdOut.WriteLine(line);
|
||||||
|
output += line;
|
||||||
|
}
|
||||||
|
WScript.sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
function emulator_running() {
|
||||||
|
var local_devices = shell.Exec("%comspec% /c adb devices").StdOut.ReadAll();
|
||||||
|
if(local_devices.match(/emulator/)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function emulate() {
|
||||||
|
// don't run emulator if a device is plugged in or if emulator is already running
|
||||||
|
if(emulator_running()) {
|
||||||
|
WScript.Echo("Device or Emulator already running!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var oExec = shell.Exec("%comspec% /c android.bat list avd");
|
||||||
|
var avd_list = [];
|
||||||
|
var avd_id = -10;
|
||||||
|
while(!oExec.StdOut.AtEndOfStream) {
|
||||||
|
var output = oExec.StdOut.ReadLine();
|
||||||
|
if(output.match(/Name: (.)*/)) {
|
||||||
|
avd_list.push(output.replace(/ *Name:\s/, ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// user has no AVDs
|
||||||
|
if(avd_list.length == 0) {
|
||||||
|
WScript.Echo("You don't have any Android Virtual Devices. Please create at least one AVD.");
|
||||||
|
WScript.Echo("android");
|
||||||
|
WScript.Quit(1);
|
||||||
|
}
|
||||||
|
// user has only one AVD so we launch that one
|
||||||
|
if(avd_list.length == 1) {
|
||||||
|
|
||||||
|
shell.Run("emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\cache -avd "+avd_list[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// user has more than one avd so we ask them to choose
|
||||||
|
if(avd_list.length > 1) {
|
||||||
|
while(!avd_list[avd_id]) {
|
||||||
|
WScript.Echo("Choose from one of the following Android Virtual Devices [0 to "+(avd_list.length - 1)+"]:")
|
||||||
|
for(i = 0, j = avd_list.length ; i < j ; i++) {
|
||||||
|
WScript.Echo((i)+") "+avd_list[i]);
|
||||||
|
}
|
||||||
|
WScript.StdOut.Write("> ");
|
||||||
|
avd_id = new Number(WScript.StdIn.ReadLine());
|
||||||
|
}
|
||||||
|
|
||||||
|
shell.Run("emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\\cache -avd "+avd_list[avd_id], 0, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean() {
|
||||||
|
exec("%comspec% /c ant.bat clean -f "+ROOT+"\\build.xml 2>&1");
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug() {
|
||||||
|
exec("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1");
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug_install() {
|
||||||
|
exec("%comspec% /c ant.bat debug install -f "+ROOT+"\\build.xml 2>&1");
|
||||||
|
}
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
WScript.Echo(exec("%comspec% /c adb.bat logcat"));
|
||||||
|
}
|
||||||
|
|
||||||
|
function launch() {
|
||||||
|
var launch_str=exec("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml");
|
||||||
|
//WScript.Echo(launch_str);
|
||||||
|
exec("%comspec% /c adb shell am start -n "+launch_str+" 2>&1");
|
||||||
|
}
|
||||||
|
|
||||||
|
function BOOM() {
|
||||||
|
clean();
|
||||||
|
if(emulator_running()) {
|
||||||
|
debug_install();
|
||||||
|
launch();
|
||||||
|
} else {
|
||||||
|
debug();
|
||||||
|
WScript.Echo("##################################################################");
|
||||||
|
WScript.Echo("# Plug in your device or launch an emulator with cordova/emulate #");
|
||||||
|
WScript.Echo("##################################################################");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var args = WScript.Arguments;
|
||||||
|
if(args.count() != 1) {
|
||||||
|
WScript.StdErr.Write("An error has occured!\n");
|
||||||
|
WScript.Quit(1);
|
||||||
|
}
|
||||||
|
eval(args(0)+"()");
|
||||||
7
bin/templates/cordova/debug
Normal file
7
bin/templates/cordova/debug
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd )
|
||||||
|
|
||||||
|
bash $CORDOVA_PATH/cordova debug
|
||||||
1
bin/templates/cordova/debug.bat
Normal file
1
bin/templates/cordova/debug.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
%~dp0\cordova.bat debug
|
||||||
7
bin/templates/cordova/emulate
Normal file
7
bin/templates/cordova/emulate
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd )
|
||||||
|
|
||||||
|
bash $CORDOVA_PATH/cordova emulate
|
||||||
1
bin/templates/cordova/emulate.bat
Normal file
1
bin/templates/cordova/emulate.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
%~dp0\cordova.bat emulate
|
||||||
7
bin/templates/cordova/log
Normal file
7
bin/templates/cordova/log
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_PATH=$( cd "$( dirname "$0" )/.." && pwd )
|
||||||
|
|
||||||
|
bash $PROJECT_PATH/cordova/cordova log
|
||||||
0
bin/templates/cordova/log.bat
Normal file
0
bin/templates/cordova/log.bat
Normal file
@@ -23,7 +23,7 @@
|
|||||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
<title>PhoneGap</title>
|
<title>PhoneGap</title>
|
||||||
<link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title">
|
<link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title">
|
||||||
<script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
|
<script type="text/javascript" charset="utf-8" src="cordova-1.9.0rc1.js"></script>
|
||||||
<script type="text/javascript" charset="utf-8" src="main.js"></script>
|
<script type="text/javascript" charset="utf-8" src="main.js"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -80,6 +80,41 @@ create_project.on('exit', function(code) {
|
|||||||
path.exists(util.format('%s/assets/www/cordova-%s.js', project_path, version), function(exists) {
|
path.exists(util.format('%s/assets/www/cordova-%s.js', project_path, version), function(exists) {
|
||||||
assert(exists, 'cordova.js did not get added');
|
assert(exists, 'cordova.js did not get added');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// make sure cordova master script was added
|
||||||
|
path.exists(util.format('%s/cordova/cordova', project_path), function(exists) {
|
||||||
|
assert(exists, 'cordova script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure debug script was added
|
||||||
|
path.exists(util.format('%s/cordova/debug', project_path), function(exists) {
|
||||||
|
assert(exists, 'debug script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure BOOM script was added
|
||||||
|
path.exists(util.format('%s/cordova/BOOM', project_path), function(exists) {
|
||||||
|
assert(exists, 'BOOM script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure log script was added
|
||||||
|
path.exists(util.format('%s/cordova/log', project_path), function(exists) {
|
||||||
|
assert(exists, 'log script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure clean script was added
|
||||||
|
path.exists(util.format('%s/cordova/clean', project_path), function(exists) {
|
||||||
|
assert(exists, 'clean script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure emulate script was added
|
||||||
|
path.exists(util.format('%s/cordova/emulate', project_path), function(exists) {
|
||||||
|
assert(exists, 'emulate script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure appinfo.jar script was added
|
||||||
|
path.exists(util.format('%s/cordova/appinfo.jar', project_path), function(exists) {
|
||||||
|
assert(exists, 'appinfo.jar script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
// check that project compiles && creates a cordovaExample-debug.apk
|
// check that project compiles && creates a cordovaExample-debug.apk
|
||||||
var compile_project = spawn('ant', ['debug'], {cwd: project_path});
|
var compile_project = spawn('ant', ['debug'], {cwd: project_path});
|
||||||
|
|||||||
143
bin/tests/test_create_win.js
Normal file
143
bin/tests/test_create_win.js
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
var build_path = __dirname + '/../..'
|
||||||
|
project_path = process.env.Temp + '\\example',
|
||||||
|
package_name = 'org.apache.cordova.example',
|
||||||
|
package_as_path = 'org/apache/cordova/example',
|
||||||
|
project_name = 'cordovaExample';
|
||||||
|
|
||||||
|
var path = require('path'),
|
||||||
|
fs = require('fs'),
|
||||||
|
util = require('util'),
|
||||||
|
assert = require('assert'),
|
||||||
|
exec = require('child_process').exec,
|
||||||
|
spawn = require('child_process').spawn;
|
||||||
|
|
||||||
|
var version = fs.readFileSync(build_path + '/VERSION').toString().replace('\r\n', '');
|
||||||
|
|
||||||
|
assert(version !== undefined);
|
||||||
|
assert(version !== '');
|
||||||
|
|
||||||
|
process.on('uncaughtException', function (err) {
|
||||||
|
console.log('Caught exception: ' + err);
|
||||||
|
exec('rd /s /q ' + project_path);
|
||||||
|
});
|
||||||
|
|
||||||
|
var create_project = spawn('cscript',
|
||||||
|
[build_path + '/bin/create.js',
|
||||||
|
project_path,
|
||||||
|
package_name,
|
||||||
|
project_name]
|
||||||
|
);
|
||||||
|
|
||||||
|
create_project.stderr.on('data', function (data) {
|
||||||
|
console.log('ps stderr: ' + data);
|
||||||
|
});
|
||||||
|
|
||||||
|
create_project.stderr.on('data', function(data) {
|
||||||
|
console.log(data.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
create_project.stdout.on('data', function(data) {
|
||||||
|
console.log(data.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
create_project.on('exit', function(code) {
|
||||||
|
assert.equal(code, 0, 'Project did not get created');
|
||||||
|
|
||||||
|
// make sure the project was created
|
||||||
|
path.exists(project_path, function(exists) {
|
||||||
|
assert(exists, 'Project path does not exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure the build directory was cleaned up
|
||||||
|
// path.exists(build_path + '/framework/libs', function(exists) {
|
||||||
|
// assert(!exists, 'libs directory did not get cleaned up');
|
||||||
|
// });
|
||||||
|
path.exists(build_path + util.format('/framework/assets/cordova-%s.js', version), function(exists) {
|
||||||
|
assert(!exists, 'javascript file did not get cleaned up');
|
||||||
|
});
|
||||||
|
path.exists(build_path + util.format('/framework/cordova-%s.jar', version), function(exists) {
|
||||||
|
assert(!exists, 'jar file did not get cleaned up');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure AndroidManifest.xml was added
|
||||||
|
path.exists(util.format('%s/AndroidManifest.xml', project_path), function(exists) {
|
||||||
|
assert(exists, 'AndroidManifest.xml did not get created');
|
||||||
|
// TODO check that the activity name was properly substituted
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure main Activity was added
|
||||||
|
path.exists(util.format('%s/src/%s/%s.java', project_path, package_as_path, project_name), function(exists) {
|
||||||
|
assert(exists, 'Activity did not get created');
|
||||||
|
// TODO check that package name and activity name were substitued properly
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure plugins.xml was added
|
||||||
|
path.exists(util.format('%s/res/xml/plugins.xml', project_path), function(exists) {
|
||||||
|
assert(exists, 'plugins.xml did not get created');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure cordova.xml was added
|
||||||
|
path.exists(util.format('%s/res/xml/cordova.xml', project_path), function(exists) {
|
||||||
|
assert(exists, 'plugins.xml did not get created');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure cordova.jar was added
|
||||||
|
path.exists(util.format('%s/libs/cordova-%s.jar', project_path, version), function(exists) {
|
||||||
|
assert(exists, 'cordova.jar did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure cordova.js was added
|
||||||
|
path.exists(util.format('%s/assets/www/cordova-%s.js', project_path, version), function(exists) {
|
||||||
|
assert(exists, 'cordova.js did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure cordova master script was added
|
||||||
|
path.exists(util.format('%s/cordova/cordova.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'cordova script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure debug script was added
|
||||||
|
path.exists(util.format('%s/cordova/debug.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'debug script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure BOOM script was added
|
||||||
|
path.exists(util.format('%s/cordova/BOOM.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'BOOM script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure log script was added
|
||||||
|
path.exists(util.format('%s/cordova/log.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'log script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure clean script was added
|
||||||
|
path.exists(util.format('%s/cordova/clean.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'clean script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure emulate script was added
|
||||||
|
path.exists(util.format('%s/cordova/emulate.bat', project_path), function(exists) {
|
||||||
|
assert(exists, 'emulate script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// make sure appinfo.jar script was added
|
||||||
|
path.exists(util.format('%s/cordova/appinfo.jar', project_path), function(exists) {
|
||||||
|
assert(exists, 'appinfo.jar script did not get added');
|
||||||
|
});
|
||||||
|
|
||||||
|
// check that project compiles && creates a cordovaExample-debug.apk
|
||||||
|
// XXX: !@##!@# WINDOWS
|
||||||
|
exec('ant debug -f ' + project_path + "\\build.xml", function(error, stdout, stderr) {
|
||||||
|
assert(error == null, "Cordova Android Project does not compile");
|
||||||
|
path.exists(util.format('%s/bin/%s-debug.apk', project_path, project_name),
|
||||||
|
function(exists) {
|
||||||
|
assert(exists, 'Package did not get created');
|
||||||
|
// if project compiles properly just AXE it
|
||||||
|
exec('rd /s /q ' + project_path);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// commit 347de1a785b7ecbe86c2189343ab2549a9297f9b
|
// commit 25033fceac7c800623f1f16881b784d19eba69cc
|
||||||
|
|
||||||
// File generated at :: Fri Jun 08 2012 16:17:50 GMT-0700 (PDT)
|
// File generated at :: Thu Jun 21 2012 10:45:32 GMT-0700 (PDT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
@@ -190,7 +190,9 @@ var cordova = {
|
|||||||
fireDocumentEvent: function(type, data) {
|
fireDocumentEvent: function(type, data) {
|
||||||
var evt = createEvent(type, data);
|
var evt = createEvent(type, data);
|
||||||
if (typeof documentEventHandlers[type] != 'undefined') {
|
if (typeof documentEventHandlers[type] != 'undefined') {
|
||||||
documentEventHandlers[type].fire(evt);
|
setTimeout(function() {
|
||||||
|
documentEventHandlers[type].fire(evt);
|
||||||
|
}, 0);
|
||||||
} else {
|
} else {
|
||||||
document.dispatchEvent(evt);
|
document.dispatchEvent(evt);
|
||||||
}
|
}
|
||||||
@@ -198,7 +200,9 @@ var cordova = {
|
|||||||
fireWindowEvent: function(type, data) {
|
fireWindowEvent: function(type, data) {
|
||||||
var evt = createEvent(type,data);
|
var evt = createEvent(type,data);
|
||||||
if (typeof windowEventHandlers[type] != 'undefined') {
|
if (typeof windowEventHandlers[type] != 'undefined') {
|
||||||
windowEventHandlers[type].fire(evt);
|
setTimeout(function() {
|
||||||
|
windowEventHandlers[type].fire(evt);
|
||||||
|
}, 0);
|
||||||
} else {
|
} else {
|
||||||
window.dispatchEvent(evt);
|
window.dispatchEvent(evt);
|
||||||
}
|
}
|
||||||
@@ -953,8 +957,7 @@ module.exports = function(success, fail, service, action, args) {
|
|||||||
|
|
||||||
// If a result was returned
|
// If a result was returned
|
||||||
if (r.length > 0) {
|
if (r.length > 0) {
|
||||||
var v;
|
var v = JSON.parse(r);
|
||||||
eval("v="+r+";");
|
|
||||||
|
|
||||||
// If status is OK, then return value back to caller
|
// If status is OK, then return value back to caller
|
||||||
if (v.status === cordova.callbackStatus.OK) {
|
if (v.status === cordova.callbackStatus.OK) {
|
||||||
@@ -1067,28 +1070,6 @@ module.exports = {
|
|||||||
cordova.addDocumentEventHandler('menubutton');
|
cordova.addDocumentEventHandler('menubutton');
|
||||||
cordova.addDocumentEventHandler('searchbutton');
|
cordova.addDocumentEventHandler('searchbutton');
|
||||||
|
|
||||||
function bindButtonChannel(buttonName) {
|
|
||||||
// generic button bind used for volumeup/volumedown buttons
|
|
||||||
return cordova.addDocumentEventHandler(buttonName + 'button', {
|
|
||||||
onSubscribe:function() {
|
|
||||||
// If we just attached the first handler, let native know we need to override the button.
|
|
||||||
if (this.numHandlers === 1) {
|
|
||||||
exec(null, null, "App", "overrideButton", [buttonName, true]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onUnsubscribe:function() {
|
|
||||||
// If we just detached the last handler, let native know we no longer override the volumeup button.
|
|
||||||
if (this.numHandlers === 0) {
|
|
||||||
exec(null, null, "App", "overrideButton", [buttonName, false]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
// Inject a listener for the volume buttons on the document.
|
|
||||||
var volumeUpButtonChannel = bindButtonChannel('volumeup');
|
|
||||||
var volumeDownButtonChannel = bindButtonChannel('volumedown');
|
|
||||||
|
|
||||||
// Figure out if we need to shim-in localStorage and WebSQL
|
// Figure out if we need to shim-in localStorage and WebSQL
|
||||||
// support from the native side.
|
// support from the native side.
|
||||||
var storage = require('cordova/plugin/android/storage');
|
var storage = require('cordova/plugin/android/storage');
|
||||||
@@ -1308,7 +1289,7 @@ cameraExport.getPicture = function(successCallback, errorCallback, options) {
|
|||||||
|
|
||||||
cameraExport.cleanup = function(successCallback, errorCallback) {
|
cameraExport.cleanup = function(successCallback, errorCallback) {
|
||||||
exec(successCallback, errorCallback, "Camera", "cleanup", []);
|
exec(successCallback, errorCallback, "Camera", "cleanup", []);
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports = cameraExport;
|
module.exports = cameraExport;
|
||||||
});
|
});
|
||||||
@@ -2628,7 +2609,8 @@ module.exports = FileSystem;
|
|||||||
|
|
||||||
// file: lib/common/plugin/FileTransfer.js
|
// file: lib/common/plugin/FileTransfer.js
|
||||||
define("cordova/plugin/FileTransfer", function(require, exports, module) {
|
define("cordova/plugin/FileTransfer", function(require, exports, module) {
|
||||||
var exec = require('cordova/exec');
|
var exec = require('cordova/exec'),
|
||||||
|
FileTransferError = require('cordova/plugin/FileTransferError');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FileTransfer uploads a file to a remote server.
|
* FileTransfer uploads a file to a remote server.
|
||||||
@@ -2647,6 +2629,8 @@ var FileTransfer = function() {};
|
|||||||
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
|
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
|
||||||
*/
|
*/
|
||||||
FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
|
FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
|
||||||
|
// sanity parameter checking
|
||||||
|
if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
|
||||||
// check for options
|
// check for options
|
||||||
var fileKey = null;
|
var fileKey = null;
|
||||||
var fileName = null;
|
var fileName = null;
|
||||||
@@ -2668,7 +2652,12 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]);
|
var fail = function(e) {
|
||||||
|
var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
|
||||||
|
errorCallback(error);
|
||||||
|
};
|
||||||
|
|
||||||
|
exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2679,6 +2668,8 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
|
|||||||
* @param errorCallback {Function} Callback to be invoked upon error
|
* @param errorCallback {Function} Callback to be invoked upon error
|
||||||
*/
|
*/
|
||||||
FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
|
FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
|
||||||
|
// sanity parameter checking
|
||||||
|
if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
|
||||||
var win = function(result) {
|
var win = function(result) {
|
||||||
var entry = null;
|
var entry = null;
|
||||||
if (result.isDirectory) {
|
if (result.isDirectory) {
|
||||||
@@ -2693,6 +2684,12 @@ FileTransfer.prototype.download = function(source, target, successCallback, erro
|
|||||||
entry.fullPath = result.fullPath;
|
entry.fullPath = result.fullPath;
|
||||||
successCallback(entry);
|
successCallback(entry);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var fail = function(e) {
|
||||||
|
var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
|
||||||
|
errorCallback(error);
|
||||||
|
};
|
||||||
|
|
||||||
exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
|
exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2706,8 +2703,11 @@ define("cordova/plugin/FileTransferError", function(require, exports, module) {
|
|||||||
* FileTransferError
|
* FileTransferError
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
var FileTransferError = function(code) {
|
var FileTransferError = function(code, source, target, status) {
|
||||||
this.code = code || null;
|
this.code = code || null;
|
||||||
|
this.source = source || null;
|
||||||
|
this.target = target || null;
|
||||||
|
this.http_status = status || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
FileTransferError.FILE_NOT_FOUND_ERR = 1;
|
FileTransferError.FILE_NOT_FOUND_ERR = 1;
|
||||||
@@ -2715,6 +2715,7 @@ FileTransferError.INVALID_URL_ERR = 2;
|
|||||||
FileTransferError.CONNECTION_ERR = 3;
|
FileTransferError.CONNECTION_ERR = 3;
|
||||||
|
|
||||||
module.exports = FileTransferError;
|
module.exports = FileTransferError;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// file: lib/common/plugin/FileUploadOptions.js
|
// file: lib/common/plugin/FileUploadOptions.js
|
||||||
@@ -3665,21 +3666,6 @@ module.exports = {
|
|||||||
exec(null, null, "App", "overrideBackbutton", [override]);
|
exec(null, null, "App", "overrideBackbutton", [override]);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Override the default behavior of the Android volume button.
|
|
||||||
* If overridden, when the volume button is pressed, the "volume[up|down]button" JavaScript event will be fired.
|
|
||||||
*
|
|
||||||
* Note: The user should not have to call this method. Instead, when the user
|
|
||||||
* registers for the "volume[up|down]button" event, this is automatically done.
|
|
||||||
*
|
|
||||||
* @param button volumeup, volumedown
|
|
||||||
* @param override T=override, F=cancel override
|
|
||||||
*/
|
|
||||||
overrideButton:function(button, override) {
|
|
||||||
exec(null, null, "App", "overrideButton", [button, override]);
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exit and terminate the application.
|
* Exit and terminate the application.
|
||||||
*/
|
*/
|
||||||
@@ -5509,6 +5495,9 @@ define("cordova/plugin/splashscreen", function(require, exports, module) {
|
|||||||
var exec = require('cordova/exec');
|
var exec = require('cordova/exec');
|
||||||
|
|
||||||
var splashscreen = {
|
var splashscreen = {
|
||||||
|
show:function() {
|
||||||
|
exec(null, null, "SplashScreen", "show", []);
|
||||||
|
},
|
||||||
hide:function() {
|
hide:function() {
|
||||||
exec(null, null, "SplashScreen", "hide", []);
|
exec(null, null, "SplashScreen", "hide", []);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title></title>
|
<title></title>
|
||||||
<script src="cordova-1.8.0.js"></script>
|
<script src="cordova-1.9.0rc1.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|||||||
@@ -68,12 +68,12 @@ public class AccelListener extends Plugin implements SensorEventListener {
|
|||||||
* Sets the context of the Command. This can then be used to do things like
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
* get file paths associated with the Activity.
|
* get file paths associated with the Activity.
|
||||||
*
|
*
|
||||||
* @param ctx The context of the main Activity.
|
* @param cordova The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface cordova) {
|
||||||
super.setContext(ctx);
|
super.setContext(cordova);
|
||||||
this.sensorManager = (SensorManager) ctx.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
this.sensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class App extends Plugin {
|
|||||||
this.clearCache();
|
this.clearCache();
|
||||||
}
|
}
|
||||||
else if (action.equals("show")) { // TODO @bc - Not in master branch. When should this be called?
|
else if (action.equals("show")) { // TODO @bc - Not in master branch. When should this be called?
|
||||||
ctx.getActivity().runOnUiThread(new Runnable() {
|
cordova.getActivity().runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
webView.postMessage("spinner", "stop");
|
webView.postMessage("spinner", "stop");
|
||||||
}
|
}
|
||||||
@@ -73,10 +73,6 @@ public class App extends Plugin {
|
|||||||
else if (action.equals("overrideBackbutton")) {
|
else if (action.equals("overrideBackbutton")) {
|
||||||
this.overrideBackbutton(args.getBoolean(0));
|
this.overrideBackbutton(args.getBoolean(0));
|
||||||
}
|
}
|
||||||
else if (action.equals("isBackbuttonOverridden")) {
|
|
||||||
boolean b = this.isBackbuttonOverridden();
|
|
||||||
return new PluginResult(status, b);
|
|
||||||
}
|
|
||||||
else if (action.equals("exitApp")) {
|
else if (action.equals("exitApp")) {
|
||||||
this.exitApp();
|
this.exitApp();
|
||||||
}
|
}
|
||||||
@@ -162,7 +158,7 @@ public class App extends Plugin {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void cancelLoadUrl() {
|
public void cancelLoadUrl() {
|
||||||
this.ctx.cancelLoadUrl();
|
this.cordova.cancelLoadUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -202,14 +198,6 @@ public class App extends Plugin {
|
|||||||
LOG.i("DroidGap", "WARNING: Volume Button Default Behaviour will be overridden. The volume event will be fired!");
|
LOG.i("DroidGap", "WARNING: Volume Button Default Behaviour will be overridden. The volume event will be fired!");
|
||||||
webView.bindButton(button, override);
|
webView.bindButton(button, override);
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Return whether the Android back button is overridden by the user.
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public boolean isBackbuttonOverridden() {
|
|
||||||
return this.ctx.isBackButtonBound();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exit the Android application.
|
* Exit the Android application.
|
||||||
|
|||||||
@@ -305,7 +305,7 @@ public class AudioHandler extends Plugin {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void setAudioOutputDevice(int output) {
|
public void setAudioOutputDevice(int output) {
|
||||||
AudioManager audiMgr = (AudioManager) this.ctx.getActivity().getSystemService(Context.AUDIO_SERVICE);
|
AudioManager audiMgr = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE);
|
||||||
if (output == 2) {
|
if (output == 2) {
|
||||||
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
|
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
|
||||||
}
|
}
|
||||||
@@ -324,7 +324,7 @@ public class AudioHandler extends Plugin {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public int getAudioOutputDevice() {
|
public int getAudioOutputDevice() {
|
||||||
AudioManager audiMgr = (AudioManager) this.ctx.getActivity().getSystemService(Context.AUDIO_SERVICE);
|
AudioManager audiMgr = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE);
|
||||||
if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE) {
|
if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public class AudioPlayer implements OnCompletionListener, OnPreparedListener, On
|
|||||||
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
this.tempFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tmprecording.mp3";
|
this.tempFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tmprecording.mp3";
|
||||||
} else {
|
} else {
|
||||||
this.tempFile = "/data/data/" + handler.ctx.getActivity().getPackageName() + "/cache/tmprecording.mp3";
|
this.tempFile = "/data/data/" + handler.cordova.getActivity().getPackageName() + "/cache/tmprecording.mp3";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ public class AudioPlayer implements OnCompletionListener, OnPreparedListener, On
|
|||||||
f.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath()
|
f.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath()
|
||||||
+ File.separator + file));
|
+ File.separator + file));
|
||||||
} else {
|
} else {
|
||||||
f.renameTo(new File("/data/data/" + handler.ctx.getActivity().getPackageName() + "/cache/" + file));
|
f.renameTo(new File("/data/data/" + handler.cordova.getActivity().getPackageName() + "/cache/" + file));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -220,7 +220,7 @@ public class AudioPlayer implements OnCompletionListener, OnPreparedListener, On
|
|||||||
else {
|
else {
|
||||||
if (file.startsWith("/android_asset/")) {
|
if (file.startsWith("/android_asset/")) {
|
||||||
String f = file.substring(15);
|
String f = file.substring(15);
|
||||||
android.content.res.AssetFileDescriptor fd = this.handler.ctx.getActivity().getAssets().openFd(f);
|
android.content.res.AssetFileDescriptor fd = this.handler.cordova.getActivity().getAssets().openFd(f);
|
||||||
this.mPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
|
this.mPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class BatteryListener extends Plugin {
|
|||||||
updateBatteryInfo(intent);
|
updateBatteryInfo(intent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ctx.getActivity().registerReceiver(this.receiver, intentFilter);
|
cordova.getActivity().registerReceiver(this.receiver, intentFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't return any result now, since status results will be sent when events come in from broadcast receiver
|
// Don't return any result now, since status results will be sent when events come in from broadcast receiver
|
||||||
@@ -105,7 +105,7 @@ public class BatteryListener extends Plugin {
|
|||||||
private void removeBatteryListener() {
|
private void removeBatteryListener() {
|
||||||
if (this.receiver != null) {
|
if (this.receiver != null) {
|
||||||
try {
|
try {
|
||||||
this.ctx.getActivity().unregisterReceiver(this.receiver);
|
this.cordova.getActivity().unregisterReceiver(this.receiver);
|
||||||
this.receiver = null;
|
this.receiver = null;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(LOG_TAG, "Error unregistering battery receiver: " + e.getMessage(), e);
|
Log.e(LOG_TAG, "Error unregistering battery receiver: " + e.getMessage(), e);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package org.apache.cordova;
|
|||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -41,15 +42,19 @@ import android.database.Cursor;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
|
import android.media.MediaScannerConnection;
|
||||||
|
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Environment;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class launches the camera view, allows the user to take a picture, closes the camera view,
|
* This class launches the camera view, allows the user to take a picture, closes the camera view,
|
||||||
* and returns the captured image. When the camera view is closed, the screen displayed before
|
* and returns the captured image. When the camera view is closed, the screen displayed before
|
||||||
* the camera view was shown is redisplayed.
|
* the camera view was shown is redisplayed.
|
||||||
*/
|
*/
|
||||||
public class CameraLauncher extends Plugin {
|
public class CameraLauncher extends Plugin implements MediaScannerConnectionClient {
|
||||||
|
|
||||||
private static final int DATA_URL = 0; // Return base64 encoded string
|
private static final int DATA_URL = 0; // Return base64 encoded string
|
||||||
private static final int FILE_URI = 1; // Return file uri (content://media/external/images/media/2 for Android)
|
private static final int FILE_URI = 1; // Return file uri (content://media/external/images/media/2 for Android)
|
||||||
@@ -76,9 +81,12 @@ public class CameraLauncher extends Plugin {
|
|||||||
private Uri imageUri; // Uri of captured image
|
private Uri imageUri; // Uri of captured image
|
||||||
private int encodingType; // Type of encoding to use
|
private int encodingType; // Type of encoding to use
|
||||||
private int mediaType; // What type of media to retrieve
|
private int mediaType; // What type of media to retrieve
|
||||||
|
private boolean saveToPhotoAlbum; // Should the picture be saved to the device's photo album
|
||||||
|
|
||||||
public String callbackId;
|
public String callbackId;
|
||||||
private int numPics;
|
private int numPics;
|
||||||
|
|
||||||
|
private MediaScannerConnection conn; // Used to update gallery app with newly-written files
|
||||||
|
|
||||||
//This should never be null!
|
//This should never be null!
|
||||||
//private CordovaInterface cordova;
|
//private CordovaInterface cordova;
|
||||||
@@ -114,6 +122,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
if (action.equals("takePicture")) {
|
if (action.equals("takePicture")) {
|
||||||
int srcType = CAMERA;
|
int srcType = CAMERA;
|
||||||
int destType = FILE_URI;
|
int destType = FILE_URI;
|
||||||
|
this.saveToPhotoAlbum = false;
|
||||||
this.targetHeight = 0;
|
this.targetHeight = 0;
|
||||||
this.targetWidth = 0;
|
this.targetWidth = 0;
|
||||||
this.encodingType = JPEG;
|
this.encodingType = JPEG;
|
||||||
@@ -127,6 +136,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
this.targetHeight = args.getInt(4);
|
this.targetHeight = args.getInt(4);
|
||||||
this.encodingType = args.getInt(5);
|
this.encodingType = args.getInt(5);
|
||||||
this.mediaType = args.getInt(6);
|
this.mediaType = args.getInt(6);
|
||||||
|
this.saveToPhotoAlbum = args.getBoolean(9);
|
||||||
|
|
||||||
if (srcType == CAMERA) {
|
if (srcType == CAMERA) {
|
||||||
this.takePicture(destType, encodingType);
|
this.takePicture(destType, encodingType);
|
||||||
@@ -165,7 +175,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
*/
|
*/
|
||||||
public void takePicture(int returnType, int encodingType) {
|
public void takePicture(int returnType, int encodingType) {
|
||||||
// Save the number of images currently on disk for later
|
// Save the number of images currently on disk for later
|
||||||
this.numPics = queryImgDB().getCount();
|
this.numPics = queryImgDB(whichContentStore()).getCount();
|
||||||
|
|
||||||
// Display camera
|
// Display camera
|
||||||
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
|
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
|
||||||
@@ -176,8 +186,8 @@ public class CameraLauncher extends Plugin {
|
|||||||
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
|
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
|
||||||
this.imageUri = Uri.fromFile(photo);
|
this.imageUri = Uri.fromFile(photo);
|
||||||
|
|
||||||
if (this.ctx != null) {
|
if (this.cordova != null) {
|
||||||
this.ctx.startActivityForResult((Plugin) this, intent, (CAMERA + 1) * 16 + returnType + 1);
|
this.cordova.startActivityForResult((Plugin) this, intent, (CAMERA + 1) * 16 + returnType + 1);
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
|
// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity");
|
||||||
@@ -192,9 +202,9 @@ public class CameraLauncher extends Plugin {
|
|||||||
private File createCaptureFile(int encodingType) {
|
private File createCaptureFile(int encodingType) {
|
||||||
File photo = null;
|
File photo = null;
|
||||||
if (encodingType == JPEG) {
|
if (encodingType == JPEG) {
|
||||||
photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Pic.jpg");
|
photo = new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), ".Pic.jpg");
|
||||||
} else if (encodingType == PNG) {
|
} else if (encodingType == PNG) {
|
||||||
photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Pic.png");
|
photo = new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), ".Pic.png");
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
|
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
|
||||||
}
|
}
|
||||||
@@ -228,8 +238,8 @@ public class CameraLauncher extends Plugin {
|
|||||||
|
|
||||||
intent.setAction(Intent.ACTION_GET_CONTENT);
|
intent.setAction(Intent.ACTION_GET_CONTENT);
|
||||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
if (this.ctx != null) {
|
if (this.cordova != null) {
|
||||||
this.ctx.startActivityForResult((Plugin) this, Intent.createChooser(intent,
|
this.cordova.startActivityForResult((Plugin) this, Intent.createChooser(intent,
|
||||||
new String(title)), (srcType + 1) * 16 + returnType + 1);
|
new String(title)), (srcType + 1) * 16 + returnType + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -277,6 +287,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
|
|
||||||
Bitmap retval = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
|
Bitmap retval = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
|
||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
|
System.gc();
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +310,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
ExifHelper exif = new ExifHelper();
|
ExifHelper exif = new ExifHelper();
|
||||||
try {
|
try {
|
||||||
if (this.encodingType == JPEG) {
|
if (this.encodingType == JPEG) {
|
||||||
exif.createInFile(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/Pic.jpg");
|
exif.createInFile(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/.Pic.jpg");
|
||||||
exif.readExifData();
|
exif.readExifData();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -310,63 +321,85 @@ public class CameraLauncher extends Plugin {
|
|||||||
// If image available
|
// If image available
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
try {
|
try {
|
||||||
// Read in bitmap of captured image
|
Bitmap bitmap = null;
|
||||||
Bitmap bitmap;
|
|
||||||
try {
|
|
||||||
bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getActivity().getContentResolver(), imageUri);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
Uri uri = intent.getData();
|
|
||||||
android.content.ContentResolver resolver = this.ctx.getActivity().getContentResolver();
|
|
||||||
bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
bitmap = scaleBitmap(bitmap);
|
|
||||||
|
|
||||||
// If sending base64 image back
|
// If sending base64 image back
|
||||||
if (destType == DATA_URL) {
|
if (destType == DATA_URL) {
|
||||||
|
bitmap = scaleBitmap(getBitmapFromResult(intent));
|
||||||
|
|
||||||
this.processPicture(bitmap);
|
this.processPicture(bitmap);
|
||||||
checkForDuplicateImage(DATA_URL);
|
checkForDuplicateImage(DATA_URL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If sending filename back
|
// If sending filename back
|
||||||
else if (destType == FILE_URI) {
|
else if (destType == FILE_URI) {
|
||||||
// Create entry in media store for image
|
Uri uri;
|
||||||
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
|
if (!this.saveToPhotoAlbum) {
|
||||||
ContentValues values = new ContentValues();
|
uri = Uri.fromFile(new File("/data/data/" + this.cordova.getActivity().getPackageName() + "/", (new File(FileUtils.stripFileProtocol(this.imageUri.toString()))).getName()));
|
||||||
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
|
} else {
|
||||||
Uri uri = null;
|
// Create entry in media store for image
|
||||||
try {
|
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
|
||||||
uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
|
ContentValues values = new ContentValues();
|
||||||
} catch (UnsupportedOperationException e) {
|
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
|
||||||
LOG.d(LOG_TAG, "Can't write to external media storage.");
|
|
||||||
try {
|
try {
|
||||||
uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
|
uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
|
||||||
} catch (UnsupportedOperationException ex) {
|
} catch (UnsupportedOperationException e) {
|
||||||
LOG.d(LOG_TAG, "Can't write to internal media storage.");
|
LOG.d(LOG_TAG, "Can't write to external media storage.");
|
||||||
this.failPicture("Error capturing image - no media storage found.");
|
try {
|
||||||
return;
|
uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
|
||||||
|
} catch (UnsupportedOperationException ex) {
|
||||||
|
LOG.d(LOG_TAG, "Can't write to internal media storage.");
|
||||||
|
this.failPicture("Error capturing image - no media storage found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add compressed version of captured image to returned media store Uri
|
// If all this is true we shouldn't compress the image.
|
||||||
OutputStream os = this.ctx.getActivity().getContentResolver().openOutputStream(uri);
|
if (this.targetHeight == -1 && this.targetWidth == -1 && this.mQuality == 100) {
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
FileInputStream fis = new FileInputStream(FileUtils.stripFileProtocol(imageUri.toString()));
|
||||||
os.close();
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int len;
|
||||||
|
while ((len = fis.read(buffer)) != -1) {
|
||||||
|
os.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
os.flush();
|
||||||
|
os.close();
|
||||||
|
fis.close();
|
||||||
|
|
||||||
// Restore exif data to file
|
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
|
||||||
if (this.encodingType == JPEG) {
|
} else {
|
||||||
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
|
|
||||||
exif.writeExifData();
|
bitmap = scaleBitmap(getBitmapFromResult(intent));
|
||||||
|
|
||||||
|
// Add compressed version of captured image to returned media store Uri
|
||||||
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
||||||
|
os.close();
|
||||||
|
|
||||||
|
// Restore exif data to file
|
||||||
|
|
||||||
|
if (this.encodingType == JPEG) {
|
||||||
|
String exifPath;
|
||||||
|
if (this.saveToPhotoAlbum) {
|
||||||
|
exifPath = FileUtils.getRealPathFromURI(uri, this.cordova);
|
||||||
|
} else {
|
||||||
|
exifPath = uri.getPath();
|
||||||
|
}
|
||||||
|
exif.createOutFile(exifPath);
|
||||||
|
exif.writeExifData();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send Uri back to JavaScript for viewing image
|
// Send Uri back to JavaScript for viewing image
|
||||||
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
|
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
|
||||||
}
|
}
|
||||||
bitmap.recycle();
|
|
||||||
|
this.cleanup(FILE_URI, this.imageUri, bitmap);
|
||||||
bitmap = null;
|
bitmap = null;
|
||||||
System.gc();
|
|
||||||
|
|
||||||
checkForDuplicateImage(FILE_URI);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.failPicture("Error capturing image.");
|
this.failPicture("Error capturing image.");
|
||||||
@@ -388,9 +421,9 @@ public class CameraLauncher extends Plugin {
|
|||||||
else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) {
|
else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) {
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
Uri uri = intent.getData();
|
Uri uri = intent.getData();
|
||||||
android.content.ContentResolver resolver = this.ctx.getActivity().getContentResolver();
|
android.content.ContentResolver resolver = this.cordova.getActivity().getContentResolver();
|
||||||
|
|
||||||
// If you ask for video or all media type you will automatically get back a file URI
|
// If you ask for video or all media type you will automatically get back a file URI
|
||||||
// and there will be no attempt to resize any returned data
|
// and there will be no attempt to resize any returned data
|
||||||
if (this.mediaType != PICTURE) {
|
if (this.mediaType != PICTURE) {
|
||||||
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
|
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
|
||||||
@@ -401,7 +434,7 @@ public class CameraLauncher extends Plugin {
|
|||||||
try {
|
try {
|
||||||
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
||||||
String[] cols = { MediaStore.Images.Media.ORIENTATION };
|
String[] cols = { MediaStore.Images.Media.ORIENTATION };
|
||||||
Cursor cursor = this.ctx.getActivity().getContentResolver().query(intent.getData(),
|
Cursor cursor = this.cordova.getActivity().getContentResolver().query(intent.getData(),
|
||||||
cols,
|
cols,
|
||||||
null, null, null);
|
null, null, null);
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
@@ -433,21 +466,21 @@ public class CameraLauncher extends Plugin {
|
|||||||
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
||||||
bitmap = scaleBitmap(bitmap);
|
bitmap = scaleBitmap(bitmap);
|
||||||
|
|
||||||
String fileName = DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/resize.jpg";
|
String fileName = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
||||||
OutputStream os = new FileOutputStream(fileName);
|
OutputStream os = new FileOutputStream(fileName);
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
||||||
os.close();
|
os.close();
|
||||||
|
|
||||||
// Restore exif data to file
|
// Restore exif data to file
|
||||||
if (this.encodingType == JPEG) {
|
if (this.encodingType == JPEG) {
|
||||||
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
|
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.cordova));
|
||||||
exif.writeExifData();
|
exif.writeExifData();
|
||||||
}
|
}
|
||||||
|
|
||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
bitmap = null;
|
bitmap = null;
|
||||||
|
|
||||||
// The resized image is cached by the app in order to get around this and not have to delete you
|
// The resized image is cached by the app in order to get around this and not have to delete you
|
||||||
// application cache I'm adding the current system time to the end of the file url.
|
// application cache I'm adding the current system time to the end of the file url.
|
||||||
this.success(new PluginResult(PluginResult.Status.OK, ("file://" + fileName + "?" + System.currentTimeMillis())), this.callbackId);
|
this.success(new PluginResult(PluginResult.Status.OK, ("file://" + fileName + "?" + System.currentTimeMillis())), this.callbackId);
|
||||||
System.gc();
|
System.gc();
|
||||||
@@ -471,19 +504,48 @@ public class CameraLauncher extends Plugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Bitmap getBitmapFromResult(Intent intent)
|
||||||
|
throws IOException, FileNotFoundException {
|
||||||
|
Bitmap bitmap = null;
|
||||||
|
try {
|
||||||
|
bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getActivity().getContentResolver(), imageUri);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Uri uri = intent.getData();
|
||||||
|
android.content.ContentResolver resolver = this.ctx.getActivity().getContentResolver();
|
||||||
|
bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
|
||||||
|
}
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a cursor that can be used to determine how many images we have.
|
* Creates a cursor that can be used to determine how many images we have.
|
||||||
*
|
*
|
||||||
* @return a cursor
|
* @return a cursor
|
||||||
*/
|
*/
|
||||||
private Cursor queryImgDB() {
|
private Cursor queryImgDB(Uri contentStore) {
|
||||||
return this.ctx.getActivity().getContentResolver().query(
|
return this.cordova.getActivity().getContentResolver().query(
|
||||||
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
contentStore,
|
||||||
new String[] { MediaStore.Images.Media._ID },
|
new String[] { MediaStore.Images.Media._ID },
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up after picture taking. Checking for duplicates and that kind of stuff.
|
||||||
|
*/
|
||||||
|
private void cleanup(int imageType, Uri oldImage, Bitmap bitmap) {
|
||||||
|
bitmap.recycle();
|
||||||
|
|
||||||
|
// Clean up initial camera-written image file.
|
||||||
|
(new File(FileUtils.stripFileProtocol(oldImage.toString()))).delete();
|
||||||
|
|
||||||
|
checkForDuplicateImage(imageType);
|
||||||
|
// Scan for the gallery to update pic refs in gallery
|
||||||
|
this.scanForGallery();
|
||||||
|
|
||||||
|
System.gc();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to find out if we are in a situation where the Camera Intent adds to images
|
* Used to find out if we are in a situation where the Camera Intent adds to images
|
||||||
@@ -494,7 +556,8 @@ public class CameraLauncher extends Plugin {
|
|||||||
*/
|
*/
|
||||||
private void checkForDuplicateImage(int type) {
|
private void checkForDuplicateImage(int type) {
|
||||||
int diff = 1;
|
int diff = 1;
|
||||||
Cursor cursor = queryImgDB();
|
Uri contentStore = whichContentStore();
|
||||||
|
Cursor cursor = queryImgDB(contentStore);
|
||||||
int currentNumOfImages = cursor.getCount();
|
int currentNumOfImages = cursor.getCount();
|
||||||
|
|
||||||
if (type == FILE_URI) {
|
if (type == FILE_URI) {
|
||||||
@@ -505,8 +568,20 @@ public class CameraLauncher extends Plugin {
|
|||||||
if ((currentNumOfImages - numPics) == diff) {
|
if ((currentNumOfImages - numPics) == diff) {
|
||||||
cursor.moveToLast();
|
cursor.moveToLast();
|
||||||
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
|
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
|
||||||
Uri uri = Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + id);
|
Uri uri = Uri.parse(contentStore + "/" + id);
|
||||||
this.ctx.getActivity().getContentResolver().delete(uri, null, null);
|
this.cordova.getActivity().getContentResolver().delete(uri, null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if we are storing the images in internal or external storage
|
||||||
|
* @return Uri
|
||||||
|
*/
|
||||||
|
private Uri whichContentStore() {
|
||||||
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
|
return android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
|
||||||
|
} else {
|
||||||
|
return android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,4 +616,24 @@ public class CameraLauncher extends Plugin {
|
|||||||
public void failPicture(String err) {
|
public void failPicture(String err) {
|
||||||
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
|
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void scanForGallery() {
|
||||||
|
if(this.conn!=null) this.conn.disconnect();
|
||||||
|
this.conn = new MediaScannerConnection(this.ctx.getActivity().getApplicationContext(), this);
|
||||||
|
conn.connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onMediaScannerConnected() {
|
||||||
|
try{
|
||||||
|
this.conn.scanFile(this.imageUri.toString(), "image/*");
|
||||||
|
} catch (java.lang.IllegalStateException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LOG.d(LOG_TAG, "Can;t scan file in MediaScanner aftering taking picture");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onScanCompleted(String path, Uri uri) {
|
||||||
|
this.conn.disconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package org.apache.cordova;
|
package org.apache.cordova;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
@@ -32,10 +33,12 @@ import org.json.JSONObject;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.database.Cursor;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.provider.MediaStore;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public class Capture extends Plugin {
|
public class Capture extends Plugin {
|
||||||
@@ -61,6 +64,7 @@ public class Capture extends Plugin {
|
|||||||
private double duration; // optional duration parameter for video recording
|
private double duration; // optional duration parameter for video recording
|
||||||
private JSONArray results; // The array of results to be returned to the user
|
private JSONArray results; // The array of results to be returned to the user
|
||||||
private Uri imageUri; // Uri of captured image
|
private Uri imageUri; // Uri of captured image
|
||||||
|
private int numPics; // Number of pictures before capture activity
|
||||||
|
|
||||||
//private CordovaInterface cordova;
|
//private CordovaInterface cordova;
|
||||||
|
|
||||||
@@ -195,21 +199,24 @@ public class Capture extends Plugin {
|
|||||||
private void captureAudio() {
|
private void captureAudio() {
|
||||||
Intent intent = new Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION);
|
Intent intent = new Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION);
|
||||||
|
|
||||||
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_AUDIO);
|
this.cordova.startActivityForResult((Plugin) this, intent, CAPTURE_AUDIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up an intent to capture images. Result handled by onActivityResult()
|
* Sets up an intent to capture images. Result handled by onActivityResult()
|
||||||
*/
|
*/
|
||||||
private void captureImage() {
|
private void captureImage() {
|
||||||
|
// Save the number of images currently on disk for later
|
||||||
|
this.numPics = queryImgDB(whichContentStore()).getCount();
|
||||||
|
|
||||||
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
|
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
|
||||||
|
|
||||||
// Specify file so that large image is captured and returned
|
// Specify file so that large image is captured and returned
|
||||||
File photo = new File(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()), "Capture.jpg");
|
File photo = new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), "Capture.jpg");
|
||||||
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
|
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
|
||||||
this.imageUri = Uri.fromFile(photo);
|
this.imageUri = Uri.fromFile(photo);
|
||||||
|
|
||||||
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_IMAGE);
|
this.cordova.startActivityForResult((Plugin) this, intent, CAPTURE_IMAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,7 +227,7 @@ public class Capture extends Plugin {
|
|||||||
// Introduced in API 8
|
// Introduced in API 8
|
||||||
//intent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT, duration);
|
//intent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT, duration);
|
||||||
|
|
||||||
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_VIDEO);
|
this.cordova.startActivityForResult((Plugin) this, intent, CAPTURE_VIDEO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -256,48 +263,39 @@ public class Capture extends Plugin {
|
|||||||
// It crashes in the emulator and on my phone with a null pointer exception
|
// It crashes in the emulator and on my phone with a null pointer exception
|
||||||
// To work around it I had to grab the code from CameraLauncher.java
|
// To work around it I had to grab the code from CameraLauncher.java
|
||||||
try {
|
try {
|
||||||
// Create an ExifHelper to save the exif data that is lost during compression
|
|
||||||
ExifHelper exif = new ExifHelper();
|
|
||||||
exif.createInFile(DirectoryManager.getTempDirectoryPath(this.ctx.getActivity()) + "/Capture.jpg");
|
|
||||||
exif.readExifData();
|
|
||||||
|
|
||||||
// Read in bitmap of captured image
|
|
||||||
Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getActivity().getContentResolver(), imageUri);
|
|
||||||
|
|
||||||
// Create entry in media store for image
|
// Create entry in media store for image
|
||||||
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
|
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, IMAGE_JPEG);
|
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, IMAGE_JPEG);
|
||||||
Uri uri = null;
|
Uri uri = null;
|
||||||
try {
|
try {
|
||||||
uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
|
uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
|
||||||
} catch (UnsupportedOperationException e) {
|
} catch (UnsupportedOperationException e) {
|
||||||
LOG.d(LOG_TAG, "Can't write to external media storage.");
|
LOG.d(LOG_TAG, "Can't write to external media storage.");
|
||||||
try {
|
try {
|
||||||
uri = this.ctx.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
|
uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
|
||||||
} catch (UnsupportedOperationException ex) {
|
} catch (UnsupportedOperationException ex) {
|
||||||
LOG.d(LOG_TAG, "Can't write to internal media storage.");
|
LOG.d(LOG_TAG, "Can't write to internal media storage.");
|
||||||
this.fail(createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image - no media storage found."));
|
this.fail(createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image - no media storage found."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
FileInputStream fis = new FileInputStream(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/Capture.jpg");
|
||||||
// Add compressed version of captured image to returned media store Uri
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
OutputStream os = this.ctx.getActivity().getContentResolver().openOutputStream(uri);
|
byte[] buffer = new byte[4096];
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
|
int len;
|
||||||
|
while ((len = fis.read(buffer)) != -1) {
|
||||||
|
os.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
os.flush();
|
||||||
os.close();
|
os.close();
|
||||||
|
fis.close();
|
||||||
bitmap.recycle();
|
|
||||||
bitmap = null;
|
|
||||||
System.gc();
|
|
||||||
|
|
||||||
// Restore exif data to file
|
|
||||||
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
|
|
||||||
exif.writeExifData();
|
|
||||||
|
|
||||||
// Add image to results
|
// Add image to results
|
||||||
results.put(createMediaFile(uri));
|
results.put(createMediaFile(uri));
|
||||||
|
|
||||||
|
checkForDuplicateImage();
|
||||||
|
|
||||||
if (results.length() >= limit) {
|
if (results.length() >= limit) {
|
||||||
// Send Uri back to JavaScript for viewing image
|
// Send Uri back to JavaScript for viewing image
|
||||||
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
|
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
|
||||||
@@ -356,7 +354,7 @@ public class Capture extends Plugin {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private JSONObject createMediaFile(Uri data) {
|
private JSONObject createMediaFile(Uri data) {
|
||||||
File fp = new File(FileUtils.getRealPathFromURI(data, this.ctx));
|
File fp = new File(FileUtils.getRealPathFromURI(data, this.cordova));
|
||||||
JSONObject obj = new JSONObject();
|
JSONObject obj = new JSONObject();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -405,4 +403,49 @@ public class Capture extends Plugin {
|
|||||||
public void fail(JSONObject err) {
|
public void fail(JSONObject err) {
|
||||||
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
|
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a cursor that can be used to determine how many images we have.
|
||||||
|
*
|
||||||
|
* @return a cursor
|
||||||
|
*/
|
||||||
|
private Cursor queryImgDB(Uri contentStore) {
|
||||||
|
return this.cordova.getActivity().getContentResolver().query(
|
||||||
|
contentStore,
|
||||||
|
new String[] { MediaStore.Images.Media._ID },
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to find out if we are in a situation where the Camera Intent adds to images
|
||||||
|
* to the content store.
|
||||||
|
*/
|
||||||
|
private void checkForDuplicateImage() {
|
||||||
|
Uri contentStore = whichContentStore();
|
||||||
|
Cursor cursor = queryImgDB(contentStore);
|
||||||
|
int currentNumOfImages = cursor.getCount();
|
||||||
|
|
||||||
|
// delete the duplicate file if the difference is 2
|
||||||
|
if ((currentNumOfImages - numPics) == 2) {
|
||||||
|
cursor.moveToLast();
|
||||||
|
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
|
||||||
|
Uri uri = Uri.parse(contentStore + "/" + id);
|
||||||
|
this.cordova.getActivity().getContentResolver().delete(uri, null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if we are storing the images in internal or external storage
|
||||||
|
* @return Uri
|
||||||
|
*/
|
||||||
|
private Uri whichContentStore() {
|
||||||
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
|
return android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
|
||||||
|
} else {
|
||||||
|
return android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,11 +67,11 @@ public class CompassListener extends Plugin implements SensorEventListener {
|
|||||||
* Sets the context of the Command. This can then be used to do things like
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
* get file paths associated with the Activity.
|
* get file paths associated with the Activity.
|
||||||
*
|
*
|
||||||
* @param ctx The context of the main Activity.
|
* @param cordova The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface cordova) {
|
||||||
super.setContext(ctx);
|
super.setContext(cordova);
|
||||||
this.sensorManager = (SensorManager) ctx.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
this.sensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class ContactManager extends Plugin {
|
|||||||
* older phones.
|
* older phones.
|
||||||
*/
|
*/
|
||||||
if (this.contactAccessor == null) {
|
if (this.contactAccessor == null) {
|
||||||
this.contactAccessor = new ContactAccessorSdk5(this.webView, this.ctx);
|
this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -45,16 +45,16 @@ public class CordovaChromeClient extends WebChromeClient {
|
|||||||
|
|
||||||
private String TAG = "CordovaLog";
|
private String TAG = "CordovaLog";
|
||||||
private long MAX_QUOTA = 100 * 1024 * 1024;
|
private long MAX_QUOTA = 100 * 1024 * 1024;
|
||||||
private CordovaInterface ctx;
|
private CordovaInterface cordova;
|
||||||
private CordovaWebView appView;
|
private CordovaWebView appView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param ctx
|
* @param cordova
|
||||||
*/
|
*/
|
||||||
public CordovaChromeClient(CordovaInterface ctx) {
|
public CordovaChromeClient(CordovaInterface cordova) {
|
||||||
this.ctx = ctx;
|
this.cordova = cordova;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +64,7 @@ public class CordovaChromeClient extends WebChromeClient {
|
|||||||
* @param app
|
* @param app
|
||||||
*/
|
*/
|
||||||
public CordovaChromeClient(CordovaInterface ctx, CordovaWebView app) {
|
public CordovaChromeClient(CordovaInterface ctx, CordovaWebView app) {
|
||||||
this.ctx = ctx;
|
this.cordova = ctx;
|
||||||
this.appView = app;
|
this.appView = app;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ public class CordovaChromeClient extends WebChromeClient {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
|
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
|
||||||
AlertDialog.Builder dlg = new AlertDialog.Builder(this.ctx.getActivity());
|
AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity());
|
||||||
dlg.setMessage(message);
|
dlg.setMessage(message);
|
||||||
dlg.setTitle("Alert");
|
dlg.setTitle("Alert");
|
||||||
//Don't let alerts break the back button
|
//Don't let alerts break the back button
|
||||||
@@ -131,7 +131,7 @@ public class CordovaChromeClient extends WebChromeClient {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
|
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
|
||||||
AlertDialog.Builder dlg = new AlertDialog.Builder(this.ctx.getActivity());
|
AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity());
|
||||||
dlg.setMessage(message);
|
dlg.setMessage(message);
|
||||||
dlg.setTitle("Confirm");
|
dlg.setTitle("Confirm");
|
||||||
dlg.setCancelable(true);
|
dlg.setCancelable(true);
|
||||||
@@ -243,9 +243,9 @@ public class CordovaChromeClient extends WebChromeClient {
|
|||||||
// Show dialog
|
// Show dialog
|
||||||
else {
|
else {
|
||||||
final JsPromptResult res = result;
|
final JsPromptResult res = result;
|
||||||
AlertDialog.Builder dlg = new AlertDialog.Builder(this.ctx.getActivity());
|
AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity());
|
||||||
dlg.setMessage(message);
|
dlg.setMessage(message);
|
||||||
final EditText input = new EditText(this.ctx.getActivity());
|
final EditText input = new EditText(this.cordova.getActivity());
|
||||||
if (defaultValue != null) {
|
if (defaultValue != null) {
|
||||||
input.setText(defaultValue);
|
input.setText(defaultValue);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class CordovaWebView extends WebView {
|
|||||||
|
|
||||||
|
|
||||||
/** Actvities and other important classes **/
|
/** Actvities and other important classes **/
|
||||||
private CordovaInterface mCtx;
|
private CordovaInterface cordova;
|
||||||
CordovaWebViewClient viewClient;
|
CordovaWebViewClient viewClient;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private CordovaChromeClient chromeClient;
|
private CordovaChromeClient chromeClient;
|
||||||
@@ -90,7 +90,7 @@ public class CordovaWebView extends WebView {
|
|||||||
super(context);
|
super(context);
|
||||||
if (CordovaInterface.class.isInstance(context))
|
if (CordovaInterface.class.isInstance(context))
|
||||||
{
|
{
|
||||||
this.mCtx = (CordovaInterface) context;
|
this.cordova = (CordovaInterface) context;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -110,14 +110,14 @@ public class CordovaWebView extends WebView {
|
|||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
if (CordovaInterface.class.isInstance(context))
|
if (CordovaInterface.class.isInstance(context))
|
||||||
{
|
{
|
||||||
this.mCtx = (CordovaInterface) context;
|
this.cordova = (CordovaInterface) context;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
||||||
}
|
}
|
||||||
this.setWebChromeClient(new CordovaChromeClient(this.mCtx, this));
|
this.setWebChromeClient(new CordovaChromeClient(this.cordova, this));
|
||||||
this.setWebViewClient(new CordovaWebViewClient(this.mCtx, this));
|
this.setWebViewClient(new CordovaWebViewClient(this.cordova, this));
|
||||||
this.loadConfiguration();
|
this.loadConfiguration();
|
||||||
this.setup();
|
this.setup();
|
||||||
}
|
}
|
||||||
@@ -134,14 +134,14 @@ public class CordovaWebView extends WebView {
|
|||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
if (CordovaInterface.class.isInstance(context))
|
if (CordovaInterface.class.isInstance(context))
|
||||||
{
|
{
|
||||||
this.mCtx = (CordovaInterface) context;
|
this.cordova = (CordovaInterface) context;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
||||||
}
|
}
|
||||||
this.setWebChromeClient(new CordovaChromeClient(this.mCtx, this));
|
this.setWebChromeClient(new CordovaChromeClient(this.cordova, this));
|
||||||
this.setWebViewClient(new CordovaWebViewClient(this.mCtx, this));
|
this.setWebViewClient(new CordovaWebViewClient(this.cordova, this));
|
||||||
this.loadConfiguration();
|
this.loadConfiguration();
|
||||||
this.setup();
|
this.setup();
|
||||||
}
|
}
|
||||||
@@ -158,14 +158,14 @@ public class CordovaWebView extends WebView {
|
|||||||
super(context, attrs, defStyle, privateBrowsing);
|
super(context, attrs, defStyle, privateBrowsing);
|
||||||
if (CordovaInterface.class.isInstance(context))
|
if (CordovaInterface.class.isInstance(context))
|
||||||
{
|
{
|
||||||
this.mCtx = (CordovaInterface) context;
|
this.cordova = (CordovaInterface) context;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
Log.d(TAG, "Your activity must implement CordovaInterface to work");
|
||||||
}
|
}
|
||||||
this.setWebChromeClient(new CordovaChromeClient(this.mCtx));
|
this.setWebChromeClient(new CordovaChromeClient(this.cordova));
|
||||||
this.setWebViewClient(new CordovaWebViewClient(this.mCtx));
|
this.setWebViewClient(new CordovaWebViewClient(this.cordova));
|
||||||
this.loadConfiguration();
|
this.loadConfiguration();
|
||||||
this.setup();
|
this.setup();
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ public class CordovaWebView extends WebView {
|
|||||||
|
|
||||||
// Enable database
|
// Enable database
|
||||||
settings.setDatabaseEnabled(true);
|
settings.setDatabaseEnabled(true);
|
||||||
String databasePath = this.mCtx.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
|
String databasePath = this.cordova.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
|
||||||
settings.setDatabasePath(databasePath);
|
settings.setDatabasePath(databasePath);
|
||||||
|
|
||||||
// Enable DOM storage
|
// Enable DOM storage
|
||||||
@@ -202,7 +202,7 @@ public class CordovaWebView extends WebView {
|
|||||||
|
|
||||||
//Start up the plugin manager
|
//Start up the plugin manager
|
||||||
try {
|
try {
|
||||||
this.pluginManager = new PluginManager(this, this.mCtx);
|
this.pluginManager = new PluginManager(this, this.cordova);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -394,13 +394,13 @@ public class CordovaWebView extends WebView {
|
|||||||
|
|
||||||
// If timeout, then stop loading and handle error
|
// If timeout, then stop loading and handle error
|
||||||
if (me.loadUrlTimeout == currentLoadUrlTimeout) {
|
if (me.loadUrlTimeout == currentLoadUrlTimeout) {
|
||||||
me.mCtx.getActivity().runOnUiThread(loadError);
|
me.cordova.getActivity().runOnUiThread(loadError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Load url
|
// Load url
|
||||||
this.mCtx.getActivity().runOnUiThread(new Runnable() {
|
this.cordova.getActivity().runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
Thread thread = new Thread(timeoutCheck);
|
Thread thread = new Thread(timeoutCheck);
|
||||||
thread.start();
|
thread.start();
|
||||||
@@ -569,7 +569,7 @@ public class CordovaWebView extends WebView {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
mCtx.getActivity().startActivity(intent);
|
cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error loading url " + url, e);
|
LOG.e(TAG, "Error loading url " + url, e);
|
||||||
}
|
}
|
||||||
@@ -581,7 +581,7 @@ public class CordovaWebView extends WebView {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
mCtx.getActivity().startActivity(intent);
|
cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error loading url " + url, e);
|
LOG.e(TAG, "Error loading url " + url, e);
|
||||||
}
|
}
|
||||||
@@ -596,7 +596,7 @@ public class CordovaWebView extends WebView {
|
|||||||
* <log level="DEBUG" />
|
* <log level="DEBUG" />
|
||||||
*/
|
*/
|
||||||
private void loadConfiguration() {
|
private void loadConfiguration() {
|
||||||
int id = getResources().getIdentifier("cordova", "xml", this.mCtx.getActivity().getPackageName());
|
int id = getResources().getIdentifier("cordova", "xml", this.cordova.getActivity().getPackageName());
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
LOG.i("CordovaLog", "cordova.xml missing. Ignoring...");
|
LOG.i("CordovaLog", "cordova.xml missing. Ignoring...");
|
||||||
return;
|
return;
|
||||||
@@ -627,7 +627,7 @@ public class CordovaWebView extends WebView {
|
|||||||
LOG.i("CordovaLog", "Found preference for %s=%s", name, value);
|
LOG.i("CordovaLog", "Found preference for %s=%s", name, value);
|
||||||
|
|
||||||
// Save preferences in Intent
|
// Save preferences in Intent
|
||||||
this.mCtx.getActivity().getIntent().putExtra(name, value);
|
this.cordova.getActivity().getIntent().putExtra(name, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@@ -648,8 +648,8 @@ public class CordovaWebView extends WebView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ("true".equals(this.getProperty("fullscreen", "false"))) {
|
if ("true".equals(this.getProperty("fullscreen", "false"))) {
|
||||||
this.mCtx.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
|
this.cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
|
||||||
this.mCtx.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
this.cordova.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,7 +661,7 @@ public class CordovaWebView extends WebView {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String getProperty(String name, String defaultValue) {
|
public String getProperty(String name, String defaultValue) {
|
||||||
Bundle bundle = this.mCtx.getActivity().getIntent().getExtras();
|
Bundle bundle = this.cordova.getActivity().getIntent().getExtras();
|
||||||
if (bundle == null) {
|
if (bundle == null) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,20 +21,26 @@ package org.apache.cordova;
|
|||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
|
|
||||||
import org.apache.cordova.api.CordovaInterface;
|
import org.apache.cordova.api.CordovaInterface;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
import android.content.res.AssetManager;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.net.http.SslError;
|
import android.net.http.SslError;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.webkit.HttpAuthHandler;
|
import android.webkit.HttpAuthHandler;
|
||||||
import android.webkit.SslErrorHandler;
|
import android.webkit.SslErrorHandler;
|
||||||
|
import android.webkit.WebResourceResponse;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
@@ -44,7 +50,7 @@ import android.webkit.WebViewClient;
|
|||||||
public class CordovaWebViewClient extends WebViewClient {
|
public class CordovaWebViewClient extends WebViewClient {
|
||||||
|
|
||||||
private static final String TAG = "Cordova";
|
private static final String TAG = "Cordova";
|
||||||
CordovaInterface ctx;
|
CordovaInterface cordova;
|
||||||
CordovaWebView appView;
|
CordovaWebView appView;
|
||||||
private boolean doClearHistory = false;
|
private boolean doClearHistory = false;
|
||||||
|
|
||||||
@@ -54,20 +60,20 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param ctx
|
* @param cordova
|
||||||
*/
|
*/
|
||||||
public CordovaWebViewClient(CordovaInterface ctx) {
|
public CordovaWebViewClient(CordovaInterface cordova) {
|
||||||
this.ctx = ctx;
|
this.cordova = cordova;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param ctx
|
* @param cordova
|
||||||
* @param view
|
* @param view
|
||||||
*/
|
*/
|
||||||
public CordovaWebViewClient(CordovaInterface ctx, CordovaWebView view) {
|
public CordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
|
||||||
this.ctx = ctx;
|
this.cordova = cordova;
|
||||||
this.appView = view;
|
this.appView = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +106,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_DIAL);
|
Intent intent = new Intent(Intent.ACTION_DIAL);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
this.ctx.getActivity().startActivity(intent);
|
this.cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error dialing " + url + ": " + e.toString());
|
LOG.e(TAG, "Error dialing " + url + ": " + e.toString());
|
||||||
}
|
}
|
||||||
@@ -111,7 +117,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
this.ctx.getActivity().startActivity(intent);
|
this.cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error showing map " + url + ": " + e.toString());
|
LOG.e(TAG, "Error showing map " + url + ": " + e.toString());
|
||||||
}
|
}
|
||||||
@@ -122,7 +128,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
this.ctx.getActivity().startActivity(intent);
|
this.cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error sending email " + url + ": " + e.toString());
|
LOG.e(TAG, "Error sending email " + url + ": " + e.toString());
|
||||||
}
|
}
|
||||||
@@ -154,7 +160,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
intent.setData(Uri.parse("sms:" + address));
|
intent.setData(Uri.parse("sms:" + address));
|
||||||
intent.putExtra("address", address);
|
intent.putExtra("address", address);
|
||||||
intent.setType("vnd.android-dir/mms-sms");
|
intent.setType("vnd.android-dir/mms-sms");
|
||||||
this.ctx.getActivity().startActivity(intent);
|
this.cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error sending sms " + url + ":" + e.toString());
|
LOG.e(TAG, "Error sending sms " + url + ":" + e.toString());
|
||||||
}
|
}
|
||||||
@@ -178,7 +184,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
try {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
this.ctx.getActivity().startActivity(intent);
|
this.cordova.getActivity().startActivity(intent);
|
||||||
} catch (android.content.ActivityNotFoundException e) {
|
} catch (android.content.ActivityNotFoundException e) {
|
||||||
LOG.e(TAG, "Error loading url " + url, e);
|
LOG.e(TAG, "Error loading url " + url, e);
|
||||||
}
|
}
|
||||||
@@ -241,6 +247,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
* Notify the host application that a page has finished loading.
|
* Notify the host application that a page has finished loading.
|
||||||
* This method is called only for main frame. When onPageFinished() is called, the rendering picture may not be updated yet.
|
* This method is called only for main frame. When onPageFinished() is called, the rendering picture may not be updated yet.
|
||||||
*
|
*
|
||||||
|
*
|
||||||
* @param view The webview initiating the callback.
|
* @param view The webview initiating the callback.
|
||||||
* @param url The url of the page.
|
* @param url The url of the page.
|
||||||
*/
|
*/
|
||||||
@@ -280,7 +287,7 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
ctx.getActivity().runOnUiThread(new Runnable() {
|
cordova.getActivity().runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
appView.postMessage("spinner", "stop");
|
appView.postMessage("spinner", "stop");
|
||||||
}
|
}
|
||||||
@@ -342,8 +349,9 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
@Override
|
@Override
|
||||||
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
|
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
|
||||||
|
|
||||||
final String packageName = this.ctx.getActivity().getPackageName();
|
final String packageName = this.cordova.getActivity().getPackageName();
|
||||||
final PackageManager pm = this.ctx.getActivity().getPackageManager();
|
final PackageManager pm = this.cordova.getActivity().getPackageManager();
|
||||||
|
|
||||||
ApplicationInfo appInfo;
|
ApplicationInfo appInfo;
|
||||||
try {
|
try {
|
||||||
appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
|
appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
|
||||||
@@ -451,4 +459,43 @@ public class CordovaWebViewClient extends WebViewClient {
|
|||||||
this.authenticationTokens.clear();
|
this.authenticationTokens.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
||||||
|
if(url.contains("?") || url.contains("#")){
|
||||||
|
return generateWebResourceResponse(url);
|
||||||
|
} else {
|
||||||
|
return super.shouldInterceptRequest(view, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private WebResourceResponse generateWebResourceResponse(String url) {
|
||||||
|
final String ANDROID_ASSET = "file:///android_asset/";
|
||||||
|
if (url.startsWith(ANDROID_ASSET)) {
|
||||||
|
String niceUrl = url;
|
||||||
|
niceUrl = url.replaceFirst(ANDROID_ASSET, "");
|
||||||
|
if(niceUrl.contains("?")){
|
||||||
|
niceUrl = niceUrl.split("\\?")[0];
|
||||||
|
}
|
||||||
|
else if(niceUrl.contains("#"))
|
||||||
|
{
|
||||||
|
niceUrl = niceUrl.split("#")[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
String mimetype = null;
|
||||||
|
if(niceUrl.endsWith(".html")){
|
||||||
|
mimetype = "text/html";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AssetManager assets = cordova.getActivity().getAssets();
|
||||||
|
Uri uri = Uri.parse(niceUrl);
|
||||||
|
InputStream stream = assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING);
|
||||||
|
WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
|
||||||
|
return response;
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.e("generateWebResourceResponse", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import android.telephony.TelephonyManager;
|
|||||||
public class Device extends Plugin {
|
public class Device extends Plugin {
|
||||||
public static final String TAG = "Device";
|
public static final String TAG = "Device";
|
||||||
|
|
||||||
public static String cordovaVersion = "1.8.0"; // Cordova version
|
public static String cordovaVersion = "1.9.0rc1"; // Cordova version
|
||||||
public static String platform = "Android"; // Device OS
|
public static String platform = "Android"; // Device OS
|
||||||
public static String uuid; // Device UUID
|
public static String uuid; // Device UUID
|
||||||
|
|
||||||
@@ -54,10 +54,10 @@ public class Device extends Plugin {
|
|||||||
* Sets the context of the Command. This can then be used to do things like
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
* get file paths associated with the Activity.
|
* get file paths associated with the Activity.
|
||||||
*
|
*
|
||||||
* @param ctx The context of the main Activity.
|
* @param cordova The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface cordova) {
|
||||||
super.setContext(ctx);
|
super.setContext(cordova);
|
||||||
Device.uuid = getUuid();
|
Device.uuid = getUuid();
|
||||||
this.initTelephonyReceiver();
|
this.initTelephonyReceiver();
|
||||||
}
|
}
|
||||||
@@ -110,7 +110,7 @@ public class Device extends Plugin {
|
|||||||
* Unregister receiver.
|
* Unregister receiver.
|
||||||
*/
|
*/
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
this.ctx.getActivity().unregisterReceiver(this.telephonyReceiver);
|
this.cordova.getActivity().unregisterReceiver(this.telephonyReceiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
@@ -125,7 +125,7 @@ public class Device extends Plugin {
|
|||||||
private void initTelephonyReceiver() {
|
private void initTelephonyReceiver() {
|
||||||
IntentFilter intentFilter = new IntentFilter();
|
IntentFilter intentFilter = new IntentFilter();
|
||||||
intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
|
intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
|
||||||
//final CordovaInterface myctx = this.ctx;
|
//final CordovaInterface mycordova = this.cordova;
|
||||||
this.telephonyReceiver = new BroadcastReceiver() {
|
this.telephonyReceiver = new BroadcastReceiver() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -153,7 +153,7 @@ public class Device extends Plugin {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Register the receiver
|
// Register the receiver
|
||||||
this.ctx.getActivity().registerReceiver(this.telephonyReceiver, intentFilter);
|
this.cordova.getActivity().registerReceiver(this.telephonyReceiver, intentFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -171,7 +171,7 @@ public class Device extends Plugin {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String getUuid() {
|
public String getUuid() {
|
||||||
String uuid = Settings.Secure.getString(this.ctx.getActivity().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
|
String uuid = Settings.Secure.getString(this.cordova.getActivity().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
|
||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
protected CordovaWebViewClient webViewClient;
|
protected CordovaWebViewClient webViewClient;
|
||||||
|
|
||||||
protected LinearLayout root;
|
protected LinearLayout root;
|
||||||
public boolean bound = false;
|
|
||||||
protected boolean cancelLoadUrl = false;
|
protected boolean cancelLoadUrl = false;
|
||||||
protected ProgressDialog spinnerDialog = null;
|
protected ProgressDialog spinnerDialog = null;
|
||||||
|
|
||||||
@@ -181,10 +180,6 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
// when another application (activity) is started.
|
// when another application (activity) is started.
|
||||||
protected boolean keepRunning = true;
|
protected boolean keepRunning = true;
|
||||||
|
|
||||||
private boolean volumeupBound;
|
|
||||||
|
|
||||||
private boolean volumedownBound;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the authentication token.
|
* Sets the authentication token.
|
||||||
*
|
*
|
||||||
@@ -260,7 +255,7 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
{
|
{
|
||||||
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
|
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.getBooleanProperty("setFullscreen", false))
|
if(this.getBooleanProperty("setFullscreen", false))
|
||||||
{
|
{
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
||||||
@@ -786,7 +781,7 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Launch an activity for which you would like a result when it finished. When this activity exits,
|
* Launch an activity for which you would like a result when it finished. When this activity exits,
|
||||||
* your onActivityResult() method will be called.
|
* your onActivityResult() method will be called.
|
||||||
*
|
*
|
||||||
* @param command The command object
|
* @param command The command object
|
||||||
@@ -948,24 +943,6 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
return this.getContext();
|
return this.getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Override the backbutton.
|
|
||||||
*
|
|
||||||
* @param override
|
|
||||||
*/
|
|
||||||
public void bindBackButton(boolean override) {
|
|
||||||
this.bound = override;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine of backbutton is overridden.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public boolean isBackButtonBound() {
|
|
||||||
return this.bound;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the specified URL in the Cordova webview or a new browser instance.
|
* Load the specified URL in the Cordova webview or a new browser instance.
|
||||||
*
|
*
|
||||||
@@ -982,16 +959,6 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bindButton(String button, boolean override) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
if (button.compareTo("volumeup")==0) {
|
|
||||||
this.volumeupBound = override;
|
|
||||||
}
|
|
||||||
else if (button.compareTo("volumedown")==0) {
|
|
||||||
this.volumedownBound = override;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Dialog splashDialog;
|
protected Dialog splashDialog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1008,40 +975,46 @@ public class DroidGap extends Activity implements CordovaInterface {
|
|||||||
* Shows the splash screen over the full Activity
|
* Shows the splash screen over the full Activity
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
protected void showSplashScreen(int time) {
|
protected void showSplashScreen(final int time) {
|
||||||
|
final DroidGap that = this;
|
||||||
|
|
||||||
// Get reference to display
|
Runnable runnable = new Runnable() {
|
||||||
Display display = getWindowManager().getDefaultDisplay();
|
|
||||||
|
|
||||||
// Create the layout for the dialog
|
|
||||||
LinearLayout root = new LinearLayout(this);
|
|
||||||
root.setMinimumHeight(display.getHeight());
|
|
||||||
root.setMinimumWidth(display.getWidth());
|
|
||||||
root.setOrientation(LinearLayout.VERTICAL);
|
|
||||||
root.setBackgroundColor(this.getIntegerProperty("backgroundColor", Color.BLACK));
|
|
||||||
root.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
|
|
||||||
ViewGroup.LayoutParams.FILL_PARENT, 0.0F));
|
|
||||||
root.setBackgroundResource(this.splashscreen);
|
|
||||||
|
|
||||||
// Create and show the dialog
|
|
||||||
splashDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
|
|
||||||
// check to see if the splash screen should be full screen
|
|
||||||
if ((getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)
|
|
||||||
== WindowManager.LayoutParams.FLAG_FULLSCREEN) {
|
|
||||||
splashDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
|
||||||
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
||||||
}
|
|
||||||
splashDialog.setContentView(root);
|
|
||||||
splashDialog.setCancelable(false);
|
|
||||||
splashDialog.show();
|
|
||||||
|
|
||||||
// Set Runnable to remove splash screen just in case
|
|
||||||
final Handler handler = new Handler();
|
|
||||||
handler.postDelayed(new Runnable() {
|
|
||||||
public void run() {
|
public void run() {
|
||||||
removeSplashScreen();
|
// Get reference to display
|
||||||
|
Display display = getWindowManager().getDefaultDisplay();
|
||||||
|
|
||||||
|
// Create the layout for the dialog
|
||||||
|
LinearLayout root = new LinearLayout(that.getActivity());
|
||||||
|
root.setMinimumHeight(display.getHeight());
|
||||||
|
root.setMinimumWidth(display.getWidth());
|
||||||
|
root.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
root.setBackgroundColor(that.getIntegerProperty("backgroundColor", Color.BLACK));
|
||||||
|
root.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
|
||||||
|
ViewGroup.LayoutParams.FILL_PARENT, 0.0F));
|
||||||
|
root.setBackgroundResource(that.splashscreen);
|
||||||
|
|
||||||
|
// Create and show the dialog
|
||||||
|
splashDialog = new Dialog(that, android.R.style.Theme_Translucent_NoTitleBar);
|
||||||
|
// check to see if the splash screen should be full screen
|
||||||
|
if ((getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)
|
||||||
|
== WindowManager.LayoutParams.FLAG_FULLSCREEN) {
|
||||||
|
splashDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
||||||
|
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
}
|
||||||
|
splashDialog.setContentView(root);
|
||||||
|
splashDialog.setCancelable(false);
|
||||||
|
splashDialog.show();
|
||||||
|
|
||||||
|
// Set Runnable to remove splash screen just in case
|
||||||
|
final Handler handler = new Handler();
|
||||||
|
handler.postDelayed(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
removeSplashScreen();
|
||||||
|
}
|
||||||
|
}, time);
|
||||||
}
|
}
|
||||||
}, time);
|
};
|
||||||
|
this.runOnUiThread(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -524,7 +524,7 @@ public class FileTransfer extends Plugin {
|
|||||||
private InputStream getPathFromUri(String path) throws FileNotFoundException {
|
private InputStream getPathFromUri(String path) throws FileNotFoundException {
|
||||||
if (path.startsWith("content:")) {
|
if (path.startsWith("content:")) {
|
||||||
Uri uri = Uri.parse(path);
|
Uri uri = Uri.parse(path);
|
||||||
return ctx.getActivity().getContentResolver().openInputStream(uri);
|
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
||||||
}
|
}
|
||||||
else if (path.startsWith("file://")) {
|
else if (path.startsWith("file://")) {
|
||||||
int question = path.indexOf("?");
|
int question = path.indexOf("?");
|
||||||
|
|||||||
@@ -223,9 +223,9 @@ public class FileUtils extends Plugin {
|
|||||||
*/
|
*/
|
||||||
private void notifyDelete(String filePath) {
|
private void notifyDelete(String filePath) {
|
||||||
String newFilePath = stripFileProtocol(filePath);
|
String newFilePath = stripFileProtocol(filePath);
|
||||||
int result = this.ctx.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
int result = this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||||
MediaStore.Images.Media.DATA + " = ?",
|
MediaStore.Images.Media.DATA + " = ?",
|
||||||
new String[] { filePath });
|
new String[] { newFilePath });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -246,7 +246,7 @@ public class FileUtils extends Plugin {
|
|||||||
|
|
||||||
// Handle the special case where you get an Android content:// uri.
|
// Handle the special case where you get an Android content:// uri.
|
||||||
if (decoded.startsWith("content:")) {
|
if (decoded.startsWith("content:")) {
|
||||||
Cursor cursor = this.ctx.getActivity().managedQuery(Uri.parse(decoded), new String[] { MediaStore.Images.Media.DATA }, null, null, null);
|
Cursor cursor = this.cordova.getActivity().managedQuery(Uri.parse(decoded), new String[] { MediaStore.Images.Media.DATA }, null, null, null);
|
||||||
// Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data"
|
// Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data"
|
||||||
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
|
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -728,9 +728,9 @@ public class FileUtils extends Plugin {
|
|||||||
private boolean atRootDirectory(String filePath) {
|
private boolean atRootDirectory(String filePath) {
|
||||||
filePath = stripFileProtocol(filePath);
|
filePath = stripFileProtocol(filePath);
|
||||||
|
|
||||||
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + ctx.getActivity().getPackageName() + "/cache") ||
|
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.getActivity().getPackageName() + "/cache") ||
|
||||||
filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
|
filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
|
||||||
filePath.equals("/data/data/" + ctx.getActivity().getPackageName())) {
|
filePath.equals("/data/data/" + cordova.getActivity().getPackageName())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -819,16 +819,16 @@ public class FileUtils extends Plugin {
|
|||||||
fs.put("name", "temporary");
|
fs.put("name", "temporary");
|
||||||
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
fp = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
|
fp = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
|
||||||
"/Android/data/" + ctx.getActivity().getPackageName() + "/cache/");
|
"/Android/data/" + cordova.getActivity().getPackageName() + "/cache/");
|
||||||
// Create the cache dir if it doesn't exist.
|
// Create the cache dir if it doesn't exist.
|
||||||
fp.mkdirs();
|
fp.mkdirs();
|
||||||
fs.put("root", getEntry(Environment.getExternalStorageDirectory().getAbsolutePath() +
|
fs.put("root", getEntry(Environment.getExternalStorageDirectory().getAbsolutePath() +
|
||||||
"/Android/data/" + ctx.getActivity().getPackageName() + "/cache/"));
|
"/Android/data/" + cordova.getActivity().getPackageName() + "/cache/"));
|
||||||
} else {
|
} else {
|
||||||
fp = new File("/data/data/" + ctx.getActivity().getPackageName() + "/cache/");
|
fp = new File("/data/data/" + cordova.getActivity().getPackageName() + "/cache/");
|
||||||
// Create the cache dir if it doesn't exist.
|
// Create the cache dir if it doesn't exist.
|
||||||
fp.mkdirs();
|
fp.mkdirs();
|
||||||
fs.put("root", getEntry("/data/data/" + ctx.getActivity().getPackageName() + "/cache/"));
|
fs.put("root", getEntry("/data/data/" + cordova.getActivity().getPackageName() + "/cache/"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == PERSISTENT) {
|
else if (type == PERSISTENT) {
|
||||||
@@ -836,7 +836,7 @@ public class FileUtils extends Plugin {
|
|||||||
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
fs.put("root", getEntry(Environment.getExternalStorageDirectory()));
|
fs.put("root", getEntry(Environment.getExternalStorageDirectory()));
|
||||||
} else {
|
} else {
|
||||||
fs.put("root", getEntry("/data/data/" + ctx.getActivity().getPackageName()));
|
fs.put("root", getEntry("/data/data/" + cordova.getActivity().getPackageName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -943,7 +943,7 @@ public class FileUtils extends Plugin {
|
|||||||
String contentType = null;
|
String contentType = null;
|
||||||
if (filename.startsWith("content:")) {
|
if (filename.startsWith("content:")) {
|
||||||
Uri fileUri = Uri.parse(filename);
|
Uri fileUri = Uri.parse(filename);
|
||||||
contentType = this.ctx.getActivity().getContentResolver().getType(fileUri);
|
contentType = this.cordova.getActivity().getContentResolver().getType(fileUri);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
contentType = getMimeType(filename);
|
contentType = getMimeType(filename);
|
||||||
@@ -1026,7 +1026,7 @@ public class FileUtils extends Plugin {
|
|||||||
private InputStream getPathFromUri(String path) throws FileNotFoundException {
|
private InputStream getPathFromUri(String path) throws FileNotFoundException {
|
||||||
if (path.startsWith("content")) {
|
if (path.startsWith("content")) {
|
||||||
Uri uri = Uri.parse(path);
|
Uri uri = Uri.parse(path);
|
||||||
return ctx.getActivity().getContentResolver().openInputStream(uri);
|
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
path = stripFileProtocol(path);
|
path = stripFileProtocol(path);
|
||||||
@@ -1038,13 +1038,13 @@ public class FileUtils extends Plugin {
|
|||||||
* Queries the media store to find out what the file path is for the Uri we supply
|
* Queries the media store to find out what the file path is for the Uri we supply
|
||||||
*
|
*
|
||||||
* @param contentUri the Uri of the audio/image/video
|
* @param contentUri the Uri of the audio/image/video
|
||||||
* @param ctx) the current applicaiton context
|
* @param cordova) the current applicaiton context
|
||||||
* @return the full path to the file
|
* @return the full path to the file
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
protected static String getRealPathFromURI(Uri contentUri, CordovaInterface ctx) {
|
protected static String getRealPathFromURI(Uri contentUri, CordovaInterface cordova) {
|
||||||
String[] proj = { _DATA };
|
String[] proj = { _DATA };
|
||||||
Cursor cursor = ctx.getActivity().managedQuery(contentUri, proj, null, null, null);
|
Cursor cursor = cordova.getActivity().managedQuery(contentUri, proj, null, null, null);
|
||||||
int column_index = cursor.getColumnIndexOrThrow(_DATA);
|
int column_index = cursor.getColumnIndexOrThrow(_DATA);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
return cursor.getString(column_index);
|
return cursor.getString(column_index);
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class GeoBroker extends Plugin {
|
|||||||
*/
|
*/
|
||||||
public PluginResult execute(String action, JSONArray args, String callbackId) {
|
public PluginResult execute(String action, JSONArray args, String callbackId) {
|
||||||
if (this.locationManager == null) {
|
if (this.locationManager == null) {
|
||||||
this.locationManager = (LocationManager) this.ctx.getActivity().getSystemService(Context.LOCATION_SERVICE);
|
this.locationManager = (LocationManager) this.cordova.getActivity().getSystemService(Context.LOCATION_SERVICE);
|
||||||
this.networkListener = new NetworkListener(this.locationManager, this);
|
this.networkListener = new NetworkListener(this.locationManager, this);
|
||||||
this.gpsListener = new GPSListener(this.locationManager, this);
|
this.gpsListener = new GPSListener(this.locationManager, this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,11 +84,11 @@ public class NetworkManager extends Plugin {
|
|||||||
* Sets the context of the Command. This can then be used to do things like
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
* get file paths associated with the Activity.
|
* get file paths associated with the Activity.
|
||||||
*
|
*
|
||||||
* @param ctx The context of the main Activity.
|
* @param cordova The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface cordova) {
|
||||||
super.setContext(ctx);
|
super.setContext(cordova);
|
||||||
this.sockMan = (ConnectivityManager) ctx.getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
|
this.sockMan = (ConnectivityManager) cordova.getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
this.connectionCallbackId = null;
|
this.connectionCallbackId = null;
|
||||||
|
|
||||||
// We need to listen to connectivity events to update navigator.connection
|
// We need to listen to connectivity events to update navigator.connection
|
||||||
@@ -102,7 +102,7 @@ public class NetworkManager extends Plugin {
|
|||||||
updateConnectionInfo((NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO));
|
updateConnectionInfo((NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ctx.getActivity().registerReceiver(this.receiver, intentFilter);
|
cordova.getActivity().registerReceiver(this.receiver, intentFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ public class NetworkManager extends Plugin {
|
|||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
if (this.receiver != null) {
|
if (this.receiver != null) {
|
||||||
try {
|
try {
|
||||||
this.ctx.getActivity().unregisterReceiver(this.receiver);
|
this.cordova.getActivity().unregisterReceiver(this.receiver);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(LOG_TAG, "Error unregistering network receiver: " + e.getMessage(), e);
|
Log.e(LOG_TAG, "Error unregistering network receiver: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ public class Notification extends Plugin {
|
|||||||
*/
|
*/
|
||||||
public void beep(long count) {
|
public void beep(long count) {
|
||||||
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||||
Ringtone notification = RingtoneManager.getRingtone(this.ctx.getActivity().getBaseContext(), ringtone);
|
Ringtone notification = RingtoneManager.getRingtone(this.cordova.getActivity().getBaseContext(), ringtone);
|
||||||
|
|
||||||
// If phone is not set to silent mode
|
// If phone is not set to silent mode
|
||||||
if (notification != null) {
|
if (notification != null) {
|
||||||
@@ -171,7 +171,7 @@ public class Notification extends Plugin {
|
|||||||
if (time == 0) {
|
if (time == 0) {
|
||||||
time = 500;
|
time = 500;
|
||||||
}
|
}
|
||||||
Vibrator vibrator = (Vibrator) this.ctx.getActivity().getSystemService(Context.VIBRATOR_SERVICE);
|
Vibrator vibrator = (Vibrator) this.cordova.getActivity().getSystemService(Context.VIBRATOR_SERVICE);
|
||||||
vibrator.vibrate(time);
|
vibrator.vibrate(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,13 +184,13 @@ public class Notification extends Plugin {
|
|||||||
*/
|
*/
|
||||||
public synchronized void alert(final String message, final String title, final String buttonLabel, final String callbackId) {
|
public synchronized void alert(final String message, final String title, final String buttonLabel, final String callbackId) {
|
||||||
|
|
||||||
final CordovaInterface ctx = this.ctx;
|
final CordovaInterface cordova = this.cordova;
|
||||||
final Notification notification = this;
|
final Notification notification = this;
|
||||||
|
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
AlertDialog.Builder dlg = new AlertDialog.Builder(ctx.getActivity());
|
AlertDialog.Builder dlg = new AlertDialog.Builder(cordova.getActivity());
|
||||||
dlg.setMessage(message);
|
dlg.setMessage(message);
|
||||||
dlg.setTitle(title);
|
dlg.setTitle(title);
|
||||||
dlg.setCancelable(false);
|
dlg.setCancelable(false);
|
||||||
@@ -205,7 +205,7 @@ public class Notification extends Plugin {
|
|||||||
dlg.show();
|
dlg.show();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
this.ctx.getActivity().runOnUiThread(runnable);
|
this.cordova.getActivity().runOnUiThread(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,13 +220,13 @@ public class Notification extends Plugin {
|
|||||||
*/
|
*/
|
||||||
public synchronized void confirm(final String message, final String title, String buttonLabels, final String callbackId) {
|
public synchronized void confirm(final String message, final String title, String buttonLabels, final String callbackId) {
|
||||||
|
|
||||||
final CordovaInterface ctx = this.ctx;
|
final CordovaInterface cordova = this.cordova;
|
||||||
final Notification notification = this;
|
final Notification notification = this;
|
||||||
final String[] fButtons = buttonLabels.split(",");
|
final String[] fButtons = buttonLabels.split(",");
|
||||||
|
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
AlertDialog.Builder dlg = new AlertDialog.Builder(ctx.getActivity());
|
AlertDialog.Builder dlg = new AlertDialog.Builder(cordova.getActivity());
|
||||||
dlg.setMessage(message);
|
dlg.setMessage(message);
|
||||||
dlg.setTitle(title);
|
dlg.setTitle(title);
|
||||||
dlg.setCancelable(false);
|
dlg.setCancelable(false);
|
||||||
@@ -269,7 +269,7 @@ public class Notification extends Plugin {
|
|||||||
dlg.show();
|
dlg.show();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
this.ctx.getActivity().runOnUiThread(runnable);
|
this.cordova.getActivity().runOnUiThread(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -284,10 +284,10 @@ public class Notification extends Plugin {
|
|||||||
this.spinnerDialog = null;
|
this.spinnerDialog = null;
|
||||||
}
|
}
|
||||||
final Notification notification = this;
|
final Notification notification = this;
|
||||||
final CordovaInterface ctx = this.ctx;
|
final CordovaInterface cordova = this.cordova;
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
notification.spinnerDialog = ProgressDialog.show(ctx.getActivity(), title, message, true, true,
|
notification.spinnerDialog = ProgressDialog.show(cordova.getActivity(), title, message, true, true,
|
||||||
new DialogInterface.OnCancelListener() {
|
new DialogInterface.OnCancelListener() {
|
||||||
public void onCancel(DialogInterface dialog) {
|
public void onCancel(DialogInterface dialog) {
|
||||||
notification.spinnerDialog = null;
|
notification.spinnerDialog = null;
|
||||||
@@ -295,7 +295,7 @@ public class Notification extends Plugin {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.ctx.getActivity().runOnUiThread(runnable);
|
this.cordova.getActivity().runOnUiThread(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,10 +320,10 @@ public class Notification extends Plugin {
|
|||||||
this.progressDialog = null;
|
this.progressDialog = null;
|
||||||
}
|
}
|
||||||
final Notification notification = this;
|
final Notification notification = this;
|
||||||
final CordovaInterface ctx = this.ctx;
|
final CordovaInterface cordova = this.cordova;
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
notification.progressDialog = new ProgressDialog(ctx.getActivity());
|
notification.progressDialog = new ProgressDialog(cordova.getActivity());
|
||||||
notification.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
|
notification.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
|
||||||
notification.progressDialog.setTitle(title);
|
notification.progressDialog.setTitle(title);
|
||||||
notification.progressDialog.setMessage(message);
|
notification.progressDialog.setMessage(message);
|
||||||
@@ -339,7 +339,7 @@ public class Notification extends Plugin {
|
|||||||
notification.progressDialog.show();
|
notification.progressDialog.show();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.ctx.getActivity().runOnUiThread(runnable);
|
this.cordova.getActivity().runOnUiThread(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -31,8 +31,9 @@ public class SplashScreen extends Plugin {
|
|||||||
String result = "";
|
String result = "";
|
||||||
|
|
||||||
if (action.equals("hide")) {
|
if (action.equals("hide")) {
|
||||||
//((DroidGap)this.ctx).removeSplashScreen();
|
|
||||||
this.webView.postMessage("splashscreen", "hide");
|
this.webView.postMessage("splashscreen", "hide");
|
||||||
|
} else if (action.equals("show")){
|
||||||
|
this.webView.postMessage("splashscreen", "show");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
status = PluginResult.Status.INVALID_ACTION;
|
status = PluginResult.Status.INVALID_ACTION;
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ public class Storage extends Plugin {
|
|||||||
|
|
||||||
// If no database path, generate from application package
|
// If no database path, generate from application package
|
||||||
if (this.path == null) {
|
if (this.path == null) {
|
||||||
this.path = this.ctx.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
|
this.path = this.cordova.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.dbName = this.path + File.pathSeparator + db + ".db";
|
this.dbName = this.path + File.pathSeparator + db + ".db";
|
||||||
|
|||||||
@@ -46,11 +46,11 @@ public class TempListener extends Plugin implements SensorEventListener {
|
|||||||
* Sets the context of the Command. This can then be used to do things like
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
* get file paths associated with the Activity.
|
* get file paths associated with the Activity.
|
||||||
*
|
*
|
||||||
* @param ctx The context of the main Activity.
|
* @param cordova The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface cordova) {
|
||||||
super.setContext(ctx);
|
super.setContext(cordova);
|
||||||
this.sensorManager = (SensorManager) ctx.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
this.sensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -44,19 +44,6 @@ public interface CordovaInterface {
|
|||||||
*/
|
*/
|
||||||
abstract public void setActivityResultCallback(IPlugin plugin);
|
abstract public void setActivityResultCallback(IPlugin plugin);
|
||||||
|
|
||||||
/**
|
|
||||||
* Causes the Activity to override the back button behavior.
|
|
||||||
*
|
|
||||||
* @param override
|
|
||||||
*/
|
|
||||||
public abstract void bindBackButton(boolean override);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A hook required to check if the Back Button is bound.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public abstract boolean isBackButtonBound();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Android activity.
|
* Get the Android activity.
|
||||||
@@ -76,4 +63,5 @@ public interface CordovaInterface {
|
|||||||
* @return Object or null
|
* @return Object or null
|
||||||
*/
|
*/
|
||||||
public Object onMessage(String id, Object data);
|
public Object onMessage(String id, Object data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ public abstract class Plugin implements IPlugin {
|
|||||||
public String id;
|
public String id;
|
||||||
public CordovaWebView webView; // WebView object
|
public CordovaWebView webView; // WebView object
|
||||||
public CordovaInterface ctx; // CordovaActivity object
|
public CordovaInterface ctx; // CordovaActivity object
|
||||||
|
public CordovaInterface cordova;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the request and returns PluginResult.
|
* Executes the request and returns PluginResult.
|
||||||
@@ -61,7 +62,8 @@ public abstract class Plugin implements IPlugin {
|
|||||||
* @param ctx The context of the main Activity.
|
* @param ctx The context of the main Activity.
|
||||||
*/
|
*/
|
||||||
public void setContext(CordovaInterface ctx) {
|
public void setContext(CordovaInterface ctx) {
|
||||||
this.ctx = ctx;
|
this.cordova = ctx;
|
||||||
|
this.ctx = cordova;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user