forked from github/cordova-android
Merge branch '2.8.x' of https://git-wip-us.apache.org/repos/asf/cordova-android into 2.8.x
This commit is contained in:
commit
fbd6b559d4
20
README.md
20
README.md
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
-->
|
||||||
Cordova Android
|
Cordova Android
|
||||||
===
|
===
|
||||||
|
|
||||||
|
@ -1,3 +1,20 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
|
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%check_reqs.js (
|
IF EXIST %full_path%check_reqs.js (
|
||||||
@ -6,4 +23,4 @@ IF EXIST %full_path%check_reqs.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2
|
ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -153,6 +153,7 @@ cp "$BUILD_PATH"/bin/templates/cordova/build "$PROJECT_PATH"/cordova/build
|
|||||||
cp "$BUILD_PATH"/bin/templates/cordova/clean "$PROJECT_PATH"/cordova/clean
|
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/log "$PROJECT_PATH"/cordova/log
|
||||||
cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run
|
cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run
|
||||||
|
cp "$BUILD_PATH"/bin/templates/cordova/version "$PROJECT_PATH"/cordova/version
|
||||||
cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova "$PROJECT_PATH"/cordova/lib/cordova
|
cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova "$PROJECT_PATH"/cordova/lib/cordova
|
||||||
cp "$BUILD_PATH"/bin/templates/cordova/lib/install-device "$PROJECT_PATH"/cordova/lib/install-device
|
cp "$BUILD_PATH"/bin/templates/cordova/lib/install-device "$PROJECT_PATH"/cordova/lib/install-device
|
||||||
cp "$BUILD_PATH"/bin/templates/cordova/lib/install-emulator "$PROJECT_PATH"/cordova/lib/install-emulator
|
cp "$BUILD_PATH"/bin/templates/cordova/lib/install-emulator "$PROJECT_PATH"/cordova/lib/install-emulator
|
||||||
|
@ -1,2 +1,18 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
%~dp0\cordova.bat build %*
|
%~dp0\cordova.bat build %*
|
||||||
|
@ -1,2 +1,18 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
%~dp0\cordova.bat clean %*
|
%~dp0\cordova.bat clean %*
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
@ECHO OFF
|
|
||||||
GOTO BEGIN
|
|
||||||
:: Licensed to the Apache Software Foundation (ASF) under one
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
:: or more contributor license agreements. See the NOTICE file
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
:: distributed with this work for additional information
|
:: distributed with this work for additional information
|
||||||
@ -16,7 +14,7 @@ GOTO BEGIN
|
|||||||
:: KIND, either express or implied. See the License for the
|
:: KIND, either express or implied. See the License for the
|
||||||
:: specific language governing permissions and limitations
|
:: specific language governing permissions and limitations
|
||||||
:: under the License.
|
:: under the License.
|
||||||
:BEGIN
|
@ECHO OFF
|
||||||
IF NOT DEFINED JAVA_HOME GOTO MISSING
|
IF NOT DEFINED JAVA_HOME GOTO MISSING
|
||||||
FOR %%X in (java.exe ant.bat android.bat) do (
|
FOR %%X in (java.exe ant.bat android.bat) do (
|
||||||
SET FOUND=%%~$PATH:X
|
SET FOUND=%%~$PATH:X
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
SET full_path=%~dp0
|
SET full_path=%~dp0
|
||||||
IF EXIST %full_path%cordova.js (
|
IF EXIST %full_path%cordova.js (
|
||||||
@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
|
|||||||
ECHO.
|
ECHO.
|
||||||
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
)
|
)
|
||||||
|
@ -1,2 +1,18 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
%~dp0\cordova.bat log %*
|
%~dp0\cordova.bat log %*
|
||||||
|
@ -1,2 +1,18 @@
|
|||||||
|
:: Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
:: or more contributor license agreements. See the NOTICE file
|
||||||
|
:: distributed with this work for additional information
|
||||||
|
:: regarding copyright ownership. The ASF licenses this file
|
||||||
|
:: to you under the Apache License, Version 2.0 (the
|
||||||
|
:: "License"); you may not use this file except in compliance
|
||||||
|
:: with the License. You may obtain a copy of the License at
|
||||||
|
::
|
||||||
|
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
::
|
||||||
|
:: Unless required by applicable law or agreed to in writing,
|
||||||
|
:: software distributed under the License is distributed on an
|
||||||
|
:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
:: KIND, either express or implied. See the License for the
|
||||||
|
:: specific language governing permissions and limitations
|
||||||
|
:: under the License.
|
||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
%~dp0\cordova.bat run %*
|
%~dp0\cordova.bat run %*
|
||||||
|
@ -1,18 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--
|
<!--
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
or more contributor license agreements. See the NOTICE file
|
or more contributor license agreements. See the NOTICE file
|
||||||
distributed with this work for additional information
|
distributed with this work for additional information
|
||||||
regarding copyright ownership. The ASF licenses this file
|
regarding copyright ownership. The ASF licenses this file
|
||||||
to you under the Apache License, Version 2.0 (the
|
to you under the Apache License, Version 2.0 (the
|
||||||
"License"); you may not use this file except in compliance
|
"License"); you may not use this file except in compliance
|
||||||
with the License. You may obtain a copy of the License at
|
with the License. You may obtain a copy of the License at
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
Unless required by applicable law or agreed to in writing,
|
||||||
specific language governing permissions and limitations
|
software distributed under the License is distributed on an
|
||||||
under the License.
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
-->
|
-->
|
||||||
<widget xmlns = "http://www.w3.org/ns/widgets"
|
<widget xmlns = "http://www.w3.org/ns/widgets"
|
||||||
id = "io.cordova.helloCordova"
|
id = "io.cordova.helloCordova"
|
||||||
|
@ -20,7 +20,7 @@ package org.apache.cordova;
|
|||||||
|
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
|
||||||
@ -56,14 +56,6 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
this.pausedForPhone = new ArrayList<AudioPlayer>();
|
this.pausedForPhone = new ArrayList<AudioPlayer>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFilePath(String url, String source){
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.webView.pluginManager, cordova, source);
|
|
||||||
if(dataResource.getUri().getScheme().equals("http") || dataResource.getUri().getScheme().equals("https"))
|
|
||||||
return dataResource.getUri().toString();
|
|
||||||
else
|
|
||||||
return dataResource.getRealFile().getPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the request and returns PluginResult.
|
* Executes the request and returns PluginResult.
|
||||||
* @param action The action to execute.
|
* @param action The action to execute.
|
||||||
@ -76,13 +68,13 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
String result = "";
|
String result = "";
|
||||||
|
|
||||||
if (action.equals("startRecordingAudio")) {
|
if (action.equals("startRecordingAudio")) {
|
||||||
this.startRecordingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startRecordingAudio"));
|
this.startRecordingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
|
||||||
}
|
}
|
||||||
else if (action.equals("stopRecordingAudio")) {
|
else if (action.equals("stopRecordingAudio")) {
|
||||||
this.stopRecordingAudio(args.getString(0));
|
this.stopRecordingAudio(args.getString(0));
|
||||||
}
|
}
|
||||||
else if (action.equals("startPlayingAudio")) {
|
else if (action.equals("startPlayingAudio")) {
|
||||||
this.startPlayingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startPlayingAudio"));
|
this.startPlayingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
|
||||||
}
|
}
|
||||||
else if (action.equals("seekToAudio")) {
|
else if (action.equals("seekToAudio")) {
|
||||||
this.seekToAudio(args.getString(0), args.getInt(1));
|
this.seekToAudio(args.getString(0), args.getInt(1));
|
||||||
@ -110,7 +102,7 @@ public class AudioHandler extends CordovaPlugin {
|
|||||||
}
|
}
|
||||||
else if (action.equals("create")) {
|
else if (action.equals("create")) {
|
||||||
String id = args.getString(0);
|
String id = args.getString(0);
|
||||||
String src = getFilePath(args.getString(1), "AudioHandler.create");
|
String src = FileHelper.stripFileProtocol(args.getString(1));
|
||||||
AudioPlayer audio = new AudioPlayer(this, id, src);
|
AudioPlayer audio = new AudioPlayer(this, id, src);
|
||||||
this.players.put(id, audio);
|
this.players.put(id, audio);
|
||||||
}
|
}
|
||||||
|
@ -20,16 +20,15 @@ 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;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -43,6 +42,7 @@ import android.graphics.Bitmap;
|
|||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.media.MediaScannerConnection;
|
import android.media.MediaScannerConnection;
|
||||||
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@ -290,7 +290,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
// If sending base64 image back
|
// If sending base64 image back
|
||||||
if (destType == DATA_URL) {
|
if (destType == DATA_URL) {
|
||||||
bitmap = getScaledBitmap(imageUri.toString());
|
bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
if (bitmap == null) {
|
if (bitmap == null) {
|
||||||
// Try to get the bitmap from intent.
|
// Try to get the bitmap from intent.
|
||||||
bitmap = (Bitmap)intent.getExtras().get("data");
|
bitmap = (Bitmap)intent.getExtras().get("data");
|
||||||
@ -316,9 +316,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
if (this.saveToPhotoAlbum) {
|
if (this.saveToPhotoAlbum) {
|
||||||
Uri inputUri = getUriFromMediaStore();
|
Uri inputUri = getUriFromMediaStore();
|
||||||
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
//Just because we have a media URI doesn't mean we have a real file, we need to make it
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(inputUri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova)));
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
uri = Uri.fromFile(file);
|
|
||||||
} else {
|
} else {
|
||||||
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
|
uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
|
||||||
}
|
}
|
||||||
@ -334,15 +332,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
this.callbackContext.success(uri.toString());
|
this.callbackContext.success(uri.toString());
|
||||||
} else {
|
} else {
|
||||||
bitmap = getScaledBitmap(imageUri.toString());
|
bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
|
|
||||||
if (rotate != 0 && this.correctOrientation) {
|
if (rotate != 0 && this.correctOrientation) {
|
||||||
bitmap = getRotatedBitmap(rotate, bitmap, exif);
|
bitmap = getRotatedBitmap(rotate, bitmap, exif);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add compressed version of captured image to returned media store Uri
|
// Add compressed version of captured image to returned media store Uri
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
OutputStream os = dataResource.getOutputStream();
|
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
|
||||||
os.close();
|
os.close();
|
||||||
|
|
||||||
@ -350,7 +347,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
if (this.encodingType == JPEG) {
|
if (this.encodingType == JPEG) {
|
||||||
String exifPath;
|
String exifPath;
|
||||||
if (this.saveToPhotoAlbum) {
|
if (this.saveToPhotoAlbum) {
|
||||||
exifPath = dataResource.getRealFile().getPath();
|
exifPath = FileHelper.getRealPath(uri, this.cordova);
|
||||||
} else {
|
} else {
|
||||||
exifPath = uri.getPath();
|
exifPath = uri.getPath();
|
||||||
}
|
}
|
||||||
@ -401,9 +398,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
this.callbackContext.success(uri.toString());
|
this.callbackContext.success(uri.toString());
|
||||||
} else {
|
} else {
|
||||||
String uriString = uri.toString();
|
String uriString = uri.toString();
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
|
|
||||||
// Get the path to the image. Makes loading so much easier.
|
// Get the path to the image. Makes loading so much easier.
|
||||||
String mimeType = dataResource.getMimeType();
|
String mimeType = FileHelper.getMimeType(uriString, this.cordova);
|
||||||
// If we don't have a valid image so quit.
|
// If we don't have a valid image so quit.
|
||||||
if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
|
if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
|
||||||
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
Log.d(LOG_TAG, "I either have a null image path or bitmap");
|
||||||
@ -444,8 +440,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// Create an ExifHelper to save the exif data that is lost during compression
|
// Create an ExifHelper to save the exif data that is lost during compression
|
||||||
String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
|
||||||
// Some content: URIs do not map to file paths (e.g. picasa).
|
// Some content: URIs do not map to file paths (e.g. picasa).
|
||||||
File realFile = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent").getRealFile();
|
String realPath = FileHelper.getRealPath(uri, this.cordova);
|
||||||
String realPath = realFile != null? realFile.getPath() : null;
|
|
||||||
ExifHelper exif = new ExifHelper();
|
ExifHelper exif = new ExifHelper();
|
||||||
if (realPath != null && this.encodingType == JPEG) {
|
if (realPath != null && this.encodingType == JPEG) {
|
||||||
try {
|
try {
|
||||||
@ -539,15 +534,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
*/
|
*/
|
||||||
private void writeUncompressedImage(Uri uri) throws FileNotFoundException,
|
private void writeUncompressedImage(Uri uri) throws FileNotFoundException,
|
||||||
IOException {
|
IOException {
|
||||||
DataResource inputDataResource = DataResource.initiateNewDataRequestForUri(imageUri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
|
FileInputStream fis = new FileInputStream(FileHelper.stripFileProtocol(imageUri.toString()));
|
||||||
InputStream fis = inputDataResource.getInputStream();
|
OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
|
||||||
DataResource outDataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
|
|
||||||
OutputStream os = outDataResource.getOutputStream();
|
|
||||||
if(fis == null) {
|
|
||||||
throw new FileNotFoundException("Could not get the input file");
|
|
||||||
} else if(os == null) {
|
|
||||||
throw new FileNotFoundException("Could not get the output file");
|
|
||||||
}
|
|
||||||
byte[] buffer = new byte[4096];
|
byte[] buffer = new byte[4096];
|
||||||
int len;
|
int len;
|
||||||
while ((len = fis.read(buffer)) != -1) {
|
while ((len = fis.read(buffer)) != -1) {
|
||||||
@ -590,15 +578,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
*/
|
*/
|
||||||
private Bitmap getScaledBitmap(String imageUrl) throws IOException {
|
private Bitmap getScaledBitmap(String imageUrl) throws IOException {
|
||||||
// If no new width or height were specified return the original bitmap
|
// If no new width or height were specified return the original bitmap
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(imageUrl, webView.pluginManager, cordova, "CameraLauncher.getScaledBitmap");
|
|
||||||
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
if (this.targetWidth <= 0 && this.targetHeight <= 0) {
|
||||||
return BitmapFactory.decodeStream(dataResource.getInputStream());
|
return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova));
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out the original width and height of the image
|
// figure out the original width and height of the image
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inJustDecodeBounds = true;
|
options.inJustDecodeBounds = true;
|
||||||
BitmapFactory.decodeStream(dataResource.getInputStream(), null, options);
|
BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
|
|
||||||
//CB-2292: WTF? Why is the width null?
|
//CB-2292: WTF? Why is the width null?
|
||||||
if(options.outWidth == 0 || options.outHeight == 0)
|
if(options.outWidth == 0 || options.outHeight == 0)
|
||||||
@ -612,7 +599,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// Load in the smallest bitmap possible that is closest to the size we want
|
// Load in the smallest bitmap possible that is closest to the size we want
|
||||||
options.inJustDecodeBounds = false;
|
options.inJustDecodeBounds = false;
|
||||||
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
|
||||||
Bitmap unscaledBitmap = BitmapFactory.decodeStream(dataResource.getInputStream(), null, options);
|
Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
|
||||||
if (unscaledBitmap == null) {
|
if (unscaledBitmap == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -711,20 +698,16 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(oldImage, webView.pluginManager, cordova, "CameraLauncher.cleanup");
|
// Clean up initial camera-written image file.
|
||||||
File file = dataResource.getRealFile();
|
(new File(FileHelper.stripFileProtocol(oldImage.toString()))).delete();
|
||||||
if(file != null) {
|
|
||||||
// Clean up initial camera-written image file.
|
|
||||||
file.delete();
|
|
||||||
|
|
||||||
checkForDuplicateImage(imageType);
|
checkForDuplicateImage(imageType);
|
||||||
// Scan for the gallery to update pic refs in gallery
|
// Scan for the gallery to update pic refs in gallery
|
||||||
if (this.saveToPhotoAlbum && newImage != null) {
|
if (this.saveToPhotoAlbum && newImage != null) {
|
||||||
this.scanForGallery(newImage);
|
this.scanForGallery(newImage);
|
||||||
}
|
|
||||||
|
|
||||||
System.gc();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
System.gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,7 +26,6 @@ import java.io.OutputStream;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -130,8 +129,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
// If the mimeType isn't set the rest will fail
|
// If the mimeType isn't set the rest will fail
|
||||||
// so let's see if we can determine it.
|
// so let's see if we can determine it.
|
||||||
if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) {
|
if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.dataResource");
|
mimeType = FileHelper.getMimeType(filePath, cordova);
|
||||||
mimeType = dataResource.getMimeType();
|
|
||||||
}
|
}
|
||||||
Log.d(LOG_TAG, "Mime type = " + mimeType);
|
Log.d(LOG_TAG, "Mime type = " + mimeType);
|
||||||
|
|
||||||
@ -158,8 +156,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
|
private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
options.inJustDecodeBounds = true;
|
options.inJustDecodeBounds = true;
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.getImageData");
|
BitmapFactory.decodeFile(FileHelper.stripFileProtocol(filePath), options);
|
||||||
BitmapFactory.decodeFile(dataResource.getRealFile().getPath(), options);
|
|
||||||
obj.put("height", options.outHeight);
|
obj.put("height", options.outHeight);
|
||||||
obj.put("width", options.outWidth);
|
obj.put("width", options.outWidth);
|
||||||
return obj;
|
return obj;
|
||||||
@ -351,8 +348,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private JSONObject createMediaFile(Uri data) {
|
private JSONObject createMediaFile(Uri data) {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(data, webView.pluginManager, cordova, "Capture.createMediaFile");
|
File fp = new File(FileHelper.getRealPath(data, this.cordova));
|
||||||
File fp = dataResource.getRealFile();
|
|
||||||
JSONObject obj = new JSONObject();
|
JSONObject obj = new JSONObject();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -362,7 +358,6 @@ public class Capture extends CordovaPlugin {
|
|||||||
// Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
|
// Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
|
||||||
// are reported as video/3gpp. I'm doing this hacky check of the URI to see if it
|
// are reported as video/3gpp. I'm doing this hacky check of the URI to see if it
|
||||||
// is stored in the audio or video content store.
|
// is stored in the audio or video content store.
|
||||||
|
|
||||||
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
|
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
|
||||||
if (data.toString().contains("/audio/")) {
|
if (data.toString().contains("/audio/")) {
|
||||||
obj.put("type", AUDIO_3GPP);
|
obj.put("type", AUDIO_3GPP);
|
||||||
@ -370,7 +365,7 @@ public class Capture extends CordovaPlugin {
|
|||||||
obj.put("type", VIDEO_3GPP);
|
obj.put("type", VIDEO_3GPP);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.put("type", dataResource.getMimeType());
|
obj.put("type", FileHelper.getMimeType(fp.getAbsolutePath(), cordova));
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.put("lastModifiedDate", fp.lastModified());
|
obj.put("lastModifiedDate", fp.lastModified());
|
||||||
|
@ -26,11 +26,10 @@ import org.apache.cordova.api.CordovaInterface;
|
|||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.net.URLConnection;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
public class FileHelper {
|
public class FileHelper {
|
||||||
private static final String LOG_TAG = "FileUtils";
|
private static final String LOG_TAG = "FileUtils";
|
||||||
@ -91,65 +90,18 @@ public class FileHelper {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
|
public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
|
||||||
if (uriString.startsWith("content:")) {
|
if (uriString.startsWith("content")) {
|
||||||
Uri uri = Uri.parse(uriString);
|
Uri uri = Uri.parse(uriString);
|
||||||
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
return cordova.getActivity().getContentResolver().openInputStream(uri);
|
||||||
} else if (uriString.startsWith("file:///android_asset/")) {
|
} else if (uriString.startsWith("file:///android_asset/")) {
|
||||||
Uri uri = Uri.parse(uriString);
|
Uri uri = Uri.parse(uriString);
|
||||||
String relativePath = uri.getPath().substring(15);
|
String relativePath = uri.getPath().substring(15);
|
||||||
return cordova.getActivity().getAssets().open(relativePath);
|
return cordova.getActivity().getAssets().open(relativePath);
|
||||||
} else if (uriString.startsWith("file://")) {
|
} else {
|
||||||
return new FileInputStream(getRealPath(uriString, cordova));
|
return new FileInputStream(getRealPath(uriString, cordova));
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OutputStream getOutputStreamFromUriString(String uriString, CordovaInterface cordova) throws FileNotFoundException{
|
|
||||||
if (uriString.startsWith("content:")) {
|
|
||||||
Uri uri = Uri.parse(uriString);
|
|
||||||
return cordova.getActivity().getContentResolver().openOutputStream(uri);
|
|
||||||
} else if (uriString.startsWith("file:") && !uriString.startsWith("file:///android_asset/")) {
|
|
||||||
String realPath = uriString.substring(7);
|
|
||||||
return new FileOutputStream(realPath);
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns whether the uri can be written to by openeing a File to that uri
|
|
||||||
*
|
|
||||||
* @param the URI to test
|
|
||||||
* @return boolean indicating whether the uri is writable
|
|
||||||
*/
|
|
||||||
public static boolean isUriWritable(String uriString) {
|
|
||||||
String scheme = uriString.split(":")[0];
|
|
||||||
|
|
||||||
if(scheme.equals("file")){
|
|
||||||
// special case file
|
|
||||||
return !uriString.startsWith("file:///android_asset/");
|
|
||||||
}
|
|
||||||
return "content".equals(scheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensures the "file://" prefix exists for the given string
|
|
||||||
* If the given URI string already has a scheme, it is returned unchanged
|
|
||||||
*
|
|
||||||
* @param path - the path string to operate on
|
|
||||||
* @return a String with the "file://" scheme set
|
|
||||||
*/
|
|
||||||
public static String insertFileProtocol(String path) {
|
|
||||||
if(!path.matches("^[a-z0-9+.-]+:.*")){
|
|
||||||
//Ensure it is not a relative path
|
|
||||||
if(!path.startsWith("/")){
|
|
||||||
throw new IllegalArgumentException("Relative paths" + path + "are not allowed.");
|
|
||||||
}
|
|
||||||
path = "file://" + path;
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the "file://" prefix from the given URI string, if applicable.
|
* Removes the "file://" prefix from the given URI string, if applicable.
|
||||||
* If the given URI string doesn't have a "file://" prefix, it is returned unchanged.
|
* If the given URI string doesn't have a "file://" prefix, it is returned unchanged.
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.cordova;
|
package org.apache.cordova;
|
||||||
|
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -25,7 +27,6 @@ import android.util.Log;
|
|||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.cordova.api.CallbackContext;
|
import org.apache.cordova.api.CallbackContext;
|
||||||
import org.apache.cordova.api.CordovaPlugin;
|
import org.apache.cordova.api.CordovaPlugin;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.PluginResult;
|
import org.apache.cordova.api.PluginResult;
|
||||||
import org.apache.cordova.file.EncodingException;
|
import org.apache.cordova.file.EncodingException;
|
||||||
import org.apache.cordova.file.FileExistsException;
|
import org.apache.cordova.file.FileExistsException;
|
||||||
@ -45,6 +46,8 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,7 +234,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @param filePath the path to check
|
* @param filePath the path to check
|
||||||
*/
|
*/
|
||||||
private void notifyDelete(String filePath) {
|
private void notifyDelete(String filePath) {
|
||||||
String newFilePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.notifyDelete").getRealFile().getPath();
|
String newFilePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
try {
|
try {
|
||||||
this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||||
MediaStore.Images.Media.DATA + " = ?",
|
MediaStore.Images.Media.DATA + " = ?",
|
||||||
@ -253,10 +256,37 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws IOException if the user can't read the file
|
* @throws IOException if the user can't read the file
|
||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException {
|
private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(url, webView.pluginManager, cordova, "FileUtils.resolveLocalFileSystemURI").getRealFile();
|
String decoded = URLDecoder.decode(url, "UTF-8");
|
||||||
|
|
||||||
if (fp == null || !fp.exists()) {
|
File fp = null;
|
||||||
|
|
||||||
|
// Handle the special case where you get an Android content:// uri.
|
||||||
|
if (decoded.startsWith("content:")) {
|
||||||
|
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"
|
||||||
|
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
|
||||||
|
cursor.moveToFirst();
|
||||||
|
fp = new File(cursor.getString(column_index));
|
||||||
|
} else {
|
||||||
|
// Test to see if this is a valid URL first
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
URL testUrl = new URL(decoded);
|
||||||
|
|
||||||
|
if (decoded.startsWith("file://")) {
|
||||||
|
int questionMark = decoded.indexOf("?");
|
||||||
|
if (questionMark < 0) {
|
||||||
|
fp = new File(decoded.substring(7, decoded.length()));
|
||||||
|
} else {
|
||||||
|
fp = new File(decoded.substring(7, questionMark));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fp = new File(decoded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fp.exists()) {
|
||||||
throw new FileNotFoundException();
|
throw new FileNotFoundException();
|
||||||
}
|
}
|
||||||
if (!fp.canRead()) {
|
if (!fp.canRead()) {
|
||||||
@ -274,9 +304,9 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONArray readEntries(String fileName) throws FileNotFoundException, JSONException {
|
private JSONArray readEntries(String fileName) throws FileNotFoundException, JSONException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(fileName);
|
||||||
|
|
||||||
if (fp == null || !fp.exists()) {
|
if (!fp.exists()) {
|
||||||
// The directory we are listing doesn't exist so we should fail.
|
// The directory we are listing doesn't exist so we should fail.
|
||||||
throw new FileNotFoundException();
|
throw new FileNotFoundException();
|
||||||
}
|
}
|
||||||
@ -311,10 +341,8 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileExistsException
|
* @throws FileExistsException
|
||||||
*/
|
*/
|
||||||
private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
|
private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
|
||||||
DataResource dataResourceFrom = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.transferTo");
|
String newFileName = FileHelper.getRealPath(fileName, cordova);
|
||||||
String newFileName = dataResourceFrom.getRealFile().getPath();
|
newParent = FileHelper.getRealPath(newParent, cordova);
|
||||||
DataResource dataResourceTo = DataResource.initiateNewDataRequestForUri(newParent, webView.pluginManager, cordova, "FileUtils.transferTo");
|
|
||||||
newParent = dataResourceTo.getRealFile().getPath();
|
|
||||||
|
|
||||||
// Check for invalid file name
|
// Check for invalid file name
|
||||||
if (newName != null && newName.contains(":")) {
|
if (newName != null && newName.contains(":")) {
|
||||||
@ -585,7 +613,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileExistsException
|
* @throws FileExistsException
|
||||||
*/
|
*/
|
||||||
private boolean removeRecursively(String filePath) throws FileExistsException {
|
private boolean removeRecursively(String filePath) throws FileExistsException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(filePath);
|
||||||
|
|
||||||
// You can't delete the root directory.
|
// You can't delete the root directory.
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
@ -626,7 +654,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws InvalidModificationException
|
* @throws InvalidModificationException
|
||||||
*/
|
*/
|
||||||
private boolean remove(String filePath) throws NoModificationAllowedException, InvalidModificationException {
|
private boolean remove(String filePath) throws NoModificationAllowedException, InvalidModificationException {
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
|
File fp = createFileObject(filePath);
|
||||||
|
|
||||||
// You can't delete the root directory.
|
// You can't delete the root directory.
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
@ -670,8 +698,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
throw new EncodingException("This file has a : in it's name");
|
throw new EncodingException("This file has a : in it's name");
|
||||||
}
|
}
|
||||||
|
|
||||||
String filePath = getFullFilePath(dirPath, fileName);
|
File fp = createFileObject(dirPath, fileName);
|
||||||
File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getFile").getRealFile();
|
|
||||||
|
|
||||||
if (create) {
|
if (create) {
|
||||||
if (exclusive && fp.exists()) {
|
if (exclusive && fp.exists()) {
|
||||||
@ -713,14 +740,15 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @param fileName new file name
|
* @param fileName new file name
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getFullFilePath(String dirPath, String fileName) {
|
private File createFileObject(String dirPath, String fileName) {
|
||||||
|
File fp = null;
|
||||||
if (fileName.startsWith("/")) {
|
if (fileName.startsWith("/")) {
|
||||||
return fileName;
|
fp = new File(fileName);
|
||||||
} else {
|
} else {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(dirPath, webView.pluginManager, cordova, "FileUtils.getFullFilePath");
|
dirPath = FileHelper.getRealPath(dirPath, cordova);
|
||||||
dirPath = dataResource.getRealFile().getPath();
|
fp = new File(dirPath + File.separator + fileName);
|
||||||
return dirPath + File.separator + fileName;
|
|
||||||
}
|
}
|
||||||
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -732,13 +760,12 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONObject getParent(String filePath) throws JSONException {
|
private JSONObject getParent(String filePath) throws JSONException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getParent");
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
filePath = dataResource.getRealFile().getPath();
|
|
||||||
|
|
||||||
if (atRootDirectory(filePath)) {
|
if (atRootDirectory(filePath)) {
|
||||||
return getEntry(filePath);
|
return getEntry(filePath);
|
||||||
}
|
}
|
||||||
return getEntry(dataResource.getRealFile().getParent());
|
return getEntry(new File(filePath).getParent());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -749,7 +776,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @return true if we are at the root, false otherwise.
|
* @return true if we are at the root, false otherwise.
|
||||||
*/
|
*/
|
||||||
private boolean atRootDirectory(String filePath) {
|
private boolean atRootDirectory(String filePath) {
|
||||||
filePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.atRootDirectory").getRealFile().getPath();
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
|
|
||||||
if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.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()) ||
|
||||||
@ -759,6 +786,19 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a File object from the passed in path
|
||||||
|
*
|
||||||
|
* @param filePath
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private File createFileObject(String filePath) {
|
||||||
|
filePath = FileHelper.getRealPath(filePath, cordova);
|
||||||
|
|
||||||
|
File file = new File(filePath);
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up metadata about this entry.
|
* Look up metadata about this entry.
|
||||||
*
|
*
|
||||||
@ -767,9 +807,9 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws FileNotFoundException
|
* @throws FileNotFoundException
|
||||||
*/
|
*/
|
||||||
private long getMetadata(String filePath) throws FileNotFoundException {
|
private long getMetadata(String filePath) throws FileNotFoundException {
|
||||||
File file = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata").getRealFile();
|
File file = createFileObject(filePath);
|
||||||
|
|
||||||
if (file == null || !file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new FileNotFoundException("Failed to find file in getMetadata");
|
throw new FileNotFoundException("Failed to find file in getMetadata");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,16 +825,15 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws JSONException
|
* @throws JSONException
|
||||||
*/
|
*/
|
||||||
private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException {
|
private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata");
|
File file = createFileObject(filePath);
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
|
|
||||||
if (file == null || !file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new FileNotFoundException("File: " + filePath + " does not exist.");
|
throw new FileNotFoundException("File: " + filePath + " does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject metadata = new JSONObject();
|
JSONObject metadata = new JSONObject();
|
||||||
metadata.put("size", file.length());
|
metadata.put("size", file.length());
|
||||||
metadata.put("type", dataResource.getMimeType());
|
metadata.put("type", FileHelper.getMimeType(filePath, cordova));
|
||||||
metadata.put("name", file.getName());
|
metadata.put("name", file.getName());
|
||||||
metadata.put("fullPath", filePath);
|
metadata.put("fullPath", filePath);
|
||||||
metadata.put("lastModifiedDate", file.lastModified());
|
metadata.put("lastModifiedDate", file.lastModified());
|
||||||
@ -896,8 +935,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
this.cordova.getThreadPool().execute(new Runnable() {
|
this.cordova.getThreadPool().execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs");
|
byte[] bytes = readAsBinaryHelper(filename, start, end);
|
||||||
byte[] bytes = readAsBinaryHelper(dataResource.getInputStream(), start, end);
|
|
||||||
|
|
||||||
PluginResult result;
|
PluginResult result;
|
||||||
switch (resultType) {
|
switch (resultType) {
|
||||||
@ -911,7 +949,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
result = new PluginResult(PluginResult.Status.OK, bytes, true);
|
result = new PluginResult(PluginResult.Status.OK, bytes, true);
|
||||||
break;
|
break;
|
||||||
default: // Base64.
|
default: // Base64.
|
||||||
String contentType = dataResource.getMimeType();
|
String contentType = FileHelper.getMimeType(filename, cordova);
|
||||||
byte[] base64 = Base64.encodeBase64(bytes);
|
byte[] base64 = Base64.encodeBase64(bytes);
|
||||||
String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII");
|
String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII");
|
||||||
result = new PluginResult(PluginResult.Status.OK, s);
|
result = new PluginResult(PluginResult.Status.OK, s);
|
||||||
@ -938,9 +976,10 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @return Contents of the file as a byte[].
|
* @return Contents of the file as a byte[].
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private byte[] readAsBinaryHelper(InputStream inputStream, int start, int end) throws IOException {
|
private byte[] readAsBinaryHelper(String filename, int start, int end) throws IOException {
|
||||||
int numBytesToRead = end - start;
|
int numBytesToRead = end - start;
|
||||||
byte[] bytes = new byte[numBytesToRead];
|
byte[] bytes = new byte[numBytesToRead];
|
||||||
|
InputStream inputStream = FileHelper.getInputStreamFromUriString(filename, cordova);
|
||||||
int numBytesRead = 0;
|
int numBytesRead = 0;
|
||||||
|
|
||||||
if (start > 0) {
|
if (start > 0) {
|
||||||
@ -969,8 +1008,7 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
throw new NoModificationAllowedException("Couldn't write to file given its content URI");
|
throw new NoModificationAllowedException("Couldn't write to file given its content URI");
|
||||||
}
|
}
|
||||||
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.write");
|
filename = FileHelper.getRealPath(filename, cordova);
|
||||||
filename = dataResource.getRealFile().getPath();
|
|
||||||
|
|
||||||
boolean append = false;
|
boolean append = false;
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
@ -999,16 +1037,13 @@ public class FileUtils extends CordovaPlugin {
|
|||||||
* @throws NoModificationAllowedException
|
* @throws NoModificationAllowedException
|
||||||
*/
|
*/
|
||||||
private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
|
private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.truncateFile");
|
if (filename.startsWith("content://")) {
|
||||||
if(!dataResource.isWritable()) {
|
throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
|
||||||
throw new NoModificationAllowedException("Couldn't truncate file as it is not writable");
|
|
||||||
}
|
|
||||||
File file = dataResource.getRealFile();
|
|
||||||
if(file == null) {
|
|
||||||
throw new FileNotFoundException("Couldn't get the file");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RandomAccessFile raf = new RandomAccessFile(file, "rw");
|
filename = FileHelper.getRealPath(filename, cordova);
|
||||||
|
|
||||||
|
RandomAccessFile raf = new RandomAccessFile(filename, "rw");
|
||||||
try {
|
try {
|
||||||
if (raf.length() >= size) {
|
if (raf.length() >= size) {
|
||||||
FileChannel channel = raf.getChannel();
|
FileChannel channel = raf.getChannel();
|
||||||
|
@ -22,8 +22,6 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.cordova.api.CordovaInterface;
|
import org.apache.cordova.api.CordovaInterface;
|
||||||
import org.apache.cordova.api.DataResource;
|
|
||||||
import org.apache.cordova.api.DataResourceContext;
|
|
||||||
import org.apache.cordova.api.LOG;
|
import org.apache.cordova.api.LOG;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
@ -45,27 +43,41 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
||||||
// We need to support the new DataResource intercepts without breaking the shouldInterceptRequest mechanism.
|
|
||||||
DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.appView.pluginManager, cordova,
|
|
||||||
"WebViewClient.shouldInterceptRequest");
|
|
||||||
url = dataResource.getUri().toString();
|
|
||||||
|
|
||||||
// This mechanism is no longer needed due to the dataResource mechanism. It would be awesome to just get rid of it.
|
|
||||||
//Check if plugins intercept the request
|
//Check if plugins intercept the request
|
||||||
WebResourceResponse ret = super.shouldInterceptRequest(view, url);
|
WebResourceResponse ret = super.shouldInterceptRequest(view, url);
|
||||||
|
if(ret == null && (url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url))){
|
||||||
if(ret == null) {
|
ret = generateWebResourceResponse(url);
|
||||||
try {
|
|
||||||
InputStream is;
|
|
||||||
String mimeType;
|
|
||||||
if((is = dataResource.getInputStream()) != null && (mimeType = dataResource.getMimeType()) != null) {
|
|
||||||
// If we don't know how to open this file, let the browser continue loading
|
|
||||||
ret = new WebResourceResponse(mimeType, "UTF-8", is);
|
|
||||||
}
|
|
||||||
} catch(IOException e) {
|
|
||||||
LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file.", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private WebResourceResponse generateWebResourceResponse(String url) {
|
||||||
|
if (url.startsWith("file:///android_asset/")) {
|
||||||
|
String mimetype = FileHelper.getMimeType(url, cordova);
|
||||||
|
|
||||||
|
try {
|
||||||
|
InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova);
|
||||||
|
WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
|
||||||
|
return response;
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.e("generateWebResourceResponse", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean needsIceCreamSpaceInAssetUrlFix(String url) {
|
||||||
|
if (!url.contains("%20")){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(android.os.Build.VERSION.SDK_INT){
|
||||||
|
case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH:
|
||||||
|
case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
/*
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
*/
|
||||||
package org.apache.cordova;
|
package org.apache.cordova;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
/*
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
*/
|
||||||
package org.apache.cordova.api;
|
package org.apache.cordova.api;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
|
@ -175,20 +175,6 @@ public class CordovaPlugin {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* All plugins can now choose if they want to modify any uri requests. This includes all webview requests, opening of files, content uri's etc.
|
|
||||||
* This mechanism allows several plugins to modify the same request
|
|
||||||
* @param requestSource The source of the incoming request
|
|
||||||
*
|
|
||||||
* @param dataResource The resource to be loaded.
|
|
||||||
* @param dataResourceContext Context associated with the resource load
|
|
||||||
* @return Return a new DataResource if the plugin wants to assist in loading the request or null if it doesn't.
|
|
||||||
*/
|
|
||||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
|
||||||
public DataResource handleDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the WebView does a top-level navigation or refreshes.
|
* Called when the WebView does a top-level navigation or refreshes.
|
||||||
*
|
*
|
||||||
|
@ -1,141 +0,0 @@
|
|||||||
package org.apache.cordova.api;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
|
|
||||||
import org.apache.cordova.FileHelper;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All requests to access files, browser network requests etc have to go through this class.
|
|
||||||
*/
|
|
||||||
public class DataResource {
|
|
||||||
private CordovaInterface cordova;
|
|
||||||
|
|
||||||
// Uri of the request. Always required.
|
|
||||||
private Uri uri;
|
|
||||||
// Remaining fields may or may not be null
|
|
||||||
private InputStream is;
|
|
||||||
private OutputStream os;
|
|
||||||
private String mimeType;
|
|
||||||
private Boolean writable;
|
|
||||||
private File realFile;
|
|
||||||
private boolean retryIsLoad = true;
|
|
||||||
private boolean retryOsLoad = true;
|
|
||||||
private boolean retryMimeTypeLoad = true;
|
|
||||||
private boolean retryWritableLoad = true;
|
|
||||||
private boolean retryRealFileLoad = true;
|
|
||||||
|
|
||||||
public DataResource(CordovaInterface cordova, Uri uri) {
|
|
||||||
this.cordova = cordova;
|
|
||||||
this.uri = uri;
|
|
||||||
}
|
|
||||||
public DataResource(CordovaInterface cordova, Uri uri, InputStream is,
|
|
||||||
OutputStream os, String mimeType, boolean writable, File realFile) {
|
|
||||||
this(cordova, uri);
|
|
||||||
this.is = is;
|
|
||||||
this.mimeType = mimeType;
|
|
||||||
this.writable = Boolean.valueOf(writable);
|
|
||||||
this.realFile = realFile;
|
|
||||||
}
|
|
||||||
public Uri getUri() {
|
|
||||||
// Uri is always provided
|
|
||||||
return uri;
|
|
||||||
}
|
|
||||||
public InputStream getInputStream() throws IOException {
|
|
||||||
if(is == null && retryIsLoad) {
|
|
||||||
try {
|
|
||||||
is = FileHelper.getInputStreamFromUriString(uri.toString(), cordova);
|
|
||||||
} finally {
|
|
||||||
// We failed loading once, don't try loading anymore
|
|
||||||
if(is == null) {
|
|
||||||
retryIsLoad = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
public OutputStream getOutputStream() throws FileNotFoundException {
|
|
||||||
if(os == null && retryOsLoad) {
|
|
||||||
try {
|
|
||||||
os = FileHelper.getOutputStreamFromUriString(uri.toString(), cordova);
|
|
||||||
} finally {
|
|
||||||
// We failed loading once, don't try loading anymore
|
|
||||||
if(os == null) {
|
|
||||||
retryOsLoad = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
public String getMimeType() {
|
|
||||||
if(mimeType == null && retryMimeTypeLoad) {
|
|
||||||
try {
|
|
||||||
mimeType = FileHelper.getMimeType(uri.toString(), cordova);
|
|
||||||
} finally {
|
|
||||||
// We failed loading once, don't try loading anymore
|
|
||||||
if(mimeType == null) {
|
|
||||||
retryMimeTypeLoad = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mimeType;
|
|
||||||
}
|
|
||||||
public boolean isWritable() {
|
|
||||||
if(writable == null && retryWritableLoad) {
|
|
||||||
try {
|
|
||||||
writable = FileHelper.isUriWritable(uri.toString());
|
|
||||||
} finally {
|
|
||||||
// We failed loading once, don't try loading anymore
|
|
||||||
if(writable == null) {
|
|
||||||
retryWritableLoad = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// default to false
|
|
||||||
return writable != null && writable.booleanValue();
|
|
||||||
}
|
|
||||||
public File getRealFile() {
|
|
||||||
if(realFile == null && retryRealFileLoad) {
|
|
||||||
try {
|
|
||||||
String realPath = FileHelper.getRealPath(uri, cordova);
|
|
||||||
if(realPath != null) {
|
|
||||||
realFile = new File(realPath);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
// We failed loading once, don't try loading anymore
|
|
||||||
if(realFile == null) {
|
|
||||||
retryRealFileLoad = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return realFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static instantiation methods
|
|
||||||
public static DataResource initiateNewDataRequestForUri(String uriString, PluginManager pluginManager, CordovaInterface cordova, String requestSourceTag){
|
|
||||||
// if no protocol is specified, assume its file:
|
|
||||||
uriString = FileHelper.insertFileProtocol(uriString);
|
|
||||||
return initiateNewDataRequestForUri(Uri.parse(uriString), pluginManager, cordova, requestSourceTag);
|
|
||||||
}
|
|
||||||
public static DataResource initiateNewDataRequestForUri(Uri uri, PluginManager pluginManager, CordovaInterface cordova, String requestSourceTag){
|
|
||||||
return initiateNewDataRequestForUri(uri, pluginManager, cordova, new DataResourceContext(requestSourceTag));
|
|
||||||
}
|
|
||||||
public static DataResource initiateNewDataRequestForUri(String uriString, PluginManager pluginManager, CordovaInterface cordova, DataResourceContext dataResourceContext){
|
|
||||||
// if no protocol is specified, assume its file:
|
|
||||||
uriString = FileHelper.insertFileProtocol(uriString);
|
|
||||||
return initiateNewDataRequestForUri(Uri.parse(uriString), pluginManager, cordova, dataResourceContext);
|
|
||||||
}
|
|
||||||
public static DataResource initiateNewDataRequestForUri(Uri uri, PluginManager pluginManager, CordovaInterface cordova, DataResourceContext dataResourceContext){
|
|
||||||
DataResource dataResource = new DataResource(cordova, uri);
|
|
||||||
if (pluginManager != null) {
|
|
||||||
// get the resource as returned by plugins
|
|
||||||
dataResource = pluginManager.handleDataResourceRequestWithPlugins(dataResource, dataResourceContext);
|
|
||||||
}
|
|
||||||
return dataResource;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
package org.apache.cordova.api;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
|
||||||
/*
|
|
||||||
* Some context information associated with a DataRequest.
|
|
||||||
*/
|
|
||||||
public class DataResourceContext {
|
|
||||||
// A random id that is unique for a particular request.
|
|
||||||
private int requestId;
|
|
||||||
// A tag associated with the source of this dataResourceContext
|
|
||||||
private String source;
|
|
||||||
// If needed, any data associated with core plugins can be a part of the context object
|
|
||||||
// If needed, any data associated with non core plugins should store data in a Map so as to not clutter the context object
|
|
||||||
private Map<String, Object> dataMap;
|
|
||||||
public DataResourceContext(String source) {
|
|
||||||
this.requestId = new Random().nextInt();
|
|
||||||
this.source = source;
|
|
||||||
this.dataMap = new HashMap<String, Object>();
|
|
||||||
}
|
|
||||||
public int getRequestId() {
|
|
||||||
return requestId;
|
|
||||||
}
|
|
||||||
public String getSource() {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
public Map<String, Object> getDataMap() {
|
|
||||||
return dataMap;
|
|
||||||
}
|
|
||||||
}
|
|
@ -54,7 +54,6 @@ public class PluginManager {
|
|||||||
// Map URL schemes like foo: to plugins that want to handle those schemes
|
// Map URL schemes like foo: to plugins that want to handle those schemes
|
||||||
// This would allow how all URLs are handled to be offloaded to a plugin
|
// This would allow how all URLs are handled to be offloaded to a plugin
|
||||||
protected HashMap<String, String> urlMap = new HashMap<String, String>();
|
protected HashMap<String, String> urlMap = new HashMap<String, String>();
|
||||||
private int MAX_REPITIONS = 1000;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
@ -401,32 +400,4 @@ public class PluginManager {
|
|||||||
LOG.e(TAG, "https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
|
LOG.e(TAG, "https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
|
||||||
LOG.e(TAG, "=====================================================================================");
|
LOG.e(TAG, "=====================================================================================");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the any resource is going to be loaded - either from the webview, files or any other resource
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param dataResource The resource request to be loaded.
|
|
||||||
* @param dataResourceContext The context of the dataResource request
|
|
||||||
* @return Return the resource request that will be loaded. The returned request may be modified or unchanged.
|
|
||||||
*/
|
|
||||||
public DataResource handleDataResourceRequestWithPlugins(DataResource dataResource, DataResourceContext dataResourceContext){
|
|
||||||
int repetitions = 0;
|
|
||||||
boolean requestModified = true;
|
|
||||||
while(requestModified && repetitions < MAX_REPITIONS) {
|
|
||||||
requestModified = false;
|
|
||||||
repetitions ++;
|
|
||||||
for (PluginEntry entry : this.entries.values()) {
|
|
||||||
if (entry.plugin != null) {
|
|
||||||
DataResource ret = entry.plugin.handleDataResourceRequest(dataResource, dataResourceContext);
|
|
||||||
if(ret != null) {
|
|
||||||
dataResource = ret;
|
|
||||||
requestModified = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dataResource;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
-->
|
||||||
# Android Native Tests #
|
# Android Native Tests #
|
||||||
|
|
||||||
These tests are designed to verify Android native features and other Android specific features.
|
These tests are designed to verify Android native features and other Android specific features.
|
||||||
|
@ -1,4 +1,22 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
<widget xmlns = "http://www.w3.org/ns/widgets"
|
<widget xmlns = "http://www.w3.org/ns/widgets"
|
||||||
id = "io.cordova.helloCordova"
|
id = "io.cordova.helloCordova"
|
||||||
version = "2.0.0">
|
version = "2.0.0">
|
||||||
|
Loading…
Reference in New Issue
Block a user