You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2013/06/12 19:15:51 UTC

[35/56] [abbrv] [partial] start of lazy loading: axe all vendored-in libs

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebView.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebView.java b/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebView.java
deleted file mode 100755
index c57cd50..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebView.java
+++ /dev/null
@@ -1,947 +0,0 @@
-/*
-       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;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Stack;
-import java.util.regex.Pattern;
-
-import org.apache.cordova.Config;
-import org.apache.cordova.api.CordovaInterface;
-import org.apache.cordova.api.LOG;
-import org.apache.cordova.api.PluginManager;
-import org.apache.cordova.api.PluginResult;
-
-import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebBackForwardList;
-import android.webkit.WebHistoryItem;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebSettings.LayoutAlgorithm;
-import android.widget.FrameLayout;
-
-public class CordovaWebView extends WebView {
-
-    public static final String TAG = "CordovaWebView";
-
-    private ArrayList<Integer> keyDownCodes = new ArrayList<Integer>();
-    private ArrayList<Integer> keyUpCodes = new ArrayList<Integer>();
-
-    public PluginManager pluginManager;
-    private boolean paused;
-
-    private BroadcastReceiver receiver;
-
-
-    /** Activities and other important classes **/
-    private CordovaInterface cordova;
-    CordovaWebViewClient viewClient;
-    @SuppressWarnings("unused")
-    private CordovaChromeClient chromeClient;
-
-    private String url;
-
-    // Flag to track that a loadUrl timeout occurred
-    int loadUrlTimeout = 0;
-
-    private boolean bound;
-
-    private boolean handleButton = false;
-    
-    private long lastMenuEventTime = 0;
-
-    NativeToJsMessageQueue jsMessageQueue;
-    ExposedJsApi exposedJsApi;
-
-    /** custom view created by the browser (a video player for example) */
-    private View mCustomView;
-    private WebChromeClient.CustomViewCallback mCustomViewCallback;
-
-    private ActivityResult mResult = null;
-
-    class ActivityResult {
-        
-        int request;
-        int result;
-        Intent incoming;
-        
-        public ActivityResult(int req, int res, Intent intent) {
-            request = req;
-            result = res;
-            incoming = intent;
-        }
-
-        
-    }
-    
-    static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER =
-            new FrameLayout.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            Gravity.CENTER);
-    
-    /**
-     * Constructor.
-     *
-     * @param context
-     */
-    public CordovaWebView(Context context) {
-        super(context);
-        if (CordovaInterface.class.isInstance(context))
-        {
-            this.cordova = (CordovaInterface) context;
-        }
-        else
-        {
-            Log.d(TAG, "Your activity must implement CordovaInterface to work");
-        }
-        this.loadConfiguration();
-        this.setup();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param context
-     * @param attrs
-     */
-    public CordovaWebView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        if (CordovaInterface.class.isInstance(context))
-        {
-            this.cordova = (CordovaInterface) context;
-        }
-        else
-        {
-            Log.d(TAG, "Your activity must implement CordovaInterface to work");
-        }
-        this.setWebChromeClient(new CordovaChromeClient(this.cordova, this));
-        this.initWebViewClient(this.cordova);
-        this.loadConfiguration();
-        this.setup();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param context
-     * @param attrs
-     * @param defStyle
-     *
-     */
-    public CordovaWebView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        if (CordovaInterface.class.isInstance(context))
-        {
-            this.cordova = (CordovaInterface) context;
-        }
-        else
-        {
-            Log.d(TAG, "Your activity must implement CordovaInterface to work");
-        }
-        this.setWebChromeClient(new CordovaChromeClient(this.cordova, this));
-        this.loadConfiguration();
-        this.setup();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param context
-     * @param attrs
-     * @param defStyle
-     * @param privateBrowsing
-     */
-    @TargetApi(11)
-    public CordovaWebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
-        super(context, attrs, defStyle, privateBrowsing);
-        if (CordovaInterface.class.isInstance(context))
-        {
-            this.cordova = (CordovaInterface) context;
-        }
-        else
-        {
-            Log.d(TAG, "Your activity must implement CordovaInterface to work");
-        }
-        this.setWebChromeClient(new CordovaChromeClient(this.cordova));
-        this.initWebViewClient(this.cordova);
-        this.loadConfiguration();
-        this.setup();
-    }
-
-
-    private void initWebViewClient(CordovaInterface cordova) {
-        if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB ||
-                android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
-        {
-            this.setWebViewClient(new CordovaWebViewClient(this.cordova, this));
-        }
-        else
-        {
-            this.setWebViewClient(new IceCreamCordovaWebViewClient(this.cordova, this));
-        }
-    }
-
-    /**
-     * Initialize webview.
-     */
-    @SuppressWarnings("deprecation")
-    @SuppressLint("NewApi")
-    private void setup() {
-        this.setInitialScale(0);
-        this.setVerticalScrollBarEnabled(false);
-        this.requestFocusFromTouch();
-
-        // Enable JavaScript
-        WebSettings settings = this.getSettings();
-        settings.setJavaScriptEnabled(true);
-        settings.setJavaScriptCanOpenWindowsAutomatically(true);
-        settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
-        
-        // Set the nav dump for HTC 2.x devices (disabling for ICS, deprecated entirely for Jellybean 4.2)
-        try {
-            Method gingerbread_getMethod =  WebSettings.class.getMethod("setNavDump", new Class[] { boolean.class });
-            
-            String manufacturer = android.os.Build.MANUFACTURER;
-            Log.d(TAG, "CordovaWebView is running on device made by: " + manufacturer);
-            if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB &&
-                    android.os.Build.MANUFACTURER.contains("HTC"))
-            {
-                gingerbread_getMethod.invoke(settings, true);
-            }
-        } catch (NoSuchMethodException e) {
-            Log.d(TAG, "We are on a modern version of Android, we will deprecate HTC 2.3 devices in 2.8");
-        } catch (IllegalArgumentException e) {
-            Log.d(TAG, "Doing the NavDump failed with bad arguments");
-        } catch (IllegalAccessException e) {
-            Log.d(TAG, "This should never happen: IllegalAccessException means this isn't Android anymore");
-        } catch (InvocationTargetException e) {
-            Log.d(TAG, "This should never happen: InvocationTargetException means this isn't Android anymore.");
-        }
-
-        //We don't save any form data in the application
-        settings.setSaveFormData(false);
-        settings.setSavePassword(false);
-        
-        // Jellybean rightfully tried to lock this down. Too bad they didn't give us a whitelist
-        // while we do this
-        if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
-            Level16Apis.enableUniversalAccess(settings);
-        // Enable database
-        // We keep this disabled because we use or shim to get around DOM_EXCEPTION_ERROR_16
-        String databasePath = this.cordova.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
-        settings.setDatabaseEnabled(true);
-        settings.setDatabasePath(databasePath);
-        
-        settings.setGeolocationDatabasePath(databasePath);
-
-        // Enable DOM storage
-        settings.setDomStorageEnabled(true);
-
-        // Enable built-in geolocation
-        settings.setGeolocationEnabled(true);
-        
-        // Enable AppCache
-        // Fix for CB-2282
-        settings.setAppCacheMaxSize(5 * 1048576);
-        String pathToCache = this.cordova.getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
-        settings.setAppCachePath(pathToCache);
-        settings.setAppCacheEnabled(true);
-        
-        // Fix for CB-1405
-        // Google issue 4641
-        this.updateUserAgentString();
-        
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
-        if (this.receiver == null) {
-            this.receiver = new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    updateUserAgentString();
-                }
-            };
-            this.cordova.getActivity().registerReceiver(this.receiver, intentFilter);
-        }
-        // end CB-1405
-
-        pluginManager = new PluginManager(this, this.cordova);
-        jsMessageQueue = new NativeToJsMessageQueue(this, cordova);
-        exposedJsApi = new ExposedJsApi(pluginManager, jsMessageQueue);
-        exposeJsInterface();
-    }
-    
-    private void updateUserAgentString() {
-        this.getSettings().getUserAgentString();
-    }
-
-    private void exposeJsInterface() {
-        int SDK_INT = Build.VERSION.SDK_INT;
-        boolean isHoneycomb = (SDK_INT >= Build.VERSION_CODES.HONEYCOMB && SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR2);
-        if (isHoneycomb || (SDK_INT < Build.VERSION_CODES.GINGERBREAD)) {
-            Log.i(TAG, "Disabled addJavascriptInterface() bridge since Android version is old.");
-            // Bug being that Java Strings do not get converted to JS strings automatically.
-            // This isn't hard to work-around on the JS side, but it's easier to just
-            // use the prompt bridge instead.
-            return;            
-        } else if (SDK_INT < Build.VERSION_CODES.HONEYCOMB && Build.MANUFACTURER.equals("unknown")) {
-            // addJavascriptInterface crashes on the 2.3 emulator.
-            Log.i(TAG, "Disabled addJavascriptInterface() bridge callback due to a bug on the 2.3 emulator");
-            return;
-        }
-        this.addJavascriptInterface(exposedJsApi, "_cordovaNative");
-    }
-
-    /**
-     * Set the WebViewClient.
-     *
-     * @param client
-     */
-    public void setWebViewClient(CordovaWebViewClient client) {
-        this.viewClient = client;
-        super.setWebViewClient(client);
-    }
-
-    /**
-     * Set the WebChromeClient.
-     *
-     * @param client
-     */
-    public void setWebChromeClient(CordovaChromeClient client) {
-        this.chromeClient = client;
-        super.setWebChromeClient(client);
-    }
-    
-    public CordovaChromeClient getWebChromeClient() {
-        return this.chromeClient;
-    }
-
-    /**
-     * Load the url into the webview.
-     *
-     * @param url
-     */
-    @Override
-    public void loadUrl(String url) {
-        if (url.equals("about:blank") || url.startsWith("javascript:")) {
-            this.loadUrlNow(url);
-        }
-        else {
-
-            String initUrl = this.getProperty("url", null);
-
-            // If first page of app, then set URL to load to be the one passed in
-            if (initUrl == null) {
-                this.loadUrlIntoView(url);
-            }
-            // Otherwise use the URL specified in the activity's extras bundle
-            else {
-                this.loadUrlIntoView(initUrl);
-            }
-        }
-    }
-
-    /**
-     * Load the url into the webview after waiting for period of time.
-     * This is used to display the splashscreen for certain amount of time.
-     *
-     * @param url
-     * @param time              The number of ms to wait before loading webview
-     */
-    public void loadUrl(final String url, int time) {
-        String initUrl = this.getProperty("url", null);
-
-        // If first page of app, then set URL to load to be the one passed in
-        if (initUrl == null) {
-            this.loadUrlIntoView(url, time);
-        }
-        // Otherwise use the URL specified in the activity's extras bundle
-        else {
-            this.loadUrlIntoView(initUrl);
-        }
-    }
-
-    /**
-     * Load the url into the webview.
-     *
-     * @param url
-     */
-    public void loadUrlIntoView(final String url) {
-        LOG.d(TAG, ">>> loadUrl(" + url + ")");
-
-        this.url = url;
-        this.pluginManager.init();
-
-
-        // Create a timeout timer for loadUrl
-        final CordovaWebView me = this;
-        final int currentLoadUrlTimeout = me.loadUrlTimeout;
-        final int loadUrlTimeoutValue = Integer.parseInt(this.getProperty("loadUrlTimeoutValue", "20000"));
-
-        // Timeout error method
-        final Runnable loadError = new Runnable() {
-            public void run() {
-                me.stopLoading();
-                LOG.e(TAG, "CordovaWebView: TIMEOUT ERROR!");
-                if (viewClient != null) {
-                    viewClient.onReceivedError(me, -6, "The connection to the server was unsuccessful.", url);
-                }
-            }
-        };
-
-        // Timeout timer method
-        final Runnable timeoutCheck = new Runnable() {
-            public void run() {
-                try {
-                    synchronized (this) {
-                        wait(loadUrlTimeoutValue);
-                    }
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-
-                // If timeout, then stop loading and handle error
-                if (me.loadUrlTimeout == currentLoadUrlTimeout) {
-                    me.cordova.getActivity().runOnUiThread(loadError);
-                }
-            }
-        };
-
-        // Load url
-        this.cordova.getActivity().runOnUiThread(new Runnable() {
-            public void run() {
-                Thread thread = new Thread(timeoutCheck);
-                thread.start();
-                me.loadUrlNow(url);
-            }
-        });
-    }
-
-    /**
-     * Load URL in webview.
-     *
-     * @param url
-     */
-    void loadUrlNow(String url) {
-        if (LOG.isLoggable(LOG.DEBUG) && !url.startsWith("javascript:")) {
-            LOG.d(TAG, ">>> loadUrlNow()");
-        }
-        if (url.startsWith("file://") || url.startsWith("javascript:") || Config.isUrlWhiteListed(url)) {
-            super.loadUrl(url);
-        }
-    }
-
-    /**
-     * Load the url into the webview after waiting for period of time.
-     * This is used to display the splashscreen for certain amount of time.
-     *
-     * @param url
-     * @param time              The number of ms to wait before loading webview
-     */
-    public void loadUrlIntoView(final String url, final int time) {
-
-        // If not first page of app, then load immediately
-        // Add support for browser history if we use it.
-        if ((url.startsWith("javascript:")) || this.canGoBack()) {
-        }
-
-        // If first page, then show splashscreen
-        else {
-
-            LOG.d(TAG, "DroidGap.loadUrl(%s, %d)", url, time);
-
-            // Send message to show splashscreen now if desired
-            this.postMessage("splashscreen", "show");
-        }
-
-        // Load url
-        this.loadUrlIntoView(url);
-    }
-    
-    /**
-     * Send JavaScript statement back to JavaScript.
-     * (This is a convenience method)
-     *
-     * @param message
-     */
-    public void sendJavascript(String statement) {
-        this.jsMessageQueue.addJavaScript(statement);
-    }
-
-    /**
-     * Send a plugin result back to JavaScript.
-     * (This is a convenience method)
-     *
-     * @param message
-     */
-    public void sendPluginResult(PluginResult result, String callbackId) {
-        this.jsMessageQueue.addPluginResult(result, callbackId);
-    }
-
-    /**
-     * Send a message to all plugins.
-     *
-     * @param id            The message id
-     * @param data          The message data
-     */
-    public void postMessage(String id, Object data) {
-        if (this.pluginManager != null) {
-            this.pluginManager.postMessage(id, data);
-        }
-    }
-
-
-    /**
-     * Go to previous page in history.  (We manage our own history)
-     *
-     * @return true if we went back, false if we are already at top
-     */
-    public boolean backHistory() {
-
-        // Check webview first to see if there is a history
-        // This is needed to support curPage#diffLink, since they are added to appView's history, but not our history url array (JQMobile behavior)
-        if (super.canGoBack()) {
-            printBackForwardList();
-            super.goBack();
-            
-            return true;
-        }
-        return false;
-    }
-
-
-    /**
-     * Load the specified URL in the Cordova webview or a new browser instance.
-     *
-     * NOTE: If openExternal is false, only URLs listed in whitelist can be loaded.
-     *
-     * @param url           The url to load.
-     * @param openExternal  Load url in browser instead of Cordova webview.
-     * @param clearHistory  Clear the history stack, so new page becomes top of history
-     * @param params        DroidGap parameters for new app
-     */
-    public void showWebPage(String url, boolean openExternal, boolean clearHistory, HashMap<String, Object> params) {
-        LOG.d(TAG, "showWebPage(%s, %b, %b, HashMap", url, openExternal, clearHistory);
-
-        // If clearing history
-        if (clearHistory) {
-            this.clearHistory();
-        }
-
-        // If loading into our webview
-        if (!openExternal) {
-
-            // Make sure url is in whitelist
-            if (url.startsWith("file://") || Config.isUrlWhiteListed(url)) {
-                // TODO: What about params?
-                // Load new URL
-                this.loadUrl(url);
-            }
-            // Load in default viewer if not
-            else {
-                LOG.w(TAG, "showWebPage: Cannot load URL into webview since it is not in white list.  Loading into browser instead. (URL=" + url + ")");
-                try {
-                    Intent intent = new Intent(Intent.ACTION_VIEW);
-                    intent.setData(Uri.parse(url));
-                    cordova.getActivity().startActivity(intent);
-                } catch (android.content.ActivityNotFoundException e) {
-                    LOG.e(TAG, "Error loading url " + url, e);
-                }
-            }
-        }
-
-        // Load in default view intent
-        else {
-            try {
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setData(Uri.parse(url));
-                cordova.getActivity().startActivity(intent);
-            } catch (android.content.ActivityNotFoundException e) {
-                LOG.e(TAG, "Error loading url " + url, e);
-            }
-        }
-    }
-
-    /**
-     * Check configuration parameters from Config.
-     * Approved list of URLs that can be loaded into DroidGap
-     *      <access origin="http://server regexp" subdomains="true" />
-     * Log level: ERROR, WARN, INFO, DEBUG, VERBOSE (default=ERROR)
-     *      <log level="DEBUG" />
-     */
-    private void loadConfiguration() {
- 
-        if ("true".equals(this.getProperty("fullscreen", "false"))) {
-            this.cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
-            this.cordova.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
-        }
-    }
-
-    /**
-     * Get string property for activity.
-     *
-     * @param name
-     * @param defaultValue
-     * @return
-     */
-    public String getProperty(String name, String defaultValue) {
-        Bundle bundle = this.cordova.getActivity().getIntent().getExtras();
-        if (bundle == null) {
-            return defaultValue;
-        }
-        Object p = bundle.get(name);
-        if (p == null) {
-            return defaultValue;
-        }
-        return p.toString();
-    }
-
-    /*
-     * onKeyDown
-     */
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event)
-    {
-        if(keyDownCodes.contains(keyCode))
-        {
-            if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
-                    // only override default behavior is event bound
-                    LOG.d(TAG, "Down Key Hit");
-                    this.loadUrl("javascript:cordova.fireDocumentEvent('volumedownbutton');");
-                    return true;
-            }
-            // If volumeup key
-            else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
-                    LOG.d(TAG, "Up Key Hit");
-                    this.loadUrl("javascript:cordova.fireDocumentEvent('volumeupbutton');");
-                    return true;
-            }
-            else
-            {
-                return super.onKeyDown(keyCode, event);
-            }
-        }
-        else if(keyCode == KeyEvent.KEYCODE_BACK)
-        {
-            return !(this.startOfHistory()) || this.bound;
-        }
-        else if(keyCode == KeyEvent.KEYCODE_MENU)
-        {
-            //How did we get here?  Is there a childView?
-            View childView = this.getFocusedChild();
-            if(childView != null)
-            {
-                //Make sure we close the keyboard if it's present
-                InputMethodManager imm = (InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
-                imm.hideSoftInputFromWindow(childView.getWindowToken(), 0);
-                cordova.getActivity().openOptionsMenu();
-                return true;
-            } else {
-                return super.onKeyDown(keyCode, event);
-            }
-        }
-        
-        return super.onKeyDown(keyCode, event);
-    }
-    
-
-    @Override
-    public boolean onKeyUp(int keyCode, KeyEvent event)
-    {
-        // If back key
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            // A custom view is currently displayed  (e.g. playing a video)
-            if(mCustomView != null) {
-                this.hideCustomView();
-            } else {
-                // The webview is currently displayed
-                // If back key is bound, then send event to JavaScript
-                if (this.bound) {
-                    this.loadUrl("javascript:cordova.fireDocumentEvent('backbutton');");
-                    return true;
-                } else {
-                    // If not bound
-                    // Go to previous page in webview if it is possible to go back
-                    if (this.backHistory()) {
-                        return true;
-                    }
-                    // If not, then invoke default behaviour
-                    else {
-                        //this.activityState = ACTIVITY_EXITING;
-                    	//return false;
-                    	// If they hit back button when app is initializing, app should exit instead of hang until initilazation (CB2-458)
-                    	this.cordova.getActivity().finish();
-                    }
-                }
-            }
-        }
-        // Legacy
-        else if (keyCode == KeyEvent.KEYCODE_MENU) {
-            if (this.lastMenuEventTime < event.getEventTime()) {
-                this.loadUrl("javascript:cordova.fireDocumentEvent('menubutton');");
-            }
-            this.lastMenuEventTime = event.getEventTime();
-            return super.onKeyUp(keyCode, event);
-        }
-        // If search key
-        else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
-            this.loadUrl("javascript:cordova.fireDocumentEvent('searchbutton');");
-            return true;
-        }
-        else if(keyUpCodes.contains(keyCode))
-        {
-            //What the hell should this do?
-            return super.onKeyUp(keyCode, event);
-        }
-
-        //Does webkit change this behavior?
-        return super.onKeyUp(keyCode, event);
-    }
-
-    
-    public void bindButton(boolean override)
-    {
-        this.bound = override;
-    }
-
-    public void bindButton(String button, boolean override) {
-        // TODO Auto-generated method stub
-        if (button.compareTo("volumeup")==0) {
-          keyDownCodes.add(KeyEvent.KEYCODE_VOLUME_UP);
-        }
-        else if (button.compareTo("volumedown")==0) {
-          keyDownCodes.add(KeyEvent.KEYCODE_VOLUME_DOWN);
-        }
-      }
-
-    public void bindButton(int keyCode, boolean keyDown, boolean override) {
-       if(keyDown)
-       {
-           keyDownCodes.add(keyCode);
-       }
-       else
-       {
-           keyUpCodes.add(keyCode);
-       }
-    }
-
-    public boolean isBackButtonBound()
-    {
-        return this.bound;
-    }
-    
-    public void handlePause(boolean keepRunning)
-    {
-        LOG.d(TAG, "Handle the pause");
-        // Send pause event to JavaScript
-        this.loadUrl("javascript:try{cordova.fireDocumentEvent('pause');}catch(e){console.log('exception firing pause event from native');};");
-
-        // Forward to plugins
-        if (this.pluginManager != null) {
-            this.pluginManager.onPause(keepRunning);
-        }
-
-        // If app doesn't want to run in background
-        if (!keepRunning) {
-            // Pause JavaScript timers (including setInterval)
-            this.pauseTimers();
-        }
-        paused = true;
-   
-    }
-    
-    public void handleResume(boolean keepRunning, boolean activityResultKeepRunning)
-    {
-
-        this.loadUrl("javascript:try{cordova.fireDocumentEvent('resume');}catch(e){console.log('exception firing resume event from native');};");
-        
-        // Forward to plugins
-        if (this.pluginManager != null) {
-            this.pluginManager.onResume(keepRunning);
-        }
-
-        // Resume JavaScript timers (including setInterval)
-        this.resumeTimers();
-        paused = false;
-    }
-    
-    public void handleDestroy()
-    {
-        // Send destroy event to JavaScript
-    	// Since baseUrl is set in loadUrlIntoView, if user hit Back button before loadUrl was called, we'll get an NPE on baseUrl (CB-2458)
-        this.loadUrlIntoView("javascript:try{cordova.require('cordova/channel').onDestroy.fire();}catch(e){console.log('exception firing destroy event from native');};");
-
-        // Load blank page so that JavaScript onunload is called
-        this.loadUrl("about:blank");
-
-        // Forward to plugins
-        if (this.pluginManager != null) {
-            this.pluginManager.onDestroy();
-        }
-        
-        // unregister the receiver
-        if (this.receiver != null) {
-            try {
-                this.cordova.getActivity().unregisterReceiver(this.receiver);
-            } catch (Exception e) {
-                Log.e(TAG, "Error unregistering configuration receiver: " + e.getMessage(), e);
-            }
-        }
-    }
-    
-    public void onNewIntent(Intent intent)
-    {
-        //Forward to plugins
-        if (this.pluginManager != null) {
-            this.pluginManager.onNewIntent(intent);
-        }
-    }
-    
-    public boolean isPaused()
-    {
-        return paused;
-    }
-
-    public boolean hadKeyEvent() {
-        return handleButton;
-    }
-
-    // Wrapping these functions in their own class prevents warnings in adb like:
-    // VFY: unable to resolve virtual method 285: Landroid/webkit/WebSettings;.setAllowUniversalAccessFromFileURLs
-    @TargetApi(16)
-    private static class Level16Apis {
-        static void enableUniversalAccess(WebSettings settings) {
-            settings.setAllowUniversalAccessFromFileURLs(true);
-        }
-    }
-    
-    public void printBackForwardList() {
-        WebBackForwardList currentList = this.copyBackForwardList();
-        int currentSize = currentList.getSize();
-        for(int i = 0; i < currentSize; ++i)
-        {
-            WebHistoryItem item = currentList.getItemAtIndex(i);
-            String url = item.getUrl();
-            LOG.d(TAG, "The URL at index: " + Integer.toString(i) + "is " + url );
-        }
-    }
-    
-    
-    //Can Go Back is BROKEN!
-    public boolean startOfHistory()
-    {
-        WebBackForwardList currentList = this.copyBackForwardList();
-        WebHistoryItem item = currentList.getItemAtIndex(0);
-        if( item!=null){	// Null-fence in case they haven't called loadUrl yet (CB-2458)
-	        String url = item.getUrl();
-	        String currentUrl = this.getUrl();
-	        LOG.d(TAG, "The current URL is: " + currentUrl);
-	        LOG.d(TAG, "The URL at item 0 is:" + url);
-	        return currentUrl.equals(url);
-        }
-        return false;
-    }
-
-    public void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {
-        // This code is adapted from the original Android Browser code, licensed under the Apache License, Version 2.0
-        Log.d(TAG, "showing Custom View");
-        // if a view already exists then immediately terminate the new one
-        if (mCustomView != null) {
-            callback.onCustomViewHidden();
-            return;
-        }
-        
-        // Store the view and its callback for later (to kill it properly)
-        mCustomView = view;
-        mCustomViewCallback = callback;
-        
-        // Add the custom view to its container.
-        ViewGroup parent = (ViewGroup) this.getParent();
-        parent.addView(view, COVER_SCREEN_GRAVITY_CENTER);
-        
-        // Hide the content view.
-        this.setVisibility(View.GONE);
-        
-        // Finally show the custom view container.
-        parent.setVisibility(View.VISIBLE);
-        parent.bringToFront();
-    }
-
-    public void hideCustomView() {
-        // This code is adapted from the original Android Browser code, licensed under the Apache License, Version 2.0
-        Log.d(TAG, "Hidding Custom View");
-        if (mCustomView == null) return;
-
-        // Hide the custom view.
-        mCustomView.setVisibility(View.GONE);
-        
-        // Remove the custom view from its container.
-        ViewGroup parent = (ViewGroup) this.getParent();
-        parent.removeView(mCustomView);
-        mCustomView = null;
-        mCustomViewCallback.onCustomViewHidden();
-        
-        // Show the content view.
-        this.setVisibility(View.VISIBLE);
-    }
-    
-    /**
-     * if the video overlay is showing then we need to know 
-     * as it effects back button handling
-     * 
-     * @return
-     */
-    public boolean isCustomViewShowing() {
-        return mCustomView != null;
-    }
-    
-    public WebBackForwardList restoreState(Bundle savedInstanceState)
-    {
-        WebBackForwardList myList = super.restoreState(savedInstanceState);
-        Log.d(TAG, "WebView restoration crew now restoring!");
-        //Initialize the plugin manager once more
-        this.pluginManager.init();
-        return myList;
-    }
-
-    public void storeResult(int requestCode, int resultCode, Intent intent) {
-        mResult = new ActivityResult(requestCode, resultCode, intent);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebViewClient.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebViewClient.java b/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebViewClient.java
deleted file mode 100755
index 4b00615..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/CordovaWebViewClient.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
-       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;
-
-import java.io.ByteArrayInputStream;
-import java.util.Hashtable;
-
-import org.apache.cordova.api.CordovaInterface;
-
-import org.apache.cordova.api.LOG;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.annotation.TargetApi;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.net.http.SslError;
-import android.util.Log;
-import android.view.View;
-import android.webkit.HttpAuthHandler;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebResourceResponse;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-/**
- * This class is the WebViewClient that implements callbacks for our web view.
- */
-public class CordovaWebViewClient extends WebViewClient {
-
-	private static final String TAG = "Cordova";
-	private static final String CORDOVA_EXEC_URL_PREFIX = "http://cdv_exec/";
-    CordovaInterface cordova;
-    CordovaWebView appView;
-    private boolean doClearHistory = false;
-
-    /** The authorization tokens. */
-    private Hashtable<String, AuthenticationToken> authenticationTokens = new Hashtable<String, AuthenticationToken>();
-
-    /**
-     * Constructor.
-     *
-     * @param cordova
-     */
-    public CordovaWebViewClient(CordovaInterface cordova) {
-        this.cordova = cordova;
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param cordova
-     * @param view
-     */
-    public CordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
-        this.cordova = cordova;
-        this.appView = view;
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param view
-     */
-    public void setWebView(CordovaWebView view) {
-        this.appView = view;
-    }
-
-
-    // Parses commands sent by setting the webView's URL to:
-    // cdvbrg:service/action/callbackId#jsonArgs
-	private void handleExecUrl(String url) {
-		int idx1 = CORDOVA_EXEC_URL_PREFIX.length();
-		int idx2 = url.indexOf('#', idx1 + 1);
-		int idx3 = url.indexOf('#', idx2 + 1);
-		int idx4 = url.indexOf('#', idx3 + 1);
-		if (idx1 == -1 || idx2 == -1 || idx3 == -1 || idx4 == -1) {
-			Log.e(TAG, "Could not decode URL command: " + url);
-			return;
-		}
-		String service    = url.substring(idx1, idx2);
-		String action     = url.substring(idx2 + 1, idx3);
-		String callbackId = url.substring(idx3 + 1, idx4);
-		String jsonArgs   = url.substring(idx4 + 1);
-        appView.pluginManager.exec(service, action, callbackId, jsonArgs);
-	}
-
-    /**
-     * Give the host application a chance to take over the control when a new url
-     * is about to be loaded in the current WebView.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param url           The url to be loaded.
-     * @return              true to override, false for default behavior
-     */
-	@Override
-    public boolean shouldOverrideUrlLoading(WebView view, String url) {
-    	// Check if it's an exec() bridge command message.
-    	if (NativeToJsMessageQueue.ENABLE_LOCATION_CHANGE_EXEC_MODE && url.startsWith(CORDOVA_EXEC_URL_PREFIX)) {
-    		handleExecUrl(url);
-    	}
-
-        // Give plugins the chance to handle the url
-    	else if ((this.appView.pluginManager != null) && this.appView.pluginManager.onOverrideUrlLoading(url)) {
-        }
-
-        // If dialing phone (tel:5551212)
-        else if (url.startsWith(WebView.SCHEME_TEL)) {
-            try {
-                Intent intent = new Intent(Intent.ACTION_DIAL);
-                intent.setData(Uri.parse(url));
-                this.cordova.getActivity().startActivity(intent);
-            } catch (android.content.ActivityNotFoundException e) {
-                LOG.e(TAG, "Error dialing " + url + ": " + e.toString());
-            }
-        }
-
-        // If displaying map (geo:0,0?q=address)
-        else if (url.startsWith("geo:")) {
-            try {
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setData(Uri.parse(url));
-                this.cordova.getActivity().startActivity(intent);
-            } catch (android.content.ActivityNotFoundException e) {
-                LOG.e(TAG, "Error showing map " + url + ": " + e.toString());
-            }
-        }
-
-        // If sending email (mailto:abc@corp.com)
-        else if (url.startsWith(WebView.SCHEME_MAILTO)) {
-            try {
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setData(Uri.parse(url));
-                this.cordova.getActivity().startActivity(intent);
-            } catch (android.content.ActivityNotFoundException e) {
-                LOG.e(TAG, "Error sending email " + url + ": " + e.toString());
-            }
-        }
-
-        // If sms:5551212?body=This is the message
-        else if (url.startsWith("sms:")) {
-            try {
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-
-                // Get address
-                String address = null;
-                int parmIndex = url.indexOf('?');
-                if (parmIndex == -1) {
-                    address = url.substring(4);
-                }
-                else {
-                    address = url.substring(4, parmIndex);
-
-                    // If body, then set sms body
-                    Uri uri = Uri.parse(url);
-                    String query = uri.getQuery();
-                    if (query != null) {
-                        if (query.startsWith("body=")) {
-                            intent.putExtra("sms_body", query.substring(5));
-                        }
-                    }
-                }
-                intent.setData(Uri.parse("sms:" + address));
-                intent.putExtra("address", address);
-                intent.setType("vnd.android-dir/mms-sms");
-                this.cordova.getActivity().startActivity(intent);
-            } catch (android.content.ActivityNotFoundException e) {
-                LOG.e(TAG, "Error sending sms " + url + ":" + e.toString());
-            }
-        }
-
-        // All else
-        else {
-
-            // If our app or file:, then load into a new Cordova webview container by starting a new instance of our activity.
-            // Our app continues to run.  When BACK is pressed, our app is redisplayed.
-            if (url.startsWith("file://") || url.startsWith("data:")  || Config.isUrlWhiteListed(url)) {
-                return false;
-            }
-
-            // If not our application, let default viewer handle
-            else {
-                try {
-                    Intent intent = new Intent(Intent.ACTION_VIEW);
-                    intent.setData(Uri.parse(url));
-                    this.cordova.getActivity().startActivity(intent);
-                } catch (android.content.ActivityNotFoundException e) {
-                    LOG.e(TAG, "Error loading url " + url, e);
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Check for intercepting any requests for resources.
-     * This includes images and scripts and so on, not just top-level pages.
-     * @param view          The WebView.
-     * @param url           The URL to be loaded.
-     * @return              Either null to proceed as normal, or a WebResourceResponse.
-     */
-    @Override
-    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
-      //If something isn't whitelisted, just send a blank response
-        if(!Config.isUrlWhiteListed(url) && (url.startsWith("http://") || url.startsWith("https://")))
-        {
-            return getWhitelistResponse();
-        }
-    	if (this.appView.pluginManager != null) {
-            return this.appView.pluginManager.shouldInterceptRequest(url);
-        }
-        return null;
-    }
-    
-    private WebResourceResponse getWhitelistResponse()
-    {
-        WebResourceResponse emptyResponse;
-        String empty = "";
-        ByteArrayInputStream data = new ByteArrayInputStream(empty.getBytes());
-        return new WebResourceResponse("text/plain", "UTF-8", data);
-    }
-
-    /**
-     * On received http auth request.
-     * The method reacts on all registered authentication tokens. There is one and only one authentication token for any host + realm combination
-     *
-     * @param view
-     * @param handler
-     * @param host
-     * @param realm
-     */
-    @Override
-    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
-
-        // Get the authentication token
-        AuthenticationToken token = this.getAuthenticationToken(host, realm);
-        if (token != null) {
-            handler.proceed(token.getUserName(), token.getPassword());
-        }
-        else {
-            // Handle 401 like we'd normally do!
-            super.onReceivedHttpAuthRequest(view, handler, host, realm);
-        }
-    }
-
-    /**
-     * Notify the host application that a page has started loading.
-     * This method is called once for each main frame load so a page with iframes or framesets will call onPageStarted
-     * one time for the main frame. This also means that onPageStarted will not be called when the contents of an
-     * embedded frame changes, i.e. clicking a link whose target is an iframe.
-     *
-     * @param view          The webview initiating the callback.
-     * @param url           The url of the page.
-     */
-    @Override
-    public void onPageStarted(WebView view, String url, Bitmap favicon) {
-
-        // Flush stale messages.
-        this.appView.jsMessageQueue.reset();
-
-        // Broadcast message that page has loaded
-        this.appView.postMessage("onPageStarted", url);
-
-        // Notify all plugins of the navigation, so they can clean up if necessary.
-        if (this.appView.pluginManager != null) {
-            this.appView.pluginManager.onReset();
-        }
-    }
-
-    /**
-     * 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.
-     *
-     *
-     * @param view          The webview initiating the callback.
-     * @param url           The url of the page.
-     */
-    @Override
-    public void onPageFinished(WebView view, String url) {
-        super.onPageFinished(view, url);
-        LOG.d(TAG, "onPageFinished(" + url + ")");
-
-        /**
-         * Because of a timing issue we need to clear this history in onPageFinished as well as
-         * onPageStarted. However we only want to do this if the doClearHistory boolean is set to
-         * true. You see when you load a url with a # in it which is common in jQuery applications
-         * onPageStared is not called. Clearing the history at that point would break jQuery apps.
-         */
-        if (this.doClearHistory) {
-            view.clearHistory();
-            this.doClearHistory = false;
-        }
-
-        // Clear timeout flag
-        this.appView.loadUrlTimeout++;
-
-        // Broadcast message that page has loaded
-        this.appView.postMessage("onPageFinished", url);
-
-        // Make app visible after 2 sec in case there was a JS error and Cordova JS never initialized correctly
-        if (this.appView.getVisibility() == View.INVISIBLE) {
-            Thread t = new Thread(new Runnable() {
-                public void run() {
-                    try {
-                        Thread.sleep(2000);
-                        cordova.getActivity().runOnUiThread(new Runnable() {
-                            public void run() {
-                                appView.postMessage("spinner", "stop");
-                            }
-                        });
-                    } catch (InterruptedException e) {
-                    }
-                }
-            });
-            t.start();
-        }
-
-        // Shutdown if blank loaded
-        if (url.equals("about:blank")) {
-            appView.postMessage("exit", null);
-        }
-    }
-
-    /**
-     * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable).
-     * The errorCode parameter corresponds to one of the ERROR_* constants.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param errorCode     The error code corresponding to an ERROR_* value.
-     * @param description   A String describing the error.
-     * @param failingUrl    The url that failed to load.
-     */
-    @Override
-    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
-        LOG.d(TAG, "CordovaWebViewClient.onReceivedError: Error code=%s Description=%s URL=%s", errorCode, description, failingUrl);
-
-        // Clear timeout flag
-        this.appView.loadUrlTimeout++;
-
-        // Handle error
-        JSONObject data = new JSONObject();
-        try {
-            data.put("errorCode", errorCode);
-            data.put("description", description);
-            data.put("url", failingUrl);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
-        this.appView.postMessage("onReceivedError", data);
-    }
-
-    /**
-     * Notify the host application that an SSL error occurred while loading a resource.
-     * The host application must call either handler.cancel() or handler.proceed().
-     * Note that the decision may be retained for use in response to future SSL errors.
-     * The default behavior is to cancel the load.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param handler       An SslErrorHandler object that will handle the user's response.
-     * @param error         The SSL error object.
-     */
-    @TargetApi(8)
-    @Override
-    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-
-        final String packageName = this.cordova.getActivity().getPackageName();
-        final PackageManager pm = this.cordova.getActivity().getPackageManager();
-
-        ApplicationInfo appInfo;
-        try {
-            appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
-            if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
-                // debug = true
-                handler.proceed();
-                return;
-            } else {
-                // debug = false
-                super.onReceivedSslError(view, handler, error);
-            }
-        } catch (NameNotFoundException e) {
-            // When it doubt, lock it out!
-            super.onReceivedSslError(view, handler, error);
-        }
-    }
-
-
-    /**
-     * Sets the authentication token.
-     *
-     * @param authenticationToken
-     * @param host
-     * @param realm
-     */
-    public void setAuthenticationToken(AuthenticationToken authenticationToken, String host, String realm) {
-        if (host == null) {
-            host = "";
-        }
-        if (realm == null) {
-            realm = "";
-        }
-        this.authenticationTokens.put(host.concat(realm), authenticationToken);
-    }
-
-    /**
-     * Removes the authentication token.
-     *
-     * @param host
-     * @param realm
-     *
-     * @return the authentication token or null if did not exist
-     */
-    public AuthenticationToken removeAuthenticationToken(String host, String realm) {
-        return this.authenticationTokens.remove(host.concat(realm));
-    }
-
-    /**
-     * Gets the authentication token.
-     *
-     * In order it tries:
-     * 1- host + realm
-     * 2- host
-     * 3- realm
-     * 4- no host, no realm
-     *
-     * @param host
-     * @param realm
-     *
-     * @return the authentication token
-     */
-    public AuthenticationToken getAuthenticationToken(String host, String realm) {
-        AuthenticationToken token = null;
-        token = this.authenticationTokens.get(host.concat(realm));
-
-        if (token == null) {
-            // try with just the host
-            token = this.authenticationTokens.get(host);
-
-            // Try the realm
-            if (token == null) {
-                token = this.authenticationTokens.get(realm);
-            }
-
-            // if no host found, just query for default
-            if (token == null) {
-                token = this.authenticationTokens.get("");
-            }
-        }
-
-        return token;
-    }
-
-    /**
-     * Clear all authentication tokens.
-     */
-    public void clearAuthenticationTokens() {
-        this.authenticationTokens.clear();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/Device.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/Device.java b/lib/cordova-android/framework/src/org/apache/cordova/Device.java
deleted file mode 100644
index ff7d118..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/Device.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
-       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;
-
-import java.util.TimeZone;
-
-import org.apache.cordova.api.CallbackContext;
-import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.LOG;
-import org.apache.cordova.api.CordovaInterface;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-
-public class Device extends CordovaPlugin {
-    public static final String TAG = "Device";
-
-    public static String cordovaVersion = "2.8.0rc1";              // Cordova version
-    public static String platform = "Android";                  // Device OS
-    public static String uuid;                                  // Device UUID
-
-    BroadcastReceiver telephonyReceiver = null;
-
-    /**
-     * Constructor.
-     */
-    public Device() {
-    }
-
-    /**
-     * Sets the context of the Command. This can then be used to do things like
-     * get file paths associated with the Activity.
-     *
-     * @param cordova The context of the main Activity.
-     * @param webView The CordovaWebView Cordova is running in.
-     */
-    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-        super.initialize(cordova, webView);
-        Device.uuid = getUuid();
-        this.initTelephonyReceiver();
-    }
-
-    /**
-     * Executes the request and returns PluginResult.
-     *
-     * @param action            The action to execute.
-     * @param args              JSONArry of arguments for the plugin.
-     * @param callbackContext   The callback id used when calling back into JavaScript.
-     * @return                  True if the action was valid, false if not.
-     */
-    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
-        if (action.equals("getDeviceInfo")) {
-            JSONObject r = new JSONObject();
-            r.put("uuid", Device.uuid);
-            r.put("version", this.getOSVersion());
-            r.put("platform", Device.platform);
-            r.put("cordova", Device.cordovaVersion);
-            r.put("model", this.getModel());
-            callbackContext.success(r);
-        }
-        else {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Unregister receiver.
-     */
-    public void onDestroy() {
-        this.cordova.getActivity().unregisterReceiver(this.telephonyReceiver);
-    }
-
-    //--------------------------------------------------------------------------
-    // LOCAL METHODS
-    //--------------------------------------------------------------------------
-
-    /**
-     * Listen for telephony events: RINGING, OFFHOOK and IDLE
-     * Send these events to all plugins using
-     *      DroidGap.onMessage("telephone", "ringing" | "offhook" | "idle")
-     */
-    private void initTelephonyReceiver() {
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
-        //final CordovaInterface mycordova = this.cordova;
-        this.telephonyReceiver = new BroadcastReceiver() {
-
-            @Override
-            public void onReceive(Context context, Intent intent) {
-
-                // If state has changed
-                if ((intent != null) && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
-                    if (intent.hasExtra(TelephonyManager.EXTRA_STATE)) {
-                        String extraData = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
-                        if (extraData.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
-                            LOG.i(TAG, "Telephone RINGING");
-                            webView.postMessage("telephone", "ringing");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
-                            LOG.i(TAG, "Telephone OFFHOOK");
-                            webView.postMessage("telephone", "offhook");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
-                            LOG.i(TAG, "Telephone IDLE");
-                            webView.postMessage("telephone", "idle");
-                        }
-                    }
-                }
-            }
-        };
-
-        // Register the receiver
-        this.cordova.getActivity().registerReceiver(this.telephonyReceiver, intentFilter);
-    }
-
-    /**
-     * Get the OS name.
-     *
-     * @return
-     */
-    public String getPlatform() {
-        return Device.platform;
-    }
-
-    /**
-     * Get the device's Universally Unique Identifier (UUID).
-     *
-     * @return
-     */
-    public String getUuid() {
-        String uuid = Settings.Secure.getString(this.cordova.getActivity().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
-        return uuid;
-    }
-
-    /**
-     * Get the Cordova version.
-     *
-     * @return
-     */
-    public String getCordovaVersion() {
-        return Device.cordovaVersion;
-    }
-
-    public String getModel() {
-        String model = android.os.Build.MODEL;
-        return model;
-    }
-
-    public String getProductName() {
-        String productname = android.os.Build.PRODUCT;
-        return productname;
-    }
-
-    /**
-     * Get the OS version.
-     *
-     * @return
-     */
-    public String getOSVersion() {
-        String osversion = android.os.Build.VERSION.RELEASE;
-        return osversion;
-    }
-
-    public String getSDKVersion() {
-        @SuppressWarnings("deprecation")
-        String sdkversion = android.os.Build.VERSION.SDK;
-        return sdkversion;
-    }
-
-    public String getTimeZoneID() {
-        TimeZone tz = TimeZone.getDefault();
-        return (tz.getID());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/DirectoryManager.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/DirectoryManager.java b/lib/cordova-android/framework/src/org/apache/cordova/DirectoryManager.java
deleted file mode 100644
index 292f402..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/DirectoryManager.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-       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;
-
-import java.io.File;
-
-import android.content.Context;
-import android.os.Environment;
-import android.os.StatFs;
-
-/**
- * This class provides file directory utilities.
- * All file operations are performed on the SD card.
- *
- * It is used by the FileUtils class.
- */
-public class DirectoryManager {
-
-    @SuppressWarnings("unused")
-    private static final String LOG_TAG = "DirectoryManager";
-
-    /**
-     * Determine if a file or directory exists.
-     * @param name				The name of the file to check.
-     * @return					T=exists, F=not found
-     */
-    protected static boolean testFileExists(String name) {
-        boolean status;
-
-        // If SD card exists
-        if ((testSaveLocationExists()) && (!name.equals(""))) {
-            File path = Environment.getExternalStorageDirectory();
-            File newPath = constructFilePaths(path.toString(), name);
-            status = newPath.exists();
-        }
-        // If no SD card
-        else {
-            status = false;
-        }
-        return status;
-    }
-
-    /**
-     * Get the free disk space
-     * 
-     * @return 		Size in KB or -1 if not available
-     */
-    protected static long getFreeDiskSpace(boolean checkInternal) {
-        String status = Environment.getExternalStorageState();
-        long freeSpace = 0;
-
-        // If SD card exists
-        if (status.equals(Environment.MEDIA_MOUNTED)) {
-            freeSpace = freeSpaceCalculation(Environment.getExternalStorageDirectory().getPath());
-        }
-        else if (checkInternal) {
-            freeSpace = freeSpaceCalculation("/");
-        }
-        // If no SD card and we haven't been asked to check the internal directory then return -1
-        else {
-            return -1;
-        }
-
-        return freeSpace;
-    }
-
-    /**
-     * Given a path return the number of free KB
-     * 
-     * @param path to the file system
-     * @return free space in KB
-     */
-    private static long freeSpaceCalculation(String path) {
-        StatFs stat = new StatFs(path);
-        long blockSize = stat.getBlockSize();
-        long availableBlocks = stat.getAvailableBlocks();
-        return availableBlocks * blockSize / 1024;
-    }
-
-    /**
-     * Determine if SD card exists.
-     * 
-     * @return				T=exists, F=not found
-     */
-    protected static boolean testSaveLocationExists() {
-        String sDCardStatus = Environment.getExternalStorageState();
-        boolean status;
-
-        // If SD card is mounted
-        if (sDCardStatus.equals(Environment.MEDIA_MOUNTED)) {
-            status = true;
-        }
-
-        // If no SD card
-        else {
-            status = false;
-        }
-        return status;
-    }
-
-    /**
-     * Create a new file object from two file paths.
-     *
-     * @param file1			Base file path
-     * @param file2			Remaining file path
-     * @return				File object
-     */
-    private static File constructFilePaths (String file1, String file2) {
-        File newPath;
-        if (file2.startsWith(file1)) {
-            newPath = new File(file2);
-        }
-        else {
-            newPath = new File(file1 + "/" + file2);
-        }
-        return newPath;
-    }
-
-    /**
-     * Determine if we can use the SD Card to store the temporary file.  If not then use
-     * the internal cache directory.
-     *
-     * @return the absolute path of where to store the file
-     */
-    protected static String getTempDirectoryPath(Context ctx) {
-        File cache = null;
-
-        // SD Card Mounted
-        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-            cache = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
-                    "/Android/data/" + ctx.getPackageName() + "/cache/");
-        }
-        // Use internal storage
-        else {
-            cache = ctx.getCacheDir();
-        }
-
-        // Create the cache directory if it doesn't exist
-        if (!cache.exists()) {
-            cache.mkdirs();
-        }
-
-        return cache.getAbsolutePath();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/DroidGap.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/DroidGap.java b/lib/cordova-android/framework/src/org/apache/cordova/DroidGap.java
deleted file mode 100644
index fbaf6c4..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/DroidGap.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-       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.
-*/
-
-// We moved everything to CordovaActivity
-
-package org.apache.cordova;
-
-public class DroidGap extends CordovaActivity {
-
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/Echo.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/Echo.java b/lib/cordova-android/framework/src/org/apache/cordova/Echo.java
deleted file mode 100644
index aaebe02..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/Echo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-       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;
-
-import org.apache.cordova.api.CallbackContext;
-import org.apache.cordova.api.CordovaPlugin;
-import org.json.JSONException;
-
-public class Echo extends CordovaPlugin {
-
-    @Override
-    public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {
-        if ("echo".equals(action)) {
-            final String result = args.isNull(0) ? null : args.getString(0);
-            callbackContext.success(result);
-            return true;
-        } else if ("echoAsync".equals(action)) {
-            final String result = args.isNull(0) ? null : args.getString(0);
-            cordova.getThreadPool().execute(new Runnable() {
-                public void run() {
-                    callbackContext.success(result);
-                }
-            });
-            return true;
-        } else if ("echoArrayBuffer".equals(action)) {
-            final byte[] result = args.getArrayBuffer(0);
-            callbackContext.success(result);
-            return true;
-        }
-        return false;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/ExifHelper.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/ExifHelper.java b/lib/cordova-android/framework/src/org/apache/cordova/ExifHelper.java
deleted file mode 100644
index 38ad0a6..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/ExifHelper.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-       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;
-
-import java.io.IOException;
-
-import android.media.ExifInterface;
-
-public class ExifHelper {
-    private String aperture = null;
-    private String datetime = null;
-    private String exposureTime = null;
-    private String flash = null;
-    private String focalLength = null;
-    private String gpsAltitude = null;
-    private String gpsAltitudeRef = null;
-    private String gpsDateStamp = null;
-    private String gpsLatitude = null;
-    private String gpsLatitudeRef = null;
-    private String gpsLongitude = null;
-    private String gpsLongitudeRef = null;
-    private String gpsProcessingMethod = null;
-    private String gpsTimestamp = null;
-    private String iso = null;
-    private String make = null;
-    private String model = null;
-    private String orientation = null;
-    private String whiteBalance = null;
-
-    private ExifInterface inFile = null;
-    private ExifInterface outFile = null;
-
-    /**
-     * The file before it is compressed
-     *
-     * @param filePath
-     * @throws IOException
-     */
-    public void createInFile(String filePath) throws IOException {
-        this.inFile = new ExifInterface(filePath);
-    }
-
-    /**
-     * The file after it has been compressed
-     *
-     * @param filePath
-     * @throws IOException
-     */
-    public void createOutFile(String filePath) throws IOException {
-        this.outFile = new ExifInterface(filePath);
-    }
-
-    /**
-     * Reads all the EXIF data from the input file.
-     */
-    public void readExifData() {
-        this.aperture = inFile.getAttribute(ExifInterface.TAG_APERTURE);
-        this.datetime = inFile.getAttribute(ExifInterface.TAG_DATETIME);
-        this.exposureTime = inFile.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
-        this.flash = inFile.getAttribute(ExifInterface.TAG_FLASH);
-        this.focalLength = inFile.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
-        this.gpsAltitude = inFile.getAttribute(ExifInterface.TAG_GPS_ALTITUDE);
-        this.gpsAltitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF);
-        this.gpsDateStamp = inFile.getAttribute(ExifInterface.TAG_GPS_DATESTAMP);
-        this.gpsLatitude = inFile.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
-        this.gpsLatitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
-        this.gpsLongitude = inFile.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
-        this.gpsLongitudeRef = inFile.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
-        this.gpsProcessingMethod = inFile.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD);
-        this.gpsTimestamp = inFile.getAttribute(ExifInterface.TAG_GPS_TIMESTAMP);
-        this.iso = inFile.getAttribute(ExifInterface.TAG_ISO);
-        this.make = inFile.getAttribute(ExifInterface.TAG_MAKE);
-        this.model = inFile.getAttribute(ExifInterface.TAG_MODEL);
-        this.orientation = inFile.getAttribute(ExifInterface.TAG_ORIENTATION);
-        this.whiteBalance = inFile.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
-    }
-
-    /**
-     * Writes the previously stored EXIF data to the output file.
-     *
-     * @throws IOException
-     */
-    public void writeExifData() throws IOException {
-        // Don't try to write to a null file
-        if (this.outFile == null) {
-            return;
-        }
-
-        if (this.aperture != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_APERTURE, this.aperture);
-        }
-        if (this.datetime != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_DATETIME, this.datetime);
-        }
-        if (this.exposureTime != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_EXPOSURE_TIME, this.exposureTime);
-        }
-        if (this.flash != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_FLASH, this.flash);
-        }
-        if (this.focalLength != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_FOCAL_LENGTH, this.focalLength);
-        }
-        if (this.gpsAltitude != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, this.gpsAltitude);
-        }
-        if (this.gpsAltitudeRef != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF, this.gpsAltitudeRef);
-        }
-        if (this.gpsDateStamp != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, this.gpsDateStamp);
-        }
-        if (this.gpsLatitude != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_LATITUDE, this.gpsLatitude);
-        }
-        if (this.gpsLatitudeRef != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, this.gpsLatitudeRef);
-        }
-        if (this.gpsLongitude != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, this.gpsLongitude);
-        }
-        if (this.gpsLongitudeRef != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, this.gpsLongitudeRef);
-        }
-        if (this.gpsProcessingMethod != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD, this.gpsProcessingMethod);
-        }
-        if (this.gpsTimestamp != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP, this.gpsTimestamp);
-        }
-        if (this.iso != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_ISO, this.iso);
-        }
-        if (this.make != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_MAKE, this.make);
-        }
-        if (this.model != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_MODEL, this.model);
-        }
-        if (this.orientation != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_ORIENTATION, this.orientation);
-        }
-        if (this.whiteBalance != null) {
-            this.outFile.setAttribute(ExifInterface.TAG_WHITE_BALANCE, this.whiteBalance);
-        }
-
-        this.outFile.saveAttributes();
-    }
-
-    public int getOrientation() {
-        int o = Integer.parseInt(this.orientation);
-
-        if (o == ExifInterface.ORIENTATION_NORMAL) {
-            return 0;
-        } else if (o == ExifInterface.ORIENTATION_ROTATE_90) {
-            return 90;
-        } else if (o == ExifInterface.ORIENTATION_ROTATE_180) {
-            return 180;
-        } else if (o == ExifInterface.ORIENTATION_ROTATE_270) {
-            return 270;
-        } else {
-            return 0;
-        }
-    }
-
-    public void resetOrientation() {
-        this.orientation = "" + ExifInterface.ORIENTATION_NORMAL;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/ExposedJsApi.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/ExposedJsApi.java b/lib/cordova-android/framework/src/org/apache/cordova/ExposedJsApi.java
deleted file mode 100755
index 7702d35..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/ExposedJsApi.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-       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;
-
-import android.webkit.JavascriptInterface;
-import org.apache.cordova.api.PluginManager;
-import org.apache.cordova.api.PluginResult;
-import org.json.JSONException;
-
-/**
- * Contains APIs that the JS can call. All functions in here should also have
- * an equivalent entry in CordovaChromeClient.java, and be added to
- * cordova-js/lib/android/plugin/android/promptbasednativeapi.js
- */
-/* package */ class ExposedJsApi {
-    
-    private PluginManager pluginManager;
-    private NativeToJsMessageQueue jsMessageQueue;
-    
-    public ExposedJsApi(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) {
-        this.pluginManager = pluginManager;
-        this.jsMessageQueue = jsMessageQueue;
-    }
-
-    @JavascriptInterface
-    public String exec(String service, String action, String callbackId, String arguments) throws JSONException {
-        // If the arguments weren't received, send a message back to JS.  It will switch bridge modes and try again.  See CB-2666.
-        // We send a message meant specifically for this case.  It starts with "@" so no other message can be encoded into the same string.
-        if (arguments == null) {
-            return "@Null arguments.";
-        }
-
-        jsMessageQueue.setPaused(true);
-        try {
-            boolean wasSync = pluginManager.exec(service, action, callbackId, arguments);
-            String ret = "";
-            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING || wasSync) {
-                ret = jsMessageQueue.popAndEncode();
-            }
-            return ret;
-        } finally {
-            jsMessageQueue.setPaused(false);
-        }
-    }
-    
-    @JavascriptInterface
-    public void setNativeToJsBridgeMode(int value) {
-        jsMessageQueue.setBridgeMode(value);
-    }
-    
-    @JavascriptInterface
-    public String retrieveJsMessages() {
-        return jsMessageQueue.popAndEncode();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java b/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
deleted file mode 100644
index 8b446b0..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-       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;
-
-import android.database.Cursor;
-import android.net.Uri;
-import android.webkit.MimeTypeMap;
-
-import org.apache.cordova.api.CordovaInterface;
-import org.apache.cordova.api.LOG;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLConnection;
-import java.util.Locale;
-
-public class FileHelper {
-    private static final String LOG_TAG = "FileUtils";
-    private static final String _DATA = "_data";
-
-    /**
-     * Returns the real path of the given URI string.
-     * If the given URI string represents a content:// URI, the real path is retrieved from the media store.
-     *
-     * @param uriString the URI string of the audio/image/video
-     * @param cordova the current application context
-     * @return the full path to the file
-     */
-    @SuppressWarnings("deprecation")
-    public static String getRealPath(String uriString, CordovaInterface cordova) {
-        String realPath = null;
-
-        if (uriString.startsWith("content://")) {
-            String[] proj = { _DATA };
-            Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null);
-            int column_index = cursor.getColumnIndexOrThrow(_DATA);
-            cursor.moveToFirst();
-            realPath = cursor.getString(column_index);
-            if (realPath == null) {
-                LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString);
-            }
-        } else if (uriString.startsWith("file://")) {
-            realPath = uriString.substring(7);
-            if (realPath.startsWith("/android_asset/")) {
-                LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString);
-                realPath = null;
-            }
-        } else {
-            realPath = uriString;
-        }
-
-        return realPath;
-    }
-
-    /**
-     * Returns the real path of the given URI.
-     * If the given URI is a content:// URI, the real path is retrieved from the media store.
-     *
-     * @param uri the URI of the audio/image/video
-     * @param cordova the current application context
-     * @return the full path to the file
-     */
-    public static String getRealPath(Uri uri, CordovaInterface cordova) {
-        return FileHelper.getRealPath(uri.toString(), cordova);
-    }
-
-    /**
-     * Returns an input stream based on given URI string.
-     *
-     * @param uriString the URI string from which to obtain the input stream
-     * @param cordova the current application context
-     * @return an input stream into the data at the given URI or null if given an invalid URI string
-     * @throws IOException
-     */
-    public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
-        if (uriString.startsWith("content")) {
-            Uri uri = Uri.parse(uriString);
-            return cordova.getActivity().getContentResolver().openInputStream(uri);
-        } else if (uriString.startsWith("file:///android_asset/")) {
-            Uri uri = Uri.parse(uriString);
-            String relativePath = uri.getPath().substring(15);
-            return cordova.getActivity().getAssets().open(relativePath);
-        } else {
-            return new FileInputStream(getRealPath(uriString, cordova));
-        }
-    }
-
-    /**
-     * 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.
-     *
-     * @param uriString the URI string to operate on
-     * @return a path without the "file://" prefix
-     */
-    public static String stripFileProtocol(String uriString) {
-        if (uriString.startsWith("file://")) {
-            uriString = uriString.substring(7);
-        }
-        return uriString;
-    }
-
-    /**
-     * Returns the mime type of the data specified by the given URI string.
-     *
-     * @param uriString the URI string of the data
-     * @return the mime type of the specified data
-     */
-    public static String getMimeType(String uriString, CordovaInterface cordova) {
-        String mimeType = null;
-
-        Uri uri = Uri.parse(uriString);
-        if (uriString.startsWith("content://")) {
-            mimeType = cordova.getActivity().getContentResolver().getType(uri);
-        } else {
-            // MimeTypeMap.getFileExtensionFromUrl() fails when there are query parameters.
-            String extension = uri.getPath();
-            int lastDot = extension.lastIndexOf('.');
-            if (lastDot != -1) {
-                extension = extension.substring(lastDot + 1);
-            }
-            // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
-            extension = extension.toLowerCase();
-            if (extension.equals("3ga")) {
-                mimeType = "audio/3gpp";
-            } else {
-                mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
-            }
-        }
-
-        return mimeType;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/09ee1837/lib/cordova-android/framework/src/org/apache/cordova/FileProgressResult.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/FileProgressResult.java b/lib/cordova-android/framework/src/org/apache/cordova/FileProgressResult.java
deleted file mode 100644
index d981175..0000000
--- a/lib/cordova-android/framework/src/org/apache/cordova/FileProgressResult.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-       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;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Encapsulates in-progress status of uploading or downloading a file to a remote server.
- */
-public class FileProgressResult {
-
-    private boolean lengthComputable = false; // declares whether total is known
-    private long loaded = 0;                  // bytes sent so far
-    private long total = 0;                   // bytes total, if known
-
-    public boolean getLengthComputable() {
-        return lengthComputable;
-    }
-
-    public void setLengthComputable(boolean computable) {
-        this.lengthComputable = computable;
-    }
-
-    public long getLoaded() {
-        return loaded;
-    }
-
-    public void setLoaded(long bytes) {
-        this.loaded = bytes;
-    }
-
-    public long getTotal() {
-        return total;
-    }
-
-    public void setTotal(long bytes) {
-        this.total = bytes;
-    }
-
-    public JSONObject toJSONObject() throws JSONException {
-        return new JSONObject(
-                "{loaded:" + loaded +
-                ",total:" + total +
-                ",lengthComputable:" + (lengthComputable ? "true" : "false") + "}");
-    }
-}