Merge "New method to return the last dialed number Bug:2227429"
diff --git a/api/current.xml b/api/current.xml
index f3e614a..113b9e0 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -14690,6 +14690,25 @@
<parameter name="value" type="java.lang.String">
</parameter>
</method>
+<method name="testHasFeatures"
+ return="android.accounts.AccountManagerFuture<java.lang.Boolean>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="account" type="android.accounts.Account">
+</parameter>
+<parameter name="features" type="java.lang.String[]">
+</parameter>
+<parameter name="callback" type="android.accounts.AccountManagerCallback<java.lang.Boolean>">
+</parameter>
+<parameter name="handler" type="android.os.Handler">
+</parameter>
+</method>
<method name="updateCredentials"
return="android.accounts.AccountManagerFuture<android.os.Bundle>"
abstract="false"
diff --git a/cmds/dumpstate/Android.mk b/cmds/dumpstate/Android.mk
index 27891ec..431a556 100644
--- a/cmds/dumpstate/Android.mk
+++ b/cmds/dumpstate/Android.mk
@@ -15,15 +15,4 @@
include $(BUILD_EXECUTABLE)
-COMMANDS = dumpcrash
-SYMLINKS := $(addprefix $(TARGET_OUT_EXECUTABLES)/,$(COMMANDS))
-$(SYMLINKS): DUMPSTATE_BINARY := dumpstate
-$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
- @echo "Symlink: $@ -> $(DUMPSTATE_BINARY)"
- @mkdir -p $(dir $@)
- @rm -rf $@
- $(hide) ln -sf $(DUMPSTATE_BINARY) $@
-
-ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS)
-
endif
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index a2b5d8d..9300915 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -14,361 +14,254 @@
* limitations under the License.
*/
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/time.h>
#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
-#include <cutils/sockets.h>
+#include <cutils/properties.h>
+
#include "private/android_filesystem_config.h"
-
#define LOG_TAG "dumpstate"
#include <utils/Log.h>
#include "dumpstate.h"
-static char* const gzip_args[] = { "gzip", "-6", 0 };
-static int start_pattern[] = { 150, 0 };
-static int end_pattern[] = { 75, 50, 75, 50, 75, 0 };
-
-static struct tm now;
-
-static void dump_kernel_log(const char *path, const char *title) ;
+/* read before root is shed */
+static char cmdline_buf[16384] = "(unknown)";
+static const char *dump_traces_path = NULL;
/* dumps the current system state to stdout */
-static void dumpstate(int full) {
- if (full) {
- PRINT("========================================================");
- PRINT("== dumpstate");
- PRINT("========================================================");
- PRINT("------ MEMORY INFO ------");
- DUMP("/proc/meminfo");
- PRINT("------ CPU INFO ------");
- EXEC7("top", "-n", "1", "-d", "1", "-m", "30", "-t");
- PRINT("------ PROCRANK ------");
- EXEC_XBIN("procrank");
- PRINT("------ VIRTUAL MEMORY STATS ------");
- DUMP("/proc/vmstat");
- PRINT("------ VMALLOC INFO ------");
- DUMP("/proc/vmallocinfo");
- PRINT("------ SLAB INFO ------");
- DUMP("/proc/slabinfo");
- PRINT("------ ZONEINFO ------");
- DUMP("/proc/zoneinfo");
- PRINT("------ SYSTEM LOG ------");
- EXEC4("logcat", "-v", "time", "-d", "*:v");
- PRINT("------ VM TRACES ------");
- DUMP("/data/anr/traces.txt");
- PRINT("------ EVENT LOG TAGS ------");
- DUMP("/etc/event-log-tags");
- PRINT("------ EVENT LOG ------");
- EXEC6("logcat", "-b", "events", "-v", "time", "-d", "*:v");
- PRINT("------ RADIO LOG ------");
- EXEC6("logcat", "-b", "radio", "-v", "time", "-d", "*:v");
- PRINT("------ NETWORK STATE ------");
- PRINT("Interfaces:");
- EXEC("netcfg");
- PRINT("");
- PRINT("Routes:");
- DUMP("/proc/net/route");
+static void dumpstate() {
+ time_t now = time(NULL);
+ char build[PROPERTY_VALUE_MAX], fingerprint[PROPERTY_VALUE_MAX];
+ char radio[PROPERTY_VALUE_MAX], bootloader[PROPERTY_VALUE_MAX];
+ char network[PROPERTY_VALUE_MAX], date[80];
+
+ property_get("ro.build.display.id", build, "(unknown)");
+ property_get("ro.build.fingerprint", fingerprint, "(unknown)");
+ property_get("ro.baseband", radio, "(unknown)");
+ property_get("ro.bootloader", bootloader, "(unknown)");
+ property_get("gsm.operator.alpha", network, "(unknown)");
+ strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&now));
+
+ printf("========================================================\n");
+ printf("== dumpstate: %s\n", date);
+ printf("========================================================\n");
+
+ printf("\n");
+ printf("Build: %s\n", build);
+ printf("Bootloader: %s\n", bootloader);
+ printf("Radio: %s\n", radio);
+ printf("Network: %s\n", network);
+
+ printf("Kernel: ");
+ dump_file(NULL, "/proc/version");
+ printf("Command line: %s\n", strtok(cmdline_buf, "\n"));
+ printf("\n");
+
+ dump_file("MEMORY INFO", "/proc/meminfo");
+ run_command("CPU INFO", 10, "top", "-n", "1", "-d", "1", "-m", "30", "-t", NULL);
+ run_command("PROCRANK", 20, "procrank", NULL);
+ dump_file("VIRTUAL MEMORY STATS", "/proc/vmstat");
+ dump_file("VMALLOC INFO", "/proc/vmallocinfo");
+ dump_file("SLAB INFO", "/proc/slabinfo");
+ dump_file("ZONEINFO", "/proc/zoneinfo");
+
+ run_command("SYSTEM LOG", 20, "logcat", "-v", "time", "-d", "*:v", NULL);
+
+ /* show the traces we collected in main(), if that was done */
+ if (dump_traces_path != NULL) {
+ dump_file("VM TRACES JUST NOW", dump_traces_path);
+ }
+
+ /* only show ANR traces if they're less than 15 minutes old */
+ struct stat st;
+ char anr_traces_path[PATH_MAX];
+ property_get("dalvik.vm.stack-trace-file", anr_traces_path, "");
+ if (anr_traces_path[0] && !stat(anr_traces_path, &st) && time(NULL) - st.st_mtime < 15 * 60) {
+ dump_file("VM TRACES AT LAST ANR", anr_traces_path);
+ }
+
+ // dump_file("EVENT LOG TAGS", "/etc/event-log-tags");
+ run_command("EVENT LOG", 20, "logcat", "-b", "events", "-v", "time", "-d", "*:v", NULL);
+ run_command("RADIO LOG", 20, "logcat", "-b", "radio", "-v", "time", "-d", "*:v", NULL);
+
+ run_command("NETWORK INTERFACES", 10, "netcfg", NULL);
+ dump_file("NETWORK ROUTES", "/proc/net/route");
+
#ifdef FWDUMP_bcm4329
- PRINT("Dump wlan FW log");
- EXEC_XBIN6("su", "root","dhdutil","-i","eth0","upload","/data/local/tmp/wlan_crash.dump");
+ run_command("DUMP WIFI FIRMWARE LOG", 60,
+ "dhdutil", "-i", "eth0", "upload", "/data/local/tmp/wlan_crash.dump", NULL);
#endif
- PRINT("------ SYSTEM PROPERTIES ------");
- print_properties();
- PRINT("------ KERNEL LOG ------");
- EXEC("dmesg");
- PRINT("------ KERNEL WAKELOCKS ------");
- DUMP("/proc/wakelocks");
- PRINT("------ KERNEL CPUFREQ ------");
- DUMP("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state");
- PRINT("");
- PRINT("------ PROCESSES ------");
- EXEC1("ps", "-P");
- PRINT("------ PROCESSES AND THREADS ------");
- EXEC3("ps", "-t", "-p", "-P");
- PRINT("------ LIBRANK ------");
- EXEC_XBIN("librank");
- PRINT("------ BINDER FAILED TRANSACTION LOG ------");
- DUMP("/proc/binder/failed_transaction_log");
- PRINT("");
- PRINT("------ BINDER TRANSACTION LOG ------");
- DUMP("/proc/binder/transaction_log");
- PRINT("");
- PRINT("------ BINDER TRANSACTIONS ------");
- DUMP("/proc/binder/transactions");
- PRINT("");
- PRINT("------ BINDER STATS ------");
- DUMP("/proc/binder/stats");
- PRINT("");
- PRINT("------ BINDER PROCESS STATE: $i ------");
- DUMP_FILES("/proc/binder/proc");
- PRINT("------ FILESYSTEMS ------");
- EXEC("df");
- PRINT("------ PACKAGE SETTINGS ------");
- DUMP("/data/system/packages.xml");
- PRINT("------ PACKAGE UID ERRORS ------");
- DUMP("/data/system/uiderrors.txt");
- dump_kernel_log("/proc/last_kmsg", "LAST KMSG");
+ print_properties();
- PRINT("------ LAST RADIO LOG ------");
- EXEC1("parse_radio_log", "/proc/last_radio_log");
+ run_command("KERNEL LOG", 20, "dmesg", NULL);
- dump_kernel_log("/data/dontpanic/apanic_console",
- "PANIC CONSOLE");
- dump_kernel_log("/data/dontpanic/apanic_threads",
- "PANIC THREADS");
+ dump_file("KERNEL WAKELOCKS", "/proc/wakelocks");
+ dump_file("KERNEL CPUFREQ", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state");
- PRINT("------ BACKLIGHTS ------");
- DUMP_PROMPT("LCD brightness=", "/sys/class/leds/lcd-backlight/brightness");
- DUMP_PROMPT("Button brightness=", "/sys/class/leds/button-backlight/brightness");
- DUMP_PROMPT("Keyboard brightness=", "/sys/class/leds/keyboard-backlight/brightness");
- DUMP_PROMPT("ALS mode=", "/sys/class/leds/lcd-backlight/als");
- DUMP_PROMPT("LCD driver registers:\n", "/sys/class/leds/lcd-backlight/registers");
- }
- PRINT("========================================================");
- PRINT("== build.prop");
- PRINT("========================================================");
+ run_command("PROCESSES", 10, "ps", "-P", NULL);
+ run_command("PROCESSES AND THREADS", 10, "ps", "-t", "-p", "-P", NULL);
+ run_command("LIBRANK", 10, "librank", NULL);
- /* the crash server parses key-value pairs between the VERSION INFO and
- * END lines so we can aggregate crash reports based on this data.
- */
- PRINT("------ VERSION INFO ------");
- print_date("currenttime=", &now);
- DUMP_PROMPT("kernel.version=", "/proc/version");
- DUMP_PROMPT("kernel.cmdline=", "/proc/cmdline");
- DUMP("/system/build.prop");
- PROPERTY("gsm.version.ril-impl");
- PROPERTY("gsm.version.baseband");
- PROPERTY("gsm.imei");
- PROPERTY("gsm.sim.operator.numeric");
- PROPERTY("gsm.operator.alpha");
- PRINT("------ END ------");
+ dump_file("BINDER FAILED TRANSACTION LOG", "/proc/binder/failed_transaction_log");
+ dump_file("BINDER TRANSACTION LOG", "/proc/binder/transaction_log");
+ dump_file("BINDER TRANSACTIONS", "/proc/binder/transactions");
+ dump_file("BINDER STATS", "/proc/binder/stats");
+ run_command("BINDER PROCESS STATE", 10, "sh", "-c", "cat /proc/binder/proc/*");
- if (full) {
- PRINT("========================================================");
- PRINT("== dumpsys");
- PRINT("========================================================");
- /* the full dumpsys is starting to take a long time, so we need
- to increase its timeout. we really need to do the timeouts in
- dumpsys itself... */
- EXEC_TIMEOUT("dumpsys", 60);
- }
+ run_command("FILESYSTEMS & FREE SPACE", 10, "df", NULL);
+
+ dump_file("PACKAGE SETTINGS", "/data/system/packages.xml");
+ dump_file("PACKAGE UID ERRORS", "/data/system/uiderrors.txt");
+
+ dump_file("LAST KMSG", "/proc/last_kmsg");
+ run_command("LAST RADIO LOG", 10, "parse_radio_log", "/proc/last_radio_log", NULL);
+ dump_file("LAST PANIC CONSOLE", "/data/dontpanic/apanic_console");
+ dump_file("LAST PANIC THREADS", "/data/dontpanic/apanic_threads");
+
+ printf("----- BACKLIGHTS -----\n");
+ printf("LCD brightness=");
+ dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness");
+ printf("Button brightness=");
+ dump_file(NULL, "/sys/class/leds/button-backlight/brightness");
+ printf("Keyboard brightness=");
+ dump_file(NULL, "/sys/class/leds/keyboard-backlight/brightness");
+ printf("ALS mode=");
+ dump_file(NULL, "/sys/class/leds/lcd-backlight/als");
+ printf("LCD driver registers:\n");
+ dump_file(NULL, "/sys/class/leds/lcd-backlight/registers");
+ printf("\n");
+
+ printf("========================================================\n");
+ printf("== Android Framework Services\n");
+ printf("========================================================\n");
+
+ /* the full dumpsys is starting to take a long time, so we need
+ to increase its timeout. we really need to do the timeouts in
+ dumpsys itself... */
+ run_command("DUMPSYS", 60, "dumpsys", NULL);
}
-/* used to check the file name passed via argv[0] */
-static int check_command_name(const char* name, const char* test) {
- int name_length, test_length;
- if (!strcmp(name, test))
- return 1;
-
- name_length = strlen(name);
- test_length = strlen(test);
-
- if (name_length > test_length + 2) {
- name += (name_length - test_length);
- if (name[-1] != '/')
- return 0;
- if (!strcmp(name, test))
- return 1;
- }
-
- return 0;
+static void usage() {
+ fprintf(stderr, "usage: dumpstate [-d] [-o file] [-s] [-z]\n"
+ " -d: append date to filename (requires -o)\n"
+ " -o: write to file (instead of stdout)\n"
+ " -s: write output to control socket (for init)\n"
+ " -z: gzip output (requires -o)\n");
}
int main(int argc, char *argv[]) {
- int dumpcrash = check_command_name(argv[0], "dumpcrash");
- int add_date = 0;
- char* outfile = 0;
- int vibrate = 0;
- int compress = 0;
- int socket = 0;
- int c, fd, vibrate_fd, fds[2];
- char path[PATH_MAX];
- pid_t pid;
- gid_t groups[] = { AID_LOG, AID_SDCARD_RW };
+ int do_add_date = 0;
+ int do_compress = 0;
+ char* use_outfile = 0;
+ int use_socket = 0;
LOGI("begin\n");
/* set as high priority, and protect from OOM killer */
setpriority(PRIO_PROCESS, 0, -20);
- protect_from_oom_killer();
+ FILE *oom_adj = fopen("/proc/self/oom_adj", "w");
+ if (oom_adj) {
+ fputs("-17", oom_adj);
+ fclose(oom_adj);
+ }
- get_time(&now);
+ /* very first thing, collect VM traces from Dalvik (needs root) */
+ dump_traces_path = dump_vm_traces();
- do {
- c = getopt(argc, argv, "do:svz");
- if (c == EOF)
- break;
+ int c;
+ while ((c = getopt(argc, argv, "dho:svz")) != -1) {
switch (c) {
- case 'd':
- add_date = 1;
- break;
- case 'o':
- outfile = optarg;
- break;
- case 'v':
- vibrate = 1;
- break;
- case 'z':
- compress = 1;
- break;
- case 's':
- socket = 1;
- break;
- case '?':
- fprintf(stderr, "%s: invalid option -%c\n",
- argv[0], optopt);
+ case 'd': do_add_date = 1; break;
+ case 'o': use_outfile = optarg; break;
+ case 's': use_socket = 1; break;
+ case 'v': break; // compatibility no-op
+ case 'z': do_compress = 6; break;
+ case '?': printf("\n");
+ case 'h':
+ usage();
exit(1);
}
- } while (1);
+ }
- /* open vibrator before switching user */
- if (vibrate) {
- vibrate_fd = open("/sys/class/timed_output/vibrator/enable", O_WRONLY);
- if (vibrate_fd > 0)
- fcntl(vibrate_fd, F_SETFD, FD_CLOEXEC);
- } else
- vibrate_fd = -1;
+ /* open the vibrator before dropping root */
+ FILE *vibrator = fopen("/sys/class/timed_output/vibrator/enable", "w");
+ if (vibrator) fcntl(fileno(vibrator), F_SETFD, FD_CLOEXEC);
+
+ /* read /proc/cmdline before dropping root */
+ FILE *cmdline = fopen("/proc/cmdline", "r");
+ if (cmdline != NULL) {
+ fgets(cmdline_buf, sizeof(cmdline_buf), cmdline);
+ fclose(cmdline);
+ }
/* switch to non-root user and group */
+ gid_t groups[] = { AID_LOG, AID_SDCARD_RW };
setgroups(sizeof(groups)/sizeof(groups[0]), groups);
setuid(AID_SHELL);
- /* make it safe to use both printf and STDOUT_FILENO */
- setvbuf(stdout, 0, _IONBF, 0);
+ char path[PATH_MAX], tmp_path[PATH_MAX];
+ pid_t gzip_pid = -1;
- if (socket) {
- struct sockaddr addr;
- socklen_t alen;
-
- int s = android_get_control_socket("dumpstate");
- if (s < 0) {
- fprintf(stderr, "could not open dumpstate socket\n");
- exit(1);
+ if (use_socket) {
+ redirect_to_socket(stdout, "dumpstate");
+ } else if (use_outfile) {
+ strlcpy(path, use_outfile, sizeof(path));
+ if (do_add_date) {
+ char date[80];
+ time_t now = time(NULL);
+ strftime(date, sizeof(date), "-%Y-%m-%d-%H-%M-%S", localtime(&now));
+ strlcat(path, date, sizeof(path));
}
- if (listen(s, 4) < 0) {
- fprintf(stderr, "could not listen on dumpstate socket\n");
- exit(1);
- }
-
- alen = sizeof(addr);
- fd = accept(s, &addr, &alen);
- if (fd < 0) {
- fprintf(stderr, "could not accept dumpstate socket\n");
- exit(1);
- }
-
- /* redirect stdout to the socket */
- dup2(fd, STDOUT_FILENO);
- close(fd);
- } else if (outfile) {
- if (strlen(outfile) > sizeof(path) - 100)
- exit(1);
-
- strcpy(path, outfile);
- if (add_date) {
- char date[260];
- strftime(date, sizeof(date),
- "-%Y-%m-%d-%H-%M-%S",
- &now);
- strcat(path, date);
- }
- if (compress)
- strcat(path, ".gz");
- else
- strcat(path, ".txt");
-
- /* ensure that all directories in the path exist */
- create_directories(path);
- fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (fd < 0)
- return fd;
-
- if (compress) {
- pipe(fds);
-
- /* redirect our stdout to the pipe */
- dup2(fds[1], STDOUT_FILENO);
- close(fds[1]);
-
- if ((pid = fork()) < 0)
- {
- fprintf(stderr, "fork error\n");
- exit(1);
- }
-
- if (pid) {
- /* parent case */
-
- /* close our copy of the input to gzip */
- close(fds[0]);
- /* close our copy of the output file */
- close(fd);
- } else {
- /* child case */
-
- /* redirect our input pipe to stdin */
- dup2(fds[0], STDIN_FILENO);
- close(fds[0]);
-
- /* redirect stdout to the output file */
- dup2(fd, STDOUT_FILENO);
- close(fd);
-
- /* run gzip to postprocess our output */
- execv("/system/bin/gzip", gzip_args);
- fprintf(stderr, "execv returned\n");
- }
- } else {
- /* redirect stdout to the output file */
- dup2(fd, STDOUT_FILENO);
- close(fd);
- }
- }
- /* else everything will print to stdout */
-
- if (vibrate) {
- vibrate_pattern(vibrate_fd, start_pattern);
- }
- dumpstate(!dumpcrash);
- if (vibrate) {
- vibrate_pattern(vibrate_fd, end_pattern);
- close(vibrate_fd);
+ strlcat(path, ".txt", sizeof(path));
+ if (do_compress) strlcat(path, ".gz", sizeof(path));
+ strlcpy(tmp_path, path, sizeof(tmp_path));
+ strlcat(tmp_path, ".tmp", sizeof(tmp_path));
+ gzip_pid = redirect_to_file(stdout, tmp_path, do_compress);
}
- /* so gzip will terminate */
- close(STDOUT_FILENO);
+ /* bzzzzzz */
+ if (vibrator) {
+ fputs("150", vibrator);
+ fflush(vibrator);
+ }
+
+ dumpstate();
+
+ /* bzzz bzzz bzzz */
+ if (vibrator) {
+ int i;
+ for (i = 0; i < 3; i++) {
+ fputs("75\n", vibrator);
+ fflush(vibrator);
+ usleep((75 + 50) * 1000);
+ }
+ fclose(vibrator);
+ }
+
+ /* wait for gzip to finish, otherwise it might get killed when we exit */
+ if (gzip_pid > 0) {
+ fclose(stdout);
+ waitpid(gzip_pid, NULL, 0);
+ }
+
+ /* rename the (now complete) .tmp file to its final location */
+ if (use_outfile && rename(tmp_path, path)) {
+ fprintf(stderr, "rename(%s, %s): %s\n", tmp_path, path, strerror(errno));
+ }
LOGI("done\n");
return 0;
}
-
-static void dump_kernel_log(const char *path, const char *title)
-
-{
- printf("------ KERNEL %s LOG ------\n", title);
- if (access(path, R_OK) < 0)
- printf("%s: %s\n", path, strerror(errno));
- else {
- struct stat sbuf;
-
- if (stat(path, &sbuf) < 0)
- printf("%s: stat failed (%s)\n", path, strerror(errno));
- else
- printf("Harvested %s", ctime(&sbuf.st_mtime));
-
- DUMP(path);
- }
-}
diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h
index ed1f005..6d48a85 100644
--- a/cmds/dumpstate/dumpstate.h
+++ b/cmds/dumpstate/dumpstate.h
@@ -18,157 +18,24 @@
#define _DUMPSTATE_H_
#include <time.h>
-
-// Commands time out after 60 seconds
-#define TIMEOUT 60
-
-#define PRINT(s) printf("%s\n", s)
-
-#define DUMP(file) dump_file(file)
-
-#define DUMP_FILES(path) dump_files(path)
-
-#define DUMP_PROMPT(prompt, file) \
-{ \
- printf(prompt); \
- dump_file(file); \
-}
-
-#define EXEC(cmd) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC_TIMEOUT(cmd, tmout)\
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, 0 } \
- }; \
- run_command(&c, tmout); \
-}
-
-#define EXEC_XBIN(cmd) \
-{ \
- static struct Command c = { \
- "/system/xbin/" cmd, \
- { cmd, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC1(cmd, a1) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC2(cmd, a1, a2) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC3(cmd, a1, a2, a3) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, a3, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC4(cmd, a1, a2, a3, a4) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, a3, a4, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC6(cmd, a1, a2, a3, a4, a5, a6) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, a3, a4, a5, a6, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC7(cmd, a1, a2, a3, a4, a5, a6, a7) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, a3, a4, a5, a6, a7, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC8(cmd, a1, a2, a3, a4, a5, a6, a7, a8) \
-{ \
- static struct Command c = { \
- "/system/bin/" cmd, \
- { cmd, a1, a2, a3, a4, a5, a6, a7, a8, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define EXEC_XBIN6(cmd, a1, a2, a3, a4, a5, a6) \
-{ \
- static struct Command c = { \
- "/system/xbin/" cmd, \
- { cmd, a1, a2, a3, a4, a5, a6, 0 } \
- }; \
- run_command(&c, TIMEOUT); \
-}
-
-#define PROPERTY(name) print_property(name)
-
-struct Command {
- const char* path;
- char* const args[];
-};
-typedef struct Command Command;
+#include <unistd.h>
/* prints the contents of a file */
-int dump_file(const char* path);
+int dump_file(const char *title, const char* path);
-/* prints the contents of all files in a directory */
-void dump_files(const char* path);
-
-/* forks a command and waits for it to finish */
-int run_command(struct Command* cmd, int timeout);
-
-/* reads the current time into tm */
-void get_time(struct tm *tm);
-
-/* prints the date in tm */
-void print_date(const char* prompt, struct tm *tm);
-
-/* prints the name and value of a system property */
-int print_property(const char* name);
+/* forks a command and waits for it to finish -- terminate args with NULL */
+int run_command(const char *title, int timeout_seconds, const char *command, ...);
/* prints all the system properties */
void print_properties();
-/* creates directories as needed for the given path */
-void create_directories(char *path);
+/* redirect output to a service control socket */
+void redirect_to_socket(FILE *redirect, const char *service);
-/* runs the vibrator using the given pattern */
-void vibrate_pattern(int fd, int* pattern);
+/* redirect output to a file, optionally gzipping; returns gzip pid */
+pid_t redirect_to_file(FILE *redirect, char *path, int gzip_level);
-/* prevents the OOM killer from killing us */
-void protect_from_oom_killer();
+/* dump Dalvik stack traces, return the trace file location (NULL if none) */
+const char *dump_vm_traces();
#endif /* _DUMPSTATE_H_ */
diff --git a/cmds/dumpstate/utils.c b/cmds/dumpstate/utils.c
index 60d845f..fda618c 100644
--- a/cmds/dumpstate/utils.c
+++ b/cmds/dumpstate/utils.c
@@ -14,217 +14,337 @@
* limitations under the License.
*/
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <poll.h>
+#include <signal.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <time.h>
-#include <unistd.h>
+#include <sys/inotify.h>
#include <sys/stat.h>
-#include <dirent.h>
-#include <limits.h>
-#include <fcntl.h>
-#include <signal.h>
#include <sys/time.h>
#include <sys/wait.h>
+#include <time.h>
+#include <unistd.h>
#include <cutils/properties.h>
-#include <sys/system_properties.h>
+#include <cutils/sockets.h>
#include "dumpstate.h"
/* prints the contents of a file */
-int dump_file(const char* path) {
- char buffer[32768];
- int fd, amount_read;
- int ret = 0;
+int dump_file(const char *title, const char* path) {
+ char buffer[32768];
+ int fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ int err = errno;
+ if (title) printf("----- %s (%s) -----\n", title, path);
+ printf("*** %s: %s\n", path, strerror(err));
+ if (title) printf("\n");
+ return -1;
+ }
- fd = open(path, O_RDONLY);
- if (fd < 0)
- return fd;
+ if (title) printf("----- %s (%s", title, path);
- do {
- ret = read(fd, buffer, sizeof(buffer));
- if (ret > 0)
- ret = write(STDOUT_FILENO, buffer, ret);
- } while (ret > 0);
+ if (title) {
+ struct stat st;
+ if (memcmp(path, "/proc/", 6) && memcmp(path, "/sys/", 5) && !fstat(fd, &st)) {
+ char stamp[80];
+ time_t mtime = st.st_mtime;
+ strftime(stamp, sizeof(stamp), "%Y-%m-%d %H:%M:%S", localtime(&mtime));
+ printf(": %s", stamp);
+ }
+ printf(") -----\n");
+ }
- buffer[0] = '\n';
- write(STDOUT_FILENO, buffer, 1);
+ int newline = 0;
+ for (;;) {
+ int ret = read(fd, buffer, sizeof(buffer));
+ if (ret > 0) {
+ newline = (buffer[ret - 1] == '\n');
+ ret = fwrite(buffer, ret, 1, stdout);
+ }
+ if (ret <= 0) break;
+ }
close(fd);
- return ret;
-}
-
-/* prints the contents of all files in a directory */
-void dump_files(const char* path) {
- DIR* dir;
- struct dirent* entry;
- char buffer[PATH_MAX];
-
- dir = opendir(path);
- if (!dir) {
- fprintf(stderr, "could not open directory %s\n", path);
- return;
- }
-
- while ((entry = readdir(dir))) {
- if (entry->d_type == DT_REG) {
- snprintf(buffer, sizeof(buffer), "%s/%s", path, entry->d_name);
- dump_file(path);
- printf("\n");
- }
- }
-
- closedir(dir);
-}
-
-/* prints the name and value of a system property */
-int print_property(const char* name) {
- char value[PROP_VALUE_MAX];
-
- __system_property_get(name, value);
- printf("%s=%s\n", name, value);
+ if (!newline) printf("\n");
+ if (title) printf("\n");
return 0;
}
-static pid_t alarm_pid = 0;
-static int timed_out = 0;
-static void sig_alarm(int sig)
-{
- if (alarm_pid) {
- kill(alarm_pid, SIGKILL);
- timed_out = 1;
- alarm_pid = 0;
- }
-}
-
/* forks a command and waits for it to finish */
-int run_command(struct Command* cmd, int timeout) {
- struct sigaction sa;
- pid_t pid;
- int status;
+int run_command(const char *title, int timeout_seconds, const char *command, ...) {
+ fflush(stdout);
+ clock_t start = clock();
+ pid_t pid = fork();
- pid = fork();
/* handle error case */
- if (pid < 0)
+ if (pid < 0) {
+ printf("*** fork: %s\n", strerror(errno));
return pid;
+ }
/* handle child case */
if (pid == 0) {
- int ret = execv(cmd->path, cmd->args);
- if (ret)
- fprintf(stderr, "execv %s returned %d\n", cmd->path, ret);
- exit(ret);
+ const char *args[1024] = {command};
+ size_t arg;
+
+ va_list ap;
+ va_start(ap, command);
+ if (title) printf("----- %s (%s", title, command);
+ for (arg = 1; arg < sizeof(args) / sizeof(args[0]); ++arg) {
+ args[arg] = va_arg(ap, const char *);
+ if (args[arg] == NULL) break;
+ if (title) printf(" %s", args[arg]);
+ }
+ if (title) printf(") -----\n");
+ fflush(stdout);
+
+ execvp(command, (char**) args);
+ printf("*** exec(%s): %s\n", command, strerror(errno));
+ _exit(-1);
}
/* handle parent case */
- timed_out = 0;
- if (timeout) {
- memset(&sa, 0, sizeof(sa));
- sa.sa_flags = SA_RESETHAND;
- sa.sa_handler = sig_alarm;
- sigaction(SIGALRM, &sa, NULL);
+ for (;;) {
+ int status;
+ pid_t p = waitpid(pid, &status, WNOHANG);
+ float elapsed = (float) (clock() - start) / CLOCKS_PER_SEC;
+ if (p == pid) {
+ if (WIFSIGNALED(status)) {
+ printf("*** %s: Killed by signal %d\n", command, WTERMSIG(status));
+ } else if (WEXITSTATUS(status) > 0) {
+ printf("*** %s: Exit code %d\n", command, WEXITSTATUS(status));
+ }
+ if (title) printf("[%s: %.1fs elapsed]\n\n", command, elapsed);
+ return status;
+ }
- /* set an alarm so we don't hang forever */
- alarm_pid = pid;
- alarm(timeout);
+ if (timeout_seconds && elapsed > timeout_seconds) {
+ printf("*** %s: Timed out after %.1fs (killing pid %d)\n", command, elapsed, pid);
+ kill(pid, SIGTERM);
+ return -1;
+ }
+
+ usleep(100000); // poll every 0.1 sec
}
-
- waitpid(pid, &status, 0);
-
- if (timed_out)
- printf("ERROR: command %s timed out\n", cmd->path);
-
- return status;
}
-/* reads the current time into tm */
-void get_time(struct tm *tm) {
- time_t t;
+size_t num_props = 0;
+static char* props[2000];
- tzset();
- time(&t);
- localtime_r(&t, tm);
+static void print_prop(const char *key, const char *name, void *user) {
+ (void) user;
+ if (num_props < sizeof(props) / sizeof(props[0])) {
+ char buf[PROPERTY_KEY_MAX + PROPERTY_VALUE_MAX + 10];
+ snprintf(buf, sizeof(buf), "[%s]: [%s]\n", key, name);
+ props[num_props++] = strdup(buf);
+ }
}
-/* prints the date in tm */
-void print_date(const char* prompt, struct tm *tm) {
- char strbuf[260];
-
- strftime(strbuf, sizeof(strbuf),
- "%a %b %e %H:%M:%S %Z %Y",
- tm);
- printf("%s%s\n", prompt, strbuf);
-}
-
-
-static void print_prop(const char *key, const char *name,
- void *user __attribute__((unused)))
-{
- printf("[%s]: [%s]\n", key, name);
+static int compare_prop(const void *a, const void *b) {
+ return strcmp(*(char * const *) a, *(char * const *) b);
}
/* prints all the system properties */
void print_properties() {
+ size_t i;
+ num_props = 0;
property_list(print_prop, NULL);
+ qsort(&props, num_props, sizeof(props[0]), compare_prop);
+
+ printf("----- SYSTEM PROPERTIES -----\n");
+ for (i = 0; i < num_props; ++i) {
+ fputs(props[i], stdout);
+ free(props[i]);
+ }
+ printf("\n");
}
-/* creates directories as needed for the given path */
-void create_directories(char *path)
-{
+/* redirect output to a service control socket */
+void redirect_to_socket(FILE *redirect, const char *service) {
+ int s = android_get_control_socket(service);
+ if (s < 0) {
+ fprintf(stderr, "android_get_control_socket(%s): %s\n", service, strerror(errno));
+ exit(1);
+ }
+ if (listen(s, 4) < 0) {
+ fprintf(stderr, "listen(control socket): %s\n", strerror(errno));
+ exit(1);
+ }
+
+ struct sockaddr addr;
+ socklen_t alen = sizeof(addr);
+ int fd = accept(s, &addr, &alen);
+ if (fd < 0) {
+ fprintf(stderr, "accept(control socket): %s\n", strerror(errno));
+ exit(1);
+ }
+
+ fflush(redirect);
+ dup2(fd, fileno(redirect));
+ close(fd);
+}
+
+/* redirect output to a file, optionally gzipping; returns gzip pid (or -1) */
+pid_t redirect_to_file(FILE *redirect, char *path, int gzip_level) {
char *chp = path;
/* skip initial slash */
if (chp[0] == '/')
chp++;
+ /* create leading directories, if necessary */
while (chp && chp[0]) {
chp = strchr(chp, '/');
if (chp) {
*chp = 0;
- mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
- *chp = '/';
- chp++;
+ mkdir(path, 0775); /* drwxrwxr-x */
+ *chp++ = '/';
}
}
-}
-/* runs the vibrator using the given pattern */
-void vibrate_pattern(int fd, int* pattern)
-{
- struct timespec tm;
- char buffer[10];
-
- while (*pattern) {
- /* read vibrate on time */
- int on_time = *pattern++;
- snprintf(buffer, sizeof(buffer), "%d", on_time);
- write(fd, buffer, strlen(buffer));
-
- /* read vibrate off time */
- int delay = *pattern++;
- if (delay) {
- delay += on_time;
-
- tm.tv_sec = delay / 1000;
- tm.tv_nsec = (delay % 1000) * 1000000;
- nanosleep(&tm, NULL);
- } else
- break;
+ int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd < 0) {
+ fprintf(stderr, "%s: %s\n", path, strerror(errno));
+ exit(1);
}
-}
-/* prevents the OOM killer from killing us */
-void protect_from_oom_killer()
-{
- int fd;
+ pid_t gzip_pid = -1;
+ if (gzip_level > 0) {
+ int fds[2];
+ if (pipe(fds)) {
+ fprintf(stderr, "pipe: %s\n", strerror(errno));
+ exit(1);
+ }
- fd = open("/proc/self/oom_adj", O_WRONLY);
- if (fd >= 0) {
- // -17 should make us immune to OOM
- const char* text = "-17";
- write(fd, text, strlen(text));
+ fflush(redirect);
+ fflush(stdout);
+
+ gzip_pid = fork();
+ if (gzip_pid < 0) {
+ fprintf(stderr, "fork: %s\n", strerror(errno));
+ exit(1);
+ }
+
+ if (gzip_pid == 0) {
+ dup2(fds[0], STDIN_FILENO);
+ dup2(fd, STDOUT_FILENO);
+
+ close(fd);
+ close(fds[0]);
+ close(fds[1]);
+
+ char level[10];
+ snprintf(level, sizeof(level), "-%d", gzip_level);
+ execlp("gzip", "gzip", level, NULL);
+ fprintf(stderr, "exec(gzip): %s\n", strerror(errno));
+ _exit(-1);
+ }
+
close(fd);
+ close(fds[0]);
+ fd = fds[1];
}
+
+ dup2(fd, fileno(redirect));
+ close(fd);
+ return gzip_pid;
+}
+
+/* dump Dalvik stack traces, return the trace file location (NULL if none) */
+const char *dump_vm_traces() {
+ char traces_path[PROPERTY_VALUE_MAX] = "";
+ property_get("dalvik.vm.stack-trace-file", traces_path, "");
+ if (!traces_path[0]) return NULL;
+
+ /* move the old traces.txt (if any) out of the way temporarily */
+ char anr_traces_path[PATH_MAX];
+ strlcpy(anr_traces_path, traces_path, sizeof(anr_traces_path));
+ strlcat(anr_traces_path, ".anr", sizeof(anr_traces_path));
+ rename(traces_path, anr_traces_path);
+
+ /* create a new, empty traces.txt file to receive stack dumps */
+ int fd = open(traces_path, O_CREAT | O_WRONLY | O_TRUNC, 0666); /* -rw-rw-rw- */
+ if (fd < 0) {
+ fprintf(stderr, "%s: %s\n", traces_path, strerror(errno));
+ return NULL;
+ }
+ close(fd);
+
+ /* walk /proc and kill -QUIT all Dalvik processes */
+ DIR *proc = opendir("/proc");
+ if (proc == NULL) {
+ fprintf(stderr, "/proc: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ /* use inotify to find when processes are done dumping */
+ int ifd = inotify_init();
+ if (ifd < 0) {
+ fprintf(stderr, "inotify_init: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ int wfd = inotify_add_watch(ifd, traces_path, IN_CLOSE_WRITE);
+ if (wfd < 0) {
+ fprintf(stderr, "inotify_add_watch(%s): %s\n", traces_path, strerror(errno));
+ return NULL;
+ }
+
+ struct dirent *d;
+ while ((d = readdir(proc))) {
+ int pid = atoi(d->d_name);
+ if (pid <= 0) continue;
+
+ /* identify Dalvik: /proc/(pid)/exe = /system/bin/app_process */
+ char path[PATH_MAX], data[PATH_MAX];
+ snprintf(path, sizeof(path), "/proc/%d/exe", pid);
+ size_t len = readlink(path, data, sizeof(data) - 1);
+ if (len <= 0 || memcmp(data, "/system/bin/app_process", 23)) continue;
+
+ /* skip zygote -- it won't dump its stack anyway */
+ snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
+ int fd = open(path, O_RDONLY);
+ len = read(fd, data, sizeof(data) - 1);
+ close(fd);
+ if (len <= 0 || !memcmp(data, "zygote", 6)) continue;
+
+ if (kill(pid, SIGQUIT)) {
+ fprintf(stderr, "kill(%d, SIGQUIT): %s\n", pid, strerror(errno));
+ continue;
+ }
+
+ /* wait for the writable-close notification from inotify */
+ struct pollfd pfd = { ifd, POLLIN, 0 };
+ int ret = poll(&pfd, 1, 200); /* 200 msec timeout */
+ if (ret < 0) {
+ fprintf(stderr, "poll: %s\n", strerror(errno));
+ } else if (ret == 0) {
+ fprintf(stderr, "warning: timed out dumping pid %d\n", pid);
+ } else {
+ struct inotify_event ie;
+ read(ifd, &ie, sizeof(ie));
+ }
+ }
+
+ close(ifd);
+
+ static char dump_traces_path[PATH_MAX];
+ strlcpy(dump_traces_path, traces_path, sizeof(dump_traces_path));
+ strlcat(dump_traces_path, ".bugreport", sizeof(dump_traces_path));
+ if (rename(traces_path, dump_traces_path)) {
+ fprintf(stderr, "rename(%s, %s): %s\n", traces_path, dump_traces_path, strerror(errno));
+ return NULL;
+ }
+
+ /* replace the saved [ANR] traces.txt file */
+ rename(anr_traces_path, traces_path);
+ return dump_traces_path;
}
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 9765496..3bbfce8 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -230,6 +230,47 @@
}
/**
+ * Tests that the given account has the specified features. If this account does not exist
+ * then this call returns false.
+ * <p>
+ * This call returns immediately but runs asynchronously and the result is accessed via the
+ * {@link AccountManagerFuture} that is returned. This future is also passed as the sole
+ * parameter to the {@link AccountManagerCallback}. If the caller wished to use this
+ * method asynchronously then they will generally pass in a callback object that will get
+ * invoked with the {@link AccountManagerFuture}. If they wish to use it synchronously then
+ * they will generally pass null for the callback and instead call
+ * {@link android.accounts.AccountManagerFuture#getResult()} on this method's return value,
+ * which will then block until the request completes.
+ * <p>
+ * Requires that the caller has permission {@link android.Manifest.permission#GET_ACCOUNTS}.
+ *
+ * @param account The {@link Account} to test
+ * @param features the features for which to test
+ * @param callback A callback to invoke when the request completes. If null then
+ * no callback is invoked.
+ * @param handler The {@link Handler} to use to invoke the callback. If null then the
+ * main thread's {@link Handler} is used.
+ * @return an {@link AccountManagerFuture} that represents the future result of the call.
+ * The future result is a {@link Boolean} that is true if the account exists and has the
+ * specified features.
+ */
+ public AccountManagerFuture<Boolean> testHasFeatures(final Account account,
+ final String[] features,
+ AccountManagerCallback<Boolean> callback, Handler handler) {
+ return new Future2Task<Boolean>(handler, callback) {
+ public void doWork() throws RemoteException {
+ mService.testHasFeatures(mResponse, account, features);
+ }
+ public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException {
+ if (!bundle.containsKey(KEY_BOOLEAN_RESULT)) {
+ throw new AuthenticatorException("no result in response");
+ }
+ return bundle.getBoolean(KEY_BOOLEAN_RESULT);
+ }
+ }.start();
+ }
+
+ /**
* Add an account to the AccountManager's set of known accounts.
* <p>
* Requires that the caller has permission
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index d5a9b02..f5166c2 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -449,6 +449,64 @@
return db.insert(TABLE_EXTRAS, EXTRAS_KEY, values);
}
+ public void testHasFeatures(IAccountManagerResponse response,
+ Account account, String[] features) {
+ checkReadAccountsPermission();
+ long identityToken = clearCallingIdentity();
+ try {
+ new TestFeaturesSession(response, account, features).bind();
+ } finally {
+ restoreCallingIdentity(identityToken);
+ }
+ }
+
+ private class TestFeaturesSession extends Session {
+ private final String[] mFeatures;
+ private final Account mAccount;
+
+ public TestFeaturesSession(IAccountManagerResponse response,
+ Account account, String[] features) {
+ super(response, account.type, false /* expectActivityLaunch */);
+ mFeatures = features;
+ mAccount = account;
+ }
+
+ public void run() throws RemoteException {
+ try {
+ mAuthenticator.hasFeatures(this, mAccount, mFeatures);
+ } catch (RemoteException e) {
+ onError(AccountManager.ERROR_CODE_REMOTE_EXCEPTION, "remote exception");
+ }
+ }
+
+ public void onResult(Bundle result) {
+ IAccountManagerResponse response = getResponseAndClose();
+ if (response != null) {
+ try {
+ if (result == null) {
+ onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "null bundle");
+ return;
+ }
+ final Bundle newResult = new Bundle();
+ newResult.putBoolean(AccountManager.KEY_BOOLEAN_RESULT,
+ result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT, false));
+ response.onResult(newResult);
+ } catch (RemoteException e) {
+ // if the caller is dead then there is no one to care about remote exceptions
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "failure while notifying response", e);
+ }
+ }
+ }
+ }
+
+ protected String toDebugString(long now) {
+ return super.toDebugString(now) + ", testHasFeatures"
+ + ", " + mAccount
+ + ", " + (mFeatures != null ? TextUtils.join(",", mFeatures) : null);
+ }
+ }
+
public void removeAccount(IAccountManagerResponse response, Account account) {
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index 0e318c0..cbd26ee 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -31,6 +31,8 @@
String getUserData(in Account account, String key);
AuthenticatorDescription[] getAuthenticatorTypes();
Account[] getAccounts(String accountType);
+ void testHasFeatures(in IAccountManagerResponse response, in Account account,
+ in String[] features);
void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features);
boolean addAccount(in Account account, String password, in Bundle extras);
void removeAccount(in IAccountManagerResponse response, in Account account);
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index a75e8dc..9112be4 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1332,7 +1332,7 @@
public final static String EXTRA_DATA_KEY = "intent_extra_data_key";
/**
- * String extra data key for {@link Intent#ACTION_GLOBAL_SEARCH} intents. Contains the initial
+ * String extra data key for {@link #INTENT_ACTION_GLOBAL_SEARCH} intents. Contains the initial
* query to show in the global search activity.
*
* @hide Pending API council approval
@@ -1340,7 +1340,7 @@
public final static String INITIAL_QUERY = "initial_query";
/**
- * Boolean extra data key for {@link Intent#ACTION_GLOBAL_SEARCH} intents. If {@code true},
+ * Boolean extra data key for {@link Intent#INTENT_ACTION_GLOBAL_SEARCH} intents. If {@code true},
* the initial query should be selected.
*
* @hide Pending API council approval
@@ -1816,7 +1816,7 @@
Log.w(TAG, "No global search activity found.");
return;
}
- Intent intent = new Intent(Intent.ACTION_GLOBAL_SEARCH);
+ Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH);
intent.setComponent(globalSearchActivity);
// TODO: Always pass name of calling package as an extra?
if (appSearchData != null) {
@@ -1847,7 +1847,7 @@
* we have settled on the right mechanism for finding the global search activity.
*/
private ComponentName getGlobalSearchActivity() {
- Intent intent = new Intent(Intent.ACTION_GLOBAL_SEARCH);
+ Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH);
PackageManager pm = mContext.getPackageManager();
List<ResolveInfo> activities =
pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index bf37b62..bbd359b 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1102,16 +1102,6 @@
public static final String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
/**
- * Activity Action: Start the global search activity.
- * <p>Input: Nothing.
- * <p>Output: Nothing.
- *
- * @hide Pending API council approval
- */
- @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_GLOBAL_SEARCH = "android.intent.action.GLOBAL_SEARCH";
-
- /**
* Activity Action: The user pressed the "Report" button in the crash/ANR dialog.
* This intent is delivered to the package which installed the application, usually
* the Market.
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index a70866d..30799ec 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -129,14 +129,14 @@
public static final int TYPE_WIFI = 1;
/**
* An MMS-specific Mobile data connection. This connection may be the
- * same as {@link #TYPEMOBILE} but it may be different. This is used
+ * same as {@link #TYPE_MOBILE} but it may be different. This is used
* by applications needing to talk to the carrier's Multimedia Messaging
* Service servers. It may coexist with default data connections.
*/
public static final int TYPE_MOBILE_MMS = 2;
/**
* A SUPL-specific Mobile data connection. This connection may be the
- * same as {@link #TYPEMOBILE} but it may be different. This is used
+ * same as {@link #TYPE_MOBILE} but it may be different. This is used
* by applications needing to talk to the carrier's Secure User Plane
* Location servers for help locating the device. It may coexist with
* default data connections.
@@ -144,7 +144,7 @@
public static final int TYPE_MOBILE_SUPL = 3;
/**
* A DUN-specific Mobile data connection. This connection may be the
- * same as {@link #TYPEMOBILE} but it may be different. This is used
+ * same as {@link #TYPE_MOBILE} but it may be different. This is used
* by applicaitons performing a Dial Up Networking bridge so that
* the carrier is aware of DUN traffic. It may coexist with default data
* connections.
@@ -152,7 +152,7 @@
public static final int TYPE_MOBILE_DUN = 4;
/**
* A High Priority Mobile data connection. This connection is typically
- * the same as {@link #TYPEMOBILE} but the routing setup is different.
+ * the same as {@link #TYPE_MOBILE} but the routing setup is different.
* Only requesting processes will have access to the Mobile DNS servers
* and only IP's explicitly requested via {@link #requestRouteToHost}
* will route over this interface if a default route exists.
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 4860cbd..747ae30 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -1638,6 +1638,13 @@
*/
public static final String LAST_TRY = "last_try";
}
+
+ public static final class WordsTable {
+ public static final String ID = "_id";
+ public static final String SOURCE_ROW_ID = "source_id";
+ public static final String TABLE_ID = "table_to_use";
+ public static final String INDEXED_TEXT = "index_text";
+ }
}
public static final class Carriers implements BaseColumns {
diff --git a/core/java/android/webkit/MimeTypeMap.java b/core/java/android/webkit/MimeTypeMap.java
index 84a8a3c..a9d6ff6 100644
--- a/core/java/android/webkit/MimeTypeMap.java
+++ b/core/java/android/webkit/MimeTypeMap.java
@@ -124,6 +124,11 @@
return null;
}
+ // Static method called by jni.
+ private static String mimeTypeFromExtension(String extension) {
+ return getSingleton().getMimeTypeFromExtension(extension);
+ }
+
/**
* Return true if the given extension has a registered MIME type.
* @param extension A file extension without the leading '.'
@@ -344,6 +349,7 @@
sMimeTypeMap.loadEntry("application/x-pkcs7-crl", "crl");
sMimeTypeMap.loadEntry("application/x-quicktimeplayer", "qtl");
sMimeTypeMap.loadEntry("application/x-shar", "shar");
+ sMimeTypeMap.loadEntry("application/x-shockwave-flash", "swf");
sMimeTypeMap.loadEntry("application/x-stuffit", "sit");
sMimeTypeMap.loadEntry("application/x-sv4cpio", "sv4cpio");
sMimeTypeMap.loadEntry("application/x-sv4crc", "sv4crc");
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index e241c77..32199a0 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1567,7 +1567,12 @@
if (!hasWindowFocus) {
setChildrenDrawingCacheEnabled(false);
- removeCallbacks(mFlingRunnable);
+ if (mFlingRunnable != null) {
+ removeCallbacks(mFlingRunnable);
+ // let the fling runnable report it's new state which
+ // should be idle
+ mFlingRunnable.endFling();
+ }
// Always hide the type filter
dismissPopup();
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index 66f0e82..53bb586 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -131,6 +131,7 @@
the first component from this list which is found to be installed is set as the
preferred activity. -->
<string-array name="default_web_search_providers">
+ <item>com.android.quicksearchbox/com.android.googlesearch.GoogleSearch</item>
<item>com.google.android.providers.enhancedgooglesearch/.Launcher</item>
<item>com.android.googlesearch/.GoogleSearch</item>
<item>com.android.websearch/.Search.1</item>
diff --git a/include/media/mediametadataretriever.h b/include/media/mediametadataretriever.h
index cfc205c..113c452 100644
--- a/include/media/mediametadataretriever.h
+++ b/include/media/mediametadataretriever.h
@@ -53,6 +53,7 @@
METADATA_KEY_VIDEO_HEIGHT = 19,
METADATA_KEY_VIDEO_WIDTH = 20,
METADATA_KEY_WRITER = 21,
+ METADATA_KEY_MIMETYPE = 22,
// Add more here...
};
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index ef30b02..2bc2734 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -57,6 +57,9 @@
kKeyYear = 'year', // cstring
kKeyAlbumArt = 'albA', // compressed image data
kKeyAlbumArtMIME = 'alAM', // cstring
+ kKeyAuthor = 'auth', // cstring
+ kKeyCDTrackNumber = 'cdtr', // cstring
+ kKeyDate = 'date', // cstring
};
enum {
diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp
index b528c46..656a3c3 100644
--- a/libs/rs/rsProgram.cpp
+++ b/libs/rs/rsProgram.cpp
@@ -110,7 +110,6 @@
void Program::bindAllocation(Allocation *alloc, uint32_t slot)
{
- LOGE("bind alloc %p %i", alloc, slot);
if (mConstants[slot].get() == alloc) {
return;
}
diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
index 8849bda..cf6d7fc 100644
--- a/libs/rs/rsProgramVertex.cpp
+++ b/libs/rs/rsProgramVertex.cpp
@@ -124,7 +124,6 @@
mShader.append(mUniformNames[0]);
mShader.append(";\n");
- LOGE("constant %i ", mConstantCount);
for (uint32_t ct=0; ct < mConstantCount; ct++) {
const Element *e = mConstantTypes[ct]->getElement();
for (uint32_t field=0; field < e->getFieldCount(); field++) {
@@ -337,7 +336,7 @@
mUniformCount = 1;
mUniformNames[0].setTo("UNI_MVP");
- for (uint32_t ct=0; ct < mInputCount; ct++) {
+ for (uint32_t ct=0; ct < mConstantCount; ct++) {
initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
}
} else {
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index cecf4f8..04f8b5d 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -255,5 +255,6 @@
public static final int METADATA_KEY_VIDEO_HEIGHT = 19;
public static final int METADATA_KEY_VIDEO_WIDTH = 20;
public static final int METADATA_KEY_WRITER = 21;
+ public static final int METADATA_KEY_MIMETYPE = 22;
// Add more here...
}
diff --git a/media/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp
index bdd7550..3193d5e 100644
--- a/media/libstagefright/AMRExtractor.cpp
+++ b/media/libstagefright/AMRExtractor.cpp
@@ -128,6 +128,18 @@
AMRExtractor::~AMRExtractor() {
}
+sp<MetaData> AMRExtractor::getMetaData() {
+ sp<MetaData> meta = new MetaData;
+
+ if (mInitCheck != OK) {
+ return meta;
+ }
+
+ meta->setCString(kKeyMIMEType, mIsWide ? "audio/amr-wb" : "audio/amr");
+
+ return meta;
+}
+
size_t AMRExtractor::countTracks() {
return mInitCheck == OK ? 1 : 0;
}
diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp
index 5df1e00..accd94d 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -711,6 +711,10 @@
sp<MetaData> MP3Extractor::getMetaData() {
sp<MetaData> meta = new MetaData;
+ if (mFirstFramePos < 0) {
+ return meta;
+ }
+
meta->setCString(kKeyMIMEType, "audio/mpeg");
ID3 id3(mDataSource);
@@ -729,8 +733,10 @@
{ kKeyArtist, "TPE1", "TP1" },
{ kKeyComposer, "TCOM", "TCM" },
{ kKeyGenre, "TCON", "TCO" },
- { kKeyTitle, "TALB", "TAL" },
+ { kKeyTitle, "TIT2", "TT2" },
{ kKeyYear, "TYE", "TYER" },
+ { kKeyAuthor, "TXT", "TEXT" },
+ { kKeyCDTrackNumber, "TRK", "TRCK" },
};
static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index b340b29..9e7f1c7 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -152,6 +152,7 @@
MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source)
: mDataSource(source),
mHaveMetadata(false),
+ mHasVideo(false),
mFirstTrack(NULL),
mLastTrack(NULL) {
}
@@ -167,6 +168,23 @@
mFirstTrack = mLastTrack = NULL;
}
+sp<MetaData> MPEG4Extractor::getMetaData() {
+ sp<MetaData> meta = new MetaData;
+
+ status_t err;
+ if ((err = readMetaData()) != OK) {
+ return meta;
+ }
+
+ if (mHasVideo) {
+ meta->setCString(kKeyMIMEType, "video/mp4");
+ } else {
+ meta->setCString(kKeyMIMEType, "audio/mp4");
+ }
+
+ return meta;
+}
+
size_t MPEG4Extractor::countTracks() {
status_t err;
if ((err = readMetaData()) != OK) {
@@ -235,7 +253,7 @@
status_t err;
while ((err = parseChunk(&offset, 0)) == OK) {
}
-
+
if (mHaveMetadata) {
return OK;
}
@@ -561,6 +579,8 @@
case FOURCC('s', '2', '6', '3'):
case FOURCC('a', 'v', 'c', '1'):
{
+ mHasVideo = true;
+
if (mHandlerType != FOURCC('v', 'i', 'd', 'e')) {
return ERROR_MALFORMED;
}
diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp
index 4815db2..3451383 100644
--- a/media/libstagefright/StagefrightMediaScanner.cpp
+++ b/media/libstagefright/StagefrightMediaScanner.cpp
@@ -179,6 +179,12 @@
if (mRetriever->setDataSource(path) == OK
&& mRetriever->setMode(
METADATA_MODE_METADATA_RETRIEVAL_ONLY) == OK) {
+ const char *value;
+ if ((value = mRetriever->extractMetadata(
+ METADATA_KEY_MIMETYPE)) != NULL) {
+ client.setMimeType(value);
+ }
+
struct KeyMap {
const char *tag;
int key;
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index be4a9d9..c7877a9 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -275,9 +275,13 @@
int to;
};
static const Map kMap[] = {
+ { kKeyMIMEType, METADATA_KEY_MIMETYPE },
+ { kKeyCDTrackNumber, METADATA_KEY_CD_TRACK_NUMBER },
{ kKeyAlbum, METADATA_KEY_ALBUM },
{ kKeyArtist, METADATA_KEY_ARTIST },
+ { kKeyAuthor, METADATA_KEY_AUTHOR },
{ kKeyComposer, METADATA_KEY_COMPOSER },
+ { kKeyDate, METADATA_KEY_DATE },
{ kKeyGenre, METADATA_KEY_GENRE },
{ kKeyTitle, METADATA_KEY_TITLE },
{ kKeyYear, METADATA_KEY_YEAR },
@@ -301,9 +305,16 @@
memcpy(mAlbumArt->mData, data, dataSize);
}
+ size_t numTracks = mExtractor->countTracks();
+
+ char tmp[32];
+ sprintf(tmp, "%d", numTracks);
+
+ mMetaData.add(METADATA_KEY_NUM_TRACKS, String8(tmp));
+
// The overall duration is the duration of the longest track.
int64_t maxDurationUs = 0;
- for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
+ for (size_t i = 0; i < numTracks; ++i) {
sp<MetaData> trackMeta = mExtractor->getTrackMetaData(i);
int64_t durationUs;
@@ -315,7 +326,6 @@
}
// The duration value is a string representing the duration in ms.
- char tmp[32];
sprintf(tmp, "%lld", (maxDurationUs + 500) / 1000);
mMetaData.add(METADATA_KEY_DURATION, String8(tmp));
diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp
index 542c764..959a767 100644
--- a/media/libstagefright/WAVExtractor.cpp
+++ b/media/libstagefright/WAVExtractor.cpp
@@ -82,6 +82,18 @@
WAVExtractor::~WAVExtractor() {
}
+sp<MetaData> WAVExtractor::getMetaData() {
+ sp<MetaData> meta = new MetaData;
+
+ if (mInitCheck != OK) {
+ return meta;
+ }
+
+ meta->setCString(kKeyMIMEType, "audio/x-wav");
+
+ return meta;
+}
+
size_t WAVExtractor::countTracks() {
return mInitCheck == OK ? 1 : 0;
}
diff --git a/media/libstagefright/include/AMRExtractor.h b/media/libstagefright/include/AMRExtractor.h
index 1972a1c..db49fe4 100644
--- a/media/libstagefright/include/AMRExtractor.h
+++ b/media/libstagefright/include/AMRExtractor.h
@@ -32,6 +32,8 @@
virtual sp<MediaSource> getTrack(size_t index);
virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual sp<MetaData> getMetaData();
+
protected:
virtual ~AMRExtractor();
diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h
index ce4736d..0e360e8 100644
--- a/media/libstagefright/include/MPEG4Extractor.h
+++ b/media/libstagefright/include/MPEG4Extractor.h
@@ -31,9 +31,11 @@
// Extractor assumes ownership of "source".
MPEG4Extractor(const sp<DataSource> &source);
- size_t countTracks();
- sp<MediaSource> getTrack(size_t index);
- sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual size_t countTracks();
+ virtual sp<MediaSource> getTrack(size_t index);
+ virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+
+ virtual sp<MetaData> getMetaData();
protected:
virtual ~MPEG4Extractor();
@@ -49,6 +51,7 @@
sp<DataSource> mDataSource;
bool mHaveMetadata;
+ bool mHasVideo;
Track *mFirstTrack, *mLastTrack;
diff --git a/media/libstagefright/include/WAVExtractor.h b/media/libstagefright/include/WAVExtractor.h
index 10b9700..8545efc 100644
--- a/media/libstagefright/include/WAVExtractor.h
+++ b/media/libstagefright/include/WAVExtractor.h
@@ -34,6 +34,8 @@
virtual sp<MediaSource> getTrack(size_t index);
virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual sp<MetaData> getMetaData();
+
protected:
virtual ~WAVExtractor();
diff --git a/telephony/java/com/android/internal/telephony/Call.java b/telephony/java/com/android/internal/telephony/Call.java
index b95dd11..4967ab8 100644
--- a/telephony/java/com/android/internal/telephony/Call.java
+++ b/telephony/java/com/android/internal/telephony/Call.java
@@ -18,6 +18,8 @@
import java.util.List;
+import android.util.Log;
+
/**
* {@hide}
*/
@@ -54,6 +56,8 @@
// merged, etc.
protected boolean isGeneric = false;
+ protected final String LOG_TAG = "Call";
+
/* Instance Methods */
/** Do not modify the List result!!! This list is not yours to keep
@@ -235,4 +239,17 @@
public void setGeneric(boolean generic) {
isGeneric = generic;
}
+
+ /**
+ * Hangup call if it is alive
+ */
+ public void hangupIfAlive() {
+ if (getState().isAlive()) {
+ try {
+ hangup();
+ } catch (CallStateException ex) {
+ Log.w(LOG_TAG, " hangupIfActive: caught " + ex);
+ }
+ }
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index 6892998..7383649 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -271,6 +271,13 @@
protected abstract void updateSpnDisplay();
protected abstract void setPowerStateToDesired();
+ /**
+ * Clean up existing voice and data connection then turn off radio power.
+ *
+ * Hang up the existing voice calls to decrease call drop rate.
+ */
+ protected abstract void powerOffRadioSafely();
+
/** Cancel a pending (if any) pollState() operation */
protected void cancelPollState() {
// This will effectively cancel the rest of the poll requests.
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index af3cbd5..42feaa9 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -514,7 +514,7 @@
synchronized(this) {
if (mPendingRadioPowerOffAfterDataOff) {
if (DBG) log("EVENT_SET_RADIO_OFF, turn radio off now.");
- cm.setRadioPower(false, null);
+ hangupAndPowerOff();
mPendingRadioPowerOffAfterDataOff = false;
}
}
@@ -541,32 +541,42 @@
dcTracker.getStateInString(),
dcTracker.getAnyDataEnabled() ? 1 : 0);
}
- Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
- msg.arg1 = 1; // tearDown is true
- msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
- dcTracker.sendMessage(msg);
- synchronized(this) {
- if (!mPendingRadioPowerOffAfterDataOff) {
- DataConnectionTracker.State currentState = dcTracker.getState();
- if (currentState != DataConnectionTracker.State.CONNECTED
- && currentState != DataConnectionTracker.State.DISCONNECTING
- && currentState != DataConnectionTracker.State.INITING) {
- if (DBG) log("Data disconnected, turn off radio right away.");
- cm.setRadioPower(false, null);
+ // If it's on and available and we want it off gracefully
+ powerOffRadioSafely();
+ } // Otherwise, we're in the desired state
+ }
+
+ @Override
+ protected void powerOffRadioSafely(){
+ // clean data connection
+ DataConnectionTracker dcTracker = phone.mDataConnection;
+
+ Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
+ msg.arg1 = 1; // tearDown is true
+ msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
+ dcTracker.sendMessage(msg);
+
+ synchronized(this) {
+ if (!mPendingRadioPowerOffAfterDataOff) {
+ DataConnectionTracker.State currentState = dcTracker.getState();
+ if (currentState != DataConnectionTracker.State.CONNECTED
+ && currentState != DataConnectionTracker.State.DISCONNECTING
+ && currentState != DataConnectionTracker.State.INITING) {
+ if (DBG) log("Data disconnected, turn off radio right away.");
+ hangupAndPowerOff();
+ }
+ else if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 30000)) {
+ if (DBG) {
+ log("Wait up to 30 sec for data to disconnect, then turn off radio.");
}
- else if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 30000)) {
- if (DBG) {
- log("Wait up to 30 sec for data to disconnect, then turn off radio.");
- }
- mPendingRadioPowerOffAfterDataOff = true;
- } else {
- Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away.");
- cm.setRadioPower(false, null);
- }
+ mPendingRadioPowerOffAfterDataOff = true;
+ } else {
+ Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away.");
+ hangupAndPowerOff();
}
}
- } // Otherwise, we're in the desired state
+ }
}
@Override
@@ -1644,11 +1654,19 @@
if (mPendingRadioPowerOffAfterDataOff) {
if (DBG) log("Process pending request to turn radio off.");
removeMessages(EVENT_SET_RADIO_POWER_OFF);
- cm.setRadioPower(false, null);
+ hangupAndPowerOff();
mPendingRadioPowerOffAfterDataOff = false;
return true;
}
return false;
}
}
+
+ private void hangupAndPowerOff() {
+ // hang up all active voice calls
+ phone.mCT.ringingCall.hangupIfAlive();
+ phone.mCT.backgroundCall.hangupIfAlive();
+ phone.mCT.foregroundCall.hangupIfAlive();
+ cm.setRadioPower(false, null);
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 3f52eff..6695ccb 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -808,7 +808,7 @@
protected void restartRadio() {
Log.d(LOG_TAG, "************TURN OFF RADIO**************");
cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF);
- phone.mCM.setRadioPower(false, null);
+ mGsmPhone.mSST.powerOffRadioSafely();
/* Note: no need to call setRadioPower(true). Assuming the desired
* radio power state is still ON (as tracked by ServiceStateTracker),
* ServiceStateTracker will call setRadioPower when it receives the
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index c2c89c01..48e5c97 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -518,26 +518,41 @@
EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF,
dcTracker.getStateInString(), dcTracker.getAnyDataEnabled() ? 1 : 0);
}
- Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
- msg.arg1 = 1; // tearDown is true
- msg.obj = GSMPhone.REASON_RADIO_TURNED_OFF;
- dcTracker.sendMessage(msg);
-
- // poll data state up to 15 times, with a 100ms delay
- // totaling 1.5 sec. Normal data disable action will finish in 100ms.
- for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
- if (dcTracker.getState() != DataConnectionTracker.State.CONNECTED
- && dcTracker.getState() != DataConnectionTracker.State.DISCONNECTING) {
- Log.d(LOG_TAG, "Data shutdown complete.");
- break;
- }
- SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
- }
- // If it's on and available and we want it off..
- cm.setRadioPower(false, null);
+ // If it's on and available and we want it off gracefully
+ powerOffRadioSafely();
} // Otherwise, we're in the desired state
}
+ @Override
+ protected void powerOffRadioSafely() {
+ // clean data connection
+ DataConnectionTracker dcTracker = phone.mDataConnection;
+ Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
+ msg.arg1 = 1; // tearDown is true
+ msg.obj = GSMPhone.REASON_RADIO_TURNED_OFF;
+ dcTracker.sendMessage(msg);
+
+ // poll data state up to 15 times, with a 100ms delay
+ // totaling 1.5 sec. Normal data disable action will finish in 100ms.
+ for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
+ if (dcTracker.getState() != DataConnectionTracker.State.CONNECTED
+ && dcTracker.getState() != DataConnectionTracker.State.DISCONNECTING) {
+ Log.d(LOG_TAG, "Data shutdown complete.");
+ break;
+ }
+ SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
+ }
+
+ // hang up all active voice calls
+ if (phone.isInCall()) {
+ phone.mCT.ringingCall.hangupIfAlive();
+ phone.mCT.backgroundCall.hangupIfAlive();
+ phone.mCT.foregroundCall.hangupIfAlive();
+ }
+
+ cm.setRadioPower(false, null);
+ }
+
protected void updateSpnDisplay() {
int rule = phone.mSIMRecords.getDisplayRule(ss.getOperatorNumeric());
String spn = phone.mSIMRecords.getServiceProviderName();
diff --git a/tests/AndroidTests/src/com/android/unit_tests/AndroidTests.java b/tests/AndroidTests/src/com/android/unit_tests/AndroidTests.java
deleted file mode 100644
index 4b86add..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/AndroidTests.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2005 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 com.android.unit_tests;
-
-import android.test.FrameworkTests;
-import android.test.suitebuilder.TestSuiteBuilder;
-
-import junit.framework.TestSuite;
-
-public class AndroidTests extends TestSuite {
-
- public static TestSuite suite() {
- TestSuiteBuilder suiteBuilder = new TestSuiteBuilder(AndroidTests.class);
- TestSuite suite = suiteBuilder.includeAllPackagesUnderHere().build();
-
- return suite;
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/DatabaseCursorTest.java b/tests/AndroidTests/src/com/android/unit_tests/DatabaseCursorTest.java
deleted file mode 100644
index 5df499d..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/DatabaseCursorTest.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.database.CursorIndexOutOfBoundsException;
-import android.database.DataSetObserver;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteCursor;
-import android.database.sqlite.SQLiteCursorDriver;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQuery;
-import android.database.sqlite.SQLiteStatement;
-import android.os.Looper;
-import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Random;
-
-import junit.framework.TestCase;
-
-public class DatabaseCursorTest extends TestCase implements PerformanceTestCase {
-
- private static final String sString1 = "this is a test";
- private static final String sString2 = "and yet another test";
- private static final String sString3 = "this string is a little longer, but still a test";
-
- private static final int CURRENT_DATABASE_VERSION = 42;
- private SQLiteDatabase mDatabase;
- private File mDatabaseFile;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mDatabaseFile = new File("/sqlite_stmt_journals", "database_test.db");
- if (mDatabaseFile.exists()) {
- mDatabaseFile.delete();
- }
- mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
- assertNotNull(mDatabase);
- mDatabase.setVersion(CURRENT_DATABASE_VERSION);
- }
-
- @Override
- protected void tearDown() throws Exception {
- mDatabase.close();
- mDatabaseFile.delete();
- super.tearDown();
- }
-
- public boolean isPerformanceOnly() {
- return false;
- }
-
- // These test can only be run once.
- public int startPerformance(Intermediates intermediates) {
- return 1;
- }
-
- private void populateDefaultTable() {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
-
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString1 + "');");
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString2 + "');");
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString3 + "');");
- }
-
- @MediumTest
- public void testCursorUpdate() {
- mDatabase.execSQL(
- "CREATE TABLE test (_id INTEGER PRIMARY KEY, d INTEGER, s INTEGER);");
- for(int i = 0; i < 20; i++) {
- mDatabase.execSQL("INSERT INTO test (d, s) VALUES (" + i +
- "," + i%2 + ");");
- }
-
- Cursor c = mDatabase.query("test", null, "s = 0", null, null, null, null);
- int dCol = c.getColumnIndexOrThrow("d");
- int sCol = c.getColumnIndexOrThrow("s");
-
- int count = 0;
- while (c.moveToNext()) {
- assertTrue(c.updateInt(dCol, 3));
- count++;
- }
- assertEquals(10, count);
-
- assertTrue(c.commitUpdates());
-
- assertTrue(c.requery());
-
- count = 0;
- while (c.moveToNext()) {
- assertEquals(3, c.getInt(dCol));
- count++;
- }
-
- assertEquals(10, count);
- assertTrue(c.moveToFirst());
- assertTrue(c.deleteRow());
- assertEquals(9, c.getCount());
- c.close();
- }
-
- @MediumTest
- public void testBlob() throws Exception {
- // create table
- mDatabase.execSQL(
- "CREATE TABLE test (_id INTEGER PRIMARY KEY, s TEXT, d REAL, l INTEGER, b BLOB);");
- // insert blob
- Object[] args = new Object[4];
-
- byte[] blob = new byte[1000];
- byte value = 99;
- Arrays.fill(blob, value);
- args[3] = blob;
-
- String s = new String("text");
- args[0] = s;
- Double d = 99.9;
- args[1] = d;
- Long l = (long)1000;
- args[2] = l;
-
- String sql = "INSERT INTO test (s, d, l, b) VALUES (?,?,?,?)";
- mDatabase.execSQL(sql, args);
- // use cursor to access blob
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- c.moveToNext();
- ContentValues cv = new ContentValues();
- DatabaseUtils.cursorRowToContentValues(c, cv);
-
- int bCol = c.getColumnIndexOrThrow("b");
- int sCol = c.getColumnIndexOrThrow("s");
- int dCol = c.getColumnIndexOrThrow("d");
- int lCol = c.getColumnIndexOrThrow("l");
- byte[] cBlob = c.getBlob(bCol);
- assertTrue(Arrays.equals(blob, cBlob));
- assertEquals(s, c.getString(sCol));
- assertEquals((double)d, c.getDouble(dCol));
- assertEquals((long)l, c.getLong(lCol));
-
- // new byte[]
- byte[] newblob = new byte[1000];
- value = 98;
- Arrays.fill(blob, value);
-
- c.updateBlob(bCol, newblob);
- cBlob = c.getBlob(bCol);
- assertTrue(Arrays.equals(newblob, cBlob));
-
- // commit
- assertTrue(c.commitUpdates());
- assertTrue(c.requery());
- c.moveToNext();
- cBlob = c.getBlob(bCol);
- assertTrue(Arrays.equals(newblob, cBlob));
- c.close();
- }
-
- @MediumTest
- public void testRealColumns() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data REAL);");
- ContentValues values = new ContentValues();
- values.put("data", 42.11);
- long id = mDatabase.insert("test", "data", values);
- assertTrue(id > 0);
- Cursor c = mDatabase.rawQuery("SELECT data FROM test", null);
- assertNotNull(c);
- assertTrue(c.moveToFirst());
- assertEquals(42.11, c.getDouble(0));
- c.close();
- }
-
- @MediumTest
- public void testCursor1() throws Exception {
- populateDefaultTable();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
-
- int dataColumn = c.getColumnIndexOrThrow("data");
-
- // The cursor should ignore text before the last period when looking for a column. (This
- // is a temporary hack in all implementations of getColumnIndex.)
- int dataColumn2 = c.getColumnIndexOrThrow("junk.data");
- assertEquals(dataColumn, dataColumn2);
-
- assertSame(3, c.getCount());
-
- assertTrue(c.isBeforeFirst());
-
- try {
- c.getInt(0);
- fail("CursorIndexOutOfBoundsException expected");
- } catch (CursorIndexOutOfBoundsException ex) {
- // expected
- }
-
- c.moveToNext();
- assertEquals(1, c.getInt(0));
-
- String s = c.getString(dataColumn);
- assertEquals(sString1, s);
-
- c.moveToNext();
- s = c.getString(dataColumn);
- assertEquals(sString2, s);
-
- c.moveToNext();
- s = c.getString(dataColumn);
- assertEquals(sString3, s);
-
- c.moveToPosition(-1);
- c.moveToNext();
- s = c.getString(dataColumn);
- assertEquals(sString1, s);
-
- c.moveToPosition(2);
- s = c.getString(dataColumn);
- assertEquals(sString3, s);
-
- int i;
-
- for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) {
- c.getInt(0);
- }
-
- assertEquals(3, i);
-
- try {
- c.getInt(0);
- fail("CursorIndexOutOfBoundsException expected");
- } catch (CursorIndexOutOfBoundsException ex) {
- // expected
- }
- c.close();
- }
-
- @MediumTest
- public void testCursor2() throws Exception {
- populateDefaultTable();
-
- Cursor c = mDatabase.query("test", null, "_id > 1000", null, null, null, null);
- assertEquals(0, c.getCount());
- assertTrue(c.isBeforeFirst());
-
- try {
- c.getInt(0);
- fail("CursorIndexOutOfBoundsException expected");
- } catch (CursorIndexOutOfBoundsException ex) {
- // expected
- }
-
- int i;
- for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) {
- c.getInt(0);
- }
- assertEquals(0, i);
- try {
- c.getInt(0);
- fail("CursorIndexOutOfBoundsException expected");
- } catch (CursorIndexOutOfBoundsException ex) {
- // expected
- }
- c.close();
- }
-
- @MediumTest
- public void testLargeField() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
-
- StringBuilder sql = new StringBuilder(2100);
- sql.append("INSERT INTO test (data) VALUES ('");
- Random random = new Random(System.currentTimeMillis());
- StringBuilder randomString = new StringBuilder(1979);
- for (int i = 0; i < 1979; i++) {
- randomString.append((random.nextInt() & 0xf) % 10);
- }
- sql.append(randomString);
- sql.append("');");
- mDatabase.execSQL(sql.toString());
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- assertNotNull(c);
- assertEquals(1, c.getCount());
-
- assertTrue(c.moveToFirst());
- assertEquals(0, c.getPosition());
- String largeString = c.getString(c.getColumnIndexOrThrow("data"));
- assertNotNull(largeString);
- assertEquals(randomString.toString(), largeString);
- c.close();
- }
-
- class TestObserver extends DataSetObserver {
- int total;
- SQLiteCursor c;
- boolean quit = false;
- public TestObserver(int total_, SQLiteCursor cursor) {
- c = cursor;
- total = total_;
- }
-
- @Override
- public void onChanged() {
- int count = c.getCount();
- if (total == count) {
- int i = 0;
- while (c.moveToNext()) {
- assertEquals(i, c.getInt(1));
- i++;
- }
- assertEquals(count, i);
- quit = true;
- Looper.myLooper().quit();
- }
- }
-
- @Override
- public void onInvalidated() {
- }
- }
-
- //@Large
- @Suppress
- public void testLoadingThreadDelayRegisterData() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
-
- final int count = 505;
- String sql = "INSERT INTO test (data) VALUES (?);";
- SQLiteStatement s = mDatabase.compileStatement(sql);
- for (int i = 0; i < count; i++) {
- s.bindLong(1, i);
- s.execute();
- }
-
- int maxRead = 500;
- int initialRead = 5;
- SQLiteCursor c = (SQLiteCursor)mDatabase.rawQuery("select * from test;",
- null, initialRead, maxRead);
-
- TestObserver observer = new TestObserver(count, c);
- c.getCount();
- c.registerDataSetObserver(observer);
- if (!observer.quit) {
- Looper.loop();
- }
- c.close();
- }
-
- @LargeTest
- public void testLoadingThread() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
-
- final int count = 50000;
- String sql = "INSERT INTO test (data) VALUES (?);";
- SQLiteStatement s = mDatabase.compileStatement(sql);
- for (int i = 0; i < count; i++) {
- s.bindLong(1, i);
- s.execute();
- }
-
- int maxRead = 1000;
- int initialRead = 5;
- SQLiteCursor c = (SQLiteCursor)mDatabase.rawQuery("select * from test;",
- null, initialRead, maxRead);
-
- TestObserver observer = new TestObserver(count, c);
- c.registerDataSetObserver(observer);
- c.getCount();
-
- Looper.loop();
- c.close();
- }
-
- @LargeTest
- public void testLoadingThreadClose() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
-
- final int count = 1000;
- String sql = "INSERT INTO test (data) VALUES (?);";
- SQLiteStatement s = mDatabase.compileStatement(sql);
- for (int i = 0; i < count; i++) {
- s.bindLong(1, i);
- s.execute();
- }
-
- int maxRead = 11;
- int initialRead = 5;
- SQLiteCursor c = (SQLiteCursor)mDatabase.rawQuery("select * from test;",
- null, initialRead, maxRead);
-
- TestObserver observer = new TestObserver(count, c);
- c.registerDataSetObserver(observer);
- c.getCount();
- c.close();
- }
-
- @LargeTest
- public void testLoadingThreadDeactivate() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
-
- final int count = 1000;
- String sql = "INSERT INTO test (data) VALUES (?);";
- SQLiteStatement s = mDatabase.compileStatement(sql);
- for (int i = 0; i < count; i++) {
- s.bindLong(1, i);
- s.execute();
- }
-
- int maxRead = 11;
- int initialRead = 5;
- SQLiteCursor c = (SQLiteCursor)mDatabase.rawQuery("select * from test;",
- null, initialRead, maxRead);
-
- TestObserver observer = new TestObserver(count, c);
- c.registerDataSetObserver(observer);
- c.getCount();
- c.deactivate();
- c.close();
- }
-
- @LargeTest
- public void testManyRowsLong() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);");
-
- final int count = 36799;
- for (int i = 0; i < count; i++) {
- mDatabase.execSQL("INSERT INTO test (data) VALUES (" + i + ");");
- }
-
- Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null);
- assertNotNull(c);
-
- int i = 0;
- while (c.moveToNext()) {
- assertEquals(i, c.getInt(0));
- i++;
- }
- assertEquals(count, i);
- assertEquals(count, c.getCount());
-
- Log.d("testManyRows", "count " + Integer.toString(i));
- c.close();
- }
-
- @LargeTest
- public void testManyRowsTxt() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
- StringBuilder sql = new StringBuilder(2100);
- sql.append("INSERT INTO test (data) VALUES ('");
- Random random = new Random(System.currentTimeMillis());
- StringBuilder randomString = new StringBuilder(1979);
- for (int i = 0; i < 1979; i++) {
- randomString.append((random.nextInt() & 0xf) % 10);
- }
- sql.append(randomString);
- sql.append("');");
-
- // if cursor window size changed, adjust this value too
- final int count = 600; // more than two fillWindow needed
- for (int i = 0; i < count; i++) {
- mDatabase.execSQL(sql.toString());
- }
-
- Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null);
- assertNotNull(c);
-
- int i = 0;
- while (c.moveToNext()) {
- assertEquals(randomString.toString(), c.getString(0));
- i++;
- }
- assertEquals(count, i);
- assertEquals(count, c.getCount());
- c.close();
- }
-
- @LargeTest
- public void testManyRowsTxtLong() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, txt TEXT, data INT);");
-
- Random random = new Random(System.currentTimeMillis());
- StringBuilder randomString = new StringBuilder(1979);
- for (int i = 0; i < 1979; i++) {
- randomString.append((random.nextInt() & 0xf) % 10);
- }
-
- // if cursor window size changed, adjust this value too
- final int count = 600;
- for (int i = 0; i < count; i++) {
- StringBuilder sql = new StringBuilder(2100);
- sql.append("INSERT INTO test (txt, data) VALUES ('");
- sql.append(randomString);
- sql.append("','");
- sql.append(i);
- sql.append("');");
- mDatabase.execSQL(sql.toString());
- }
-
- Cursor c = mDatabase.query("test", new String[]{"txt", "data"}, null, null, null, null, null);
- assertNotNull(c);
-
- int i = 0;
- while (c.moveToNext()) {
- assertEquals(randomString.toString(), c.getString(0));
- assertEquals(i, c.getInt(1));
- i++;
- }
- assertEquals(count, i);
- assertEquals(count, c.getCount());
- c.close();
- }
-
- @MediumTest
- public void testRequery() throws Exception {
- populateDefaultTable();
-
- Cursor c = mDatabase.rawQuery("SELECT * FROM test", null);
- assertNotNull(c);
- assertEquals(3, c.getCount());
- c.deactivate();
- c.requery();
- assertEquals(3, c.getCount());
- c.close();
- }
-
- @MediumTest
- public void testRequeryWithSelection() throws Exception {
- populateDefaultTable();
-
- Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = '" + sString1 + "'",
- null);
- assertNotNull(c);
- assertEquals(1, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
- c.deactivate();
- c.requery();
- assertEquals(1, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
- c.close();
- }
-
- @MediumTest
- public void testRequeryWithSelectionArgs() throws Exception {
- populateDefaultTable();
-
- Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = ?",
- new String[]{sString1});
- assertNotNull(c);
- assertEquals(1, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
- c.deactivate();
- c.requery();
- assertEquals(1, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
- c.close();
- }
-
- @MediumTest
- public void testRequeryWithAlteredSelectionArgs() throws Exception {
- /**
- * Test the ability of a subclass of SQLiteCursor to change its query arguments.
- */
- populateDefaultTable();
-
- SQLiteDatabase.CursorFactory factory = new SQLiteDatabase.CursorFactory() {
- public Cursor newCursor(
- SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable,
- SQLiteQuery query) {
- return new SQLiteCursor(db, masterQuery, editTable, query) {
- @Override
- public boolean requery() {
- setSelectionArguments(new String[]{"2"});
- return super.requery();
- }
- };
- }
- };
- Cursor c = mDatabase.rawQueryWithFactory(
- factory, "SELECT data FROM test WHERE _id <= ?", new String[]{"1"},
- null);
- assertNotNull(c);
- assertEquals(1, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
-
- // Our hacked requery() changes the query arguments in the cursor.
- c.requery();
-
- assertEquals(2, c.getCount());
- assertTrue(c.moveToFirst());
- assertEquals(sString1, c.getString(0));
- assertTrue(c.moveToNext());
- assertEquals(sString2, c.getString(0));
-
- // Test that setting query args on a deactivated cursor also works.
- c.deactivate();
- c.requery();
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/DatabaseStatementTest.java b/tests/AndroidTests/src/com/android/unit_tests/DatabaseStatementTest.java
deleted file mode 100644
index 16ca59f..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/DatabaseStatementTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests;
-
-import android.database.Cursor;
-import android.database.sqlite.SQLiteConstraintException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteDoneException;
-import android.database.sqlite.SQLiteStatement;
-import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import junit.framework.TestCase;
-
-import java.io.File;
-
-public class DatabaseStatementTest extends TestCase implements PerformanceTestCase {
-
- private static final String sString1 = "this is a test";
- private static final String sString2 = "and yet another test";
- private static final String sString3 = "this string is a little longer, but still a test";
-
- private static final int CURRENT_DATABASE_VERSION = 42;
- private SQLiteDatabase mDatabase;
- private File mDatabaseFile;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mDatabaseFile = new File("/sqlite_stmt_journals", "database_test.db");
- if (mDatabaseFile.exists()) {
- mDatabaseFile.delete();
- }
- mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
- assertNotNull(mDatabase);
- mDatabase.setVersion(CURRENT_DATABASE_VERSION);
- }
-
- @Override
- protected void tearDown() throws Exception {
- mDatabase.close();
- mDatabaseFile.delete();
- super.tearDown();
- }
-
- public boolean isPerformanceOnly() {
- return false;
- }
-
- // These test can only be run once.
- public int startPerformance(Intermediates intermediates) {
- return 1;
- }
-
- private void populateDefaultTable() {
- mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
-
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString1 + "');");
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString2 + "');");
- mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString3 + "');");
- }
-
- @MediumTest
- public void testExecuteStatement() throws Exception {
- populateDefaultTable();
- SQLiteStatement statement = mDatabase.compileStatement("DELETE FROM test");
- statement.execute();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- assertEquals(0, c.getCount());
- c.deactivate();
- statement.close();
- }
-
- @MediumTest
- public void testSimpleQuery() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER NOT NULL, str TEXT NOT NULL);");
- mDatabase.execSQL("INSERT INTO test VALUES (1234, 'hello');");
- SQLiteStatement statement1 =
- mDatabase.compileStatement("SELECT num FROM test WHERE str = ?");
- SQLiteStatement statement2 =
- mDatabase.compileStatement("SELECT str FROM test WHERE num = ?");
-
- try {
- statement1.bindString(1, "hello");
- long value = statement1.simpleQueryForLong();
- assertEquals(1234, value);
-
- statement1.bindString(1, "world");
- statement1.simpleQueryForLong();
- fail("shouldn't get here");
- } catch (SQLiteDoneException e) {
- // expected
- }
-
- try {
- statement2.bindLong(1, 1234);
- String value = statement1.simpleQueryForString();
- assertEquals("hello", value);
-
- statement2.bindLong(1, 5678);
- statement1.simpleQueryForString();
- fail("shouldn't get here");
- } catch (SQLiteDoneException e) {
- // expected
- }
-
- statement1.close();
- statement2.close();
- }
-
- @MediumTest
- public void testStatementLongBinding() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
- SQLiteStatement statement = mDatabase.compileStatement("INSERT INTO test (num) VALUES (?)");
-
- for (int i = 0; i < 10; i++) {
- statement.bindLong(1, i);
- statement.execute();
- }
- statement.close();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- int numCol = c.getColumnIndexOrThrow("num");
- c.moveToFirst();
- for (long i = 0; i < 10; i++) {
- long num = c.getLong(numCol);
- assertEquals(i, num);
- c.moveToNext();
- }
- c.close();
- }
-
- @MediumTest
- public void testStatementStringBinding() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num TEXT);");
- SQLiteStatement statement = mDatabase.compileStatement("INSERT INTO test (num) VALUES (?)");
-
- for (long i = 0; i < 10; i++) {
- statement.bindString(1, Long.toHexString(i));
- statement.execute();
- }
- statement.close();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- int numCol = c.getColumnIndexOrThrow("num");
- c.moveToFirst();
- for (long i = 0; i < 10; i++) {
- String num = c.getString(numCol);
- assertEquals(Long.toHexString(i), num);
- c.moveToNext();
- }
- c.close();
- }
-
- @MediumTest
- public void testStatementClearBindings() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
- SQLiteStatement statement = mDatabase.compileStatement("INSERT INTO test (num) VALUES (?)");
-
- for (long i = 0; i < 10; i++) {
- statement.bindLong(1, i);
- statement.clearBindings();
- statement.execute();
- }
- statement.close();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, "ROWID");
- int numCol = c.getColumnIndexOrThrow("num");
- assertTrue(c.moveToFirst());
- for (long i = 0; i < 10; i++) {
- assertTrue(c.isNull(numCol));
- c.moveToNext();
- }
- c.close();
- }
-
- @MediumTest
- public void testSimpleStringBinding() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num TEXT, value TEXT);");
- String statement = "INSERT INTO test (num, value) VALUES (?,?)";
-
- String[] args = new String[2];
- for (int i = 0; i < 2; i++) {
- args[i] = Integer.toHexString(i);
- }
-
- mDatabase.execSQL(statement, args);
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- int numCol = c.getColumnIndexOrThrow("num");
- int valCol = c.getColumnIndexOrThrow("value");
- c.moveToFirst();
- String num = c.getString(numCol);
- assertEquals(Integer.toHexString(0), num);
-
- String val = c.getString(valCol);
- assertEquals(Integer.toHexString(1), val);
- c.close();
- }
-
- @MediumTest
- public void testStatementMultipleBindings() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER, str TEXT);");
- SQLiteStatement statement =
- mDatabase.compileStatement("INSERT INTO test (num, str) VALUES (?, ?)");
-
- for (long i = 0; i < 10; i++) {
- statement.bindLong(1, i);
- statement.bindString(2, Long.toHexString(i));
- statement.execute();
- }
- statement.close();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, "ROWID");
- int numCol = c.getColumnIndexOrThrow("num");
- int strCol = c.getColumnIndexOrThrow("str");
- assertTrue(c.moveToFirst());
- for (long i = 0; i < 10; i++) {
- long num = c.getLong(numCol);
- String str = c.getString(strCol);
- assertEquals(i, num);
- assertEquals(Long.toHexString(i), str);
- c.moveToNext();
- }
- c.close();
- }
-
- private static class StatementTestThread extends Thread {
- private SQLiteDatabase mDatabase;
- private SQLiteStatement mStatement;
-
- public StatementTestThread(SQLiteDatabase db, SQLiteStatement statement) {
- super();
- mDatabase = db;
- mStatement = statement;
- }
-
- @Override
- public void run() {
- mDatabase.beginTransaction();
- for (long i = 0; i < 10; i++) {
- mStatement.bindLong(1, i);
- mStatement.bindString(2, Long.toHexString(i));
- mStatement.execute();
- }
- mDatabase.setTransactionSuccessful();
- mDatabase.endTransaction();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, "ROWID");
- int numCol = c.getColumnIndexOrThrow("num");
- int strCol = c.getColumnIndexOrThrow("str");
- assertTrue(c.moveToFirst());
- for (long i = 0; i < 10; i++) {
- long num = c.getLong(numCol);
- String str = c.getString(strCol);
- assertEquals(i, num);
- assertEquals(Long.toHexString(i), str);
- c.moveToNext();
- }
- c.close();
- }
- }
-
- @MediumTest
- public void testStatementMultiThreaded() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER, str TEXT);");
- SQLiteStatement statement =
- mDatabase.compileStatement("INSERT INTO test (num, str) VALUES (?, ?)");
-
- StatementTestThread thread = new StatementTestThread(mDatabase, statement);
- thread.start();
- try {
- thread.join();
- } finally {
- statement.close();
- }
- }
-
- @MediumTest
- public void testStatementConstraint() throws Exception {
- mDatabase.execSQL("CREATE TABLE test (num INTEGER NOT NULL);");
- SQLiteStatement statement = mDatabase.compileStatement("INSERT INTO test (num) VALUES (?)");
-
- // Try to insert NULL, which violates the constraint
- try {
- statement.clearBindings();
- statement.execute();
- fail("expected exception not thrown");
- } catch (SQLiteConstraintException e) {
- // expected
- }
-
- // Make sure the statement can still be used
- statement.bindLong(1, 1);
- statement.execute();
- statement.close();
-
- Cursor c = mDatabase.query("test", null, null, null, null, null, null);
- int numCol = c.getColumnIndexOrThrow("num");
- c.moveToFirst();
- long num = c.getLong(numCol);
- assertEquals(1, num);
- c.close();
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/DatabaseTests.java b/tests/AndroidTests/src/com/android/unit_tests/DatabaseTests.java
index a7a1400..a288c73 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/DatabaseTests.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/DatabaseTests.java
@@ -23,8 +23,6 @@
TestSuite suite = new TestSuite(DatabaseTests.class.getName());
suite.addTestSuite(DatabaseGeneralTest.class);
- suite.addTestSuite(DatabaseCursorTest.class);
- suite.addTestSuite(DatabaseStatementTest.class);
suite.addTestSuite(DatabaseLocaleTest.class);
suite.addTestSuite(CursorWindowTest.class);
suite.addTestSuite(DatabaseLockTest.class);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java b/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
deleted file mode 100644
index 7252aa9..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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 com.android.unit_tests;
-
-import android.os.Parcel;
-import android.test.AndroidTestCase;
-import android.telephony.NeighboringCellInfo;
-import android.test. suitebuilder.annotation.SmallTest;
-
-import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
-
-public class NeighboringCellInfoTest extends AndroidTestCase {
- @SmallTest
- public void testConstructor() {
- int rssi = 31;
- NeighboringCellInfo nc;
-
- nc = new NeighboringCellInfo(rssi, "FFFFFFF", NETWORK_TYPE_EDGE);
- assertEquals(NETWORK_TYPE_EDGE, nc.getNetworkType());
- assertEquals(rssi, nc.getRssi());
- assertEquals(0xfff, nc.getLac());
- assertEquals(0xffff, nc.getCid());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
-
- nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UMTS);
- assertEquals(NETWORK_TYPE_UMTS, nc.getNetworkType());
- assertEquals(rssi, nc.getRssi());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
- assertEquals(0x1ff, nc.getPsc());
-
- nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UNKNOWN);
- assertEquals(NETWORK_TYPE_UNKNOWN, nc.getNetworkType());
- assertEquals(rssi, nc.getRssi());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
- }
-
- @SmallTest
- public void testParcel() {
- int rssi = 20;
-
- NeighboringCellInfo nc = new NeighboringCellInfo(rssi, "12345678", NETWORK_TYPE_GPRS);
- assertEquals(NETWORK_TYPE_GPRS, nc.getNetworkType());
- assertEquals(rssi, nc.getRssi());
- assertEquals(0x1234, nc.getLac());
- assertEquals(0x5678, nc.getCid());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
-
- Parcel p = Parcel.obtain();
- p.setDataPosition(0);
- nc.writeToParcel(p, 0);
-
- p.setDataPosition(0);
- NeighboringCellInfo nw = new NeighboringCellInfo(p);
- assertEquals(NETWORK_TYPE_GPRS, nw.getNetworkType());
- assertEquals(rssi, nw.getRssi());
- assertEquals(0x1234, nw.getLac());
- assertEquals(0x5678, nw.getCid());
- assertEquals(NeighboringCellInfo.UNKNOWN_CID, nw.getPsc());
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ArrayTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ArrayTest.java
deleted file mode 100644
index 4d5b5e7..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ArrayTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.TypedValue;
-import com.android.unit_tests.R;
-
-public class ArrayTest extends AndroidTestCase {
- private Resources mResources;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mResources = mContext.getResources();
- }
-
- private void checkEntry(int resid, int index, Object res, Object expected) {
- assertEquals("in resource 0x" + Integer.toHexString(resid)
- + " at index " + index, expected, res);
- }
-
- private void checkStringArray(int resid, String[] expected) {
- String[] res = mResources.getStringArray(resid);
- assertEquals(res.length, expected.length);
- for (int i=0; i<expected.length; i++) {
- checkEntry(resid, i, res[i], expected[i]);
- }
- }
-
- private void checkTextArray(int resid, String[] expected) {
- CharSequence[] res = mResources.getTextArray(resid);
- assertEquals(res.length, expected.length);
- for (int i=0; i<expected.length; i++) {
- checkEntry(resid, i, res[i], expected[i]);
- }
- }
-
- private void checkIntArray(int resid, int[] expected) {
- int[] res = mResources.getIntArray(resid);
- assertEquals(res.length, expected.length);
- for (int i=0; i<expected.length; i++) {
- assertEquals("in resource 0x" + Integer.toHexString(resid)
- + " at index " + i, expected[i], res[i]);
- }
- }
-
- @SmallTest
- public void testStrings() throws Exception {
- checkStringArray(R.array.strings, new String[] {"zero", "1", "here"});
- checkTextArray(R.array.strings, new String[] {"zero", "1", "here"});
- checkStringArray(R.array.integers, new String[] {null, null, null});
- checkTextArray(R.array.integers, new String[] {null, null, null});
- }
-
- @SmallTest
- public void testIntegers() throws Exception {
- checkIntArray(R.array.strings, new int[] {0, 0, 0});
- checkIntArray(R.array.integers, new int[] {0, 1, 101});
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
deleted file mode 100644
index a065d70..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.Context;
-import android.content.res.AssetManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
-import android.view.Display;
-import android.view.WindowManager;
-import com.android.unit_tests.R;
-
-import java.util.Locale;
-
-public class ConfigTest extends AndroidTestCase {
- enum properties {
- LANGUAGE,
- COUNTRY,
- MCC,
- MNC,
- TOUCHSCREEN,
- KEYBOARD,
- KEYBOARDHIDDEN,
- NAVIGATION,
- ORIENTATION,
- WIDTH,
- HEIGHT,
- DENSITY
- }
-
- private static void checkValue(Resources res, int resId, String expectedValue) {
- try {
- String actual = res.getString(resId);
- assertNotNull("Returned wrong configuration-based simple value: expected <nothing>, got '"
- + actual + "' from resource 0x"
- + Integer.toHexString(resId),
- expectedValue);
- assertEquals("Returned wrong configuration-based simple value: expected '"
- + expectedValue + "', got '" + actual + "' from resource 0x"
- + Integer.toHexString(resId),
- expectedValue, actual);
- } catch (Resources.NotFoundException e) {
- assertNull("Resource not found for configuration-based simple value: expecting \""
- + expectedValue + "\"",
- expectedValue);
- }
- }
-
- private static void checkValue(Resources res, int resId,
- int[] styleable, String[] expectedValues) {
- Resources.Theme theme = res.newTheme();
- TypedArray sa = theme.obtainStyledAttributes(resId, styleable);
- for (int i = 0; i < styleable.length; i++) {
- String actual = sa.getString(i);
- assertEquals("Returned wrong configuration-based style value: expected '"
- + expectedValues[i] + "', got '" + actual + "' from attr "
- + i + " of resource 0x" + Integer.toHexString(resId),
- actual, expectedValues[i]);
- }
- sa.recycle();
- }
-
- class TotalConfig {
- Configuration mConfig;
- DisplayMetrics mMetrics;
-
- TotalConfig() {
- mConfig = new Configuration();
- // don't rely on build settings - they may change
- mConfig.locale = new Locale("en", "US");
- mConfig.mcc = 310;
- mConfig.mnc = 001; // unused
- mConfig.touchscreen = Configuration.TOUCHSCREEN_FINGER;
- mConfig.keyboard = Configuration.KEYBOARD_QWERTY;
- mConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
- mConfig.navigation = Configuration.NAVIGATION_TRACKBALL;
- mConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
-
- mMetrics = new DisplayMetrics();
- mMetrics.widthPixels = 200;
- mMetrics.heightPixels = 320;
- mMetrics.density = 1;
- }
-
- void setProperty(properties p, int value) {
- switch(p) {
- case MCC:
- mConfig.mcc = value;
- break;
- case MNC:
- mConfig.mnc = value;
- break;
- case TOUCHSCREEN:
- mConfig.touchscreen = value;
- break;
- case KEYBOARD:
- mConfig.keyboard = value;
- break;
- case KEYBOARDHIDDEN:
- mConfig.keyboardHidden = value;
- break;
- case NAVIGATION:
- mConfig.navigation = value;
- break;
- case ORIENTATION:
- mConfig.orientation = value;
- break;
- case WIDTH:
- mMetrics.widthPixels = value;
- break;
- case HEIGHT:
- mMetrics.heightPixels = value;
- break;
- case DENSITY:
- // this is the ratio from the standard
-
- mMetrics.density = (((float)value)/((float)DisplayMetrics.DENSITY_DEFAULT));
- break;
- default:
- assert(false);
- break;
- }
- }
-
- public void setProperty(properties p, String value) {
- switch(p) {
- case LANGUAGE:
- String oldCountry = mConfig.locale.getCountry();
- mConfig.locale = new Locale(value, oldCountry);
- break;
- case COUNTRY:
- String oldLanguage = mConfig.locale.getLanguage();
- mConfig.locale = new Locale(oldLanguage, value);
- break;
- default:
- assert(false);
- break;
- }
- }
-
- public Resources getResources() {
- AssetManager assmgr = new AssetManager();
- assmgr.addAssetPath(mContext.getPackageResourcePath());
- return new Resources(assmgr, mMetrics, mConfig);
- }
- }
-
- private static void checkPair(Resources res, int[] notResIds,
- int simpleRes, String simpleString,
- int bagRes, String bagString) {
- boolean willHave = true;
- if (notResIds != null) {
- for (int i : notResIds) {
- if (i == simpleRes) {
- willHave = false;
- break;
- }
- }
- }
- checkValue(res, simpleRes, willHave ? simpleString : null);
- checkValue(res, bagRes, R.styleable.TestConfig,
- new String[]{willHave ? bagString : null});
- }
-
- @SmallTest
- public void testAllConfigs() throws Exception {
- /**
- * Test a resource that contains a value for each possible single
- * configuration value.
- */
- TotalConfig config = new TotalConfig();
- Resources res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple default");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag default"});
-
- config = new TotalConfig();
- config.setProperty(properties.LANGUAGE, "xx");
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag xx"});
-
- config = new TotalConfig();
- config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.COUNTRY, "YY");
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx-rYY");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag xx-rYY"});
-
- config = new TotalConfig();
- config.setProperty(properties.MCC, 111);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mcc111");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mcc111"});
-
- config = new TotalConfig();
- config.setProperty(properties.MNC, 222);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mnc222");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mnc222"});
-
- config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple notouch");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag notouch"});
-
- config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple stylus");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag stylus"});
-
- config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple nokeys");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag nokeys"});
-
- config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 12key");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 12key"});
-
- config = new TotalConfig();
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple keysexposed");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag keysexposed"});
-
- config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple nonav");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag nonav"});
-
- config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple dpad");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag dpad"});
-
- config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple wheel");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag wheel"});
-
- config = new TotalConfig();
- config.setProperty(properties.HEIGHT, 480);
- config.setProperty(properties.WIDTH, 320);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 480x320");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 480x320"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 240);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 240dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 240dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple landscape");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag landscape"});
-
- config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple square");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag square"});
- }
-
- @MediumTest
- public void testDensity() throws Exception {
- // have 32, 240 and the default 160 content.
- // rule is that closest wins, with down scaling (larger content)
- // being twice as nice as upscaling.
- // transition at H/2 * (-1 +/- sqrt(1+8L/H))
- // SO, X < 49 goes to 32
- // 49 >= X < 182 goes to 160
- // X >= 182 goes to 240
- TotalConfig config = new TotalConfig();
- config.setProperty(properties.DENSITY, 2);
- Resources res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 32dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 32);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 32dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 48);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 32dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 49);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple default");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag default"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 150);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple default");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag default"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 181);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple default");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag default"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 182);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 240dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 240dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 239);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 240dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 240dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 490);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 240dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 240dpi"});
- }
-
-// TODO - add tests for special cases - ie, other key params seem ignored if
-// nokeys is set
-
- @MediumTest
- public void testCombinations() throws Exception {
- /**
- * Verify that proper strings are found for multiple-selectivity case
- * (ie, a string set for locale and mcc is found only when both are
- * true).
- */
- TotalConfig config = new TotalConfig();
- config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.COUNTRY, "YY");
- config.setProperty(properties.MCC, 111);
- Resources res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mcc111 xx-rYY");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mcc111 xx-rYY"});
-
- config = new TotalConfig();
- config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.COUNTRY, "YY");
- config.setProperty(properties.MCC, 333);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx-rYY");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag xx-rYY"});
-
- config = new TotalConfig();
- config.setProperty(properties.MNC, 333);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple default");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag default"});
- }
-
- @MediumTest
- public void testPrecidence() throws Exception {
- /**
- * Verify that in cases of ties, the specific ordering is followed
- */
-
- /**
- * Precidence order: mcc, mnc, locale, orientation, density,
- * touchscreen, hidden, keyboard, navigation, width-height
- */
-
- /**
- * verify mcc trumps mnc. Have 110-xx, 220-xx but no 110-220
- * so with is selected? Should be mcc110-xx.
- */
- TotalConfig config = new TotalConfig();
- config.setProperty(properties.MCC, 110);
- config.setProperty(properties.MNC, 220);
- config.setProperty(properties.LANGUAGE, "xx");
- Resources res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mcc110 xx");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mcc110 xx"});
-
- /* full A + B + C doesn't exist. Do we get A + C or B + C?
- */
- config = new TotalConfig();
- config.setProperty(properties.MCC, 111);
- config.setProperty(properties.MNC, 222);
- config.setProperty(properties.LANGUAGE, "xx");
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mcc111 mnc222");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"});
-
- config = new TotalConfig();
- config.setProperty(properties.MNC, 222);
- config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION,
- Configuration.ORIENTATION_SQUARE);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple mnc222 xx");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag mnc222 xx"});
-
- config = new TotalConfig();
- config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION,
- Configuration.ORIENTATION_SQUARE);
- config.setProperty(properties.DENSITY, 32);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx square");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag xx square"});
-
- config = new TotalConfig();
- config.setProperty(properties.ORIENTATION,
- Configuration.ORIENTATION_SQUARE);
- config.setProperty(properties.DENSITY, 32);
- config.setProperty(properties.TOUCHSCREEN,
- Configuration.TOUCHSCREEN_STYLUS);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple square 32dpi");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag square 32dpi"});
-
- config = new TotalConfig();
- config.setProperty(properties.DENSITY, 32);
- config.setProperty(properties.TOUCHSCREEN,
- Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN,
- Configuration.KEYBOARDHIDDEN_NO);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
-
- config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN,
- Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN,
- Configuration.KEYBOARDHIDDEN_NO);
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
-
- config = new TotalConfig();
- config.setProperty(properties.KEYBOARDHIDDEN,
- Configuration.KEYBOARDHIDDEN_NO);
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- config.setProperty(properties.NAVIGATION,
- Configuration.NAVIGATION_DPAD);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple keysexposed 12key");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag keysexposed 12key"});
-
- config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- config.setProperty(properties.NAVIGATION,
- Configuration.NAVIGATION_DPAD);
- config.setProperty(properties.HEIGHT, 63);
- config.setProperty(properties.WIDTH, 57);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 12key dpad");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 12key dpad"});
-
- config = new TotalConfig();
- config.setProperty(properties.NAVIGATION,
- Configuration.NAVIGATION_DPAD);
- config.setProperty(properties.HEIGHT, 640);
- config.setProperty(properties.WIDTH, 400);
- res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple dpad");
- checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag dpad"});
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ContentTests.java b/tests/AndroidTests/src/com/android/unit_tests/content/ContentTests.java
index 80318dc..636660f 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ContentTests.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/content/ContentTests.java
@@ -23,10 +23,6 @@
TestSuite suite = new TestSuite(ContentTests.class.getName());
suite.addTestSuite(AssetTest.class);
- suite.addTestSuite(IntentFilterTest.class);
- suite.addTest(ResourceTests.suite());
- suite.addTestSuite(PluralResourcesTest.class);
- suite.addTestSuite(ConfigTest.class);
return suite;
}
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/FractionTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/FractionTest.java
deleted file mode 100644
index 74a6b8d..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/FractionTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.TypedValue;
-import com.android.unit_tests.R;
-
-public class FractionTest extends AndroidTestCase {
-
- private Resources mResources;
- private final TypedValue mValue = new TypedValue();
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mResources = mContext.getResources();
- }
-
- @SmallTest
- public void testFractions() throws Exception {
- tryFraction(R.dimen.frac100perc, 1, 1, 1);
- tryFraction(R.dimen.frac1perc, 1, 1, .01f);
- tryFraction(R.dimen.fracp1perc, 1, 1, .001f);
- tryFraction(R.dimen.fracp01perc, 1, 1, .0001f);
- tryFraction(R.dimen.frac0perc, 1, 1, 0);
- tryFraction(R.dimen.frac1p1perc, 1, 1, .011f);
- tryFraction(R.dimen.frac100p1perc, 1, 1, 1.001f);
- tryFraction(R.dimen.frac25510perc, 1, 1, 255.1f);
- tryFraction(R.dimen.frac25610perc, 1, 1, 256.1f);
- tryFraction(R.dimen.frac6553510perc, 1, 1, 65535.1f);
- tryFraction(R.dimen.frac6553610perc, 1, 1, 65536.1f);
-
- tryFraction(R.dimen.frac100perc, 100, 1, 100);
- tryFraction(R.dimen.frac1perc, 100, 1, .01f * 100);
- tryFraction(R.dimen.fracp1perc, 100, 1, .001f * 100);
- tryFraction(R.dimen.fracp01perc, 100, 1, .0001f * 100);
- tryFraction(R.dimen.frac0perc, 100, 1, 0);
- tryFraction(R.dimen.frac1p1perc, 100, 1, .011f * 100);
- tryFraction(R.dimen.frac100p1perc, 100, 1, 1.001f * 100);
- tryFraction(R.dimen.frac25510perc, 100, 1, 255.1f * 100);
- tryFraction(R.dimen.frac25610perc, 100, 1, 256.1f * 100);
- tryFraction(R.dimen.frac6553510perc, 100, 1, 65535.1f * 100);
- tryFraction(R.dimen.frac6553610perc, 100, 1, 65536.1f * 100);
-
- tryFraction(R.dimen.frac100pperc, 100, 2, 2);
- tryFraction(R.dimen.frac1pperc, 100, 2, .01f * 2);
- tryFraction(R.dimen.fracp1pperc, 100, 2, .001f * 2);
- tryFraction(R.dimen.fracp01pperc, 100, 2, .0001f * 2);
- tryFraction(R.dimen.frac0pperc, 100, 2, 0);
- tryFraction(R.dimen.frac1p1pperc, 100, 2, .011f * 2);
- tryFraction(R.dimen.frac100p1pperc, 100, 2, 1.001f * 2);
- tryFraction(R.dimen.frac25510pperc, 100, 2, 255.1f * 2);
- tryFraction(R.dimen.frac25610pperc, 100, 2, 256.1f * 2);
- tryFraction(R.dimen.frac6553510pperc, 100, 2, 65535.1f * 2);
- tryFraction(R.dimen.frac6553610pperc, 100, 2, 65536.1f * 2);
- }
-
- private void tryFraction(int resid, float base, float pbase, float expected) {
- mResources.getValue(resid, mValue, true);
- float res = mValue.getFraction(base, pbase);
- float diff = Math.abs(expected - res);
- float prec = expected * 1e-4f;
- if (prec < 1e-5f) {
- prec = 1e-5f;
- }
- //System.out.println(
- // "Res 0x" + Integer.toHexString(resid) + ": got=" + res
- // + ", expected=" + expected + ", diff=" + diff);
- assertFalse("Expecting value " + expected + " got " + res
- + ": in resource 0x" + Integer.toHexString(resid)
- + " " + mValue,
- diff > prec);
- }
-}
-
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/IntentFilterTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/IntentFilterTest.java
deleted file mode 100644
index 0335b9d..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/IntentFilterTest.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.IntentFilter;
-import android.test.suitebuilder.annotation.SmallTest;
-import static android.os.PatternMatcher.PATTERN_LITERAL;
-import static android.os.PatternMatcher.PATTERN_PREFIX;
-import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
-import android.net.Uri;
-import android.util.StringBuilderPrinter;
-import junit.framework.TestCase;
-
-import java.util.HashSet;
-
-public class IntentFilterTest extends TestCase {
-
- public static class Match extends IntentFilter {
- Match(String[] actions, String[] categories, String[] mimeTypes,
- String[] schemes, String[] authorities, String[] ports) {
- if (actions != null) {
- for (int i = 0; i < actions.length; i++) {
- addAction(actions[i]);
- }
- }
- if (categories != null) {
- for (int i = 0; i < categories.length; i++) {
- addCategory(categories[i]);
- }
- }
- if (mimeTypes != null) {
- for (int i = 0; i < mimeTypes.length; i++) {
- try {
- addDataType(mimeTypes[i]);
- } catch (IntentFilter.MalformedMimeTypeException e) {
- throw new RuntimeException("Bad mime type", e);
- }
- }
- }
- if (schemes != null) {
- for (int i = 0; i < schemes.length; i++) {
- addDataScheme(schemes[i]);
- }
- }
- if (authorities != null) {
- for (int i = 0; i < authorities.length; i++) {
- addDataAuthority(authorities[i],
- ports != null ? ports[i] : null);
- }
- }
- }
-
- Match(String[] actions, String[] categories, String[] mimeTypes,
- String[] schemes, String[] authorities, String[] ports,
- String[] paths, int[] pathTypes) {
- this(actions, categories, mimeTypes, schemes, authorities, ports);
- if (paths != null) {
- for (int i = 0; i < paths.length; i++) {
- addDataPath(paths[i], pathTypes[i]);
- }
- }
- }
- }
-
- public static class MatchCondition {
- public final int result;
- public final String action;
- public final String mimeType;
- public final Uri data;
- public final String[] categories;
-
- public MatchCondition(int _result, String _action, String[] _categories,
- String _mimeType, String _data) {
- result = _result;
- action = _action;
- mimeType = _mimeType;
- data = _data != null ? Uri.parse(_data) : null;
- categories = _categories;
- }
- }
-
- public static void checkMatches(IntentFilter filter,
- MatchCondition[] results) {
- for (int i = 0; i < results.length; i++) {
- MatchCondition mc = results[i];
- HashSet<String> categories = null;
- if (mc.categories != null) {
- for (int j = 0; j < mc.categories.length; j++) {
- if (categories == null) {
- categories = new HashSet<String>();
- }
- categories.add(mc.categories[j]);
- }
- }
- int result = filter.match(mc.action, mc.mimeType,
- mc.data != null ? mc.data.getScheme() : null, mc.data,
- categories, "test");
- if ( (result & IntentFilter.MATCH_CATEGORY_MASK)
- != (mc.result & IntentFilter.MATCH_CATEGORY_MASK) ) {
- StringBuilder msg = new StringBuilder();
- msg.append("Error matching against IntentFilter:\n");
- filter.dump(new StringBuilderPrinter(msg), " ");
- msg.append("Match action: ");
- msg.append(mc.action);
- msg.append("\nMatch mimeType: ");
- msg.append(mc.mimeType);
- msg.append("\nMatch data: ");
- msg.append(mc.data);
- msg.append("\nMatch categories: ");
- if (mc.categories != null) {
- for (int j = 0; j < mc.categories.length; j++) {
- if (j > 0) msg.append(", ");
- msg.append(mc.categories[j]);
- }
- }
- msg.append("\nExpected result: 0x");
- msg.append(Integer.toHexString(mc.result));
- msg.append(", got result: 0x");
- msg.append(Integer.toHexString(result));
- throw new RuntimeException(msg.toString());
- }
- }
- }
-
- @SmallTest
- public void testActions() throws Exception {
- IntentFilter filter = new Match(
- new String[]{"action1"}, null, null, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1",
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action2",
- null, null, null),
- });
-
- filter = new Match(
- new String[]{"action1", "action2"},
- null, null, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1",
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action2",
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action3",
- null, null, null),
- });
- }
-
- @SmallTest
- public void testCategories() throws Exception {
- IntentFilter filter = new Match(
- null, new String[]{"category1"}, null, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- new String[]{"category1"}, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
- new String[]{"category2"}, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
- new String[]{"category1", "category2"}, null, null),
- });
-
- filter = new Match(
- null, new String[]{"category1", "category2"}, null, null,
- null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- new String[]{"category1"}, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- new String[]{"category2"}, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
- new String[]{"category1", "category2"}, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
- new String[]{"category3"}, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
- new String[]{"category1", "category2", "category3"},
- null, null),
- });
- }
-
- @SmallTest
- public void testMimeTypes() throws Exception {
- IntentFilter filter = new Match(
- null, null, new String[]{"which1/what1"}, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what1", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "*/*", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which2/what2", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which2/*", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which1/what2", null),
- });
-
- filter = new Match(null, null,
- new String[]{"which1/what1", "which2/what2"}, null, null,
- null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what1", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "*/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which2/what2", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which2/*", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which1/what2", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which3/what3", null),
- });
-
- filter = new Match(null, null,
- new String[]{"which1/*"}, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what1", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "*/*", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which2/what2", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which2/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what2", null),
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null,
- "which3/what3", null),
- });
-
- filter = new Match(null, null,
- new String[]{"*/*"}, null, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_TYPE, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what1", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "*/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which2/what2", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which2/*", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which1/what2", null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null,
- "which3/what3", null),
- });
- }
-
- @SmallTest
- public void testSchemes() throws Exception {
- IntentFilter filter = new Match(null, null, null,
- new String[]{"scheme1"}, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null,
- null, null, "scheme1:foo"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme2:foo"),
- });
-
- filter = new Match(null, null, null,
- new String[]{"scheme1", "scheme2"}, null, null);
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null,
- null, null, "scheme1:foo"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null,
- null, null, "scheme2:foo"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme3:foo"),
- });
- }
-
- @SmallTest
- public void testAuthorities() throws Exception {
- IntentFilter filter = new Match(null, null, null,
- new String[]{"scheme1"},
- new String[]{"authority1"}, new String[]{null});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1:foo"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null,
- null, null, "scheme1://authority1/"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority2/"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null,
- null, null, "scheme1://authority1:100/"),
- });
-
- filter = new Match(null, null, null, new String[]{"scheme1"},
- new String[]{"authority1"}, new String[]{"100"});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1:foo"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority1/"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority2/"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null,
- null, null, "scheme1://authority1:100/"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority1:200/"),
- });
-
- filter = new Match(null, null, null, new String[]{"scheme1"},
- new String[]{"authority1", "authority2"},
- new String[]{"100", null});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1:foo"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority1/"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null,
- null, null, "scheme1://authority2/"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null,
- null, null, "scheme1://authority1:100/"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme1://authority1:200/"),
- });
- }
-
- @SmallTest
- public void testPaths() throws Exception {
- IntentFilter filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/literal1", "/2literal"},
- new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/literal1"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/2literal"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/literal"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/literal12"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/literal1", "/2literal"},
- new int[]{PATTERN_PREFIX, PATTERN_PREFIX});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/literal1"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/2literal"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/literal"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/literal12"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/.*"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/literal1"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{".*"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/literal1"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a1*b"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a1b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a11b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a2b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a1bc"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a1*"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a1"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a11"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a1b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a11"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a2"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a\\.*b"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a..b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a2b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a.bc"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a.*b"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.1b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a2b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a.bc"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a.*"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.1b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a2b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.bc"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a.\\*b"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.*b"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a1*b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a2b"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a.bc"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/"),
- });
- filter = new Match(null, null, null,
- new String[]{"scheme"}, new String[]{"authority"}, null,
- new String[]{"/a.\\*"},
- new int[]{PATTERN_SIMPLE_GLOB});
- checkMatches(filter, new MatchCondition[]{
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, null),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/ab"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a.*"),
- new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null,
- null, null, "scheme://authority/a1*"),
- new MatchCondition(IntentFilter.NO_MATCH_DATA, null,
- null, null, "scheme://authority/a1b"),
- });
- }
-
-}
-
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/PluralResourcesTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/PluralResourcesTest.java
deleted file mode 100644
index c3d1478..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/PluralResourcesTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.res.AssetManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.TypedValue;
-import android.util.Log;
-import com.android.unit_tests.R;
-
-import junit.framework.Assert;
-
-import java.util.Locale;
-
-public class PluralResourcesTest extends AndroidTestCase {
- private static final String TAG = "PluralResourcesTest";
-
- private Resources mResources;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mResources = mContext.getResources();
- }
-
- Resources resourcesForLanguage(String lang) {
- Configuration config = new Configuration();
- config.updateFrom(mResources.getConfiguration());
- config.locale = new Locale(lang);
- return new Resources(mResources.getAssets(), mResources.getDisplayMetrics(), config);
- }
-
- @SmallTest
- public void testPlurals() throws Exception {
- CharSequence cs;
- Resources res = resourcesForLanguage("en");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 0);
- Log.d(TAG, "english 0 cs=" + cs);
- Assert.assertEquals(cs.toString(), "Some dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 1);
- Log.d(TAG, "english 1 cs=" + cs);
- Assert.assertEquals(cs.toString(), "A dog");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 2);
- Assert.assertEquals(cs.toString(), "Some dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 5);
- Assert.assertEquals(cs.toString(), "Some dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 500);
- Assert.assertEquals(cs.toString(), "Some dogs");
- }
-
- @SmallTest
- public void testCzech() throws Exception {
- CharSequence cs;
- Resources res = resourcesForLanguage("cs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 0);
- Log.d(TAG, "czech 0 cs=" + cs);
- Assert.assertEquals(cs.toString(), "Some Czech dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 1);
- Log.d(TAG, "czech 1 cs=" + cs);
- Assert.assertEquals(cs.toString(), "A Czech dog");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 2);
- Log.d(TAG, "czech 2 cs=" + cs);
- Assert.assertEquals(cs.toString(), "Few Czech dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 5);
- Assert.assertEquals(cs.toString(), "Some Czech dogs");
-
- cs = res.getQuantityText(R.plurals.plurals_test, 500);
- Assert.assertEquals(cs.toString(), "Some Czech dogs");
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/PrimitiveTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/PrimitiveTest.java
deleted file mode 100644
index 44098cc..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/PrimitiveTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.TypedValue;
-import com.android.unit_tests.R;
-
-public class PrimitiveTest extends AndroidTestCase {
- private Resources mResources;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mResources = mContext.getResources();
- }
-
- private void tryEnum(int resid, int expected) {
- TypedArray sa =
- mContext.obtainStyledAttributes(resid, R.styleable.EnumStyle);
- int value = sa.getInt(R.styleable.EnumStyle_testEnum, -1);
- sa.recycle();
-
- assertEquals("Expecting value " + expected + " got " + value
- + ": in resource 0x" + Integer.toHexString(resid),
- expected, value);
- }
-
- @SmallTest
- public void testEnum() throws Exception {
- tryEnum(R.style.TestEnum1, 1);
- tryEnum(R.style.TestEnum2, 2);
- tryEnum(R.style.TestEnum10, 10);
- tryEnum(R.style.TestEnum1_EmptyInherit, 1);
- }
-
- private void tryFlag(int resid, int expected) {
- TypedArray sa =
- mContext.obtainStyledAttributes(resid, R.styleable.FlagStyle);
- int value = sa.getInt(R.styleable.FlagStyle_testFlags, -1);
- sa.recycle();
-
- assertEquals("Expecting value " + expected + " got " + value
- + ": in resource 0x" + Integer.toHexString(resid),
- expected, value);
- }
-
- @SmallTest
- public void testFlags() throws Exception {
- tryFlag(R.style.TestFlag1, 0x1);
- tryFlag(R.style.TestFlag2, 0x2);
- tryFlag(R.style.TestFlag31, 0x40000000);
- tryFlag(R.style.TestFlag1And2, 0x3);
- tryFlag(R.style.TestFlag1And2And31, 0x40000003);
- }
-
- private void tryBoolean(int resid, boolean expected) {
- TypedValue v = new TypedValue();
- mContext.getResources().getValue(resid, v, true);
- assertEquals(TypedValue.TYPE_INT_BOOLEAN, v.type);
- assertEquals("Expecting boolean value " + expected + " got " + v
- + " from TypedValue: in resource 0x" + Integer.toHexString(resid),
- expected, v.data != 0);
- assertEquals("Expecting boolean value " + expected + " got " + v
- + " from getBoolean(): in resource 0x" + Integer.toHexString(resid),
- expected, mContext.getResources().getBoolean(resid));
- }
-
- @SmallTest
- public void testBoolean() throws Exception {
- tryBoolean(R.bool.trueRes, true);
- tryBoolean(R.bool.falseRes, false);
- }
-
- private void tryString(int resid, String expected) {
- TypedValue v = new TypedValue();
- mContext.getResources().getValue(resid, v, true);
- assertEquals(TypedValue.TYPE_STRING, v.type);
- assertEquals("Expecting string value " + expected + " got " + v
- + ": in resource 0x" + Integer.toHexString(resid),
- expected, v.string);
- }
-
- @SmallTest
- public void testStringCoerce() throws Exception {
- tryString(R.string.coerceIntegerToString, "100");
- tryString(R.string.coerceBooleanToString, "true");
- tryString(R.string.coerceColorToString, "#fff");
- tryString(R.string.coerceFloatToString, "100.0");
- tryString(R.string.coerceDimensionToString, "100px");
- tryString(R.string.coerceFractionToString, "100%");
- }
-
- private static void checkString(int resid, String actual, String expected) {
- assertEquals("Expecting string value \"" + expected + "\" got \""
- + actual + "\" in resources 0x" + Integer.toHexString(resid),
- expected, actual);
- }
-
- @SmallTest
- public void testFormattedString() throws Exception {
- // Make sure the regular one doesn't format anything
- checkString(R.string.formattedStringNone,
- mResources.getString(R.string.formattedStringNone),
- "Format[]");
- checkString(R.string.formattedStringOne,
- mResources.getString(R.string.formattedStringOne),
- "Format[%d]");
- checkString(R.string.formattedStringTwo,
- mResources.getString(R.string.formattedStringTwo),
- "Format[%3$d,%2$s]");
- // Make sure the formatted one works
- checkString(R.string.formattedStringNone,
- mResources.getString(R.string.formattedStringNone),
- "Format[]");
- checkString(R.string.formattedStringOne,
- mResources.getString(R.string.formattedStringOne, 42),
- "Format[42]");
- checkString(R.string.formattedStringTwo,
- mResources.getString(R.string.formattedStringTwo, "unused", "hi", 43),
- "Format[43,hi]");
- }
-}
-
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/RawResourceTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/RawResourceTest.java
deleted file mode 100644
index 1786dc4..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/RawResourceTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 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 com.android.unit_tests.content;
-
-import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import com.android.unit_tests.R;
-
-import java.io.InputStream;
-
-public class RawResourceTest extends AndroidTestCase {
- private Resources mResources;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mResources = mContext.getResources();
- }
-
- @SmallTest
- public void testReadToEnd() throws Exception {
- InputStream is = mResources.openRawResource(R.raw.text);
- AssetTest.verifyTextAsset(is);
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ResourceNameTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ResourceNameTest.java
deleted file mode 100644
index 2a56243..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ResourceNameTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.unit_tests.content;
-
-import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.unit_tests.R;
-
-public class ResourceNameTest extends AndroidTestCase {
-
- @SmallTest
- public void testGetResourceName() {
- Resources res = mContext.getResources();
-
- String fullName = res.getResourceName(R.configVarying.simple);
- assertEquals("com.android.unit_tests:configVarying/simple", fullName);
-
- String packageName = res.getResourcePackageName(R.configVarying.simple);
- assertEquals("com.android.unit_tests", packageName);
-
- String typeName = res.getResourceTypeName(R.configVarying.simple);
- assertEquals("configVarying", typeName);
-
- String entryName = res.getResourceEntryName(R.configVarying.simple);
- assertEquals("simple", entryName);
- }
-
- @SmallTest
- public void testGetResourceIdentifier() {
- Resources res = mContext.getResources();
- int resid = res.getIdentifier(
- "com.android.unit_tests:configVarying/simple",
- null, null);
- assertEquals(R.configVarying.simple, resid);
-
- resid = res.getIdentifier("configVarying/simple", null,
- "com.android.unit_tests");
- assertEquals(R.configVarying.simple, resid);
-
- resid = res.getIdentifier("simple", "configVarying",
- "com.android.unit_tests");
- assertEquals(R.configVarying.simple, resid);
- }
-}
-
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ResourceTests.java b/tests/AndroidTests/src/com/android/unit_tests/content/ResourceTests.java
deleted file mode 100644
index 943941e..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ResourceTests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2006 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 com.android.unit_tests.content;
-
-import junit.framework.TestSuite;
-
-public class ResourceTests {
- public static TestSuite suite() {
- TestSuite suite = new TestSuite(ResourceTests.class.getName());
-
- suite.addTestSuite(FractionTest.class);
- suite.addTestSuite(PrimitiveTest.class);
- suite.addTestSuite(ArrayTest.class);
- suite.addTestSuite(ConfigTest.class);
- suite.addTestSuite(RawResourceTest.class);
- suite.addTestSuite(ResourceNameTest.class);
- return suite;
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestSuite.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestSuite.java
deleted file mode 100644
index f3d1c5e..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestSuite.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 com.android.unit_tests.vcard;
-
-import com.android.unit_tests.AndroidTests;
-
-import android.test.suitebuilder.TestSuiteBuilder;
-
-import junit.framework.TestSuite;
-
-public class VCardTestSuite extends TestSuite {
- public static TestSuite suite() {
- TestSuiteBuilder suiteBuilder = new TestSuiteBuilder(AndroidTests.class);
- suiteBuilder.includeAllPackagesUnderHere();
- return suiteBuilder.build();
- }
-}
\ No newline at end of file
diff --git a/tests/CoreTests/android/core/CoreTests.java b/tests/CoreTests/android/core/CoreTests.java
index e4f835c..442fe0f 100644
--- a/tests/CoreTests/android/core/CoreTests.java
+++ b/tests/CoreTests/android/core/CoreTests.java
@@ -59,7 +59,6 @@
suite.addTestSuite(LocationManagerProximityTest.class);
suite.addTestSuite(AndroidTestRunnerTest.class);
suite.addTestSuite(InstrumentationTestRunnerTest.class);
- suite.addTestSuite(CookieTest.class);
return suite;
}
diff --git a/tests/CoreTests/android/webkit/CookieTest.java b/tests/CoreTests/android/webkit/CookieTest.java
deleted file mode 100644
index 5c5a6a8..0000000
--- a/tests/CoreTests/android/webkit/CookieTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.AndroidTestCase;
-import android.util.Log;
-import android.webkit.CookieManager;
-import android.webkit.CookieSyncManager;
-
-public class CookieTest extends AndroidTestCase {
-
- /**
- * To run these tests: $ mmm frameworks/base/tests/CoreTests/android && adb
- * remount && adb sync $ adb shell am instrument -w \ -e class
- * android.webkit.CookieTest \
- * android.core/android.test.InstrumentationTestRunner
- */
-
- private CookieManager mCookieManager;
-
- @Override
- public void setContext(Context context) {
- assertTrue(mContext == null);
- super.setContext(context);
- CookieSyncManager.createInstance(context);
- mCookieManager = CookieManager.getInstance();
- mCookieManager.removeAllCookie();
- }
-
- public void testParse() {
- mCookieManager.removeAllCookie();
- String url = "http://www.foo.com";
-
- // basic
- mCookieManager.setCookie(url, "a=b");
- String cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b"));
-
- // quoted
- mCookieManager.setCookie(url, "c=\"d;\"");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b; c=\"d;\""));
-
- // empty
- mCookieManager.setCookie(url, "; path=/");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b; c=\"d;\""));
- }
-
- public void testDomain() {
- mCookieManager.removeAllCookie();
- String url = "http://www.foo.com";
-
- // basic
- mCookieManager.setCookie(url, "a=b");
- String cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b"));
-
- // no cross domain cookie
- cookie = mCookieManager.getCookie("http://bar.com");
- assertTrue(cookie == null);
-
- // more than one cookie
- mCookieManager.setCookie(url, "c=d; domain=.foo.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b; c=d"));
-
- // host cookie should not be accessible from a sub-domain.
- cookie = mCookieManager.getCookie("http://bar.www.foo.com");
- assertTrue(cookie.equals("c=d"));
-
- // test setting a domain= that doesn't start w/ a dot, should
- // treat it as a domain cookie, as if there was a pre-pended dot.
- mCookieManager.setCookie(url, "e=f; domain=www.foo.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=b; c=d; e=f"));
- cookie = mCookieManager.getCookie("http://sub.www.foo.com");
- assertTrue(cookie.equals("c=d; e=f"));
- cookie = mCookieManager.getCookie("http://foo.com");
- assertTrue(cookie.equals("c=d"));
- }
-
- public void testSubDomain() {
- mCookieManager.removeAllCookie();
- String url_abcd = "http://a.b.c.d.com";
- String url_bcd = "http://b.c.d.com";
- String url_cd = "http://c.d.com";
- String url_d = "http://d.com";
-
- mCookieManager.setCookie(url_abcd, "a=1; domain=.a.b.c.d.com");
- mCookieManager.setCookie(url_abcd, "b=2; domain=.b.c.d.com");
- mCookieManager.setCookie(url_abcd, "c=3; domain=.c.d.com");
- mCookieManager.setCookie(url_abcd, "d=4; domain=.d.com");
-
- String cookie = mCookieManager.getCookie(url_abcd);
- assertTrue(cookie.equals("a=1; b=2; c=3; d=4"));
- cookie = mCookieManager.getCookie(url_bcd);
- assertTrue(cookie.equals("b=2; c=3; d=4"));
- cookie = mCookieManager.getCookie(url_cd);
- assertTrue(cookie.equals("c=3; d=4"));
- cookie = mCookieManager.getCookie(url_d);
- assertTrue(cookie.equals("d=4"));
-
- // check that the same cookie can exist on different sub-domains.
- mCookieManager.setCookie(url_bcd, "x=bcd; domain=.b.c.d.com");
- mCookieManager.setCookie(url_bcd, "x=cd; domain=.c.d.com");
- cookie = mCookieManager.getCookie(url_bcd);
- assertTrue(cookie.equals("b=2; c=3; d=4; x=bcd; x=cd"));
- cookie = mCookieManager.getCookie(url_cd);
- assertTrue(cookie.equals("c=3; d=4; x=cd"));
- }
-
- public void testInvalidDomain() {
- mCookieManager.removeAllCookie();
- String url = "http://foo.bar.com";
-
- mCookieManager.setCookie(url, "a=1; domain=.yo.foo.bar.com");
- String cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "b=2; domain=.foo.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "c=3; domain=.bar.foo.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "d=4; domain=.foo.bar.com.net");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "e=5; domain=.ar.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "f=6; domain=.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "g=7; domain=.co.uk");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "h=8; domain=.foo.bar.com.com");
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
- }
-
- public void testPath() {
- mCookieManager.removeAllCookie();
- String url = "http://www.foo.com";
-
- mCookieManager.setCookie(url, "a=b; path=/wee");
- String cookie = mCookieManager.getCookie(url + "/wee");
- assertTrue(cookie.equals("a=b"));
- cookie = mCookieManager.getCookie(url + "/wee/");
- assertTrue(cookie.equals("a=b"));
- cookie = mCookieManager.getCookie(url + "/wee/hee");
- assertTrue(cookie.equals("a=b"));
- cookie = mCookieManager.getCookie(url + "/wee/hee/more");
- assertTrue(cookie.equals("a=b"));
- cookie = mCookieManager.getCookie(url + "/weehee");
- assertTrue(cookie == null);
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie == null);
-
- mCookieManager.setCookie(url, "a=c; path=");
- cookie = mCookieManager.getCookie(url + "/wee");
- assertTrue(cookie.equals("a=b; a=c"));
- cookie = mCookieManager.getCookie(url);
- assertTrue(cookie.equals("a=c"));
-
- mCookieManager.setCookie(url, "a=d");
- cookie = mCookieManager.getCookie(url + "/wee");
- assertTrue(cookie.equals("a=b; a=d"));
- }
-}
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/expandablelistview/ExpandableListWithHeadersTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/expandablelistview/ExpandableListWithHeadersTest.java
deleted file mode 100644
index 49b5106..0000000
--- a/tests/FrameworkTest/tests/src/com/android/frameworktest/expandablelistview/ExpandableListWithHeadersTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2007 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 com.android.frameworktest.expandablelistview;
-
-import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.KeyEvent;
-import android.widget.ExpandableListView;
-
-import com.android.frameworktest.expandablelistview.ExpandableListWithHeaders;
-import com.android.frameworktest.util.ListUtil;
-
-public class ExpandableListWithHeadersTest extends ActivityInstrumentationTestCase<ExpandableListWithHeaders> {
- private ExpandableListView mExpandableListView;
- private ListUtil mListUtil;
-
- public ExpandableListWithHeadersTest() {
- super("com.android.frameworktest",
- ExpandableListWithHeaders.class);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mExpandableListView = getActivity().getExpandableListView();
- mListUtil = new ListUtil(mExpandableListView, getInstrumentation());
- }
-
- @MediumTest
- public void testPreconditions() {
- assertNotNull(mExpandableListView);
- }
-
- @MediumTest
- public void testExpandOnFirstPosition() {
- // Should be a header, and hence the first group should NOT have expanded
- mListUtil.arrowScrollToSelectedPosition(0);
- sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
- getInstrumentation().waitForIdleSync();
- assertFalse(mExpandableListView.isGroupExpanded(0));
- }
-
- @LargeTest
- public void testExpandOnFirstGroup() {
- mListUtil.arrowScrollToSelectedPosition(getActivity().getNumOfHeadersAndFooters());
- sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
- getInstrumentation().waitForIdleSync();
- assertTrue(mExpandableListView.isGroupExpanded(0));
- }
-}
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/view/RemoteViewsActivityTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/view/RemoteViewsActivityTest.java
deleted file mode 100644
index 3dcb252..0000000
--- a/tests/FrameworkTest/tests/src/com/android/frameworktest/view/RemoteViewsActivityTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2008 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 com.android.frameworktest.view;
-
-import android.os.Parcel;
-import android.test.ActivityInstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.InflateException;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.RemoteViews;
-
-import com.android.frameworktest.R;
-import com.android.frameworktest.view.RemoteViewsActivity;
-
-public class RemoteViewsActivityTest extends ActivityInstrumentationTestCase<RemoteViewsActivity> {
- public RemoteViewsActivityTest() {
- super("com.android.frameworktest", RemoteViewsActivity.class);
- }
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
- }
-
- @MediumTest
- public void testGood() throws Exception {
- final RemoteViewsActivity activity = getActivity();
-
- RemoteViews orig = new RemoteViews("com.android.frameworktest",
- R.layout.remote_view_test_good);
- Parcel p = Parcel.obtain();
- orig.writeToParcel(p, 0);
- p.setDataPosition(0);
-
- RemoteViews r = RemoteViews.CREATOR.createFromParcel(p);
-
- ViewGroup parent = (ViewGroup) activity.findViewById(R.id.parent);
-
- View result = r.apply(activity, parent);
-
- p.recycle();
-
- assertTrue("LinearLayout not inflated", result.findViewById(R.id.linear) != null);
- assertTrue("TextView not inflated", result.findViewById(R.id.text) != null);
- assertTrue("ImageView not inflated", result.findViewById(R.id.image) != null);
- assertTrue("FrameLayout not inflated", result.findViewById(R.id.frame) != null);
- assertTrue("RelateiveLayout not inflated", result.findViewById(R.id.relative) != null);
- assertTrue("AbsoluteLayout not inflated", result.findViewById(R.id.absolute) != null);
- assertTrue("ProgressBar not inflated", result.findViewById(R.id.progress) != null);
- assertTrue("ImageButton not inflated", result.findViewById(R.id.image_button) != null);
- assertTrue("Button not inflated", result.findViewById(R.id.button) != null);
- }
-
- @MediumTest
- public void testDerivedClass() throws Exception {
- final RemoteViewsActivity activity = getActivity();
-
- RemoteViews orig = new RemoteViews("com.android.frameworktest",
- R.layout.remote_view_test_bad_1);
- Parcel p = Parcel.obtain();
- orig.writeToParcel(p, 0);
- p.setDataPosition(0);
-
- RemoteViews r = RemoteViews.CREATOR.createFromParcel(p);
-
- ViewGroup parent = (ViewGroup) activity.findViewById(R.id.parent);
-
- boolean exceptionThrown = false;
- View result = null;
-
- try {
- result = r.apply(activity, parent);
- } catch (InflateException e) {
- exceptionThrown = true;
- }
-
- p.recycle();
-
- assertTrue("Derived class (EditText) allowed to be inflated", exceptionThrown);
- assertNull("Derived class (EditText) allowed to be inflated", result);
- }
-
- @MediumTest
- public void testWebView() throws Exception {
- final RemoteViewsActivity activity = getActivity();
-
- RemoteViews orig = new RemoteViews("com.android.frameworktest",
- R.layout.remote_view_test_bad_2);
- Parcel p = Parcel.obtain();
- orig.writeToParcel(p, 0);
- p.setDataPosition(0);
-
- RemoteViews r = RemoteViews.CREATOR.createFromParcel(p);
-
- ViewGroup parent = (ViewGroup) activity.findViewById(R.id.parent);
-
- boolean exceptionThrown = false;
- View result = null;
-
- try {
- result = r.apply(activity, parent);
- } catch (InflateException e) {
- exceptionThrown = true;
- }
-
- p.recycle();
-
- assertTrue("WebView allowed to be inflated", exceptionThrown);
- assertNull("WebView allowed to be inflated", result);
- }
-}