diff options
| -rw-r--r-- | core/java/android/net/MobileDataStateTracker.java | 4 | ||||
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 10 | ||||
| -rw-r--r-- | core/java/android/webkit/HTML5VideoViewProxy.java | 128 | ||||
| -rw-r--r-- | core/java/android/webkit/WebChromeClient.java | 18 | ||||
| -rw-r--r-- | core/java/android/webkit/WebView.java | 10 | ||||
| -rw-r--r-- | core/jni/android_util_Process.cpp | 4 | ||||
| -rw-r--r-- | include/tts/TtsEngine.h | 41 | ||||
| -rw-r--r-- | packages/TtsService/jni/android_tts_SynthProxy.cpp | 32 | ||||
| -rwxr-xr-x | packages/TtsService/src/android/tts/SynthProxy.java | 10 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/Phone.java | 3 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java | 40 | ||||
| -rw-r--r-- | tests/backup/src/com/android/backuptest/BackupTestAgent.java | 3 | ||||
| -rwxr-xr-x | tests/backup/test_backup.sh | 1 | ||||
| -rwxr-xr-x | tests/backup/test_restore.sh | 1 |
14 files changed, 281 insertions, 24 deletions
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java index 1064fb64fb94..d48cbd5777aa 100644 --- a/core/java/android/net/MobileDataStateTracker.java +++ b/core/java/android/net/MobileDataStateTracker.java @@ -377,6 +377,8 @@ public class MobileDataStateTracker extends NetworkStateTracker { if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) { mLastCallingPid = callingPid; return setEnableApn(Phone.APN_TYPE_MMS, true); + } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DEFAULT)) { + return setEnableApn(Phone.APN_TYPE_DEFAULT_FEATURE, true); } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) { return setEnableApn(Phone.APN_TYPE_SUPL, true); } else { @@ -399,6 +401,8 @@ public class MobileDataStateTracker extends NetworkStateTracker { public int stopUsingNetworkFeature(String feature, int callingPid, int callingUid) { if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) { return setEnableApn(Phone.APN_TYPE_MMS, false); + } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DEFAULT)) { + return setEnableApn(Phone.APN_TYPE_DEFAULT_FEATURE, false); } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) { return setEnableApn(Phone.APN_TYPE_SUPL, false); } else { diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index c40704410155..9a8c3c081bd8 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -147,6 +147,16 @@ class CallbackProxy extends Handler { } /** + * Get the WebChromeClient. + * @return the current WebChromeClient instance. + * + *@hide pending API council approval. + */ + public WebChromeClient getWebChromeClient() { + return mWebChromeClient; + } + + /** * Set the client DownloadListener. * @param client An implementation of DownloadListener. */ diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java new file mode 100644 index 000000000000..973cb0103a3a --- /dev/null +++ b/core/java/android/webkit/HTML5VideoViewProxy.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed 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 android.webkit; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.widget.MediaController; +import android.widget.VideoView; + +import java.util.HashMap; + +/** + * <p>A View that displays Videos. Instances of this class + * are created on the WebCore thread. However, their code + * executes on the UI thread. Right now there is only one + * such view for fullscreen video rendering. + * + */ +class HTML5VideoViewProxy extends Handler { + // Logging tag. + private static final String LOGTAG = "HTML5VideoViewProxy"; + + // Message Ids + private static final int INIT = 100; + private static final int PLAY = 101; + + // The singleton instance. + private static HTML5VideoViewProxy sInstance; + // The VideoView driven via this proxy. + private VideoView mVideoView; + // The context object used to initialize the VideoView and the + // MediaController. + private Context mContext; + + /** + * Private constructor. + * @param context is the application context. + */ + private HTML5VideoViewProxy(Context context) { + // This handler is for the main (UI) thread. + super(Looper.getMainLooper()); + // Save the context object. + mContext = context; + // Send a message to the UI thread to create the VideoView. + // This need to be done on the UI thread, or else the + // event Handlers used by the VideoView and MediaController + // will be attached to the wrong thread. + Message message = obtainMessage(INIT); + sendMessage(message); + } + + @Override + public void handleMessage(Message msg) { + // This executes on the UI thread. + switch (msg.what) { + case INIT: + // Create the video view and set a default controller. + mVideoView = new VideoView(mContext); + mVideoView.setMediaController(new MediaController(mContext)); + break; + case PLAY: + // Check if the fullscreen video view is currently playing. + // If it is, ignore the message. + if (!mVideoView.isPlaying()) { + HashMap<String, Object> map = + (HashMap<String, Object>) msg.obj; + String url = (String) map.get("url"); + WebView webview = (WebView) map.get("webview"); + WebChromeClient client = webview.getWebChromeClient(); + if (client != null) { + mVideoView.setVideoURI(Uri.parse(url)); + mVideoView.start(); + client.onShowCustomView(mVideoView); + } + } + break; + } + } + + /** + * Play a video stream. + * @param url is the URL of the video stream. + * @param webview is the WebViewCore that is requesting the playback. + */ + public void play(String url, WebViewCore webviewCore) { + // We need to know the webview that is requesting the playback. + Message message = obtainMessage(PLAY); + HashMap<String, Object> map = new HashMap(); + map.put("url", url); + map.put("webview", webviewCore.getWebView()); + message.obj = map; + sendMessage(message); + } + + /** + * The factory for HTML5VideoViewProxy instances. Right now, + * it only produces a singleton. + * @param webViewCore is the WebViewCore that is requesting the proxy. + * + * @return the HTML5VideoViewProxy singleton. + */ + public static HTML5VideoViewProxy getInstance(WebViewCore webViewCore) { + if (sInstance == null) { + sInstance = new HTML5VideoViewProxy(webViewCore.getWebView().getContext()); + } + return sInstance; + } +} diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index 754b1d90adf4..19e39ed24a9c 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -18,6 +18,7 @@ package android.webkit; import android.graphics.Bitmap; import android.os.Message; +import android.view.View; public class WebChromeClient { @@ -44,6 +45,23 @@ public class WebChromeClient { public void onReceivedIcon(WebView view, Bitmap icon) {} /** + * Notify the host application that the current page would + * like to show a custom View. + * @param view is the View object to be shown. + * + * @hide pending council approval + */ + public void onShowCustomView(View view) {} + + /** + * Notify the host application that the current page would + * like to hide its custom view. + * + * @hide pending council approval + */ + public void onHideCustomView() {} + + /** * Request the host application to create a new Webview. The host * application should handle placement of the new WebView in the view * system. The default behavior returns null. diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 7db5c493ac3f..97134d22807c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2335,6 +2335,16 @@ public class WebView extends AbsoluteLayout } /** + * Gets the chrome handler. + * @return the current WebChromeClient instance. + * + * @hide API council approval. + */ + public WebChromeClient getWebChromeClient() { + return mCallbackProxy.getWebChromeClient(); + } + + /** * Set the Picture listener. This is an interface used to receive * notifications of a new Picture. * @param listener An implementation of WebView.PictureListener. diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 92461976d63e..770c75525225 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -269,9 +269,9 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, jint pid, jint pri) { - if (pri == ANDROID_PRIORITY_BACKGROUND) { + if (pri >= ANDROID_PRIORITY_BACKGROUND) { add_pid_to_cgroup(pid, ANDROID_TGROUP_BG_NONINTERACT); - } else if (getpriority(PRIO_PROCESS, pid) == ANDROID_PRIORITY_BACKGROUND) { + } else if (getpriority(PRIO_PROCESS, pid) >= ANDROID_PRIORITY_BACKGROUND) { add_pid_to_cgroup(pid, ANDROID_TGROUP_DEFAULT); } diff --git a/include/tts/TtsEngine.h b/include/tts/TtsEngine.h index 848653232dd6..ca50a5edd212 100644 --- a/include/tts/TtsEngine.h +++ b/include/tts/TtsEngine.h @@ -69,6 +69,14 @@ enum tts_result { TTS_MISSING_RESOURCES = -6 }; +enum tts_support_result { + TTS_LANG_COUNTRY_VAR_AVAILABLE = 2, + TTS_LANG_COUNTRY_AVAILABLE = 1, + TTS_LANG_AVAILABLE = 0, + TTS_LANG_MISSING_DATA = -1, + TTS_LANG_NOT_SUPPORTED = -2 +}; + class TtsEngine { public: @@ -86,19 +94,32 @@ public: // @return TTS_SUCCESS, or TTS_FAILURE virtual tts_result stop(); + // Returns the level of support for the language, country and variant. + // @return TTS_LANG_COUNTRY_VAR_AVAILABLE if the language, country and variant are supported, + // and the corresponding resources are correctly installed + // TTS_LANG_COUNTRY_AVAILABLE if the language and country are supported and the + // corresponding resources are correctly installed, but there is no match for + // the specified variant + // TTS_LANG_AVAILABLE if the language is supported and the + // corresponding resources are correctly installed, but there is no match for + // the specified country and variant + // TTS_LANG_MISSING_DATA if the required resources to provide any level of support + // for the language are not correctly installed + // TTS_LANG_NOT_SUPPORTED if the language is not supported by the TTS engine. + virtual tts_support_result isLanguageAvailable(const char *lang, const char *country, + const char *variant); + // Load the resources associated with the specified language. The loaded // language will only be used once a call to setLanguage() with the same - // language value is issued. Language values are based on the Android - // conventions for localization as described in the Android platform - // documentation on internationalization. This implies that language - // data is specified in the format xx-rYY, where xx is a two letter - // ISO 639-1 language code in lowercase and rYY is a two letter - // ISO 3166-1-alpha-2 language code in uppercase preceded by a - // lowercase "r". - // @param value pointer to the language value - // @param size length of the language value + // language value is issued. Language and country values are coded according to the ISO three + // letter codes for languages and countries, as can be retrieved from a java.util.Locale + // instance. The variant value is encoded as the variant string retrieved from a + // java.util.Locale instance built with that variant data. + // @param lang pointer to the ISO three letter code for the language + // @param country pointer to the ISO three letter code for the country + // @param variant pointer to the variant code // @return TTS_SUCCESS, or TTS_FAILURE - virtual tts_result loadLanguage(const char *value, const size_t size); + virtual tts_result loadLanguage(const char *lang, const char *country, const char *variant); // Load the resources associated with the specified language, country and Locale variant. // The loaded language will only be used once a call to setLanguageFromLocale() with the same diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp index c356acb50683..8537cae28c89 100644 --- a/packages/TtsService/jni/android_tts_SynthProxy.cpp +++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp @@ -297,8 +297,32 @@ android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData, variantNativeString); } env->ReleaseStringUTFChars(language, langNativeString); - env->ReleaseStringUTFChars(language, countryNativeString); - env->ReleaseStringUTFChars(language, variantNativeString); + env->ReleaseStringUTFChars(country, countryNativeString); + env->ReleaseStringUTFChars(variant, variantNativeString); +} + + +static void +android_tts_SynthProxy_loadLanguage(JNIEnv *env, jobject thiz, jint jniData, + jstring language, jstring country, jstring variant) +{ + if (jniData == 0) { + LOGE("android_tts_SynthProxy_loadLanguage(): invalid JNI data"); + return; + } + + SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData; + const char *langNativeString = env->GetStringUTFChars(language, 0); + const char *countryNativeString = env->GetStringUTFChars(country, 0); + const char *variantNativeString = env->GetStringUTFChars(variant, 0); + // TODO check return codes + if (pSynthData->mNativeSynthInterface) { + pSynthData->mNativeSynthInterface->loadLanguage(langNativeString, countryNativeString, + variantNativeString); + } + env->ReleaseStringUTFChars(language, langNativeString); + env->ReleaseStringUTFChars(country, countryNativeString); + env->ReleaseStringUTFChars(variant, variantNativeString); } @@ -567,6 +591,10 @@ static JNINativeMethod gMethods[] = { "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", (void*)android_tts_SynthProxy_setLanguage }, + { "native_loadLanguage", + "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", + (void*)android_tts_SynthProxy_loadLanguage + }, { "native_setSpeechRate", "(II)V", (void*)android_tts_SynthProxy_setSpeechRate diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java index 3bdff376429c..a8eaaa43f21f 100755 --- a/packages/TtsService/src/android/tts/SynthProxy.java +++ b/packages/TtsService/src/android/tts/SynthProxy.java @@ -73,6 +73,13 @@ public class SynthProxy { public void setLanguage(String language, String country, String variant) { native_setLanguage(mJniData, language, country, variant); } + + /** + * Loads the language: it's not set, but prepared for use later. + */ + public void loadLanguage(String language, String country, String variant) { + native_loadLanguage(mJniData, language, country, variant); + } /** * Sets the speech rate @@ -149,6 +156,9 @@ public class SynthProxy { private native final void native_setLanguage(int jniData, String language, String country, String variant); + + private native final void native_loadLanguage(int jniData, String language, String country, + String variant); private native final void native_setSpeechRate(int jniData, int speechRate); diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java index c8d384d8d5f6..b02c692fc0c3 100644 --- a/telephony/java/com/android/internal/telephony/Phone.java +++ b/telephony/java/com/android/internal/telephony/Phone.java @@ -119,8 +119,11 @@ public interface Phone { static final String APN_TYPE_MMS = "mms"; /** APN type for SUPL assisted GPS */ static final String APN_TYPE_SUPL = "supl"; + /** APN type for default data traffic, when requested using startUsingNetworkFeature */ + static final String APN_TYPE_DEFAULT_FEATURE = "default-feature"; // "Features" accessible through the connectivity manager + static final String FEATURE_ENABLE_DEFAULT = "enableDEFAULT"; static final String FEATURE_ENABLE_MMS = "enableMMS"; static final String FEATURE_ENABLE_SUPL = "enableSUPL"; diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 035c6901f0e6..25a5f510053a 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -130,7 +130,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private static int APN_DEFAULT_ID = 0; private static int APN_MMS_ID = 1; private static int APN_SUPL_ID = 2; - private static int APN_NUM_TYPES = 3; + private static int APN_DEFAULT_FEATURE_ID = 3; + private static int APN_NUM_TYPES = 4; private boolean[] dataEnabled = new boolean[APN_NUM_TYPES]; @@ -317,7 +318,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { /** * Ensure that we are connected to an APN of the specified type. * @param type the APN type (currently the only valid values - * are {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}) + * are {@link Phone#APN_TYPE_MMS}, {@link Phone#APN_TYPE_SUPL} + * and {@link Phone#APN_TYPE_DEFAULT_FEATURE}) * @return the result of the operation. Success is indicated by * a return value of either {@code Phone.APN_ALREADY_ACTIVE} or * {@code Phone.APN_REQUEST_STARTED}. In the latter case, a broadcast @@ -325,7 +327,13 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * the APN has been established. */ protected int enableApnType(String type) { - if (!TextUtils.equals(type, Phone.APN_TYPE_MMS) && + /* FIXME: APN_TYPE_DEFAULT_FEATURE is used to request the default APN. + * Due to the way mRequestedApnType is used, we needed to add + * a different APN_TYPE for this rather than using APN_TYPE_DEFAULT. + */ + + if (!TextUtils.equals(type, Phone.APN_TYPE_DEFAULT_FEATURE) && + !TextUtils.equals(type, Phone.APN_TYPE_MMS) && !TextUtils.equals(type, Phone.APN_TYPE_SUPL)) { return Phone.APN_REQUEST_FAILED; } @@ -363,12 +371,14 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * use of the default APN has not been explicitly disabled, we are connected * to the default APN. * @param type the APN type. The only valid values are currently - * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}. + * {@link Phone#APN_TYPE_MMS} {@link Phone#APN_TYPE_SUPL} and + * {@link Phone#APN_TYPE_DEFAULT_FEATURE}). * @return */ protected int disableApnType(String type) { Log.d(LOG_TAG, "disableApnType("+type+")"); - if ((TextUtils.equals(type, Phone.APN_TYPE_MMS) || + if ((TextUtils.equals(type, Phone.APN_TYPE_DEFAULT_FEATURE) || + TextUtils.equals(type, Phone.APN_TYPE_MMS) || TextUtils.equals(type, Phone.APN_TYPE_SUPL)) && isEnabled(type)) { removeMessages(EVENT_RESTORE_DEFAULT_APN); @@ -419,6 +429,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private boolean isApnTypeActive(String type) { // TODO: to support simultaneous, mActiveApn can be a List instead. + if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT_FEATURE)) { + type = Phone.APN_TYPE_DEFAULT; + } return mActiveApn != null && mActiveApn.canHandleType(type); } @@ -440,6 +453,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return dataEnabled[APN_MMS_ID]; } else if (TextUtils.equals(apnType, Phone.APN_TYPE_SUPL)) { return dataEnabled[APN_SUPL_ID]; + } else if (TextUtils.equals(apnType, Phone.APN_TYPE_DEFAULT_FEATURE)) { + return dataEnabled[APN_DEFAULT_FEATURE_ID]; } else { return false; } @@ -453,10 +468,13 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { dataEnabled[APN_MMS_ID] = enable; } else if (TextUtils.equals(apnType, Phone.APN_TYPE_SUPL)) { dataEnabled[APN_SUPL_ID] = enable; + } else if (TextUtils.equals(apnType, Phone.APN_TYPE_DEFAULT_FEATURE)) { + dataEnabled[APN_DEFAULT_FEATURE_ID] = enable; } Log.d(LOG_TAG, "dataEnabled[DEFAULT_APN]=" + dataEnabled[APN_DEFAULT_ID] + " dataEnabled[MMS_APN]=" + dataEnabled[APN_MMS_ID] + - " dataEnabled[SUPL_APN]=" + dataEnabled[APN_SUPL_ID]); + " dataEnabled[SUPL_APN]=" + dataEnabled[APN_SUPL_ID] + + " dataEnabled[APN_DEFAULT_FEATURE_ID]=" + dataEnabled[APN_DEFAULT_FEATURE_ID]); } /** @@ -484,7 +502,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { // Don't tear down if there is an active APN and it handles MMS or SUPL. // TODO: This isn't very general. if ((isApnTypeActive(Phone.APN_TYPE_MMS) && isEnabled(Phone.APN_TYPE_MMS)) || - (isApnTypeActive(Phone.APN_TYPE_SUPL) && isEnabled(Phone.APN_TYPE_SUPL))) { + (isApnTypeActive(Phone.APN_TYPE_SUPL) && isEnabled(Phone.APN_TYPE_SUPL)) || + (isApnTypeActive(Phone.APN_TYPE_DEFAULT_FEATURE) && + isEnabled(Phone.APN_TYPE_DEFAULT_FEATURE))) { return false; } Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION); @@ -514,7 +534,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * {@code true} otherwise. */ public boolean getAnyDataEnabled() { - return dataEnabled[APN_DEFAULT_ID] || dataEnabled[APN_MMS_ID] || dataEnabled[APN_SUPL_ID]; + return dataEnabled[APN_DEFAULT_ID] || dataEnabled[APN_MMS_ID] || + dataEnabled[APN_SUPL_ID] || dataEnabled[APN_DEFAULT_FEATURE_ID]; } /** @@ -1289,7 +1310,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * rather an app that inadvertantly fails to reset to the * default APN, or that dies before doing so. */ - if (dataEnabled[APN_MMS_ID] || dataEnabled[APN_SUPL_ID]) { + if (dataEnabled[APN_MMS_ID] || dataEnabled[APN_SUPL_ID] || + dataEnabled[APN_DEFAULT_FEATURE_ID]) { removeMessages(EVENT_RESTORE_DEFAULT_APN); sendMessageDelayed(obtainMessage(EVENT_RESTORE_DEFAULT_APN), getRestoreDefaultApnDelay()); diff --git a/tests/backup/src/com/android/backuptest/BackupTestAgent.java b/tests/backup/src/com/android/backuptest/BackupTestAgent.java index 931dcb012fcc..6acd90c1993d 100644 --- a/tests/backup/src/com/android/backuptest/BackupTestAgent.java +++ b/tests/backup/src/com/android/backuptest/BackupTestAgent.java @@ -23,7 +23,8 @@ public class BackupTestAgent extends BackupHelperAgent { public void onCreate() { addHelper("data_files", new FileBackupHelper(this, BackupTestActivity.FILE_NAME)); - addHelper("more_data_files", new FileBackupHelper(this, "another_file.txt", "3.txt")); + addHelper("more_data_files", new FileBackupHelper(this, "another_file.txt", "3.txt", + "empty.txt")); } } diff --git a/tests/backup/test_backup.sh b/tests/backup/test_backup.sh index f6c73d855833..6ef5dffcad85 100755 --- a/tests/backup/test_backup.sh +++ b/tests/backup/test_backup.sh @@ -12,6 +12,7 @@ adb shell "rm /data/data/com.android.backuptest/files/* ; \ echo -n first file > /data/data/com.android.backuptest/files/file.txt ; \ echo -n asdf > /data/data/com.android.backuptest/files/another_file.txt ; \ echo -n 3 > /data/data/com.android.backuptest/files/3.txt ; \ + echo -n "" > /data/data/com.android.backuptest/files/empty.txt ; \ " # say that the data has changed diff --git a/tests/backup/test_restore.sh b/tests/backup/test_restore.sh index 69da28cffcb3..f3d581e9292d 100755 --- a/tests/backup/test_restore.sh +++ b/tests/backup/test_restore.sh @@ -35,6 +35,7 @@ echo check_file file.txt "first file" check_file another_file.txt "asdf" check_file 3.txt "3" +check_file empty.txt "" echo echo |