From 4c65219a0c76301c4551cdaa2180c0f8c890655b Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 08:37:49 -0300 Subject: [PATCH 001/248] If we are common now, these are device specific :) --- BoardConfig.mk | 62 +- janice.mk | 8 + .../base/core/res/res/xml/power_profile.xml | 35 + overlay/packages/Mms/res/xml/mms_config.xml | 61 ++ recovery/recovery_keys.c | 62 ++ rootdir/fstab.samsungjanice | 13 + rootdir/init.samsungjanice.rc | 744 ++++++++++++++++++ rootdir/init.samsungjanice.usb.rc | 108 +++ rootdir/prerecovery.rc | 140 ++++ rootdir/recovery.rc | 84 ++ rootdir/ueventd.samsungjanice.rc | 61 ++ vibrator/vibrator.c | 14 +- 12 files changed, 1381 insertions(+), 11 deletions(-) create mode 100644 overlay/frameworks/base/core/res/res/xml/power_profile.xml create mode 100644 overlay/packages/Mms/res/xml/mms_config.xml create mode 100644 recovery/recovery_keys.c create mode 100644 rootdir/fstab.samsungjanice create mode 100644 rootdir/init.samsungjanice.rc create mode 100644 rootdir/init.samsungjanice.usb.rc create mode 100644 rootdir/prerecovery.rc create mode 100644 rootdir/recovery.rc create mode 100644 rootdir/ueventd.samsungjanice.rc diff --git a/BoardConfig.mk b/BoardConfig.mk index 1aa14cb..bc1f20a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -4,16 +4,76 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth +BOARD_USES_BLUETOOTH_HACK := true + +# Graphics +BOARD_USES_CUSTOM_REFRESHRATE := false + +# Camera +BOARD_USES_CAMERA_FIXES := true + +# Audio +BOARD_HAS_MR0_STE_AUDIO := true + +# Kernel +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_BASE := 0x40000000 +BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" + +# Filesystem +BOARD_NAND_PAGE_SIZE := 4096 +BOARD_NAND_SPARE_SIZE := 128 +BOARD_FLASH_BLOCK_SIZE := 4096 +TARGET_USERIMAGES_USE_EXT4 := true +BOARD_BOOTIMAGE_PARTITION_SIZE := 16777216 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 + +# Wifi +BOARD_WLAN_DEVICE := bcmdhd +BOARD_WLAN_DEVICE_REV := bcm4330 +WPA_SUPPLICANT_VERSION := VER_0_8_X +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd +BOARD_HOSTAPD_DRIVER := NL80211 +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd +WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/dhd.ko" +WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/dhd/parameters/firmware_path" +WIFI_DRIVER_FW_PATH_STA := "/system/etc/wifi/bcmdhd_sta.bin" +WIFI_DRIVER_FW_PATH_AP := "/system/etc/wifi/bcmdhd_apsta.bin" +WIFI_DRIVER_FW_PATH_P2P := "/system/etc/wifi/bcmdhd_p2p.bin" +WIFI_DRIVER_MODULE_NAME := "dhd" +WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.bin nvram_path=/system/etc/wifi/nvram_net.txt" +WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" +WIFI_BAND := 802_11_ABG +BOARD_LEGACY_NL80211_STA_EVENTS := true +BOARD_HAVE_SAMSUNG_WIFI := true # Vibrator -#BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c +BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig + +# Vold +BOARD_VOLD_MAX_PARTITIONS := 12 +BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true +BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true + +# RIL +BOARD_USES_COMMON_RIL := true + +# Recovery +BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c +BOARD_USES_COMMON_RECOVERY_GRAPHICS := true +BOARD_USES_COMMON_RECOVERY := true # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 +# Battery +BOARD_USES_COMMON_BATERY := true + # Inherit from the proprietary version -include vendor/samsung/janice/BoardConfigVendor.mk diff --git a/janice.mk b/janice.mk index af6ee0f..3e142a4 100644 --- a/janice.mk +++ b/janice.mk @@ -14,6 +14,14 @@ PRODUCT_AAPT_PREF_CONFIG := hdpi PRODUCT_PACKAGES += \ GalaxyS2Settings +# Init files +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ + $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ + $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ + $(LOCAL_PATH)/rootdir/prerecovery.rc:root/prerecovery.rc \ + $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc + # RIL PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/manuf_id.cfg:/system/etc/AT/manuf_id.cfg \ diff --git a/overlay/frameworks/base/core/res/res/xml/power_profile.xml b/overlay/frameworks/base/core/res/res/xml/power_profile.xml new file mode 100644 index 0000000..76031be --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/power_profile.xml @@ -0,0 +1,35 @@ + + + 0 + 75 + 17 + 0.3 + 201 + 0.3 + 83 + 52 + 34 + 265 + 242 + 82 + 1 + + 2.7 + 3 + + + 10000000 + 800000 + 400000 + 200000 + + 2 + 15 + + 408 + 249 + 110 + 55 + + 1500 + diff --git a/overlay/packages/Mms/res/xml/mms_config.xml b/overlay/packages/Mms/res/xml/mms_config.xml new file mode 100644 index 0000000..008ee3a --- /dev/null +++ b/overlay/packages/Mms/res/xml/mms_config.xml @@ -0,0 +1,61 @@ + + + true + + + 307200 + + + 768 + + + 1024 + + + 500 + + + 50 + + + 10 + + + 5000 + + + http://wap.samsungmobile.com/uaprof/GT-I9070.xml + + + -1 + + + 4 + + + true + + + false + + + true + + + -1 + + + Samsung GT-i9070 (Samsung Galaxy S Advance) + diff --git a/recovery/recovery_keys.c b/recovery/recovery_keys.c new file mode 100644 index 0000000..528a796 --- /dev/null +++ b/recovery/recovery_keys.c @@ -0,0 +1,62 @@ +#include + +#include "recovery_ui.h" +#include "common.h" +#include "extendedcommands.h" + + +int device_toggle_display(volatile char* key_pressed, int key_code) { + int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT]; + if (alt && key_code == KEY_L) + return 1; + // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off + if (ui_get_showing_back_button()) { + return 0; + //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END); + } + return get_allow_toggle_display() && (key_code == KEY_HOMEPAGE || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END); +} + +int device_handle_key(int key_code, int visible) { + if (visible) { + switch (key_code) { + case KEY_CAPSLOCK: + case KEY_DOWN: + case KEY_VOLUMEDOWN: + return HIGHLIGHT_DOWN; + case KEY_MENU: + return NO_ACTION; + case KEY_LEFTSHIFT: + case KEY_UP: + case KEY_VOLUMEUP: + return HIGHLIGHT_UP; + case KEY_HOMEPAGE: + if (ui_get_showing_back_button()) { + return SELECT_ITEM; + } + if (!get_allow_toggle_display()) + return GO_BACK; + break; + case KEY_POWER: + if (ui_get_showing_back_button()) { + return SELECT_ITEM; + } + if (!get_allow_toggle_display()) + return GO_BACK; + break; + case KEY_LEFTBRACE: + case KEY_ENTER: + case BTN_MOUSE: + case KEY_CAMERA: + case KEY_F21: + case KEY_SEND: + case KEY_END: + case KEY_BACKSPACE: + case KEY_SEARCH: + case KEY_BACK: + return GO_BACK; + } + } + + return NO_ACTION; +} diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice new file mode 100644 index 0000000..e3433ae --- /dev/null +++ b/rootdir/fstab.samsungjanice @@ -0,0 +1,13 @@ +# Android fstab file. +# +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK +# data partition must be located at the bottom for supporting device encryption + +/dev/block/mmcblk0p3 /system ext4 ro,noatime,errors=panic wait +/dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata +/dev/block/mmcblk0p9 /preload ext4 ro,noatime,errors=panic wait + diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc new file mode 100644 index 0000000..76d3f65 --- /dev/null +++ b/rootdir/init.samsungjanice.rc @@ -0,0 +1,744 @@ +import /init.samsungjanice.usb.rc + +on early-init + export EXTERNAL_STORAGE /storage/sdcard0 + export SECONDARY_STORAGE /storage/sdcard1 + mkdir /storage 0775 system system + mkdir /storage/sdcard0 0775 system system + mkdir /storage/sdcard1 0775 system system + mkdir /storage/usbdisk 0775 system system + + mkdir /efs 0771 radio system + mkdir /preload 0771 system system + mkdir /modemfs 0771 system system + mkdir /mnt 0755 root system + mkdir /mnt/.lfs 0755 root root + + # for backwards compatibility + symlink /storage/sdcard0 /sdcard + symlink /storage/sdcard0 /mnt/sdcard + symlink /storage/sdcard1 /extSdCard + symlink /storage/sdcard1 /mnt/extSdCard + symlink /storage/usbdisk /usbdisk0 + symlink /storage/usbdisk /mnt/usbdisk0 + +on init + + # setup the global environment + export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin + export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents/:/vendor/lib + export OMX_STE_ENS_COMPONENTS_DIR /system/lib/ste_omxcomponents/ + export OMX_BELLAGIO_LOADER_REGISTRY /system/etc/omxloaders + + # Vibetonz + export VIBE_PIPE_PATH /dev/pipes + mkdir /dev/pipes 0771 shell shell + + # Shared memory file system + mkdir /dev/shm 0700 root system + mount tmpfs tmpfs /dev/shm mode=0755,gid=1000 + + # create /tmp directory needed by psccd and CSPSA + # ...but make it a symlink so that sysmon may use it also + symlink /dev/socket /tmp + + # mount debugfs in order for Audio ADM component to retrieve debug information + mkdir /debug + mount debugfs none /debug + + +on fs + + mount_all /fstab.samsungjanice + + # Start CSPSA before synchronously running the factory reset utility that + # checks the factory reset triggers in sysfs and CSPSA and then formats + # the block device belonging to /data. + start cspsa + #exec /system/bin/logwrapper /system/bin/factoryreset -f /sys/socinfo/reset_reason -r factory-reset -c CSPSA0 -p 0xfffffffc:31 /dev/block/mmcblk0p5 + +on post-fs + + chown radio radio /modemfs + chmod 0771 /modemfs + chown radio radio /modemfs/APPL + mkdir /modemfs/APPL + chmod 0755 /modemfs/APPL + mkdir /modemfs/BOOT + chown radio radio /modemfs/BOOT + chmod 0755 /modemfs/BOOT + mkdir /modemfs/DO + chown radio radio /modemfs/DO + chmod 0755 /modemfs/DO + mkdir /modemfs/LOG + chown radio radio /modemfs/LOG + chmod 0755 /modemfs/LOG + mkdir /modemfs/TMP + chown radio radio /modemfs/TMP + chmod 0755 /modemfs/TMP + chown radio radio /modemfs/CONF + chmod 0755 /modemfs/CONF + chown radio radio /modemfs/CONF/MCE + chmod 0755 /modemfs/CONF/MCE + chown radio radio /modemfs/CONF/MCE/MCE.CFG + chmod 0644 /modemfs/CONF/MCE/MCE.CFG + chown radio radio /modemfs/PERM + chmod 0755 /modemfs/PERM + chown radio radio /modemfs/PERM/PROT + chmod 0755 /modemfs/PERM/PROT + chown radio radio /modemfs/PERM/PROT/LABEP.CFG + chmod 0644 /modemfs/PERM/PROT/LABEP.CFG + chown radio radio /modemfs/PERM/PROT/PPVALUES.DAT + chmod 0644 /modemfs/PERM/PROT/PPVALUES.DAT + + chown radio system /efs + chmod 0775 /efs + chown radio system /efs/FactoryApp + chmod 0775 /efs/FactoryApp + chown radio system /efs/imei + chmod 0770 /efs/imei + chown radio system /efs/bluetooth + chown radio system /efs/wifi + mkdir /data/mediaserver 0740 media media + + # Samsung Device permissions + chown root system /dev/mmc328x + chown root system /dev/bma222 + chown root system /dev/ecompass_ctrl + chmod 0666 /dev/mmc328x + chmod 0666 /dev/bma222 + chmod 0666 /dev/ecompass_ctrl + + # change the permission sensor chips + chown root system /dev/alps_io + chmod 0660 /dev/alps_io + chown root root /dev/rn5t592 + chmod 777 /dev/rn5t592 + + # Change permission for touchscreen and touch key + chown system radio /sys/class/sec/tsp/cmd + chown system radio /sys/class/sec/tsp/cmd_status + chown system radio /sys/class/sec/tsp/cmd_result + chown system radio /sys/class/sec/sec_touchkey/touchkey_back + chown system radio /sys/class/sec/sec_touchkey/touchkey_menu + chown radio system /sys/class/sec/sec_touchkey/touch_sensitivity + chown system radio /sys/class/sec/sec_touchscreen/tsp_firm_version_panel + chown system radio /sys/class/sec/sec_touchscreen/tsp_firm_version_phone + chown system radio /sys/class/sec/tsp_noise_test/disp_all_refdata + chown system radio /sys/class/sec/tsp_noise_test/disp_all_deltadata + chown system system /sys/class/sec/sec_touchscreen/tsp_threshold + + # DVFS LOCK + chown radio system /sys/power/cpufreq_table + chown radio system /sys/power/cpufreq_max_limit + chown radio system /sys/power/cpufreq_min_limit + chmod 0660 /sys/power/cpufreq_table + chmod 0660 /sys/power/cpufreq_max_limit + chmod 0660 /sys/power/cpufreq_min_limit + chown radio system /debug/prcmu/ape_opp + chown radio system /debug/prcmu/ddr_opp + chmod 0660 /debug/prcmu/ape_opp + chmod 0660 /debug/prcmu/ddr_opp + + # Samsung: ensure read/write access to sensor control device files + chmod 0666 /dev/gp2a_prox + chmod 0666 /dev/gp2a_light + chmod 0666 /dev/mpu60x0_gyro + chmod 0666 /dev/mpu60x0_accel + chmod 0666 /dev/mmc3280 + + # change the permission sensor chips + chown root system /dev/alps_io + chmod 0660 /dev/alps_io + chown system system /system/etc/sensors.dat + chown system system /system/etc/calib.dat + chown system system /system/etc/param.dat + chmod 0664 /system/etc/sensors.dat + chmod 0664 /system/etc/calib.dat + chmod 0664 /system/etc/param.dat + + # Change permission for magnetic sensor rev02 + chown system input /sys/class/input/input8/delay + chown system input /sys/class/input/input8/enable + chown system input /sys/class/input/input8/filter_enable + chown system input /sys/class/input/input8/filter_len + chown system input /sys/class/input/input8/filter_threshold + chown system input /sys/class/input/input8/filter_noise + chown system input /sys/class/input/input8/data + chown system input /sys/class/input/input8/status + chown system input /sys/class/input/input8/wake + chown system input /sys/class/input/input8/position + + chown system input /sys/class/input/input9/threshold + chown system input /sys/class/input/input9/distortion + chown system input /sys/class/input/input9/shape + chown compass input /sys/class/input/input9/offsets + + # orientation + chown system input /sys/class/input/input6/enable + chown system input /sys/class/input/input6/delay + chown system input /sys/class/input/input6/wake + chown system input /sys/class/input/input6/data + chown system input /sys/class/input/input6/status + + write /sys/class/input9/filter_enable 0 + + # Change permission for accelerometer + chown system input /sys/class/sensors/accelerometer_sensor/raw_data + chown system system /sys/class/sensors/accelerometer_sensor/calibration + + chown system system /sys/class/sensors/magnetic_sensor/selftest + chown system system /sys/class/sensors/magnetic_sensor/status + chown system system /sys/class/sensors/magnetic_sensor/dac + chown system system /sys/class/sensors/magnetic_sensor/adc + + chown system system /sys/class/sensors/proximity_sensor/state + chown system system /sys/class/sensors/proximity_sensor/proximity_avg + + # Change permission for gyro_sensor + chown system system /sys/class/sensors/gyro_sensor/temperature + + symlink /dev/block/mmcblk0p1 /dev/block/param + + # Install Kernel Module + insmod /system/lib/modules/j4fs.ko + mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait + + insmod /system/lib/modules/param.ko + write /sys/class/power_supply/battery/batt_reinit_capacity 1 + insmod /system/lib/modules/bthid.ko + + # loading exFAT-fs drivers + insmod /system/lib/modules/exfat_core.ko + insmod /system/lib/modules/exfat_fs.ko + +on post-fs-data + + + mkdir /data/media 0770 media_rw media_rw + chown media_rw media_rw /data/media + # give system access to wpa_supplicant.conf for backup and restore + mkdir /data/misc/psdata + mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth + mkdir /data/misc/bluetooth 0770 system system + mkdir /data/misc/wifi 0770 wifi system + mkdir /data/misc/wifi/sockets 0770 wifi wifi + mkdir /data/misc/dhcp 0775 dhcp dhcp + mkdir /data/misc/wifi 0770 wifi system + chmod 0770 /data/misc/wifi + chmod 0660 /data/misc/wifi/wpa_supplicant.conf + + + mkdir /data/misc/dhcp 0775 dhcp dhcp + chown dhcp dhcp /data/misc/dhcp + chown system system /efs/wifi/.mac.info + chmod 0664 /efs/wifi/.mac.info + + # FactoryTest files permission + mkdir /efs/FactoryApp 0775 + chown radio system /efs/FactoryApp + chmod 0775 /efs/FactoryApp + write /efs/FactoryApp/factorymode ON + chown system system /efs/FactoryApp/factorymode + chmod 0744 /efs/FactoryApp/factorymode + + # SA, System SW, SAMSUNG create log directory + mkdir /data/log 0775 system log + chown system log /data/log + chmod 0775 /data/log + chmod 0775 /data/anr + + + # After we setup wireless subsystem, let dnsmasq create files for soft ap + chown dhcp system /data/misc/dhcp +#[ SEC_MM_DRM + # DRM directory creation + mkdir /system/etc/security/.drm 0775 + chown root root /system/etc/security/.drm + chmod 0775 /system/etc/security/.drm + + # Added for Playready DRM Support + mkdir /data/data/.drm 0775 + chown drm system /data/data/.drm + chmod 0775 /data/data/.drm + mkdir /data/data/.drm/.playready 0775 + chown drm system /data/data/.drm/.playready + chmod 0775 /data/data/.drm/.playready + + # Added drm folder to copy drm plugins + mkdir /system/lib/drm 0775 + chown root root /system/lib/drm + chmod 0775 /system/lib/drm + + # DivX DRM + mkdir /efs/.files 0775 + mkdir /efs/.files/.dx1 0775 + mkdir /efs/.files/.dm33 0775 + mkdir /efs/.files/.mp301 0775 + chown media system /efs/.files/.dx1 + chown media system /efs/.files/.dm33 + chown media system /efs/.files/.mp301 + chmod 0775 /efs/.files/.dx1 + chmod 0775 /efs/.files/.dm33 + chmod 0775 /efs/.files/.mp301 +#] + + # create basic filesystem structure + mkdir /data/misc/psdata + mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth + mkdir /data/misc/bluetooth 0770 system system + + # give system access to ril_config + copy -u /system/etc/ril_config /data/misc/ril_config + chmod 0660 /data/misc/ril_config + chown root radio /data/misc/ril_config + + # Create directory for STE OMX debug logs + mkdir /data/ste-debug 0777 root root + + # give system access to sterc_script when enabling usb nap + copy -u /system/etc/psdata/sterc_conf /data/misc/psdata/sterc_conf + copy -u /system/etc/psdata/sterc_script_connect /data/misc/psdata/sterc_script_connect + copy -u /system/etc/psdata/sterc_script_disconnect /data/misc/psdata/sterc_script_disconnect + copy -u /system/etc/psdata/sterc_conf_alt /data/misc/psdata/sterc_conf_alt + copy -u /system/etc/psdata/sterc_script_connect_alt /data/misc/psdata/sterc_script_connect_alt + copy -u /system/etc/psdata/sterc_script_connect_dun /data/misc/psdata/sterc_script_connect_dun + copy -u /system/etc/psdata/sterc_script_disconnect_dun /data/misc/psdata/sterc_script_disconnect_dun + chmod 0660 /data/misc/psdata/sterc_conf + chmod 0500 /data/misc/psdata/sterc_script_connect + chmod 0500 /data/misc/psdata/sterc_script_disconnect + chmod 0660 /data/misc/psdata/sterc_conf_alt + chmod 0500 /data/misc/psdata/sterc_script_connect_alt + chmod 0500 /data/misc/psdata/sterc_script_connect_dun + chmod 0500 /data/misc/psdata/sterc_script_disconnect_dun + chown root radio /data/misc/psdata/sterc_conf + chown root radio /data/misc/psdata/sterc_conf_alt + + # give system access to stepscc_conf + copy -u /system/etc/psdata/stepscc_conf /data/misc/psdata/stepscc_conf + chmod 0660 /data/misc/psdata/stepscc_conf + chown root radio /data/misc/psdata/stepscc_conf + + # create var/run, var/lib for avahi + mkdir /var + mkdir /var/run + mkdir /var/lib + + # Change permissions for modem_log_relay config file + chmod 666 /modemfs/trace_auto.conf + + # If there is no fs-post-data action in the init..rc file, you + # must uncomment this line, otherwise encrypted filesystems + # won't work. + # Set indication (checked by vold) that we have finished this action + setprop vold.post_fs_data_done 1 + +on early-boot + + # Launch core services in case charging mode is entered + start watchdog-kicker + + # Prepare modem + class_start modem-u8500 + class_start modem-core + + # Enable autonomous power management in CM + write /sys/module/cm/parameters/enable_auto_pm 1 + +on boot + + + # Run sysinit + exec /system/bin/sysinit + + # debugfs + mount debugfs /sys/kernel/debug /sys/kernel/debug + + # Set timeout value for rmnet stats. + write /sys/devices/virtual/net/rmnet0/timeout_suspend 5000000 + + chown system system /sys/class/backlight/pri_lcd_bl/brightness + chown system system /sys/class/backlight/pwm-backlight/brightness + chown system radio /sys/class/backlight/pwm-backlight/device/lcd_power + chown system system /sys/class/backlight/pwm-backlight/device/panel_id + chown system system /sys/class/backlight/pwm-backlight/device/acl_set + chown system system /sys/class/lcd/panel/device/gamma_mode + chown system system /sys/class/lcd/panel/device/gamma_table + chown system system /sys/class/leds/button-backlight/brightness + chown radio radio /sys/class/usb_switch/FSA_SWITCH/jig_smd + chown radio system /sys/class/usb_switch/FSA_SWITCH/smd_wakelock + chown system radio /sys/class/sec/switch/usb_state + + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-005c/enable + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0029/power_state + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0068/range + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0068/datarate + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0068/powermode + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-001e/mode + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-001e/range + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-001e/rate + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0018/range + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0018/mode + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0018/rate + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0018/sleep_wake + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0019/mode + chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0019/range + chown system system /sys/devices/platform/sim-detect.0/voltage + chown audio audio /sys/devices/system/cpu/usecase/voice-call + chown audio audio /sys/devices/system/cpu/usecase/low-power-audio + chown system radio /proc/dump_enable + + # Permission for gpio_keys + chown radio system /sys/devices/platform/gpio-keys.0/wakeup_keys + write /sys/devices/platform/gpio-keys.0/wakeup_keys 172 + +# Vibetonz + chmod 0660 /dev/tspdrv + chown root shell /dev/tspdrv + +# GPS + chown root system /dev/ttyAMA1 + chmod 0660 dev/ttyAMA1 + + chown root system sys/class/sec/gps/GPS_ON_OFF/value + chmod 0664 sys/class/sec/gps/GPS_ON_OFF/value + + chown root system sys/class/sec/gps/GPS_nRST/value + chmod 0664 sys/class/sec/gps/GPS_nRST/value + +# permissions for FMRadio of Broadcom + chmod 0777 /system/bin/btld + +# Peremissions for bluetooth + # UART device + chown bluetooth net_bt_stack /dev/ttyAMA0 + chmod 0660 /dev/ttyAMA0 + +# for bluetooth. change access rights as btld runs as bluetooth user + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0 + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/claim + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/soft + chmod 0664 /sys/class/rfkill/rfkill0/state + chmod 0664 /sys/class/rfkill/rfkill0/claim + chmod 0664 /sys/class/rfkill/rfkill0/soft + setprop service.brcm.bt.pbap_mode btld + +# power up/down interface + chmod 0660 /sys/class/rfkill/rfkill0/type + chmod 0660 /sys/class/rfkill/rfkill0/state + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type + +# bluetooth MAC address programming + setprop ro.bt.bdaddr_path "/efs/bluetooth/bt_addr" + chown bluetooth bluetooth ro.bt.bdaddr_path + chown bluetooth bluetooth /system/etc/bt_addr + chmod 0644 /efs/bluetooth/addr.txt + + # Permissions for LCD + chown system system /sys/class/backlight/panel/brightness + chown system system /sys/class/backlight/panel/auto_brightness + chown system radio /sys/class/lcd/panel/lcd_power + chown system radio /sys/class/lcd/panel/lcd_type + chown system media_rw /sys/class/lcd/panel/power_reduce + chown system system /sys/class/sec/sec_touchkey/brightness + + # MTP device permission + chmod 0660 /dev/usb_mtp_gadget + chown system system /dev/usb_mtp_gadget + + # camera factory + chown system system /sys/class/sec/sec_cam/camtype + chown system system /sys/class/sec/flash/enable + chown system system /sys/class/camera/rear/rear_flash + chown system system /sys/class/camera/front/front_camtype + chown system system /sys/class/camera/rear/rear_camtype + chown system system /sys/class/camera/flash/rear_flash + + # temp Torch workaround + chmod 0222 /sys/class/sec/flash/enable + + # fbearlysuspend module parameters permissions + chown system system /sys/module/fbearlysuspend/parameters/fbdelay + chown system system /sys/module/fbearlysuspend/parameters/fbdelay_ms + chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first + chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first_ms + + # deepest sleep state fix for device parts + chown system system /d/cpuidle/deepest_state + + # Define TCP buffer sizes for various networks + # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, + + setprop net.tcp.buffersize.default 4096,87380,704512,4096,16384,110208 + setprop net.tcp.buffersize.lte 4096,87380,1220608,4096,16384,563200 + setprop net.tcp.buffersize.umts 4096,87380,563200,4096,16384,110208 + setprop net.tcp.buffersize.hspa 4096,87380,704512,4096,16384,110208 + setprop net.tcp.buffersize.hsupa 4096,87380,704512,4096,16384,262144 + setprop net.tcp.buffersize.hsdpa 4096,87380,704512,4096,16384,262144 + setprop net.tcp.buffersize.hspap 4096,87380,1220608,4096,16384,393216 + setprop net.tcp.buffersize.edge 4096,26280,35040,4096,16384,35040 + setprop net.tcp.buffersize.gprs 4096,8760,11680,4096,8760,11680 + setprop net.tcp.buffersize.evdo 4096,87380,563200,4096,16384,262144 + setprop net.tcp.buffersize.evdo_b 4096,87380,704512,4096,16384,262144 + + # camera debug + setprop persist.debug.extcamera.level 777 + setprop persist.debug.mmiocamera.level 777 + setprop debug.libcamera.trace 666 + + # Battery + chown system system /sys/class/power_supply/battery/batt_vol_adc_cal + chown system radio /sys/class/power_supply/battery/fg_reset_soc + + #Set property to change the decoder profile level to 4.1 + setprop ste.video.decoder.h264.def.lev 4.1 + + # Modem + class_start modem + class_start default + +# Make sure we startup btld before hcid +service btld /system/bin/btld -hb 3000000 -hp /dev/ttyAMA0 -lpm 1 + user root + group bluetooth net_bt_admin + disabled + oneshot + +# for bluetooth +service hciattach /system/bin/brcm_patchram_plus --enable_hci --enable_lpm --no2bytes --tosleep 5000 \ + --baudrate 3000000 -use_baudrate_for_download --patchram /system/bin/bcm4330.hcd /dev/ttyAMA0 + class main + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +# for bluetooth rf test +service bt_dut_cmd /system/bin/bcm_dut + group bluetooth net_bt_admin + disabled + oneshot + +# Crash Safe Parameter Storage Area, serving production parameter requests from clients. +# Configuration is read from file "/etc/cspsa.conf" and each found area spawns a CSPSA server +# process. +service cspsa /system/bin/cspsa-server + class parameter_storage + user root + oneshot + +# init Phonet net device required for Phonet communication with Modem +service phonet-netdev /system/bin/ifconfig upnlink0 up + class main + oneshot + +# Copy RF trim data from CSPSA, and start the Modem Storage Agent (MSA) service +service modem /system/bin/sh /system/etc/ste_modem.sh + class modem-u8500 + user root + +# Modem-supervisor +service modem-supervisor /system/bin/modem-supervisor -f /dev/dbx500_mloader_fw -i /sys/devices/platform/ab8500-i2c.0/chip_id -c monitor + class modem-u8500 + user root + +# Creating Modem Security daemon +service copsd /system/bin/copsdaemon + class modem-core + user root + +service bdaddr /system/bin/bdaddr_read + class main + user root + disabled + oneshot + +service dbus /system/bin/dbus-daemon --system --nofork + socket dbus stream 660 bluetooth bluetooth + user bluetooth + group bluetooth net_bt_admin + +service bluetoothd /system/bin/bluetoothd -n + socket bluetooth stream 660 bluetooth bluetooth + socket dbus_bluetooth stream 660 bluetooth bluetooth + # init.rc does not yet support applying capabilities, so run as root and + # let bluetoothd drop uid to bluetooth with the right linux capabilities + group bluetooth net_bt_admin misc + disabled + +service hfag /system/bin/sdptool add --channel=10 HFAG + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +service hsag /system/bin/sdptool add --channel=11 HSAG + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +service opush /system/bin/sdptool add --channel=12 OPUSH + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +service pbap /system/bin/sdptool add --channel=19 PBAP + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +on property:ril.bt_macaddr=* + start bdaddr + +# Modem_log_relay +service modem_log_relay /system/bin/modem_log_relay --ctrl_port=2001 --data_port=2002 --inv_port=2003 --report_port=2005 + class modem + user root + +service admsrv /system/bin/admsrv + class main + user root + group system audio inet net_bt net_bt_admin net_raw shell log + ioprio rt 4 + capability NET_ADMIN NET_RAW SYS_NICE + +service stedump /system/bin/stedump + class main + user root + +service geomagneticd /system/bin/geomagneticd6x + user compass + group system input + +service orientationd /system/bin/orientationd6x + user compass + group system input group system input + +# AT daemon +service atd /system/bin/at_core -mode normal -serial ttyAMA2 + class modem + user root + group radio audio + +# TA Loader +service ta_load /system/bin/ta_loader + user root + group radio + +# AT Distributor for factory test +service at_distributor /system/bin/at_distributor + user root + group radio log + +service watchdog-kicker /system/xbin/watchdog -d /dev/watchdog -t 120 + class main + oneshot + +service battery_params /system/xbin/battery_params + class main + oneshot + +service usbid_init /system/bin/usbid_init.sh + class main + oneshot + +service mobex-daemon /system/bin/npsmobex + class main + user system + group system radio inet sdcard_rw + +# SA, System SW, SAMSUNG +service bugreport /system/bin/bugmailer.sh -v + class main + disabled + oneshot + keycodes 114 115 116 + +# Vibetonz +service immvibed /system/bin/immvibed + class core + user shell + group shell + oneshot + +service mtpd /system/bin/mtpd + socket mtpd stream 600 system system + user vpn + group vpn net_admin net_raw + disabled + oneshot + +on property:ro.dumpstate.dmesg=1 + write /proc/sys/kernel/dmesg_restrict 0 + +service p2p_supplicant /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 +# we will start as root and wpa_supplicant will switch to user wifi +# after setting up the capabilities required for WEXT +# user wifi +# group wifi inet keystore + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service wpa_supplicant /system/bin/wpa_supplicant \ + -Dnl80211 -iwlan0 -e/data/misc/wifi/entropy.bin \ + -c/data/misc/wifi/wpa_supplicant.conf + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + + +service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + +service dhcpcd_rmnet0 /system/bin/dhcpcd -aABKL + class main + disabled + oneshot + +service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG + # This properly enables bluetooth tethering, it asigns a IP to any conected device + disabled + oneshot + +on property:ro.data.large_tcp_window_size=true + # We enable receiving of high-speed conections via ipv4 + write /proc/sys/net/ipv4/tcp_adv_win_scale 1 + +service iprenew_wlan0 /system/bin/dhcpcd -n + class main + disabled + oneshot + +service iprenew_rmnet0 /system/bin/dhcpcd -n + class main + disabled + oneshot + +service iprenew_bnep0 /system/bin/dhcpcd -n + class main + disabled + oneshot + +#for WiFi MFG(TestMode) +service mfgloader /system/bin/mfgloader + class main + disabled + +service wlandutservice /system/bin/wlandutservice + class main + user system + group wifi net_raw net_admin system inet + disabled + oneshot +# end of wifi diff --git a/rootdir/init.samsungjanice.usb.rc b/rootdir/init.samsungjanice.usb.rc new file mode 100644 index 0000000..26b8468 --- /dev/null +++ b/rootdir/init.samsungjanice.usb.rc @@ -0,0 +1,108 @@ +# USB initialization +# + +on init + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/f_rndis/manufacturer Samsung + write /sys/class/android_usb/android0/f_rndis/vendorID 04E8 + write /sys/class/android_usb/android0/f_rndis/wceis 0 + +on boot + write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer} + write /sys/class/android_usb/android0/iProduct ${ro.product.model} + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 + +on post-fs-data + chown system system /sys/class/android_usb/android0/f_mass_storage/lun0/file + chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun0/file + chown system system /sys/class/android_usb/android0/f_mass_storage/lun1/file + chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun1/file + chown system system /sys/class/android_usb/android0/f_rndis/ethaddr + chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr + +on property:sys.usb.config=mtp + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6865 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6866 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685B + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685E + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6863 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6864 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,dm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6864 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,acm,dm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6864 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_acm/instances 1 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + + diff --git a/rootdir/prerecovery.rc b/rootdir/prerecovery.rc new file mode 100644 index 0000000..55f7bcc --- /dev/null +++ b/rootdir/prerecovery.rc @@ -0,0 +1,140 @@ +on early-init + start ueventd + +on init + export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin + export LD_LIBRARY_PATH /vendor/lib:/system/lib + export ANDROID_ROOT /system + export ANDROID_DATA /data + export EXTERNAL_STORAGE /sdcard + + symlink /system/etc /etc + + mkdir /sdcard + mkdir /preload + mkdir /system + mkdir /data + mkdir /cache + mkdir /efs + mkdir /tmp + mkdir /dbdata + + mkdir /mnt 0775 root root + mkdir /mnt/.lfs 0775 root root + + mkdir /system 0775 system system + mkdir /modemfs 0771 system system + mkdir /data 0771 system system + + # STE: create /tmp directory needed by psccd and CSPSA + mkdir /tmp + +on early-fs + + mount ext4 /dev/block/mmcblk0p3 /system wait ro + insmod /lib/modules/j4fs.ko + mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait rw + insmod /lib/modules/param.ko + +on fs + mount tmpfs tmpfs /tmp + + # Start CSPSA before synchronously running the factory reset utility that + # checks the factory reset triggers in sysfs and CSPSA and then formats + # the block device belonging to /data. + start cspsa + #exec /system/bin/logwrapper /system/bin/factoryreset -f /sys/socinfo/reset_reason -r factory-reset -c CSPSA0 -p 0xfffffffc:31 /dev/block/mmcblk0p4 + + # Once any factory reset is completed (this is why exec is used above) it is + # OK to mount the remaining file system volumes. + + mount ext4 /dev/block/mmcblk0p2 /modemfs wait noatime nosuid nodev + mount ext4 /dev/block/mmcblk0p5 /data wait noatime nosuid nodev noauto_da_alloc + mount ext4 /dev/block/mmcblk0p7 /efs wait noatime nosuid nodev + + chmod 0666 /dev/log/radio + chmod 0666 /dev/log/main + chmod 0666 /dev/log/event + +on post-fs + + chown system system /system + chmod 0775 /system + + chown system system /modemfs + chmod 0775 /modemfs + + chown radio system /efs + chmod 0775 /efs + + chown system system /data + chmod 0771 /data + #temp + chmod 750 /sbin/fat.format + mount rootfs rootfs / ro remount + + write /proc/sys/kernel/panic_on_oops 1 + write /proc/sys/kernel/hung_task_timeout_secs 0 + write /proc/cpu/alignment 4 + write /proc/sys/kernel/sched_latency_ns 10000000 + write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000 + write /proc/sys/kernel/sched_compat_yield 1 + write /proc/sys/kernel/sched_child_runs_first 0 + +on boot + + ifup lo + hostname localhost + domainname localdomain + + class_start modem-u8500 + class_start modem-core + class_start default + +service ueventd /sbin/ueventd + critical + +service console /system/bin/sh + console + +# Crash Safe Parameter Storage Area, serving production parameter requests from clients. +# Configuration is read from file "/etc/cspsa.conf" and each found area spawns a CSPSA server +# process. +service cspsa /system/bin/logwrapper /system/bin/cspsa-server + class parameter_storage + user root + oneshot + +#STE: Copy RF trim data from CSPSA, and start the Modem Stroage Agent (MSA) service +service modem /system/bin/sh /system/etc/ste_modem.sh + class modem-u8500 + user root + +#STE: Modem-supervisor +service modem-supervisor /system/bin/modem-supervisor -r -f /dev/dbx500_mloader_fw -i /sys/devices/platform/ab8500-i2c.0/chip_id -c monitor -t 0 + class modem-u8500 + user root + +#STE: Creating Modem Security daemon +service copsd /system/bin/copsdaemon + class modem-core + user root + +#TA Loader to write default IMEI +service ta_load /system/bin/ta_loader recovery + user root + group radio + oneshot + +# block for prerecovery +#service recovery /sbin/recovery + +service adbd /sbin/adbd recovery +# disabled + +on property:persist.service.adb.enable=1 + start adbd + +#on property:persist.service.adb.enable=0 +# stop adbd + diff --git a/rootdir/recovery.rc b/rootdir/recovery.rc new file mode 100644 index 0000000..0a0c146 --- /dev/null +++ b/rootdir/recovery.rc @@ -0,0 +1,84 @@ +on early-init + start ueventd + +on init + export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin + export ANDROID_ROOT /system + export ANDROID_DATA /data + export SECONDARY_STORAGE /emmc + export EXTERNAL_STORAGE /sdcard + + symlink /system/etc /etc + + mkdir /emmc + mkdir /sdcard + mkdir /usbdisk + mkdir /system + mkdir /data + mkdir /cache + mkdir /preload + mount /tmp /tmp tmpfs + + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 + +on early-fs + mount ext4 /dev/block/mmcblk0p3 /system noatime wait + + mkdir /efs + mount ext4 /dev/block/mmcblk0p7 /efs nosuid nodev noatime wait + +# Install Kernel Module + # J4FS(lfs) mount points. + mkdir /mnt 0775 root root + mkdir /mnt/.lfs 0755 root root + + insmod /system/lib/modules/j4fs.ko + insmod /system/lib/modules/param.ko + + mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait + +on boot + ifup lo + hostname localhost + domainname localdomain + + class_start default + +service ueventd /sbin/ueventd + critical + +service console /sbin/sh + class core + console + disabled + group log + +on property:ro.debuggable=1 + start console + +service recovery /sbin/recovery + +service adbd /sbin/adbd recovery + disabled + +# Always start adbd on userdebug and eng builds +# In recovery, always run adbd as root. +on property:ro.debuggable=1 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04e8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/functions adb + write /sys/class/android_usb/android0/enable 1 + write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer + write /sys/class/android_usb/android0/iProduct $ro.product.model + write /sys/class/android_usb/android0/iSerial $ro.serialno + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 + start adbd + setprop service.adb.root 1 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + write /sys/class/android_usb/android0/enable 0 + restart adbd + write /sys/class/android_usb/android0/enable 1 + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 diff --git a/rootdir/ueventd.samsungjanice.rc b/rootdir/ueventd.samsungjanice.rc new file mode 100644 index 0000000..92c1a2d --- /dev/null +++ b/rootdir/ueventd.samsungjanice.rc @@ -0,0 +1,61 @@ +# NMF CM devices +/dev/cm_channel 0660 media system +/dev/cm_control 0660 media system +/dev/cm_sia_trace 0444 media system +/dev/cm_sva_trace 0444 media system + + +# XTI trace device +/dev/stm 0660 media system + +# modem driver - CS-Call +/dev/modemaudio 0660 audio audio + +# camera and flash devices +/dev/mmio_camera 0660 media system +/dev/camera_flash 0660 media system + +# Sensor i2c +/dev/i2c-2 0660 media system +/dev/i2c-4 0660 system system +# PWR QOS devices +/dev/ape_opp 0660 media system +/dev/ddr_opp 0660 media system + +# hwmem driver +/dev/hwmem 0666 media system + +# Mali 3D IP +/dev/mali 0666 system graphics + +# B2R2 device +/dev/b2r2_blt 0666 system graphics + +# overlay device +/dev/disp0 0666 system graphics + +# overlay device +/dev/comp0 0666 system graphics + +# AT USB device - used by ATC +/dev/ttyGS0 0060 root radio + +#permission for dun +/dev/dun 0660 system system + +# modem storage pipe +/dev/rpc 0600 radio radio + +# Trusted Eexecution Engine +/dev/tee 0666 root system + +/dev/socket/cops.socket 0777 nobody nobody +/dev/socket/cspsa_socket_CSPSA0 0666 root root +/dev/db8500-modem-trace 0600 root root +/dev/dbx500_mloader_fw 0600 root root +/dev/block/mmcblk0p19 0660 system system + +# Sensors +/dev/mpu 0660 system system +/dev/mpuirq 0660 system system +/dev/timerirq 0660 system system diff --git a/vibrator/vibrator.c b/vibrator/vibrator.c index 086d25b..9111fb1 100644 --- a/vibrator/vibrator.c +++ b/vibrator/vibrator.c @@ -21,11 +21,6 @@ #include #include - -#ifdef USE_ALTERNATIVE_VIBRATOR -extern int sendit(int timeout_ms); -#else - #define THE_DEVICE "/sys/class/timed_output/vibrator/enable" int vibrator_exists() @@ -33,10 +28,10 @@ int vibrator_exists() int fd; fd = open(THE_DEVICE, O_RDWR); - if(fd != 0) - return 1; + if(fd < 0) + return 0; close(fd); - return 0; + return 1; } static int sendit(int timeout_ms) @@ -61,7 +56,7 @@ int vibrator_on(int timeout_ms) { /* constant on, up to maximum allowed time */ if(timeout_ms < 0) - return sendit(5000); + return sendit(10000); return sendit(timeout_ms); } @@ -71,4 +66,3 @@ int vibrator_off() return (vibrator_exists() == 0) ? 0 : 1; } -#endif From c6dfae05edcbae4803e745bd11ad972cc979b74c Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 08:41:54 -0300 Subject: [PATCH 002/248] Nope,don't disable HW SYNC --- system.prop | 2 -- 1 file changed, 2 deletions(-) diff --git a/system.prop b/system.prop index 1705cd4..5f74176 100644 --- a/system.prop +++ b/system.prop @@ -8,9 +8,7 @@ rild.libargs=-d /dev/ttyS0 ro.sf.lcd_density=240 ro.lcd_min_brightness=30 -# disable hw vsync debug.hwui.render_dirty_regions=false -debug.sf.no_hw_vsync=1 # STE: Low power audio - enable ULP mode ste.nmf.autoidle=1 From 4d3fe803af09776ea77a3020f153a4b39a034850 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 09:15:22 -0300 Subject: [PATCH 003/248] Update BoardConfig.mk --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index bc1f20a..d44095f 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -53,7 +53,7 @@ BOARD_HAVE_SAMSUNG_WIFI := true BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel -TARGET_KERNEL_SOURCE := kernel/samsung/u8500 +TARGET_KERNEL_SOURCE := kernel/samsung/janice TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig From 5e9a2b2eb481c353b00e306b4e8870175572c799 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 20:58:06 -0300 Subject: [PATCH 004/248] Remote build --- BoardConfig.mk | 1 + rootdir/init.samsungjanice.rc | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index d44095f..a79b2e8 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,6 +14,7 @@ BOARD_USES_CAMERA_FIXES := true # Audio BOARD_HAS_MR0_STE_AUDIO := true +TARGET_USES_STE_AUDIO := true # Kernel BOARD_KERNEL_PAGESIZE := 4096 diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 76d3f65..2c84dae 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -611,8 +611,8 @@ service stedump /system/bin/stedump user root service geomagneticd /system/bin/geomagneticd6x - user compass - group system input + user root + group root service orientationd /system/bin/orientationd6x user compass From d4e69f217d6abda218a734ea13e71d752a9b222d Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 22:58:27 -0300 Subject: [PATCH 005/248] Trolololol --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index a79b2e8..80385e4 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -54,7 +54,7 @@ BOARD_HAVE_SAMSUNG_WIFI := true BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel -TARGET_KERNEL_SOURCE := kernel/samsung/janice +TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig From acb8c253d08a729833231f45ea624ccadd2ca44f Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 23:05:40 -0300 Subject: [PATCH 006/248] Update cm.dependencies --- cm.dependencies | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cm.dependencies b/cm.dependencies index c9d21e4..e873eee 100644 --- a/cm.dependencies +++ b/cm.dependencies @@ -1,17 +1,19 @@ [ { - "repository": "android_kernel_samsung_u8500", + "repository": "STEricsson-Android/android_kernel_samsung_u8500", "target_path": "kernel/samsung/u8500" + "revision": "jb" }, { - "repository": "android_device_samsung_u8500-common", + "repository": "STEricsson-Android/android_device_samsung_u8500-common", "target_path": "device/samsung/u8500-common" + "revision": "cm-10.1_staging" }, { - "repository": "android_packages_apps_SamsungServiceMode", + "repository": "CyanogenMod/android_packages_apps_SamsungServiceMode", "target_path": "packages/apps/SamsungServiceMode" } From 1e853bbf9801a2f3caec662cbef9d62265109a60 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 23:14:48 -0300 Subject: [PATCH 007/248] Update cm.mk --- cm.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cm.mk b/cm.mk index 7e71949..c20343e 100644 --- a/cm.mk +++ b/cm.mk @@ -22,4 +22,4 @@ PRODUCT_MODEL := GT-I9070 PRODUCT_MANUFACTURER := samsung # Set build fingerprint / ID / Product Name ect. -PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=GT-I9070 TARGET_DEVICE=GT-I9070 BUILD_FINGERPRINT="samsung/GT-I9070/GT-I9070:4.1.2/JZO54K/I9070XXLQB:user/release-keys" PRIVATE_BUILD_DESC="GT-I9070-user 4.1.2 JZO54K I9070XXLQB release-keys" +PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=GT-I9070 TARGET_DEVICE=GT-I9070 From 072687e42caecc3d7f1cdd27518dafd3fc5e7af9 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 23:17:42 -0300 Subject: [PATCH 008/248] Let the device take care of the syncs :) --- cm.dependencies | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cm.dependencies b/cm.dependencies index e873eee..6687279 100644 --- a/cm.dependencies +++ b/cm.dependencies @@ -11,6 +11,12 @@ "target_path": "device/samsung/u8500-common" "revision": "cm-10.1_staging" }, + + { + "repository": "STEricsson-Android/android_vendor_samsung_u8500-common", + "target_path": "vendor/samsung/u8500-common" + "revision": "cm-10.1_staging" + }, { "repository": "CyanogenMod/android_packages_apps_SamsungServiceMode", From d350c7957c376a27df18593e7addb8ee894a95f8 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 23:27:50 -0300 Subject: [PATCH 009/248] Update cm.dependencies --- cm.dependencies | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/cm.dependencies b/cm.dependencies index 6687279..0141383 100644 --- a/cm.dependencies +++ b/cm.dependencies @@ -1,23 +1,5 @@ [ - { - "repository": "STEricsson-Android/android_kernel_samsung_u8500", - "target_path": "kernel/samsung/u8500" - "revision": "jb" - }, - - { - "repository": "STEricsson-Android/android_device_samsung_u8500-common", - "target_path": "device/samsung/u8500-common" - "revision": "cm-10.1_staging" - }, - - { - "repository": "STEricsson-Android/android_vendor_samsung_u8500-common", - "target_path": "vendor/samsung/u8500-common" - "revision": "cm-10.1_staging" - }, - { "repository": "CyanogenMod/android_packages_apps_SamsungServiceMode", "target_path": "packages/apps/SamsungServiceMode" From 4b4b9344e0e942562dcd3643b2310ed2b2eb6cbe Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Mon, 17 Jun 2013 23:36:51 -0300 Subject: [PATCH 010/248] Update cm.dependencies --- cm.dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cm.dependencies b/cm.dependencies index 0141383..44db6a6 100644 --- a/cm.dependencies +++ b/cm.dependencies @@ -1,7 +1,7 @@ [ { - "repository": "CyanogenMod/android_packages_apps_SamsungServiceMode", + "repository": "android_packages_apps_SamsungServiceMode", "target_path": "packages/apps/SamsungServiceMode" } From e47f13520c2806907700050719b5ff6ae3728efb Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Tue, 18 Jun 2013 00:45:51 -0300 Subject: [PATCH 011/248] vibrator: disable custom vibrator for now. the fix is being done directly on libhardware_legacy --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 80385e4..a552809 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -51,7 +51,7 @@ BOARD_LEGACY_NL80211_STA_EVENTS := true BOARD_HAVE_SAMSUNG_WIFI := true # Vibrator -BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c +#BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 From 28302484d3ec156b46f1e7aece3f9342c82f5b18 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 08:16:23 -0300 Subject: [PATCH 012/248] We want recovery graphics to be built --- BoardConfig.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index a552809..cc472cf 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -69,6 +69,7 @@ BOARD_USES_COMMON_RIL := true # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c BOARD_USES_COMMON_RECOVERY_GRAPHICS := true +BOARD_CUSTOM_GRAPHICS := ../../device/samsung/u8500-common/recovery/graphics.c BOARD_USES_COMMON_RECOVERY := true # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 From 0dd94c4f22eed6175e9c1b1acbc7b15cb7aeeb2f Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 08:29:14 -0300 Subject: [PATCH 013/248] Update BoardConfig.mk --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index cc472cf..a2416b4 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -69,7 +69,7 @@ BOARD_USES_COMMON_RIL := true # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c BOARD_USES_COMMON_RECOVERY_GRAPHICS := true -BOARD_CUSTOM_GRAPHICS := ../../device/samsung/u8500-common/recovery/graphics.c +BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/u8500-common/recovery/graphics.c BOARD_USES_COMMON_RECOVERY := true # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 From cfb1c309debeb7c3c4d7b09400cd767ab1fd37de Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 08:32:32 -0300 Subject: [PATCH 014/248] Add a if not equal just in case, graphics now *should* be built in common :) --- BoardConfig.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index a2416b4..4b3919a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -68,8 +68,9 @@ BOARD_USES_COMMON_RIL := true # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c -BOARD_USES_COMMON_RECOVERY_GRAPHICS := true +ifneq ($(BOARD_CUSTOM_GRAPHICS),./../../device/samsung/u8500-common/recovery/graphics.c) BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/u8500-common/recovery/graphics.c +endif BOARD_USES_COMMON_RECOVERY := true # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 From b6ea0bc2967737a762c59efa55b76b2bc4aff200 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 08:46:08 -0300 Subject: [PATCH 015/248] Recovery files don't like to be common, make them device specific :( --- BoardConfig.mk | 4 +- recovery/graphics.c | 401 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 402 insertions(+), 3 deletions(-) create mode 100644 recovery/graphics.c diff --git a/BoardConfig.mk b/BoardConfig.mk index 4b3919a..d098680 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -68,9 +68,7 @@ BOARD_USES_COMMON_RIL := true # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c -ifneq ($(BOARD_CUSTOM_GRAPHICS),./../../device/samsung/u8500-common/recovery/graphics.c) -BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/u8500-common/recovery/graphics.c -endif +BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/janice/recovery/graphics.c BOARD_USES_COMMON_RECOVERY := true # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 diff --git a/recovery/graphics.c b/recovery/graphics.c new file mode 100644 index 0000000..daf75be --- /dev/null +++ b/recovery/graphics.c @@ -0,0 +1,401 @@ +/* + * 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. + */ + +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#ifdef BOARD_USE_CUSTOM_RECOVERY_FONT +#include BOARD_USE_CUSTOM_RECOVERY_FONT +#else +#include "font_10x18.h" +#endif + +#include "minui.h" + +#if defined(RECOVERY_BGRA) +#define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888 +#define PIXEL_SIZE 4 +#elif defined(RECOVERY_RGBX) +#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBX_8888 +#define PIXEL_SIZE 4 +#else +#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGB_565 +#define PIXEL_SIZE 2 +#endif + +#define NUM_BUFFERS 2 + +typedef struct { + GGLSurface texture; + unsigned cwidth; + unsigned cheight; + unsigned ascent; +} GRFont; + +static GRFont *gr_font = 0; +static GGLContext *gr_context = 0; +static GGLSurface gr_font_texture; +static GGLSurface gr_framebuffer[NUM_BUFFERS]; +static GGLSurface gr_mem_surface; +static unsigned gr_active_fb = 0; +static unsigned double_buffering = 0; + +static int gr_fb_fd = -1; +static int gr_vt_fd = -1; + +static struct fb_var_screeninfo vi; +static struct fb_fix_screeninfo fi; + +static int get_framebuffer(GGLSurface *fb) +{ + int fd; + void *bits; + + fd = open("/dev/graphics/fb0", O_RDWR); + if (fd < 0) { + perror("cannot open fb0"); + return -1; + } + + if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { + perror("failed to get fb0 info"); + close(fd); + return -1; + } + + vi.bits_per_pixel = PIXEL_SIZE * 8; + if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { + vi.red.offset = 8; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 24; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; + } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { + vi.red.offset = 24; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 8; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; + } else { /* RGB565*/ + vi.red.offset = 11; + vi.red.length = 5; + vi.green.offset = 5; + vi.green.length = 6; + vi.blue.offset = 0; + vi.blue.length = 5; + vi.transp.offset = 0; + vi.transp.length = 0; + } + if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { + perror("failed to put fb0 info"); + close(fd); + return -1; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { + perror("failed to get fb0 info"); + close(fd); + return -1; + } + + bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (bits == MAP_FAILED) { + perror("failed to mmap framebuffer"); + close(fd); + return -1; + } + + fb->version = sizeof(*fb); + fb->width = vi.xres; + fb->height = vi.yres; + fb->stride = fi.line_length/PIXEL_SIZE; + fb->data = bits; + fb->format = PIXEL_FORMAT; + memset(fb->data, 0, vi.yres * fi.line_length); + + fb++; + + /* check if we can use double buffering */ + if (vi.yres * fi.line_length * 2 > fi.smem_len) + return fd; + + double_buffering = 1; + + fb->version = sizeof(*fb); + fb->width = vi.xres; + fb->height = vi.yres; + fb->stride = fi.line_length/PIXEL_SIZE; + fb->data = (void*) (((unsigned) bits) + vi.yres * fi.line_length); + fb->format = PIXEL_FORMAT; + memset(fb->data, 0, vi.yres * fi.line_length); + + return fd; +} + +static void get_memory_surface(GGLSurface* ms) { + ms->version = sizeof(*ms); + ms->width = vi.xres; + ms->height = vi.yres; + ms->stride = fi.line_length/PIXEL_SIZE; + ms->data = malloc(fi.line_length * vi.yres); + ms->format = PIXEL_FORMAT; +} + +static void set_active_framebuffer(unsigned n) +{ + if (n > 1 || !double_buffering) return; + vi.yres_virtual = vi.yres * NUM_BUFFERS; + vi.yoffset = n * vi.yres; + vi.bits_per_pixel = PIXEL_SIZE * 8; + if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) { + perror("active fb swap failed"); + } +} + +void gr_flip(void) +{ + GGLContext *gl = gr_context; + + /* swap front and back buffers */ + if (double_buffering) + gr_active_fb = (gr_active_fb + 1) & 1; + + /* copy data from the in-memory surface to the buffer we're about + * to make active. */ + memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data, + fi.line_length * vi.yres); + + /* inform the display driver */ + set_active_framebuffer(gr_active_fb); +} + +void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + GGLContext *gl = gr_context; + GGLint color[4]; + color[0] = ((r << 8) | r) + 1; + color[1] = ((g << 8) | g) + 1; + color[2] = ((b << 8) | b) + 1; + color[3] = ((a << 8) | a) + 1; + gl->color4xv(gl, color); +} + +int gr_measure(const char *s) +{ + return gr_font->cwidth * strlen(s); +} + +void gr_font_size(int *x, int *y) +{ + *x = gr_font->cwidth; + *y = gr_font->cheight; +} + +int gr_text(int x, int y, const char *s) +{ + GGLContext *gl = gr_context; + GRFont *font = gr_font; + unsigned off; + + y -= font->ascent; + + gl->bindTexture(gl, &font->texture); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + + while((off = *s++)) { + off -= 32; + if (off < 96) { + gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y); + gl->recti(gl, x, y, x + font->cwidth, y + font->cheight); + } + x += font->cwidth; + } + + return x; +} + +void gr_fill(int x, int y, int w, int h) +{ + GGLContext *gl = gr_context; + gl->disable(gl, GGL_TEXTURE_2D); + gl->recti(gl, x, y, w, h); +} + +void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { + if (gr_context == NULL) { + return; + } + GGLContext *gl = gr_context; + + gl->bindTexture(gl, (GGLSurface*) source); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + gl->texCoord2i(gl, sx - dx, sy - dy); + gl->recti(gl, dx, dy, dx + w, dy + h); +} + +unsigned int gr_get_width(gr_surface surface) { + if (surface == NULL) { + return 0; + } + return ((GGLSurface*) surface)->width; +} + +unsigned int gr_get_height(gr_surface surface) { + if (surface == NULL) { + return 0; + } + return ((GGLSurface*) surface)->height; +} + +static void gr_init_font(void) +{ + GGLSurface *ftex; + unsigned char *bits, *rle; + unsigned char *in, data; + + gr_font = calloc(sizeof(*gr_font), 1); + ftex = &gr_font->texture; + + bits = malloc(font.width * font.height); + + ftex->version = sizeof(*ftex); + ftex->width = font.width; + ftex->height = font.height; + ftex->stride = font.width; + ftex->data = (void*) bits; + ftex->format = GGL_PIXEL_FORMAT_A_8; + + in = font.rundata; + while((data = *in++)) { + memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); + bits += (data & 0x7f); + } + + gr_font->cwidth = font.cwidth; + gr_font->cheight = font.cheight; + gr_font->ascent = font.cheight - 2; +} + +int gr_init_real(void) +{ + gglInit(&gr_context); + GGLContext *gl = gr_context; + + gr_init_font(); + gr_vt_fd = open("/dev/tty0", O_RDWR | O_SYNC); + if (gr_vt_fd < 0) { + // This is non-fatal; post-Cupcake kernels don't have tty0. + perror("can't open /dev/tty0"); + } else if (ioctl(gr_vt_fd, KDSETMODE, (void*) KD_GRAPHICS)) { + // However, if we do open tty0, we expect the ioctl to work. + perror("failed KDSETMODE to KD_GRAPHICS on tty0"); + gr_exit(); + return -1; + } + + gr_fb_fd = get_framebuffer(gr_framebuffer); + if (gr_fb_fd < 0) { + gr_exit(); + return -1; + } + + get_memory_surface(&gr_mem_surface); + + fprintf(stderr, "framebuffer: fd %d (%d x %d)\n", + gr_fb_fd, gr_framebuffer[0].width, gr_framebuffer[0].height); + + /* start with 0 as front (displayed) and 1 as back (drawing) */ + gr_active_fb = 0; + set_active_framebuffer(0); + gl->colorBuffer(gl, &gr_mem_surface); + + gl->activeTexture(gl, 0); + gl->enable(gl, GGL_BLEND); + gl->blendFunc(gl, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA); + + gr_fb_blank(true); + gr_fb_blank(false); + + return 0; +} + +int gr_init(void) +{ + gr_init_real(); + gr_init_real(); + return 0; +} + +void gr_exit(void) +{ + close(gr_fb_fd); + gr_fb_fd = -1; + + free(gr_mem_surface.data); + + ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT); + close(gr_vt_fd); + gr_vt_fd = -1; +} + +int gr_fb_width(void) +{ + return gr_framebuffer[0].width; +} + +int gr_fb_height(void) +{ + return gr_framebuffer[0].height; +} + +gr_pixel *gr_fb_data(void) +{ + return (unsigned short *) gr_mem_surface.data; +} + +void gr_fb_blank(bool blank) +{ + int ret; + + ret = ioctl(gr_fb_fd, FBIOBLANK, blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK); + if (ret < 0) + perror("ioctl(): blank"); +} From dd3d458c1d18b65a0403ff546f0696fcb00a1811 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 13:04:40 -0300 Subject: [PATCH 016/248] Correct my stupid mistakes We want to use these in devices, not just include them by a if equal (ifeq) in common --- BoardConfig.mk | 34 ++++++++++----------- janice.mk | 2 +- overlay/packages/Mms/res/xml/mms_config.xml | 2 +- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index d098680..3d886a0 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -4,17 +4,6 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth -BOARD_USES_BLUETOOTH_HACK := true - -# Graphics -BOARD_USES_CUSTOM_REFRESHRATE := false - -# Camera -BOARD_USES_CAMERA_FIXES := true - -# Audio -BOARD_HAS_MR0_STE_AUDIO := true -TARGET_USES_STE_AUDIO := true # Kernel BOARD_KERNEL_PAGESIZE := 4096 @@ -50,8 +39,21 @@ WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true BOARD_HAVE_SAMSUNG_WIFI := true +# Platform +TARGET_SOC := u8500 +TARGET_BOARD_PLATFORM := montblanc +TARGET_BOOTLOADER_BOARD_NAME := montblanc +COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE + +TARGET_NO_BOOTLOADER := true +TARGET_NO_RADIOIMAGE := true + +TARGET_PROVIDES_INIT := true +TARGET_PROVIDES_INIT_TARGET_RC := true + + # Vibrator -#BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c +# BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 @@ -63,18 +65,14 @@ BOARD_VOLD_MAX_PARTITIONS := 12 BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true -# RIL -BOARD_USES_COMMON_RIL := true # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/janice/recovery/graphics.c -BOARD_USES_COMMON_RECOVERY := true +TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc # Assert TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 -# Battery -BOARD_USES_COMMON_BATERY := true # Inherit from the proprietary version --include vendor/samsung/janice/BoardConfigVendor.mk +-include vendor/samsung/u8500-common/BoardConfigVendor.mk diff --git a/janice.mk b/janice.mk index 3e142a4..849bab2 100644 --- a/janice.mk +++ b/janice.mk @@ -35,4 +35,4 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/usr/keylayout/Vendor_04e8_Product_7021.kl:system/usr/keylayout/Vendor_04e8_Product_7021.kl # Use non-open-source parts if present -$(call inherit-product-if-exists, vendor/samsung/janice/janice-vendor.mk) +$(call inherit-product-if-exists, vendor/samsung/u8500-common/janice/janice-vendor-blobs.mk) diff --git a/overlay/packages/Mms/res/xml/mms_config.xml b/overlay/packages/Mms/res/xml/mms_config.xml index 008ee3a..94b2a29 100644 --- a/overlay/packages/Mms/res/xml/mms_config.xml +++ b/overlay/packages/Mms/res/xml/mms_config.xml @@ -28,7 +28,7 @@ 5000 - http://wap.samsungmobile.com/uaprof/GT-I9070.xml + http://wap.samsungmobile.com/uaprof/GT-I9070P.xml From 388389614d1b038ee5a74012ce70f7c4fe75746f Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 13:09:36 -0300 Subject: [PATCH 017/248] Correct my stupid mistakes --- .../base/core/res/res/values/arrays.xml | 37 + .../base/core/res/res/values/config.xml | 235 ++++++ .../base/core/res/res/xml/storage_list.xml | 53 ++ .../SettingsProvider/res/values/defaults.xml | 24 + .../packages/SystemUI/res/values/config.xml | 26 + overlay/include/hardware/copybit.h | 257 +++++++ overlay/include/hardware/gps.h | 686 ++++++++++++++++++ overlay/include/system/graphics.h | 195 +++++ .../apps/Camera/res/values/config.xml | 32 + .../{ => apps}/Mms/res/xml/mms_config.xml | 0 .../apps/Settings/res/values/config.xml | 27 + .../packages/apps/Torch/res/values/config.xml | 30 + 12 files changed, 1602 insertions(+) create mode 100644 overlay/frameworks/base/core/res/res/values/arrays.xml create mode 100644 overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 overlay/frameworks/base/core/res/res/xml/storage_list.xml create mode 100644 overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml create mode 100644 overlay/frameworks/base/packages/SystemUI/res/values/config.xml create mode 100644 overlay/include/hardware/copybit.h create mode 100644 overlay/include/hardware/gps.h create mode 100644 overlay/include/system/graphics.h create mode 100644 overlay/packages/apps/Camera/res/values/config.xml rename overlay/packages/{ => apps}/Mms/res/xml/mms_config.xml (100%) create mode 100644 overlay/packages/apps/Settings/res/values/config.xml create mode 100644 overlay/packages/apps/Torch/res/values/config.xml diff --git a/overlay/frameworks/base/core/res/res/values/arrays.xml b/overlay/frameworks/base/core/res/res/values/arrays.xml new file mode 100644 index 0000000..2558b33 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/arrays.xml @@ -0,0 +1,37 @@ + + + + + + + @string/reboot_reboot + @string/reboot_recovery + @string/reboot_download + + + + + + recovery + download + + + diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100644 index 0000000..feeec3f --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,235 @@ + + + + + + + + false + + 0 + 1 + + + true + + + false + + + + + + + + + wifi,1,1,1,-1,true + mobile,0,0,0,-1,true + mobile_mms,2,0,2,60000,true + mobile_supl,3,0,2,60000,true + mobile_dun,4,0,2,60000,true + mobile_hipri,5,0,3,60000,true + mobile_bluetooth,7,7,2,-1,true + mobile_fota,10,0,2,60000,true + mobile_ims,11,0,2,60000,true + mobile_cbs,12,0,2,60000,true + wifi_p2p,13,1,0,-1,true + mobile_bip,17,0,2,60000,true + + + + + + + "1,1" + "0,1" + "7,1" + + + + + + + "rndis0" + + + + + + + + "wlan0" + + + + + + + "bnep0" + + + + + + 0 + 1 + 4 + 5 + 7 + + + + true + + + true + + + true + + + true + + + + 0 + 1 + 20 + 21 + + + + + 0 + 10 + 20 + 30 + + + + + 20 + + + + + 0 + 1 + 20 + 21 + + + + + 0 + 1 + 20 + 21 + 500 + 600 + + + + + 0 + 15 + 10 + 10 + + + + pdp0 + + + true + + + true + + + true + + + true + + + /sys/devices/virtual/android_usb/android0/f_mass_storage/lun0/file + + + true + + + + 7 + 75 + 1000 + 10000 + + + + + 20 + 30 + 110 + 175 + 255 + + + + + 255 + 255 + 255 + 0 + 0 + + + diff --git a/overlay/frameworks/base/core/res/res/xml/storage_list.xml b/overlay/frameworks/base/core/res/res/xml/storage_list.xml new file mode 100644 index 0000000..7bdeabd --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/storage_list.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml new file mode 100644 index 0000000..c7c7562 --- /dev/null +++ b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml @@ -0,0 +1,24 @@ + + + + + + + 30000 + diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml new file mode 100644 index 0000000..210c15b --- /dev/null +++ b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml @@ -0,0 +1,26 @@ + + + + + + + + true + diff --git a/overlay/include/hardware/copybit.h b/overlay/include/hardware/copybit.h new file mode 100644 index 0000000..29deb54 --- /dev/null +++ b/overlay/include/hardware/copybit.h @@ -0,0 +1,257 @@ +/* + * 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. + */ + +#ifndef ANDROID_COPYBIT_INTERFACE_H +#define ANDROID_COPYBIT_INTERFACE_H + +#include + +#include +#include +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define COPYBIT_HARDWARE_MODULE_ID "copybit" + +/** + * Name of the graphics device to open + */ +#define COPYBIT_HARDWARE_COPYBIT0 "copybit0" + +/* supported pixel-formats. these must be compatible with + * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h + */ +enum { + COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, + COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, + COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, + COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, + COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, + COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, + COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, + COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP, + COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP, + COPYBIT_FORMAT_YCbCr_422_P = HAL_PIXEL_FORMAT_YCbCr_422_P, + COPYBIT_FORMAT_YCbCr_420_P = HAL_PIXEL_FORMAT_YCbCr_420_P, + COPYBIT_FORMAT_YCrCb_422_SP = HAL_PIXEL_FORMAT_YCrCb_422_SP, + COPYBIT_FORMAT_YCrCb_420_SP = HAL_PIXEL_FORMAT_YCrCb_420_SP, + COPYBIT_FORMAT_YCrCb_422_P = HAL_PIXEL_FORMAT_YCrCb_422_P, + COPYBIT_FORMAT_YCrCb_420_P = HAL_PIXEL_FORMAT_YCrCb_420_P, + /* STE: Added Support for YUV42XMBN, required for Copybit CC acceleration */ + COPYBIT_FORMAT_YCBCR42XMBN = HAL_PIXEL_FORMAT_YCBCR42XMBN, + /* STE: Added for YCbCr422R -> RGB888 use-case */ + COPYBIT_FORMAT_YCbCr_422_I = HAL_PIXEL_FORMAT_YCbCr_422_I, +}; + +/* name for copybit_set_parameter */ +enum { + /* rotation of the source image in degrees (0 to 359) */ + COPYBIT_ROTATION_DEG = 1, + /* plane alpha value */ + COPYBIT_PLANE_ALPHA = 2, + /* enable or disable dithering */ + COPYBIT_DITHER = 3, + /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */ + COPYBIT_TRANSFORM = 4, + /* blurs the copied bitmap. The amount of blurring cannot be changed + * at this time. */ + COPYBIT_BLUR = 5 +}; + +/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */ +enum { + /* flip source image horizontally */ + COPYBIT_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H, + /* flip source image vertically */ + COPYBIT_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V, + /* rotate source image 90 degres */ + COPYBIT_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90, + /* rotate source image 180 degres */ + COPYBIT_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180, + /* rotate source image 270 degres */ + COPYBIT_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, +}; + +/* enable/disable value copybit_set_parameter */ +enum { + COPYBIT_DISABLE = 0, + COPYBIT_ENABLE = 1 +}; + +/* use get_static_info() to query static informations about the hardware */ +enum { + /* Maximum amount of minification supported by the hardware*/ + COPYBIT_MINIFICATION_LIMIT = 1, + /* Maximum amount of magnification supported by the hardware */ + COPYBIT_MAGNIFICATION_LIMIT = 2, + /* Number of fractional bits support by the scaling engine */ + COPYBIT_SCALING_FRAC_BITS = 3, + /* Supported rotation step in degres. */ + COPYBIT_ROTATION_STEP_DEG = 4, +}; + +/* Image structure */ +struct copybit_image_t { + /* width */ + uint32_t w; + /* height */ + uint32_t h; + /* format COPYBIT_FORMAT_xxx */ + int32_t format; + /* base of buffer with image */ + void *base; + /* handle to the image */ + native_handle_t* handle; +}; + +/* Rectangle */ +struct copybit_rect_t { + /* left */ + int l; + /* top */ + int t; + /* right */ + int r; + /* bottom */ + int b; +}; + +/* Color (components in range 0-255) */ +struct copybit_color_t { + /* Red */ + uint8_t r; + /* Green */ + uint8_t g; + /* Blue */ + uint8_t b; + /* Alpha */ + uint8_t a; +}; + +/* Region */ +struct copybit_region_t { + int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect); +}; + +/** + * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM + * and the fields of this data structure must begin with hw_module_t + * followed by module specific information. + */ +struct copybit_module_t { + struct hw_module_t common; +}; + +/** + * Every device data structure must begin with hw_device_t + * followed by module specific public methods and attributes. + */ +struct copybit_device_t { + struct hw_device_t common; + + /** + * Set a copybit parameter. + * + * @param dev from open + * @param name one for the COPYBIT_NAME_xxx + * @param value one of the COPYBIT_VALUE_xxx + * + * @return 0 if successful + */ + int (*set_parameter)(struct copybit_device_t *dev, int name, int value); + + /** + * Get a static copybit information. + * + * @param dev from open + * @param name one of the COPYBIT_STATIC_xxx + * + * @return value or -EINVAL if error + */ + int (*get)(struct copybit_device_t *dev, int name); + + /** + * Execute the bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param region the clip region + * + * @return 0 if successful + */ + int (*blit)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_region_t const *region); + + /** + * Execute the stretch bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param dst_rect is the destination rectangle + * @param src_rect is the source rectangle + * @param region the clip region + * + * @return 0 if successful + */ + int (*stretch)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_rect_t const *dst_rect, + struct copybit_rect_t const *src_rect, + struct copybit_region_t const *region); + + /** + * Execute the fill bit blit operation + * + * @param dev from open + * @param dst is the destination image + * @param rect is the destination rectangle + * @param color is the fill color + * @param region the clip region + */ + int (*fill)(struct copybit_device_t *dev, + struct copybit_image_t *dst, + struct copybit_rect_t *rect, + struct copybit_color_t *color, + struct copybit_region_t *region); +}; + + +/** convenience API for opening and closing a device */ + +static inline int copybit_open(const struct hw_module_t* module, + struct copybit_device_t** device) { + return module->methods->open(module, + COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device); +} + +static inline int copybit_close(struct copybit_device_t* device) { + return device->common.close(&device->common); +} + + +__END_DECLS + +#endif // ANDROID_COPYBIT_INTERFACE_H + diff --git a/overlay/include/hardware/gps.h b/overlay/include/hardware/gps.h new file mode 100644 index 0000000..05b3b11 --- /dev/null +++ b/overlay/include/hardware/gps.h @@ -0,0 +1,686 @@ +/* + * Copyright (C) 2010 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. + */ + +#ifndef ANDROID_INCLUDE_HARDWARE_GPS_H +#define ANDROID_INCLUDE_HARDWARE_GPS_H + +#include +#include +#include +#include + +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define GPS_HARDWARE_MODULE_ID "gps" + + +/** Milliseconds since January 1, 1970 */ +typedef int64_t GpsUtcTime; + +/** Maximum number of SVs for gps_sv_status_callback(). */ +#define GPS_MAX_SVS 32 + +/** Requested operational mode for GPS operation. */ +typedef uint32_t GpsPositionMode; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Mode for running GPS standalone (no assistance). */ +#define GPS_POSITION_MODE_STANDALONE 0 +/** AGPS MS-Based mode. */ +#define GPS_POSITION_MODE_MS_BASED 1 +/** AGPS MS-Assisted mode. */ +#define GPS_POSITION_MODE_MS_ASSISTED 2 + +/** Requested recurrence mode for GPS operation. */ +typedef uint32_t GpsPositionRecurrence; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Receive GPS fixes on a recurring basis at a specified period. */ +#define GPS_POSITION_RECURRENCE_PERIODIC 0 +/** Request a single shot GPS fix. */ +#define GPS_POSITION_RECURRENCE_SINGLE 1 + +/** GPS status event values. */ +typedef uint16_t GpsStatusValue; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GPS status unknown. */ +#define GPS_STATUS_NONE 0 +/** GPS has begun navigating. */ +#define GPS_STATUS_SESSION_BEGIN 1 +/** GPS has stopped navigating. */ +#define GPS_STATUS_SESSION_END 2 +/** GPS has powered on but is not navigating. */ +#define GPS_STATUS_ENGINE_ON 3 +/** GPS is powered off. */ +#define GPS_STATUS_ENGINE_OFF 4 + +/** Flags to indicate which values are valid in a GpsLocation. */ +typedef uint16_t GpsLocationFlags; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GpsLocation has valid latitude and longitude. */ +#define GPS_LOCATION_HAS_LAT_LONG 0x0001 +/** GpsLocation has valid altitude. */ +#define GPS_LOCATION_HAS_ALTITUDE 0x0002 +/** GpsLocation has valid speed. */ +#define GPS_LOCATION_HAS_SPEED 0x0004 +/** GpsLocation has valid bearing. */ +#define GPS_LOCATION_HAS_BEARING 0x0008 +/** GpsLocation has valid accuracy. */ +#define GPS_LOCATION_HAS_ACCURACY 0x0010 + +/** Flags for the gps_set_capabilities callback. */ + +/** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. + If this is not set, then the framework will use 1000ms for min_interval + and will start and call start() and stop() to schedule the GPS. + */ +#define GPS_CAPABILITY_SCHEDULING 0x0000001 +/** GPS supports MS-Based AGPS mode */ +#define GPS_CAPABILITY_MSB 0x0000002 +/** GPS supports MS-Assisted AGPS mode */ +#define GPS_CAPABILITY_MSA 0x0000004 +/** GPS supports single-shot fixes */ +#define GPS_CAPABILITY_SINGLE_SHOT 0x0000008 +/** GPS supports on demand time injection */ +#define GPS_CAPABILITY_ON_DEMAND_TIME 0x0000010 + +/** Flags used to specify which aiding data to delete + when calling delete_aiding_data(). */ +typedef uint16_t GpsAidingData; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +#define GPS_DELETE_EPHEMERIS 0x0001 +#define GPS_DELETE_ALMANAC 0x0002 +#define GPS_DELETE_POSITION 0x0004 +#define GPS_DELETE_TIME 0x0008 +#define GPS_DELETE_IONO 0x0010 +#define GPS_DELETE_UTC 0x0020 +#define GPS_DELETE_HEALTH 0x0040 +#define GPS_DELETE_SVDIR 0x0080 +#define GPS_DELETE_SVSTEER 0x0100 +#define GPS_DELETE_SADATA 0x0200 +#define GPS_DELETE_RTI 0x0400 +#define GPS_DELETE_CELLDB_INFO 0x8000 +#define GPS_DELETE_ALL 0xFFFF + +/** AGPS type */ +typedef uint16_t AGpsType; +#define AGPS_TYPE_SUPL 1 +#define AGPS_TYPE_C2K 2 + +typedef uint16_t AGpsSetIDType; +#define AGPS_SETID_TYPE_NONE 0 +#define AGPS_SETID_TYPE_IMSI 1 +#define AGPS_SETID_TYPE_MSISDN 2 + +/** + * String length constants + */ +#define GPS_NI_SHORT_STRING_MAXLEN 256 +#define GPS_NI_LONG_STRING_MAXLEN 2048 + +/** + * GpsNiType constants + */ +typedef uint32_t GpsNiType; +#define GPS_NI_TYPE_VOICE 1 +#define GPS_NI_TYPE_UMTS_SUPL 2 +#define GPS_NI_TYPE_UMTS_CTRL_PLANE 3 + +/** + * GpsNiNotifyFlags constants + */ +typedef uint32_t GpsNiNotifyFlags; +/** NI requires notification */ +#define GPS_NI_NEED_NOTIFY 0x0001 +/** NI requires verification */ +#define GPS_NI_NEED_VERIFY 0x0002 +/** NI requires privacy override, no notification/minimal trace */ +#define GPS_NI_PRIVACY_OVERRIDE 0x0004 + +/** + * GPS NI responses, used to define the response in + * NI structures + */ +typedef int GpsUserResponseType; +#define GPS_NI_RESPONSE_ACCEPT 1 +#define GPS_NI_RESPONSE_DENY 2 +#define GPS_NI_RESPONSE_NORESP 3 + +/** + * NI data encoding scheme + */ +typedef int GpsNiEncodingType; +#define GPS_ENC_NONE 0 +#define GPS_ENC_SUPL_GSM_DEFAULT 1 +#define GPS_ENC_SUPL_UTF8 2 +#define GPS_ENC_SUPL_UCS2 3 +#define GPS_ENC_UNKNOWN -1 + +/** AGPS status event values. */ +typedef uint16_t AGpsStatusValue; +/** GPS requests data connection for AGPS. */ +#define GPS_REQUEST_AGPS_DATA_CONN 1 +/** GPS releases the AGPS data connection. */ +#define GPS_RELEASE_AGPS_DATA_CONN 2 +/** AGPS data connection initiated */ +#define GPS_AGPS_DATA_CONNECTED 3 +/** AGPS data connection completed */ +#define GPS_AGPS_DATA_CONN_DONE 4 +/** AGPS data connection failed */ +#define GPS_AGPS_DATA_CONN_FAILED 5 + +#define AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 +#define AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 +#define AGPS_REG_LOCATION_TYPE_MAC 3 + +/** Network types for update_network_state "type" parameter */ +#define AGPS_RIL_NETWORK_TYPE_MOBILE 0 +#define AGPS_RIL_NETWORK_TYPE_WIFI 1 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 +#define AGPS_RIL_NETWORK_TTYPE_WIMAX 6 + +/** + * Name for the GPS XTRA interface. + */ +#define GPS_XTRA_INTERFACE "gps-xtra" + +/** + * Name for the GPS DEBUG interface. + */ +#define GPS_DEBUG_INTERFACE "gps-debug" + +/** + * Name for the AGPS interface. + */ +#define AGPS_INTERFACE "agps" + +/** + * Name for NI interface + */ +#define GPS_NI_INTERFACE "gps-ni" + +/** + * Name for the AGPS-RIL interface. + */ +#define AGPS_RIL_INTERFACE "agps_ril" + +/** Represents a location. */ +typedef struct { + /** set to sizeof(GpsLocation) */ + size_t size; + /** Contains GpsLocationFlags bits. */ + uint16_t flags; + /** Represents latitude in degrees. */ + double latitude; + /** Represents longitude in degrees. */ + double longitude; + /** Represents altitude in meters above the WGS 84 reference + * ellipsoid. */ + double altitude; + /** Represents speed in meters per second. */ + float speed; + /** Represents heading in degrees. */ + float bearing; + /** Represents expected accuracy in meters. */ + float accuracy; + /** Timestamp for the location fix. */ + GpsUtcTime timestamp; +} GpsLocation; + +/** Represents the status. */ +typedef struct { + /** set to sizeof(GpsStatus) */ + size_t size; + GpsStatusValue status; +} GpsStatus; + +/** Represents SV information. */ +typedef struct { + /** set to sizeof(GpsSvInfo) */ + size_t size; + /** Pseudo-random number for the SV. */ + int prn; + /** Signal to noise ratio. */ + float snr; + /** Elevation of SV in degrees. */ + float elevation; + /** Azimuth of SV in degrees. */ + float azimuth; + /** Unknown field in Samsung I9100 libgps + May be an indicator for constellation type + (GPS, GLONASS, Galileo)? + Used on GT-I9100, likely also present on GT-N7000, + SGH-I717, SGH-I727 but this needs confirmation. + */ + int unknown_samsung_field; +} GpsSvInfo; + +/** Represents SV status. */ +typedef struct { + /** set to sizeof(GpsSvStatus) */ + size_t size; + + /** Number of SVs currently visible. */ + int num_svs; + + /** Contains an array of SV information. */ + GpsSvInfo sv_list[GPS_MAX_SVS]; + + /** Represents a bit mask indicating which SVs + * have ephemeris data. + */ + uint32_t ephemeris_mask; + + /** Represents a bit mask indicating which SVs + * have almanac data. + */ + uint32_t almanac_mask; + + /** + * Represents a bit mask indicating which SVs + * were used for computing the most recent position fix. + */ + uint32_t used_in_fix_mask; +} GpsSvStatus; + +/* 2G and 3G */ +/* In 3G lac is discarded */ +typedef struct { + uint16_t type; + uint16_t mcc; + uint16_t mnc; + uint16_t lac; + uint32_t cid; +} AGpsRefLocationCellID; + +typedef struct { + uint8_t mac[6]; +} AGpsRefLocationMac; + +/** Represents ref locations */ +typedef struct { + uint16_t type; + union { + AGpsRefLocationCellID cellID; + AGpsRefLocationMac mac; + } u; +} AGpsRefLocation; + +/** Callback with location information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_location_callback)(GpsLocation* location); + +/** Callback with status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_status_callback)(GpsStatus* status); + +/** Callback with SV status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); + +/** Callback for reporting NMEA sentences. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); + +/** Callback to inform framework of the GPS engine's capabilities. + * Capability parameter is a bit field of GPS_CAPABILITY_* flags. + */ +typedef void (* gps_set_capabilities)(uint32_t capabilities); + +/** Callback utility for acquiring the GPS wakelock. + * This can be used to prevent the CPU from suspending while handling GPS events. + */ +typedef void (* gps_acquire_wakelock)(); + +/** Callback utility for releasing the GPS wakelock. */ +typedef void (* gps_release_wakelock)(); + +/** Callback for requesting NTP time */ +typedef void (* gps_request_utc_time)(); + +/** Callback for creating a thread that can call into the Java framework code. + * This must be used to create any threads that report events up to the framework. + */ +typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); + +/** GPS callback structure. */ +typedef struct { + /** set to sizeof(GpsCallbacks) */ + size_t size; + gps_location_callback location_cb; + gps_status_callback status_cb; + gps_sv_status_callback sv_status_cb; + gps_nmea_callback nmea_cb; + gps_set_capabilities set_capabilities_cb; + gps_acquire_wakelock acquire_wakelock_cb; + gps_release_wakelock release_wakelock_cb; + gps_create_thread create_thread_cb; + gps_request_utc_time request_utc_time_cb; +} GpsCallbacks; + + +/** Represents the standard GPS interface. */ +typedef struct { + /** set to sizeof(GpsInterface) */ + size_t size; + /** + * Opens the interface and provides the callback routines + * to the implemenation of this interface. + */ + int (*init)( GpsCallbacks* callbacks ); + + /** Starts navigating. */ + int (*start)( void ); + + /** Stops navigating. */ + int (*stop)( void ); + + /** Closes the interface. */ + void (*cleanup)( void ); + + /** Injects the current time. */ + int (*inject_time)(GpsUtcTime time, int64_t timeReference, + int uncertainty); + + /** Injects current location from another location provider + * (typically cell ID). + * latitude and longitude are measured in degrees + * expected accuracy is measured in meters + */ + int (*inject_location)(double latitude, double longitude, float accuracy); + + /** + * Specifies that the next call to start will not use the + * information defined in the flags. GPS_DELETE_ALL is passed for + * a cold start. + */ + void (*delete_aiding_data)(GpsAidingData flags); + + /** + * min_interval represents the time between fixes in milliseconds. + * preferred_accuracy represents the requested fix accuracy in meters. + * preferred_time represents the requested time to first fix in milliseconds. + */ + int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, + uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); + + /** Get a pointer to extension information. */ + const void* (*get_extension)(const char* name); +} GpsInterface; + +/** Callback to request the client to download XTRA data. + * The client should download XTRA data and inject it by calling inject_xtra_data(). + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_xtra_download_request)(); + +/** Callback structure for the XTRA interface. */ +typedef struct { + gps_xtra_download_request download_request_cb; + gps_create_thread create_thread_cb; +} GpsXtraCallbacks; + +/** Extended interface for XTRA support. */ +typedef struct { + /** set to sizeof(GpsXtraInterface) */ + size_t size; + /** + * Opens the XTRA interface and provides the callback routines + * to the implemenation of this interface. + */ + int (*init)( GpsXtraCallbacks* callbacks ); + /** Injects XTRA data into the GPS. */ + int (*inject_xtra_data)( char* data, int length ); +} GpsXtraInterface; + +/** Extended interface for DEBUG support. */ +typedef struct { + /** set to sizeof(GpsDebugInterface) */ + size_t size; + + /** + * This function should return any information that the native + * implementation wishes to include in a bugreport. + */ + size_t (*get_internal_state)(char* buffer, size_t bufferSize); +} GpsDebugInterface; + +/** Represents the status of AGPS. */ +typedef struct { + /** set to sizeof(AGpsStatus) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; + uint32_t ipaddr; +} AGpsStatus; + +/** Callback with AGPS status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* agps_status_callback)(AGpsStatus* status); + +/** Callback structure for the AGPS interface. */ +typedef struct { + agps_status_callback status_cb; + gps_create_thread create_thread_cb; +} AGpsCallbacks; + + +/** Extended interface for AGPS support. */ +typedef struct { + /** set to sizeof(AGpsInterface) */ + size_t size; + + /** + * Opens the AGPS interface and provides the callback routines + * to the implemenation of this interface. + */ + void (*init)( AGpsCallbacks* callbacks ); + /** + * Notifies that a data connection is available and sets + * the name of the APN to be used for SUPL. + */ + int (*data_conn_open)( const char* apn ); + /** + * Notifies that the AGPS data connection has been closed. + */ + int (*data_conn_closed)(); + /** + * Notifies that a data connection is not available for AGPS. + */ + int (*data_conn_failed)(); + /** + * Sets the hostname and port for the AGPS server. + */ + int (*set_server)( AGpsType type, const char* hostname, int port ); +} AGpsInterface; + + +/** Represents an NI request */ +typedef struct { + /** set to sizeof(GpsNiNotification) */ + size_t size; + + /** + * An ID generated by HAL to associate NI notifications and UI + * responses + */ + int notification_id; + + /** + * An NI type used to distinguish different categories of NI + * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ... + */ + GpsNiType ni_type; + + /** + * Notification/verification options, combinations of GpsNiNotifyFlags constants + */ + GpsNiNotifyFlags notify_flags; + + /** + * Timeout period to wait for user response. + * Set to 0 for no time out limit. + */ + int timeout; + + /** + * Default response when time out. + */ + GpsUserResponseType default_response; + + /** + * Requestor ID + */ + char requestor_id[GPS_NI_SHORT_STRING_MAXLEN]; + + /** + * Notification message. It can also be used to store client_id in some cases + */ + char text[GPS_NI_LONG_STRING_MAXLEN]; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType requestor_id_encoding; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType text_encoding; + + /** + * A pointer to extra data. Format: + * key_1 = value_1 + * key_2 = value_2 + */ + char extras[GPS_NI_LONG_STRING_MAXLEN]; + +} GpsNiNotification; + +/** Callback with NI notification. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification); + +/** GPS NI callback structure. */ +typedef struct +{ + /** + * Sends the notification request from HAL to GPSLocationProvider. + */ + gps_ni_notify_callback notify_cb; + gps_create_thread create_thread_cb; +} GpsNiCallbacks; + +/** + * Extended interface for Network-initiated (NI) support. + */ +typedef struct +{ + /** set to sizeof(GpsNiInterface) */ + size_t size; + + /** Registers the callbacks for HAL to use. */ + void (*init) (GpsNiCallbacks *callbacks); + + /** Sends a response to HAL. */ + void (*respond) (int notif_id, GpsUserResponseType user_response); +} GpsNiInterface; + +struct gps_device_t { + struct hw_device_t common; + + /** + * Set the provided lights to the provided values. + * + * Returns: 0 on succes, error code on failure. + */ + const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev); +}; + +#define AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) +#define AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) + +#define AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) +#define AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) + +typedef void (*agps_ril_request_set_id)(uint32_t flags); +typedef void (*agps_ril_request_ref_loc)(uint32_t flags); + +typedef struct { + agps_ril_request_set_id request_setid; + agps_ril_request_ref_loc request_refloc; + gps_create_thread create_thread_cb; +} AGpsRilCallbacks; + +/** Extended interface for AGPS_RIL support. */ +typedef struct { + /** set to sizeof(AGpsRilInterface) */ + size_t size; + /** + * Opens the AGPS interface and provides the callback routines + * to the implemenation of this interface. + */ + void (*init)( AGpsRilCallbacks* callbacks ); + + /** + * Sets the reference location. + */ + void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct); + /** + * Sets the set ID. + */ + void (*set_set_id) (AGpsSetIDType type, const char* setid); + + /** + * Send network initiated message. + */ + void (*ni_message) (uint8_t *msg, size_t len); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_availability) (int avaiable, const char* apn); +} AGpsRilInterface; + +__END_DECLS + +#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ + diff --git a/overlay/include/system/graphics.h b/overlay/include/system/graphics.h new file mode 100644 index 0000000..b60d3a5 --- /dev/null +++ b/overlay/include/system/graphics.h @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2011 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. + */ + +#ifndef SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H +#define SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * If the HAL needs to create service threads to handle graphics related + * tasks, these threads need to run at HAL_PRIORITY_URGENT_DISPLAY priority + * if they can block the main rendering thread in any way. + * + * the priority of the current thread can be set with: + * + * #include + * setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY); + * + */ + +#define HAL_PRIORITY_URGENT_DISPLAY (-8) + +/** + * pixel format definitions + */ + +enum { + HAL_PIXEL_FORMAT_RGBA_8888 = 1, + HAL_PIXEL_FORMAT_RGBX_8888 = 2, + HAL_PIXEL_FORMAT_RGB_888 = 3, + HAL_PIXEL_FORMAT_RGB_565 = 4, + HAL_PIXEL_FORMAT_BGRA_8888 = 5, + HAL_PIXEL_FORMAT_RGBA_5551 = 6, + HAL_PIXEL_FORMAT_RGBA_4444 = 7, + + /* 0x8 - 0xFF range unavailable */ + + /* + * 0x100 - 0x1FF + * + * This range is reserved for pixel formats that are specific to the HAL + * implementation. Implementations can use any value in this range to + * communicate video pixel formats between their HAL modules. These formats + * must not have an alpha channel. Additionally, an EGLimage created from a + * gralloc buffer of one of these formats must be supported for use with the + * GL_OES_EGL_image_external OpenGL ES extension. + */ + + /* + * Android YUV format: + * + * This format is exposed outside of the HAL to software decoders and + * applications. EGLImageKHR must support it in conjunction with the + * OES_EGL_image_external extension. + * + * YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed + * by (W/2) x (H/2) Cr and Cb planes. + * + * This format assumes + * - an even width + * - an even height + * - a horizontal stride multiple of 16 pixels + * - a vertical stride equal to the height + * + * y_size = stride * height + * c_stride = ALIGN(stride/2, 16) + * c_size = c_stride * height/2 + * size = y_size + c_size * 2 + * cr_offset = y_size + * cb_offset = y_size + c_size + * + */ + HAL_PIXEL_FORMAT_YV12 = 0x32315659, // YCrCb 4:2:0 Planar + + /* + * Android RAW sensor format: + * + * This format is exposed outside of the HAL to applications. + * + * RAW_SENSOR is a single-channel 16-bit format, typically representing raw + * Bayer-pattern images from an image sensor, with minimal processing. + * + * The exact pixel layout of the data in the buffer is sensor-dependent, and + * needs to be queried from the camera device. + * + * Generally, not all 16 bits are used; more common values are 10 or 12 + * bits. All parameters to interpret the raw data (black and white points, + * color space, etc) must be queried from the camera device. + * + * This format assumes + * - an even width + * - an even height + * - a horizontal stride multiple of 16 pixels (32 bytes). + */ + HAL_PIXEL_FORMAT_RAW_SENSOR = 0x20, + + /* + * Android binary blob graphics buffer format: + * + * This format is used to carry task-specific data which does not have a + * standard image structure. The details of the format are left to the two + * endpoints. + * + * A typical use case is for transporting JPEG-compressed images from the + * Camera HAL to the framework or to applications. + * + * Buffers of this format must have a height of 1, and width equal to their + * size in bytes. + */ + HAL_PIXEL_FORMAT_BLOB = 0x21, + + /* + * Android format indicating that the choice of format is entirely up to the + * device-specific Gralloc implementation. + * + * The Gralloc implementation should examine the usage bits passed in when + * allocating a buffer with this format, and it should derive the pixel + * format from those usage flags. This format will never be used with any + * of the GRALLOC_USAGE_SW_* usage flags. + * + * If a buffer of this format is to be used as an OpenGL ES texture, the + * framework will assume that sampling the texture will always return an + * alpha value of 1.0 (i.e. the buffer contains only opaque pixel values). + * + */ + HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22, + +#ifdef STE_HARDWARE + /* STE: Added Support of YUV42XMBN, required for Copybit CC acceleration */ + HAL_PIXEL_FORMAT_YCBCR42XMBN = 0xE, +#endif + + /* Legacy formats (deprecated), used by ImageFormat.java */ + HAL_PIXEL_FORMAT_YCbCr_422_SP = 0x10, // NV16 + HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11, // NV21 +#ifdef STE_HARDWARE + HAL_PIXEL_FORMAT_YCbCr_422_P = 0x12, + HAL_PIXEL_FORMAT_YCbCr_420_P = 0x13, +#endif + HAL_PIXEL_FORMAT_YCbCr_422_I = 0x14, // YUY2 +#ifdef STE_HARDWARE + HAL_PIXEL_FORMAT_YCbCr_420_I = 0x15, + HAL_PIXEL_FORMAT_CbYCrY_422_I = 0x16, + HAL_PIXEL_FORMAT_CbYCrY_420_I = 0x17, + HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x20, + HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x21, + HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED = 0x22, + HAL_PIXEL_FORMAT_YCrCb_422_SP = 0x23, + HAL_PIXEL_FORMAT_YCrCb_422_P = 0x24, + HAL_PIXEL_FORMAT_YCrCb_420_P = 0x25, +#endif +}; + + +/** + * Transformation definitions + * + * IMPORTANT NOTE: + * HAL_TRANSFORM_ROT_90 is applied CLOCKWISE and AFTER HAL_TRANSFORM_FLIP_{H|V}. + * + */ + +enum { + /* flip source image horizontally (around the vertical axis) */ + HAL_TRANSFORM_FLIP_H = 0x01, + /* flip source image vertically (around the horizontal axis)*/ + HAL_TRANSFORM_FLIP_V = 0x02, + /* rotate source image 90 degrees clockwise */ + HAL_TRANSFORM_ROT_90 = 0x04, + /* rotate source image 180 degrees */ + HAL_TRANSFORM_ROT_180 = 0x03, + /* rotate source image 270 degrees clockwise */ + HAL_TRANSFORM_ROT_270 = 0x07, +}; + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H */ diff --git a/overlay/packages/apps/Camera/res/values/config.xml b/overlay/packages/apps/Camera/res/values/config.xml new file mode 100644 index 0000000..f9fb949 --- /dev/null +++ b/overlay/packages/apps/Camera/res/values/config.xml @@ -0,0 +1,32 @@ + + + + + + true + + true + + true + + false + + true + diff --git a/overlay/packages/Mms/res/xml/mms_config.xml b/overlay/packages/apps/Mms/res/xml/mms_config.xml similarity index 100% rename from overlay/packages/Mms/res/xml/mms_config.xml rename to overlay/packages/apps/Mms/res/xml/mms_config.xml diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml new file mode 100644 index 0000000..2ed670e --- /dev/null +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -0,0 +1,27 @@ + + + + + + true + + + true + + + true + diff --git a/overlay/packages/apps/Torch/res/values/config.xml b/overlay/packages/apps/Torch/res/values/config.xml new file mode 100644 index 0000000..80629bc --- /dev/null +++ b/overlay/packages/apps/Torch/res/values/config.xml @@ -0,0 +1,30 @@ + + + + + + + + /sys/class/sec/flash/enable + + + -1 + + From 21dc47771bcef8cd6708bc0916aa63dd99013062 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 13:12:59 -0300 Subject: [PATCH 018/248] Correct my stupid mistakes --- overlay/packages/apps/Mms/res/xml/mms_config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overlay/packages/apps/Mms/res/xml/mms_config.xml b/overlay/packages/apps/Mms/res/xml/mms_config.xml index 94b2a29..008ee3a 100644 --- a/overlay/packages/apps/Mms/res/xml/mms_config.xml +++ b/overlay/packages/apps/Mms/res/xml/mms_config.xml @@ -28,7 +28,7 @@ 5000 - http://wap.samsungmobile.com/uaprof/GT-I9070P.xml + http://wap.samsungmobile.com/uaprof/GT-I9070.xml From b08d25b15f86ff46f69f0fb86c060f1aeaa4d74c Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 16:06:15 -0300 Subject: [PATCH 019/248] Update BoardConfig.mk --- BoardConfig.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index 3d886a0..31abd37 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -5,6 +5,8 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth +# Resolution + # Kernel BOARD_KERNEL_PAGESIZE := 4096 BOARD_KERNEL_BASE := 0x40000000 From e9bfa8fac2af7347aa23df3e3e4d3fcb401d7dd6 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 16:07:14 -0300 Subject: [PATCH 020/248] Add device resolution Otherwise the vendor_cm cannot found it's bootanimation :) --- BoardConfig.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index 31abd37..cb7c121 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -6,6 +6,7 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth # Resolution +DEVICE_RESOLUTION := 800x480 # Kernel BOARD_KERNEL_PAGESIZE := 4096 From ac088e0b2cd51759162b2cb2d22dd4dd44ae383f Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 16:13:09 -0300 Subject: [PATCH 021/248] BoardConfig: Define the resolution properly This is needed by the vendor_cm repo, it will not resolve the bootanimation required otherwise --- BoardConfig.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index cb7c121..62cdbc9 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -6,7 +6,8 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth # Resolution -DEVICE_RESOLUTION := 800x480 +TARGET_SCREEN_WIDTH := 480 +TARGET_SCREEN_HEIGHT := 800 # Kernel BOARD_KERNEL_PAGESIZE := 4096 From 90d1a9b747b427ca2a170f9d45e6776d7bed304e Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 19:01:38 -0300 Subject: [PATCH 022/248] If the boot animation is not automatically selected, we chose it here :) --- cm.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cm.mk b/cm.mk index c20343e..8889915 100644 --- a/cm.mk +++ b/cm.mk @@ -11,6 +11,12 @@ TARGET_SCREEN_WIDTH := 480 # Inherit some common CM stuff. $(call inherit-product, vendor/cm/config/common_full_phone.mk) +# If the boot animation is not automatically selected, we chose it here :) + +PRODUCT_COPY_FILES += \ + vendor/cm/prebuilt/common/bootanimation/480.zip:system/media/bootanimation.zip + + # Inherit device configuration $(call inherit-product, device/samsung/janice/full_janice.mk) From 9493ec529158306098e986e836f399c64320ff73 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 19:02:14 -0300 Subject: [PATCH 023/248] BoardConfig: remove the resolution Already defined in cm.mk --- BoardConfig.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 62cdbc9..3e7712e 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -5,9 +5,6 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth -# Resolution -TARGET_SCREEN_WIDTH := 480 -TARGET_SCREEN_HEIGHT := 800 # Kernel BOARD_KERNEL_PAGESIZE := 4096 From 1c8f5c1a6dde3996829fecc344c5b000901a00c7 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 19:03:34 -0300 Subject: [PATCH 024/248] janice: Call cm.mk if it isn't called --- janice.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/janice.mk b/janice.mk index 849bab2..46459e1 100644 --- a/janice.mk +++ b/janice.mk @@ -1,6 +1,9 @@ # Include common makefile $(call inherit-product, device/samsung/u8500-common/common.mk) +# Call cm.mk because somehow it's not being called! +$(call inherit-product, device/samsung/janice/cm.mk) + LOCAL_PATH := device/samsung/janice # Overlay From bdb5bd5006da998f75a6cc21b1e1c39c944f3fa8 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 19:57:12 -0300 Subject: [PATCH 025/248] Properly call cm.mk IF one of it's strings it's not loaded :) --- janice.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/janice.mk b/janice.mk index 46459e1..5478c95 100644 --- a/janice.mk +++ b/janice.mk @@ -1,8 +1,11 @@ # Include common makefile $(call inherit-product, device/samsung/u8500-common/common.mk) + +ifneq ($(TARGET_SCREEN_HEIGHT),800) # Call cm.mk because somehow it's not being called! $(call inherit-product, device/samsung/janice/cm.mk) +endif LOCAL_PATH := device/samsung/janice From 790ddd2ffbf298e1ed39bb7bfff052f71de683ce Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 23:13:24 -0300 Subject: [PATCH 026/248] janice: Move a lot of things to device specific Include RIL on BoardConfig Move NFC packages to be build on janicep, not to be overriden :) NFC access files to janicep Move the RIL to device Build.prop overrides to device --- BoardConfig.mk | 4 +- janice.mk | 8 + ril/SamsungU8500RIL.java | 959 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 970 insertions(+), 1 deletion(-) create mode 100644 ril/SamsungU8500RIL.java diff --git a/BoardConfig.mk b/BoardConfig.mk index 3e7712e..7458af3 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -6,6 +6,8 @@ TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth +BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ + # Kernel BOARD_KERNEL_PAGESIZE := 4096 BOARD_KERNEL_BASE := 0x40000000 @@ -54,7 +56,7 @@ TARGET_PROVIDES_INIT_TARGET_RC := true # Vibrator -# BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c +BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 diff --git a/janice.mk b/janice.mk index 5478c95..4e853e7 100644 --- a/janice.mk +++ b/janice.mk @@ -16,6 +16,14 @@ DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay PRODUCT_AAPT_CONFIG := normal hdpi PRODUCT_AAPT_PREF_CONFIG := hdpi +# RIL +PRODUCT_PROPERTY_OVERRIDES += \ + mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ + ro.ril.hsxpa=1 \ + ro.ril.gprsclass=10 + ro.telephony.ril_class=SamsungU8500RIL \ + ro.telephony.sends_barcount=1 + # Packages PRODUCT_PACKAGES += \ GalaxyS2Settings diff --git a/ril/SamsungU8500RIL.java b/ril/SamsungU8500RIL.java new file mode 100644 index 0000000..b615c84 --- /dev/null +++ b/ril/SamsungU8500RIL.java @@ -0,0 +1,959 @@ +/* + * Copyright (C) 2011 The CyanogenMod 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.internal.telephony; + +import static com.android.internal.telephony.RILConstants.*; +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; +import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA; +import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA; +import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.os.Handler; +import android.os.Message; +import android.os.AsyncResult; +import android.os.Parcel; +import android.os.SystemProperties; +import android.telephony.PhoneNumberUtils; +import android.telephony.SignalStrength; +import static com.android.internal.telephony.RILConstants.*; + +import com.android.internal.telephony.CommandException; +import com.android.internal.telephony.DataCallState; +import com.android.internal.telephony.DataConnection.FailCause; +import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; +import com.android.internal.telephony.gsm.SuppServiceNotification; +import com.android.internal.telephony.RILConstants; +import com.android.internal.telephony.cdma.CdmaCallWaitingNotification; +import com.android.internal.telephony.cdma.CdmaInformationRecords; +import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec; +import com.android.internal.telephony.cdma.SignalToneUtil; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.media.AudioManager; +import android.net.ConnectivityManager; +import android.net.LocalSocket; +import android.net.LocalSocketAddress; +import android.net.NetworkInfo; +import android.os.AsyncResult; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Parcel; +import android.os.PowerManager; +import android.os.SystemProperties; +import android.os.PowerManager.WakeLock; +import android.telephony.NeighboringCellInfo; +import android.telephony.PhoneNumberUtils; +import android.telephony.SignalStrength; +import android.telephony.SmsManager; +import android.telephony.SmsMessage; +import android.text.TextUtils; +import android.util.Log; + +import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; +import com.android.internal.telephony.gsm.SuppServiceNotification; +import com.android.internal.telephony.cdma.CdmaCallWaitingNotification; +import com.android.internal.telephony.cdma.CdmaInformationRecords; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.Runtime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; + +public class SamsungU8500RIL extends RIL implements CommandsInterface { + + + //SAMSUNG STATES + static final int RIL_REQUEST_GET_CELL_BROADCAST_CONFIG = 10002; + + static final int RIL_REQUEST_SEND_ENCODED_USSD = 10005; + static final int RIL_REQUEST_SET_PDA_MEMORY_STATUS = 10006; + static final int RIL_REQUEST_GET_PHONEBOOK_STORAGE_INFO = 10007; + static final int RIL_REQUEST_GET_PHONEBOOK_ENTRY = 10008; + static final int RIL_REQUEST_ACCESS_PHONEBOOK_ENTRY = 10009; + static final int RIL_REQUEST_DIAL_VIDEO_CALL = 10010; + static final int RIL_REQUEST_CALL_DEFLECTION = 10011; + static final int RIL_REQUEST_READ_SMS_FROM_SIM = 10012; + static final int RIL_REQUEST_USIM_PB_CAPA = 10013; + static final int RIL_REQUEST_LOCK_INFO = 10014; + + static final int RIL_REQUEST_DIAL_EMERGENCY = 10016; + static final int RIL_REQUEST_GET_STOREAD_MSG_COUNT = 10017; + static final int RIL_REQUEST_STK_SIM_INIT_EVENT = 10018; + static final int RIL_REQUEST_GET_LINE_ID = 10019; + static final int RIL_REQUEST_SET_LINE_ID = 10020; + static final int RIL_REQUEST_GET_SERIAL_NUMBER = 10021; + static final int RIL_REQUEST_GET_MANUFACTURE_DATE_NUMBER = 10022; + static final int RIL_REQUEST_GET_BARCODE_NUMBER = 10023; + static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_BOOTSTRAP = 10024; + static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_NAF = 10025; + static final int RIL_REQUEST_SIM_TRANSMIT_BASIC = 10026; + static final int RIL_REQUEST_SIM_OPEN_CHANNEL = 10027; + static final int RIL_REQUEST_SIM_CLOSE_CHANNEL = 10028; + static final int RIL_REQUEST_SIM_TRANSMIT_CHANNEL = 10029; + static final int RIL_REQUEST_SIM_AUTH = 10030; + static final int RIL_REQUEST_PS_ATTACH = 10031; + static final int RIL_REQUEST_PS_DETACH = 10032; + static final int RIL_REQUEST_ACTIVATE_DATA_CALL = 10033; + static final int RIL_REQUEST_CHANGE_SIM_PERSO = 10034; + static final int RIL_REQUEST_ENTER_SIM_PERSO = 10035; + static final int RIL_REQUEST_GET_TIME_INFO = 10036; + static final int RIL_REQUEST_OMADM_SETUP_SESSION = 10037; + static final int RIL_REQUEST_OMADM_SERVER_START_SESSION = 10038; + static final int RIL_REQUEST_OMADM_CLIENT_START_SESSION = 10039; + static final int RIL_REQUEST_OMADM_SEND_DATA = 10040; + static final int RIL_REQUEST_CDMA_GET_DATAPROFILE = 10041; + static final int RIL_REQUEST_CDMA_SET_DATAPROFILE = 10042; + static final int RIL_REQUEST_CDMA_GET_SYSTEMPROPERTIES = 10043; + static final int RIL_REQUEST_CDMA_SET_SYSTEMPROPERTIES = 10044; + static final int RIL_REQUEST_SEND_SMS_COUNT = 10045; + static final int RIL_REQUEST_SEND_SMS_MSG = 10046; + static final int RIL_REQUEST_SEND_SMS_MSG_READ_STATUS = 10047; + static final int RIL_REQUEST_MODEM_HANGUP = 10048; + static final int RIL_REQUEST_SET_SIM_POWER = 10049; + static final int RIL_REQUEST_SET_PREFERRED_NETWORK_LIST = 10050; + static final int RIL_REQUEST_GET_PREFERRED_NETWORK_LIST = 10051; + static final int RIL_REQUEST_HANGUP_VT = 10052; + + static final int RIL_UNSOL_RELEASE_COMPLETE_MESSAGE = 11001; + static final int RIL_UNSOL_STK_SEND_SMS_RESULT = 11002; + static final int RIL_UNSOL_STK_CALL_CONTROL_RESULT = 11003; + static final int RIL_UNSOL_DUN_CALL_STATUS = 11004; + + static final int RIL_UNSOL_O2_HOME_ZONE_INFO = 11007; + static final int RIL_UNSOL_DEVICE_READY_NOTI = 11008; + static final int RIL_UNSOL_GPS_NOTI = 11009; + static final int RIL_UNSOL_AM = 11010; + static final int RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL = 11011; + static final int RIL_UNSOL_DATA_SUSPEND_RESUME = 11012; + static final int RIL_UNSOL_SAP = 11013; + + static final int RIL_UNSOL_SIM_SMS_STORAGE_AVAILALE = 11015; + static final int RIL_UNSOL_HSDPA_STATE_CHANGED = 11016; + static final int RIL_UNSOL_WB_AMR_STATE = 11017; + static final int RIL_UNSOL_TWO_MIC_STATE = 11018; + static final int RIL_UNSOL_DHA_STATE = 11019; + static final int RIL_UNSOL_UART = 11020; + static final int RIL_UNSOL_RESPONSE_HANDOVER = 11021; + static final int RIL_UNSOL_IPV6_ADDR = 11022; + static final int RIL_UNSOL_NWK_INIT_DISC_REQUEST = 11023; + static final int RIL_UNSOL_RTS_INDICATION = 11024; + static final int RIL_UNSOL_OMADM_SEND_DATA = 11025; + static final int RIL_UNSOL_DUN = 11026; + static final int RIL_UNSOL_SYSTEM_REBOOT = 11027; + static final int RIL_UNSOL_VOICE_PRIVACY_CHANGED = 11028; + static final int RIL_UNSOL_UTS_GETSMSCOUNT = 11029; + static final int RIL_UNSOL_UTS_GETSMSMSG = 11030; + static final int RIL_UNSOL_UTS_GET_UNREAD_SMS_STATUS = 11031; + static final int RIL_UNSOL_MIP_CONNECT_STATUS = 11032; + + protected HandlerThread mSamsungu8500RILThread; + protected ConnectivityHandler mSamsungu8500RILHandler; + private AudioManager audioManager; + private boolean mSignalbarCount = SystemProperties.getInt("ro.telephony.sends_barcount", 0) == 1 ? true : false; + private boolean mIsSamsungCdma = SystemProperties.getBoolean("ro.ril.samsung_cdma", false); + private boolean mIsGBModem = SystemProperties.getBoolean("ro.ril.gbmodem", false); + + public SamsungU8500RIL(Context context, int networkMode, int cdmaSubscription) { + super(context, networkMode, cdmaSubscription); + audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); + mQANElements = 5; + } + + static String + requestToString(int request) { + switch (request) { + case RIL_REQUEST_DIAL_EMERGENCY: return "DIAL_EMERGENCY"; + default: return RIL.requestToString(request); + } + } + + @Override + public void setCurrentPreferredNetworkType() { + if (RILJ_LOGD) riljLog("setCurrentPreferredNetworkType IGNORED"); + /* Google added this as a fix for crespo loosing network type after + * taking an OTA. This messes up the data connection state for us + * due to the way we handle network type change (disable data + * then change then re-enable). + */ + } + + private boolean NeedReconnect() + { + ConnectivityManager cm = + (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo ni_active = cm.getActiveNetworkInfo(); + + return ni_active != null && ni_active.getTypeName().equalsIgnoreCase( "mobile" ) && + ni_active.isConnected() && cm.getMobileDataEnabled(); + } + + @Override + public void setPreferredNetworkType(int networkType , Message response) { + /* Samsung modem implementation does bad things when a datacall is running + * while switching the preferred networktype. + */ + HandlerThread handlerThread; + Looper looper; + + if(NeedReconnect()) + { + if (mSamsungu8500RILHandler == null) { + + handlerThread = new HandlerThread("mSamsungu8500RILThread"); + mSamsungu8500RILThread = handlerThread; + + mSamsungu8500RILThread.start(); + + looper = mSamsungu8500RILThread.getLooper(); + mSamsungu8500RILHandler = new ConnectivityHandler(mContext, looper); + } + mSamsungu8500RILHandler.setPreferedNetworkType(networkType, response); + } else { + if (mSamsungu8500RILHandler != null) { + mSamsungu8500RILThread = null; + mSamsungu8500RILHandler = null; + } + sendPreferedNetworktype(networkType, response); + } + + } + + //Sends the real RIL request to the modem. + private void sendPreferedNetworktype(int networkType, Message response) { + RILRequest rr = RILRequest.obtain( + RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response); + + rr.mp.writeInt(1); + rr.mp.writeInt(networkType); + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + + " : " + networkType); + + send(rr); + } + + /* private class that does the handling for the dataconnection + * dataconnection is done async, so we send the request for disabling it, + * wait for the response, set the prefered networktype and notify the + * real sender with its result. + */ + private class ConnectivityHandler extends Handler{ + + private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 30; + private Context mContext; + private int mDesiredNetworkType; + //the original message, we need it for calling back the original caller when done + private Message mNetworktypeResponse; + private ConnectivityBroadcastReceiver mConnectivityReceiver = new ConnectivityBroadcastReceiver(); + + public ConnectivityHandler(Context context, Looper looper) + { + super (looper); + mContext = context; + } + + private void startListening() { + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + mContext.registerReceiver(mConnectivityReceiver, filter); + } + + private synchronized void stopListening() { + mContext.unregisterReceiver(mConnectivityReceiver); + } + + public void setPreferedNetworkType(int networkType, Message response) + { + Log.d(LOG_TAG, "Mobile Dataconnection is online setting it down"); + mDesiredNetworkType = networkType; + mNetworktypeResponse = response; + ConnectivityManager cm = + (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + //start listening for the connectivity change broadcast + startListening(); + cm.setMobileDataEnabled(false); + } + + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + //networktype was set, now we can enable the dataconnection again + case MESSAGE_SET_PREFERRED_NETWORK_TYPE: + ConnectivityManager cm = + (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + + Log.d(LOG_TAG, "preferred NetworkType set upping Mobile Dataconnection"); + cm.setMobileDataEnabled(true); + //everything done now call back that we have set the networktype + AsyncResult.forMessage(mNetworktypeResponse, null, null); + mNetworktypeResponse.sendToTarget(); + mNetworktypeResponse = null; + break; + default: + throw new RuntimeException("unexpected event not handled"); + } + } + + private class ConnectivityBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + Log.w(LOG_TAG, "onReceived() called with " + intent); + return; + } + boolean noConnectivity = + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); + + if (noConnectivity) { + //Ok dataconnection is down, now set the networktype + Log.w(LOG_TAG, "Mobile Dataconnection is now down setting preferred NetworkType"); + stopListening(); + sendPreferedNetworktype(mDesiredNetworkType, obtainMessage(MESSAGE_SET_PREFERRED_NETWORK_TYPE)); + mDesiredNetworkType = -1; + } + } + } + } + + @Override + protected RILRequest findAndRemoveRequestFromList(int serial) { + long removalTime = System.currentTimeMillis(); + long timeDiff = 0; + + synchronized (mRequestsList) { + Iterator itr = mRequestsList.iterator(); + + while ( itr.hasNext() ) { + RILRequest rr = itr.next(); + + if (rr.mSerial == serial) { + itr.remove(); + if (mRequestMessagesWaiting > 0) + mRequestMessagesWaiting--; + return rr; + } + else + { + // We need some special code here for the Samsung RIL, + // which isn't responding to some requests. + // We will print a list of such stale requests which + // haven't yet received a response. If the timeout fires + // first, then the wakelock is released without debugging. + timeDiff = removalTime - rr.creationTime; + if ( timeDiff > mWakeLockTimeout ) { + Log.d(LOG_TAG, "No response for [" + rr.mSerial + "] " + + requestToString(rr.mRequest) + " after " + timeDiff + " milliseconds."); + + /* Don't actually remove anything for now. Consider uncommenting this to + purge stale requests */ + + /* + itr.remove(); + if (mRequestMessagesWaiting > 0) { + mRequestMessagesWaiting--; + } + + // We don't handle the callback (ie. rr.mResult) for + // RIL_REQUEST_SET_TTY_MODE, which is + // RIL_REQUEST_QUERY_TTY_MODE. The reason for not doing + // so is because it will also not get a response from the + // Samsung RIL + rr.release(); + */ + } + } + } + } + return null; + } + + @Override + protected void processSolicited (Parcel p) { + int serial, error; + boolean found = false; + + serial = p.readInt(); + error = p.readInt(); + + RILRequest rr; + + rr = findAndRemoveRequestFromList(serial); + + if (rr == null) { + Log.w(LOG_TAG, "Unexpected solicited response! sn: " + + serial + " error: " + error); + return; + } + + Object ret = null; + + if (error == 0 || p.dataAvail() > 0) { + // either command succeeds or command fails but with data payload + try {switch (rr.mRequest) { + + case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break; + case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: ret = responseInts(p); break; + case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break; + case RIL_REQUEST_DIAL: ret = responseVoid(p); break; + case RIL_REQUEST_GET_IMSI: ret = responseString(p); break; + case RIL_REQUEST_HANGUP: ret = responseVoid(p); break; + case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break; + case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: ret = responseVoid(p); break; + case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break; + case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break; + case RIL_REQUEST_UDUB: ret = responseVoid(p); break; + case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break; + case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break; + case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break; + case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break; + case RIL_REQUEST_OPERATOR: ret = responseStrings(p); break; + case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break; + case RIL_REQUEST_DTMF: ret = responseVoid(p); break; + case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break; + case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break; + case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break; + case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break; + case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break; + case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break; + case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break; + case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break; + case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break; + case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break; + case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_IMEI: ret = responseString(p); break; + case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break; + case RIL_REQUEST_ANSWER: ret = responseVoid(p); break; + case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break; + case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break; + case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break; + case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break; + case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break; + case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break; + case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break; + case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break; + case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break; + case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break; + case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break; + case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break; + case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break; + case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break; + case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break; + case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break; + case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break; + case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break; + case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break; + case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break; + case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break; + case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break; + case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break; + case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break; + case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break; + case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break; + case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break; + case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break; + case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break; + case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break; + case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; + case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break; + case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; + case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break; + case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break; + case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break; + case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break; + case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break; + case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break; + case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break; + case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; + case RIL_REQUEST_ISIM_AUTHENTICATION: ret = responseString(p); break; + case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break; + case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break; + case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break; + case RIL_REQUEST_DIAL_EMERGENCY: ret = responseVoid(p); break; + default: + throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest); + //break; + }} catch (Throwable tr) { + // Exceptions here usually mean invalid RIL responses + + Log.w(LOG_TAG, rr.serialString() + "< " + + requestToString(rr.mRequest) + + " exception, possible invalid RIL response", tr); + + if (rr.mResult != null) { + AsyncResult.forMessage(rr.mResult, null, tr); + rr.mResult.sendToTarget(); + } + rr.release(); + return; + } + } + + if (error != 0) { + //ugly fix for Samsung messing up SMS_SEND request fail in binary RIL + if(!(error == -1 && rr.mRequest == RIL_REQUEST_SEND_SMS)) + { + rr.onError(error, ret); + rr.release(); + return; + } else { + try + { + ret = responseSMS(p); + } catch (Throwable tr) { + Log.w(LOG_TAG, rr.serialString() + "< " + + requestToString(rr.mRequest) + + " exception, Processing Samsung SMS fix ", tr); + rr.onError(error, ret); + rr.release(); + return; + } + } + } + + if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) + + " " + retToString(rr.mRequest, ret)); + + if (rr.mResult != null) { + AsyncResult.forMessage(rr.mResult, ret, null); + rr.mResult.sendToTarget(); + } + + rr.release(); + } + + @Override + public void + dial(String address, int clirMode, UUSInfo uusInfo, Message result) { + RILRequest rr; + if (PhoneNumberUtils.isEmergencyNumber(address)) { + dialEmergencyCall(address, clirMode, result); + return; + } + + rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); + rr.mp.writeString(address); + rr.mp.writeInt(clirMode); + rr.mp.writeInt(0); // UUS information is absent + + if (uusInfo == null) { + rr.mp.writeInt(0); // UUS information is absent + } else { + rr.mp.writeInt(1); // UUS information is present + rr.mp.writeInt(uusInfo.getType()); + rr.mp.writeInt(uusInfo.getDcs()); + rr.mp.writeByteArray(uusInfo.getUserData()); + } + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + send(rr); + } + + public void + dialEmergencyCall(String address, int clirMode, Message result) { + RILRequest rr; + Log.v(LOG_TAG, "Emergency dial: " + address); + + rr = RILRequest.obtain(RIL_REQUEST_DIAL_EMERGENCY, result); + rr.mp.writeString(address + "/"); + rr.mp.writeInt(clirMode); + rr.mp.writeInt(0); + rr.mp.writeInt(0); + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + send(rr); + } + + @Override + protected void + processUnsolicited (Parcel p) { + Object ret; + int dataPosition = p.dataPosition(); + int response = p.readInt(); + + switch (response) { + case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: ret = responseVoid(p); break; + case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: ret = responseString(p); break; + case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break; + // SAMSUNG STATES + case RIL_UNSOL_AM: ret = responseString(p); break; + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: ret = responseVoid(p); break; + case RIL_UNSOL_DATA_SUSPEND_RESUME: ret = responseInts(p); break; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: ret = responseVoid(p); break; + case RIL_UNSOL_TWO_MIC_STATE: ret = responseInts(p); break; + case RIL_UNSOL_WB_AMR_STATE: ret = responseInts(p); break; + + default: + // Rewind the Parcel + p.setDataPosition(dataPosition); + + // Forward responses that we are not overriding to the super class + super.processUnsolicited(p); + return; + } + + switch (response) { + case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: + /* has bonus radio state int */ + int state = p.readInt(); + Log.d(LOG_TAG, "Radio state: " + state); + + switch (state) { + case 2: + // RADIO_UNAVAILABLE + state = 1; + break; + case 3: + // RADIO_ON + state = 10; + break; + case 4: + // RADIO_ON + state = 10; + // When SIM is PIN-unlocked, RIL doesn't respond with RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED. + // We notify the system here. + Log.d(LOG_TAG, "SIM is PIN-unlocked now"); + if (mIccStatusChangedRegistrants != null) { + mIccStatusChangedRegistrants.notifyRegistrants(); + } + break; + } + RadioState newState = getRadioStateFromInt(state); + Log.d(LOG_TAG, "New Radio state: " + state + " (" + newState.toString() + ")"); + switchToRadioState(newState); + break; + case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: + if (RILJ_LOGD) unsljLogRet(response, ret); + + if (mGsmBroadcastSmsRegistrant != null) { + mGsmBroadcastSmsRegistrant + .notifyRegistrant(new AsyncResult(null, ret, null)); + } + break; + case RIL_UNSOL_RIL_CONNECTED: + if (RILJ_LOGD) unsljLogRet(response, ret); + + // Initial conditions + setRadioPower(false, null); + sendPreferedNetworktype(mPreferredNetworkType, null); + setCdmaSubscriptionSource(mCdmaSubscription, null); + notifyRegistrantsRilConnectionChanged(((int[])ret)[0]); + break; + // SAMSUNG STATES + case RIL_UNSOL_AM: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + String amString = (String) ret; + Log.d(LOG_TAG, "Executing AM: " + amString); + + try { + Runtime.getRuntime().exec("am " + amString); + } catch (IOException e) { + e.printStackTrace(); + Log.e(LOG_TAG, "am " + amString + " could not be executed."); + } + break; + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_DATA_SUSPEND_RESUME: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_TWO_MIC_STATE: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_WB_AMR_STATE: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + setWbAmr(((int[])ret)[0]); + break; + } + } + + static String + samsungResponseToString(int request) + { + switch(request) { + // SAMSUNG STATES + case RIL_UNSOL_AM: return "RIL_UNSOL_AM"; + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: return "RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL"; + case RIL_UNSOL_DATA_SUSPEND_RESUME: return "RIL_UNSOL_DATA_SUSPEND_RESUME"; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: return "RIL_UNSOL_STK_CALL_CONTROL_RESULT"; + case RIL_UNSOL_TWO_MIC_STATE: return "RIL_UNSOL_TWO_MIC_STATE"; + case RIL_UNSOL_WB_AMR_STATE: return "RIL_UNSOL_WB_AMR_STATE"; + default: return ""; + } + } + + protected void samsungUnsljLog(int response) { + riljLog("[UNSL]< " + samsungResponseToString(response)); + } + + protected void samsungUnsljLogMore(int response, String more) { + riljLog("[UNSL]< " + samsungResponseToString(response) + " " + more); + } + + protected void samsungUnsljLogRet(int response, Object ret) { + riljLog("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); + } + + protected void samsungUnsljLogvRet(int response, Object ret) { + riljLogv("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); + } + + /** + * Set audio parameter "wb_amr" for HD-Voice (Wideband AMR). + * + * @param state: 0 = unsupported, 1 = supported. + */ + private void setWbAmr(int state) { + if (state == 1) { + Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=on"); + audioManager.setParameters("wb_amr=on"); + } else { + Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=off"); + audioManager.setParameters("wb_amr=off"); + } + } + + @Override + protected Object + responseCallList(Parcel p) { + int num; + boolean isVideo; + ArrayList response; + DriverCall dc; + int dataAvail = p.dataAvail(); + int pos = p.dataPosition(); + int size = p.dataSize(); + + Log.d(LOG_TAG, "Parcel size = " + size); + Log.d(LOG_TAG, "Parcel pos = " + pos); + Log.d(LOG_TAG, "Parcel dataAvail = " + dataAvail); + + //Samsung changes + num = p.readInt(); + + Log.d(LOG_TAG, "num = " + num); + response = new ArrayList(num); + + for (int i = 0 ; i < num ; i++) { + + dc = new DriverCall(); + dc.state = DriverCall.stateFromCLCC(p.readInt()); + dc.index = p.readInt(); + dc.TOA = p.readInt(); + dc.isMpty = (0 != p.readInt()); + dc.isMT = (0 != p.readInt()); + dc.als = p.readInt(); + dc.isVoice = (0 != p.readInt()); + isVideo = (0 != p.readInt()); + dc.isVoicePrivacy = (0 != p.readInt()); + dc.number = p.readString(); + int np = p.readInt(); + dc.numberPresentation = DriverCall.presentationFromCLIP(np); + dc.name = p.readString(); + dc.namePresentation = p.readInt(); + int uusInfoPresent = p.readInt(); + + Log.d(LOG_TAG, "state = " + dc.state); + Log.d(LOG_TAG, "index = " + dc.index); + Log.d(LOG_TAG, "state = " + dc.TOA); + Log.d(LOG_TAG, "isMpty = " + dc.isMpty); + Log.d(LOG_TAG, "isMT = " + dc.isMT); + Log.d(LOG_TAG, "als = " + dc.als); + Log.d(LOG_TAG, "isVoice = " + dc.isVoice); + Log.d(LOG_TAG, "isVideo = " + isVideo); + Log.d(LOG_TAG, "number = " + dc.number); + Log.d(LOG_TAG, "np = " + np); + Log.d(LOG_TAG, "name = " + dc.name); + Log.d(LOG_TAG, "namePresentation = " + dc.namePresentation); + Log.d(LOG_TAG, "uusInfoPresent = " + uusInfoPresent); + + if (uusInfoPresent == 1) { + dc.uusInfo = new UUSInfo(); + dc.uusInfo.setType(p.readInt()); + dc.uusInfo.setDcs(p.readInt()); + byte[] userData = p.createByteArray(); + dc.uusInfo.setUserData(userData); + Log + .v(LOG_TAG, String.format("Incoming UUS : type=%d, dcs=%d, length=%d", + dc.uusInfo.getType(), dc.uusInfo.getDcs(), + dc.uusInfo.getUserData().length)); + Log.v(LOG_TAG, "Incoming UUS : data (string)=" + + new String(dc.uusInfo.getUserData())); + Log.v(LOG_TAG, "Incoming UUS : data (hex): " + + IccUtils.bytesToHexString(dc.uusInfo.getUserData())); + } else { + Log.v(LOG_TAG, "Incoming UUS : NOT present!"); + } + + // Make sure there's a leading + on addresses with a TOA of 145 + dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); + + response.add(dc); + + if (dc.isVoicePrivacy) { + mVoicePrivacyOnRegistrants.notifyRegistrants(); + Log.d(LOG_TAG, "InCall VoicePrivacy is enabled"); + } else { + mVoicePrivacyOffRegistrants.notifyRegistrants(); + Log.d(LOG_TAG, "InCall VoicePrivacy is disabled"); + } + } + + Collections.sort(response); + + return response; + } + + @Override + protected Object responseGetPreferredNetworkType(Parcel p) { + int [] response = (int[]) responseInts(p); + + if (response.length >= 1) { + // Since this is the response for getPreferredNetworkType + // we'll assume that it should be the value we want the + // vendor ril to take if we reestablish a connection to it. + mPreferredNetworkType = response[0]; + } + + // When the modem responds Phone.NT_MODE_GLOBAL, it means Phone.NT_MODE_WCDMA_PREF + if (response[0] == Phone.NT_MODE_GLOBAL) { + Log.d(LOG_TAG, "Overriding network type response from GLOBAL to WCDMA preferred"); + response[0] = Phone.NT_MODE_WCDMA_PREF; + } + + return response; + } + + @Override + protected Object + responseSignalStrength(Parcel p) { + int numInts = 12; + int response[]; + + /* TODO: Add SignalStrength class to match RIL_SignalStrength */ + response = new int[numInts]; + for (int i = 0 ; i < numInts ; i++) { + response[i] = p.readInt(); + } + + if (mIsSamsungCdma) + // Framework takes care of the rest for us. + return response; + + /* Matching Samsung signal strength to asu. + Method taken from Samsungs cdma/gsmSignalStateTracker */ + if(mSignalbarCount) + { + //Samsung sends the count of bars that should be displayed instead of + //a real signal strength + response[0] = ((response[0] & 0xFF00) >> 8) * 3; //gsmDbm + } else { + response[0] = response[0] & 0xFF; //gsmDbm + } + response[1] = -1; //gsmEcio + response[2] = (response[2] < 0)?-120:-response[2]; //cdmaDbm + response[3] = (response[3] < 0)?-160:-response[3]; //cdmaEcio + response[4] = (response[4] < 0)?-120:-response[4]; //evdoRssi + response[5] = (response[5] < 0)?-1:-response[5]; //evdoEcio + if(response[6] < 0 || response[6] > 8) + response[6] = -1; + + SignalStrength signalStrength = new SignalStrength( + response[0], response[1], response[2], response[3], response[4], + response[5], response[6], !mIsSamsungCdma); + return signalStrength; + } + + @Override public void + getVoiceRadioTechnology(Message result) { + RILRequest rr = RILRequest.obtain(RIL_REQUEST_VOICE_RADIO_TECH, result); + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + // RIL versions below 7 do not support this request + if (mRilVersion >= 7) + send(rr); + else + Log.d(LOG_TAG, "RIL_REQUEST_VOICE_RADIO_TECH blocked!!!"); + } + + @Override + public void getCdmaSubscriptionSource(Message response) { + RILRequest rr = RILRequest.obtain( + RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, response); + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + Log.d(LOG_TAG, "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE blocked!!!"); + //send(rr); + } +} From 1b7de77be3f09fc4cb09f0768ac309c355167ec9 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 23:38:34 -0300 Subject: [PATCH 027/248] Delete including of hardware_legacy/vibrator.c We have everything defined in the .c file, we don't want to include vibrator from legacy because it will complain about the function being defined in other way --- vibrator/vibrator.c | 1 - 1 file changed, 1 deletion(-) diff --git a/vibrator/vibrator.c b/vibrator/vibrator.c index 9111fb1..0dc12a8 100644 --- a/vibrator/vibrator.c +++ b/vibrator/vibrator.c @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include #include "qemu.h" #include From a63c1e40333365cf2958c0ab8d0f52c1d54c8838 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Wed, 19 Jun 2013 23:46:30 -0300 Subject: [PATCH 028/248] vibrator: update the delay Just as we did with janicep, we update the delay slightly https://github.com/TeamCanjica/android_device_samsung_janicep/commit/f1340207d6af45f05736f31cbc31618a2512acbf --- vibrator/vibrator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vibrator/vibrator.c b/vibrator/vibrator.c index 0dc12a8..32b5249 100644 --- a/vibrator/vibrator.c +++ b/vibrator/vibrator.c @@ -55,7 +55,7 @@ int vibrator_on(int timeout_ms) { /* constant on, up to maximum allowed time */ if(timeout_ms < 0) - return sendit(10000); + return sendit(15000); return sendit(timeout_ms); } From 67e53fb3b835c2c4970106af0db7ccddbad825f0 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Thu, 20 Jun 2013 00:32:43 -0300 Subject: [PATCH 029/248] system.prop:Set RIL in system.prop For some reason, the build just doesn't come out with the RIL class, just add it to system.prop since it's common --- system.prop | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system.prop b/system.prop index 5f74176..be411f3 100644 --- a/system.prop +++ b/system.prop @@ -5,6 +5,12 @@ rild.libpath=/system/lib/libsec-ril.so rild.libargs=-d /dev/ttyS0 +# RIL +ro.ril.hsxpa=1 +ro.ril.gprsclass=10 +ro.telephony.ril_class=SamsungU8500RIL +ro.telephony.sends_barcount=1 + ro.sf.lcd_density=240 ro.lcd_min_brightness=30 From c755bd54d8450367f651b42913ec9652cde2b5fd Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Thu, 20 Jun 2013 16:03:46 -0300 Subject: [PATCH 030/248] janice.mk: Add missing separator and correct RIL copy files following ImVic advices, we change the directory of the copy files (was trying to get them copied to rootdir/system?) to the correct one as every other product copy file. We add the missing separator which made our RIL class not being added at build.prop :) --- janice.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/janice.mk b/janice.mk index 4e853e7..baba56d 100644 --- a/janice.mk +++ b/janice.mk @@ -20,7 +20,7 @@ PRODUCT_AAPT_PREF_CONFIG := hdpi PRODUCT_PROPERTY_OVERRIDES += \ mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ ro.ril.hsxpa=1 \ - ro.ril.gprsclass=10 + ro.ril.gprsclass=10 \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 @@ -38,9 +38,9 @@ PRODUCT_COPY_FILES += \ # RIL PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/configs/manuf_id.cfg:/system/etc/AT/manuf_id.cfg \ - $(LOCAL_PATH)/configs/model_id.cfg:/system/etc/AT/model_id.cfg \ - $(LOCAL_PATH)/configs/system_id.cfg:/system/etc/AT/system_id.cfg + $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ + $(LOCAL_PATH)/configs/model_id.cfg:system/etc/AT/model_id.cfg \ + $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg # Keylayout PRODUCT_COPY_FILES += \ From 381cfb712fa7a40a1d5f63fcb60bdf9b9d236158 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Thu, 20 Jun 2013 17:04:13 -0300 Subject: [PATCH 031/248] BoardConfig:EXPERIMENTAL SOUND test, use separated streams --- BoardConfig.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index 7458af3..42b320a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -22,6 +22,9 @@ BOARD_BOOTIMAGE_PARTITION_SIZE := 16777216 BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 +# EXPERIMENTAL SOUND +BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true + # Wifi BOARD_WLAN_DEVICE := bcmdhd BOARD_WLAN_DEVICE_REV := bcm4330 From 909f331318b728512a67024a987a441c90adcf19 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Thu, 20 Jun 2013 19:21:13 -0300 Subject: [PATCH 032/248] BoardConfig:Disable experimental sound test. --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 42b320a..9b3f28c 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -23,7 +23,7 @@ BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 # EXPERIMENTAL SOUND -BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true +# BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true # Wifi BOARD_WLAN_DEVICE := bcmdhd From d92e0ad247fc8c76f4348904ce543d9d8d12bd79 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Fri, 21 Jun 2013 12:25:07 -0300 Subject: [PATCH 033/248] janice: Make Tee blobs device specific We make Tee blobs to be specific to avoid the annoying bug of janice blobs that are being copied to janicep We also modify the system.prop so it doesn't include the RIL strings anymore, they are now properly overriden --- janice.mk | 7 +++++++ system.prop | 6 ------ tee/cops_ta.ssw | Bin 0 -> 29408 bytes tee/custom_ta.ssw | Bin 0 -> 20048 bytes tee/libbassapp_ssw | 0 tee/smcl_ta_8500bx_secure.ssw | Bin 0 -> 2548 bytes 6 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 tee/cops_ta.ssw create mode 100644 tee/custom_ta.ssw create mode 100644 tee/libbassapp_ssw create mode 100644 tee/smcl_ta_8500bx_secure.ssw diff --git a/janice.mk b/janice.mk index baba56d..189673e 100644 --- a/janice.mk +++ b/janice.mk @@ -16,6 +16,13 @@ DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay PRODUCT_AAPT_CONFIG := normal hdpi PRODUCT_AAPT_PREF_CONFIG := hdpi +# TEE +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/tee/cops_ta.ssw:system/lib/tee/cops_ta.ssw \ + $(LOCAL_PATH)/tee/custom_ta.ssw:system/lib/tee/custom_ta.ssw \ + $(LOCAL_PATH)/tee/libbassapp_ssw:system/lib/tee/libbassapp_ssw \ + $(LOCAL_PATH)/tee/smcl_ta_8500bx_secure.ssw:system/lib/tee/smcl_ta_8500bx_secure.ssw + # RIL PRODUCT_PROPERTY_OVERRIDES += \ mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ diff --git a/system.prop b/system.prop index be411f3..5f74176 100644 --- a/system.prop +++ b/system.prop @@ -5,12 +5,6 @@ rild.libpath=/system/lib/libsec-ril.so rild.libargs=-d /dev/ttyS0 -# RIL -ro.ril.hsxpa=1 -ro.ril.gprsclass=10 -ro.telephony.ril_class=SamsungU8500RIL -ro.telephony.sends_barcount=1 - ro.sf.lcd_density=240 ro.lcd_min_brightness=30 diff --git a/tee/cops_ta.ssw b/tee/cops_ta.ssw new file mode 100644 index 0000000000000000000000000000000000000000..d1c5a2593106a56b8f8bac7de9682704254e4385 GIT binary patch literal 29408 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%0DRgHj*3L?%pX?c1J-p^!kx3rr6ma+V)n0SE)L0&| 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 literal 0 HcmV?d00001 diff --git a/tee/custom_ta.ssw b/tee/custom_ta.ssw new file mode 100644 index 0000000000000000000000000000000000000000..0b0066150821812683f08d76beb0125189d86eba GIT binary patch literal 20048 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 literal 0 HcmV?d00001 diff --git a/tee/libbassapp_ssw b/tee/libbassapp_ssw new file mode 100644 index 0000000..e69de29 diff --git a/tee/smcl_ta_8500bx_secure.ssw b/tee/smcl_ta_8500bx_secure.ssw new file mode 100644 index 0000000000000000000000000000000000000000..126d7e66200178fbcf53b50165fab316c8f7c640 GIT binary patch literal 2548 zcmah~4{#Gz8h@MJY?7wEq%_5lP~4_eqcJ5C99uXfjdT;T^;*jGC^|^4^=>w;H>QdslN25o-QeVB? zmc8)hEpN|rE`IKnV9I}zJGyR8$%)}D+td%#4lfv3DFkQPpQK0rFr3r1Yjj2Lh6nHX zHphN{d;G~WKixUrP`TsipL<%Ka#sH2y^V?13QJz`voFlkwt4IWyF91cQ-53b!u9n9 z=WAcJMzpKmwZ2d9eWs)E&36tCRP2#`-bSCl?`nm{e6nqg?F_Tw+%K=9hmTs{EA-WF z)m^&%zc~ZxucO1-Rw)YMP-8@1efgJdVcbmE4z%Xs@#s}wcmV` zm7|)izoCo1ZEW4RdiU|6w)~P-i#grYp)Ivh3e8ZPL}O{%SQQt(B-iZ59ZLkz*F1V!3&)8C%zrp?wi1q?f&eOhk9ZxYC;I*;!Y_2V6duWHs)93z>Dp zMSO$-21iIXTk@!fQHTf{c`c8`T$F3p!OWxx$q9&gVkpkOp+E@FftKg{QFXpw+aG7q zJ_V<6hx7_hsLlxS{Vtk2qnBA;lUQqq9)WMv8E)074JmCu#iquNrIe>ATdttx47_vH zFEe;kV;58AXqAZSvpK{Vyrh8Nvp9pds3}iWYLtm9jd`L>LnV3}DGL>AXw-YPz-cG& zxDIw0Y`w$>6*H3R5$1kSo!D;Y(e`wf5YY=7I}3;HQs!8TDp8Pp_kr&qsPT~G^S7V? zVGFoYW3Q(eiB%3Tp(Re)oSZdykw6yz5VHdBrlFm5TB|8;V!x5o+(Ox#BMnO_R>K~L zm3`=A>c~tFD&AdJK2EL1oQQ2Q%ykFJGEggro%#$@8LUyMteUg)Rrx_yg3x8_t-;;V! zP^dr0$v{7${!gG})-hBh53}Rc;t2Br_idd8D(6v2`8ccwGRJS7^Q!_{k)$2sAN`8L z)Y!^NstcJN;=-3yVGDn{v)4vCbrpIg@qUc{INPIPGlWJg#CRJfYmpeMm39ryr;B!M5?CfRI^O7tj zu~(jw7srHYES2H^8^Egzfxk5FV9kRcjVt3+_?Az#L(zS97XE_VmaYIr@I^pd_)^TS z3up8Xz@9bWOww6>G)~3WdK4il{5!~s2EC@UngO#f3EG{;yCUVTD-QESyCa;@4#MN}u)tuqq2m%6N~#2#x-67Qa7 zXEmqBU(_hzj%uVBHBt=cGN=oAm<}y-lQ+G;aC39K<=iB6O{_cuK617+nyz@fM;)ee z$hVA>2N%2lnnBTkasUPu%e{}ozrY?m&8N~;ygbuEo{~C;34rW@+GDzV)O z+He7<`XaF?;55e|^Oo4?&-=nKY9C$GxANKy__uxZ>Au=)YS_DTmNjcgH_?4?Hv|36FZw1o5?^(#DSHY3@oLt|ulc=TPB%7LUwq^H2xY1Wb>g(piEv zJo3HTR09U*i@Bg)MdgTI0a4{_S`+7NiZe@bn?Y|g;AVsA!0x{MaBkm#KK&~=BM*S7 qV2rQ(w`}?Qiv0a2?tFIPt%&Kw*~=wG&;EAec6Yd~pBt=4%l->`hi+>C literal 0 HcmV?d00001 From 1acda1da6c56cee7c0c9f6e66b300f3b6a2da183 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Fri, 21 Jun 2013 13:31:31 -0300 Subject: [PATCH 034/248] Testing props :) Suggestion(s) from OliverG96 --- rootdir/init.samsungjanice.rc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 2c84dae..74ff9ae 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -26,9 +26,10 @@ on init # setup the global environment export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin - export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents/:/vendor/lib + export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib export OMX_STE_ENS_COMPONENTS_DIR /system/lib/ste_omxcomponents/ export OMX_BELLAGIO_LOADER_REGISTRY /system/etc/omxloaders + export OMX_STE_CSCALL_COMPONENTS_DIR /system/lib/ste_omxcomponents/ # Vibetonz export VIBE_PIPE_PATH /dev/pipes From d14c2e42b9dfd6250a75a0dee2df8ebe2202ed95 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Sun, 23 Jun 2013 14:38:59 -0300 Subject: [PATCH 035/248] BoardConfig: Handling of MR0 blobs and testing for fix the flickering :) WE NEED TO SOLVE DAT PROBLEM DisplayDevice: Backwards compatibility with old EGL From 4.1 to 4.2, the display subsystem was reworked to use SurfaceTextureClient/BufferQueue instead of FramebufferNativeWindow for the framebuffer itself. Unfortunately, some legacy EGL libraries make assumptions that any framebuffer device will be FramebufferNativeWindow. These EGL libraries will fail when used in 4.2 as if the framebuffer is not FramebufferNativeWindow, they will try to dequeue more than one buffer at a time, which will cause a hang of the graphics subsystem http://review.cyanogenmod.org/#/c/28005/ Also, we disable triple buffering for now, since it's the handler of the bad-done VSYNC, so, we cap the FPS rate by refresh_rate cflag to 60, and let the screen do the actual capping of Hertz screen refresh rate. As explained here, the triple framebuffering is NOT checking the actual refresh rate of the screen, so it's running as fast as it can :) Due to the software algorithm not having to poll the graphics hardware for monitor refresh events, the algorithm is free to run as fast as possible. --- BoardConfig.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index 9b3f28c..4d23ed2 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -22,6 +22,13 @@ BOARD_BOOTIMAGE_PARTITION_SIZE := 16777216 BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 + +# Experimental testing for flickering +TARGET_DISABLE_TRIPLE_BUFFERING := TRUE +COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 +BOARD_EGL_NEEDS_LEGACY_FB := true + + # EXPERIMENTAL SOUND # BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true From fcfded8f1290b4be62a146497e2c69b727ef035b Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Tue, 25 Jun 2013 16:45:52 -0300 Subject: [PATCH 036/248] BoardConfig:Revert "testing for fix the flickering" we still need the legacy_fb cflag --- BoardConfig.mk | 2 -- 1 file changed, 2 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 4d23ed2..c0a5506 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -24,8 +24,6 @@ BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 # Experimental testing for flickering -TARGET_DISABLE_TRIPLE_BUFFERING := TRUE -COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 BOARD_EGL_NEEDS_LEGACY_FB := true From 2f40a9e11688af28a7f00778bedbe794b8cf7c24 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 17 Jul 2013 00:33:57 -0300 Subject: [PATCH 037/248] Update UsbCurrency.java --- .../src/com/cyanogenmod/settings/device/UsbCurrency.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java index 0b9aa8b..db843b7 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java @@ -31,7 +31,7 @@ public UsbCurrency(Context context, AttributeSet attrs) { this.setOnPreferenceChangeListener(this); } - private static final String FILE = "/sys/module/abb_charger/parameters/max_usb_current"; + private static final String FILE = "/sys/kernel/abb_charger/max_usb_c"; public static boolean isSupported() { return Utils.fileExists(FILE); From ce9fd9c1f4509b58ab8cd9b9be4e01fbd66b0f34 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 17 Jul 2013 00:34:19 -0300 Subject: [PATCH 038/248] Update ChargerCurrency.java --- .../src/com/cyanogenmod/settings/device/ChargerCurrency.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java index 3ab19a6..afcb24c 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java @@ -31,7 +31,7 @@ public ChargerCurrency(Context context, AttributeSet attrs) { this.setOnPreferenceChangeListener(this); } - private static final String FILE = "/sys/module/abb_charger/parameters/max_ac_current"; + private static final String FILE = "/sys/kernel/abb_charger/max_ac_c"; public static boolean isSupported() { return Utils.fileExists(FILE); From 319aa717c7d9f707876bebd92076c5ca401e8283 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 17 Jul 2013 00:58:30 -0300 Subject: [PATCH 039/248] Update USBFragmentActivity.java --- .../cyanogenmod/settings/device/USBFragmentActivity.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java index b5343fa..690ecf3 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java @@ -52,6 +52,14 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen String key = preference.getKey(); Log.w(TAG, "key: " + key); + + if (key.equals(DeviceSettings.KEY_USB_OTG_POWER)) { + if (((CheckBoxPreference)preference).isChecked()) { + Utils.writeValue(FILE, "1"); + } else { + Utils.writeValue(FILE, "0"); + } + } return true; } From f792c43a66983303cb29b8df8c1b0c5248b67bb2 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 17 Jul 2013 10:14:42 -0300 Subject: [PATCH 040/248] Import missing CheckBoxPreference to USBFragmentActivity --- .../com/cyanogenmod/settings/device/USBFragmentActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java index 690ecf3..8cc94c8 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java @@ -22,8 +22,10 @@ import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; +import android.preference.CheckBoxPreference; import android.util.Log; + import com.cyanogenmod.settings.device.R; public class USBFragmentActivity extends PreferenceFragment { From 8aa0435a0a56efa02386e2714cabc6e987ddbce4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 18 Jul 2013 22:17:37 -0300 Subject: [PATCH 041/248] fix typo --- .../src/com/cyanogenmod/settings/device/ChargerCurrency.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java index afcb24c..6d80d17 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java @@ -31,7 +31,7 @@ public ChargerCurrency(Context context, AttributeSet attrs) { this.setOnPreferenceChangeListener(this); } - private static final String FILE = "/sys/kernel/abb_charger/max_ac_c"; + private static final String FILE = "/sys/kernel/abb-charger/max_ac_c"; public static boolean isSupported() { return Utils.fileExists(FILE); From fbcea48c8becaa65fbd56ab401b524fdb3ff6933 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 18 Jul 2013 22:18:13 -0300 Subject: [PATCH 042/248] fix typo --- .../src/com/cyanogenmod/settings/device/UsbCurrency.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java index db843b7..97e5ec8 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java @@ -31,7 +31,7 @@ public UsbCurrency(Context context, AttributeSet attrs) { this.setOnPreferenceChangeListener(this); } - private static final String FILE = "/sys/kernel/abb_charger/max_usb_c"; + private static final String FILE = "/sys/kernel/abb-charger/max_usb_c"; public static boolean isSupported() { return Utils.fileExists(FILE); From 3773b1f57fda84e6fb298d5e7abbb9442515c93d Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 18 Jul 2013 22:51:59 -0300 Subject: [PATCH 043/248] Fix charger values --- DeviceSettings/res/values/arrays.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index d2d3f1f..a57f27a 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -15,14 +15,14 @@ 100 - 750 mAh *WARNING* + 800 mAh *WARNING* 600 mAh (fast charge) - 450 mAh + 400 mAh - 750 + 800 600 - 450 + 400 @@ -36,14 +36,14 @@ 3 - 750 mAh *WARNING* + 800 mAh *WARNING* 600 mAh (default) - 450 mAh + 400 mAh - 750 + 800 600 - 450 + 400 2.2 (Default) From 6ad1cd82a14bff8d27e226d113382b6093656976 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 18 Jul 2013 22:59:51 -0300 Subject: [PATCH 044/248] rename package name to GalaxySAdvanceSettings --- DeviceSettings/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/Android.mk b/DeviceSettings/Android.mk index 7225f50..0aabc3f 100644 --- a/DeviceSettings/Android.mk +++ b/DeviceSettings/Android.mk @@ -7,7 +7,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13 LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_PACKAGE_NAME := GalaxyS2Settings +LOCAL_PACKAGE_NAME := GalaxySAdvanceSettings LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) From b788c7da6b27bb983648ec09c7022a36955968ab Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 19 Jul 2013 17:39:23 -0300 Subject: [PATCH 045/248] rename package name to GalaxySAdvanceSettings --- janice.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index 189673e..d0802d1 100644 --- a/janice.mk +++ b/janice.mk @@ -33,7 +33,7 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ - GalaxyS2Settings + GalaxySAdvanceSettings # Init files PRODUCT_COPY_FILES += \ From 1187e21f081b8531191bdb63c07df970013d096d Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 19 Jul 2013 19:42:59 -0300 Subject: [PATCH 046/248] Add permissions for charging currency values and VOTG usb output voltage --- rootdir/init.samsungjanice.rc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 74ff9ae..7a26763 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -459,14 +459,16 @@ on boot # temp Torch workaround chmod 0222 /sys/class/sec/flash/enable - # fbearlysuspend module parameters permissions + # system permissions for device parts chown system system /sys/module/fbearlysuspend/parameters/fbdelay chown system system /sys/module/fbearlysuspend/parameters/fbdelay_ms chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first_ms - - # deepest sleep state fix for device parts chown system system /d/cpuidle/deepest_state + chown system system /sys/kernel/abb-regu/VOTG + chown system system /sys/kernel/abb-charger/max_ac_c + chown system system /sys/kernel/abb-charger/max_usb_c + # Define TCP buffer sizes for various networks # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, From 2d2aa40c55972de7993362853921c2a646937efe Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Sat, 20 Jul 2013 18:02:27 +0200 Subject: [PATCH 047/248] Updated Italian translation Strings.xml updated and arrays.xml added --- DeviceSettings/res/values-it/arrays.xml | 115 +++++++++++++++++++++++ DeviceSettings/res/values-it/strings.xml | 70 ++++++++++---- 2 files changed, 165 insertions(+), 20 deletions(-) create mode 100644 DeviceSettings/res/values-it/arrays.xml diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml new file mode 100644 index 0000000..ed2c36e --- /dev/null +++ b/DeviceSettings/res/values-it/arrays.xml @@ -0,0 +1,115 @@ + + + + 600 ms + 400 ms + 350 ms (Predefinito) + 200 ms + 100 ms + + + 600 + 400 + 350 + 200 + 100 + + + 800 mAh *ATTENZIONE* + 600 mAh (Ricarica Veloce) + 400 mAh + + + 800 + 600 + 400 + + + + Stato 5 + Stato 4 + Stato 3 (Predefinito) + + + 5 + 4 + 3 + + + 800 mAh *ATTENZIONE* + 600 mAh (Predefinito) + 400 mAh + + + 800 + 600 + 400 + + + 2.2 (Predefinito) + 1.9 + + + 0 + 1 + + + 10 + 20 + 30 + 50 (Predefinito) + 70 + 100 + + + 10 + 20 + 30 + 50 + 70 + 100 + + + 0% + 25% + 50% (Predefinito) + 75% + 100% + + + 0 + 25 + 50 + 75 + 100 + + + Solo UMTS + Solo HSDPA + HSDPA + HSUPA + + + 21 + 22 + 23 + + + Mai + 1 secondo + 2 secondi + 3 secondi (Predefinito) + 4 secondi + 5 secondi + 6 secondi + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + + + diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index ed70318..418be28 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -1,16 +1,29 @@ Impostazioni Galaxy S Advance + + + Generale + Modalità Rete + HSPA + Abilita HSDPA/HSUPA + Accelerometro + Usa dati di calibrazione + Usa i valori di calibrazione dell\'accelerometro. Effettuare una calibrazione dopo aver attivato questa impostazione! + Calibrazione + Posizionare il telefono su una superficie orizzontale piana e premere per effettuare la calibrazione + Calibrazione effettuata + Il sensore è stato correttamente calibrato. + Vibratore + Intensità vibrazione + Imposta l\'intensità della vibrazione + Avanzate + Profondissimo Deep Sleep + Specifica il più alto livello di deep sleep + + Schermo Colori - Scenario - Imposta lo scenario mDNIe - Modalità - Imposta la modalità mDNIe - Negativo - Abilita/disabilita i colori invertiti - Esterno - Abilita/disabilita la modalità esterno Gamma schermo Imposta il valore gamma dello schermo Schermo tattile @@ -21,21 +34,38 @@ Abilita la retroilluminazione dei tasti a sfioramento quando lo schermo è attivo Timer retroilluminazione Imposta l\'intervallo dopo cui la retroilluminazione dei tasti si spegne + Effetto CRT Spegnimento Schermo + Ritarda Sospensione + Abilita / Disabilita il ritardamento della sospensione dello schermo, abiliterà l'effetto CRT + Ritardo in ms + Millisecondi da aspettare prima di spegnere lo schermo + + + Charger control + Impostazioni USB OTG + Attivazione USB-OTG + Abilita alimentazione (in uscita) della porta USB + Controllo Caricabatterie + Voltaggio Caricabatterie + Voltaggio caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria + Voltaggio Caricabatterie USB + Voltaggio carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria + + + + + + Scenario + Imposta lo scenario mDNIe + Modalità + Imposta la modalità mDNIe + Negativo + Abilita/disabilita i colori invertiti + Esterno + Abilita/disabilita la modalità esterno Sensori - Accelerometro - Usa dati di calibrazione - Usa i valori di calibrazione dell\'accelerometro. Effettuare una calibrazione dopo aver attivato questa impostazione! - Calibrazione - Posizionare il telefono su una superficie orizzontale piana e premere per effettuare la calibrazione - Calibrazione effettuata - Il sensore è stato correttamente calibrato. Feedback tattile - Vibratore - Intensità vibrazione - Imposta l\'intensità della vibrazione Radio - HSPA - Abilita HSDPA/HSUPA Dock Audio Usa USB audio in dock From d8112635daada9ff30a2dea97c35f42321f22446 Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Sat, 20 Jul 2013 18:45:46 +0200 Subject: [PATCH 048/248] Updated Italian translation 2 Deleted some useless and double strings --- DeviceSettings/res/values-it/strings.xml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index 418be28..3555a44 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -41,7 +41,6 @@ Millisecondi da aspettare prima di spegnere lo schermo - Charger control Impostazioni USB OTG Attivazione USB-OTG Abilita alimentazione (in uscita) della porta USB @@ -50,25 +49,5 @@ Voltaggio caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria Voltaggio Caricabatterie USB Voltaggio carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - - - - - - Scenario - Imposta lo scenario mDNIe - Modalità - Imposta la modalità mDNIe - Negativo - Abilita/disabilita i colori invertiti - Esterno - Abilita/disabilita la modalità esterno - Sensori - Feedback tattile - Radio - Dock - Audio - Usa USB audio in dock - Usa l\'uscita audio passiva quando in dock From 7a87d1899a95cc83b2f414eca7d156560f38374a Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Sat, 20 Jul 2013 21:41:46 +0200 Subject: [PATCH 049/248] Fixed an error From "l'" to "l\'" --- DeviceSettings/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index 3555a44..b9e9f51 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -36,7 +36,7 @@ Imposta l\'intervallo dopo cui la retroilluminazione dei tasti si spegne Effetto CRT Spegnimento Schermo Ritarda Sospensione - Abilita / Disabilita il ritardamento della sospensione dello schermo, abiliterà l'effetto CRT + Abilita / Disabilita il ritardamento della sospensione dello schermo, abiliterà l\'effetto CRT Ritardo in ms Millisecondi da aspettare prima di spegnere lo schermo From 88ddb0901df15126defea02ac990f55b8fa1b8b5 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 01:57:00 -0300 Subject: [PATCH 050/248] DeviceSettings update --- DeviceSettings/res/values/arrays.xml | 27 +- DeviceSettings/res/values/strings.xml | 44 +-- .../res/xml/advanced_preferences.xml | 25 ++ .../res/xml/general_preferences.xml | 22 -- DeviceSettings/res/xml/screen_preferences.xml | 83 ++---- DeviceSettings/res/xml/usb_preferences.xml | 2 +- .../device/AdvancedFragmentActivity.java | 61 ++++ .../settings/device/ChargerCurrency.java | 65 +++-- .../settings/device/DeepestSleepState.java | 65 +++-- .../settings/device/DeviceSettings.java | 274 +++++++++--------- .../settings/device/FsyncMode.java | 63 ++++ .../device/GeneralFragmentActivity.java | 7 +- .../com/cyanogenmod/settings/device/Hspa.java | 66 +++-- .../settings/device/PanelGamma.java | 67 +++-- .../device/ScreenFragmentActivity.java | 123 +++----- .../cyanogenmod/settings/device/Startup.java | 23 +- .../device/TouchscreenSensitivity.java | 66 +++-- .../settings/device/USBFragmentActivity.java | 71 ++--- .../settings/device/UsbCurrency.java | 65 +++-- .../cyanogenmod/settings/device/Utils.java | 219 +++++++------- 20 files changed, 745 insertions(+), 693 deletions(-) create mode 100644 DeviceSettings/res/xml/advanced_preferences.xml create mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java create mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index a57f27a..c7b86ea 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -1,18 +1,14 @@ - - 600 ms - 400 ms - 350 ms (default) - 200 ms - 100 ms - - - 600 - 400 - 350 - 200 - 100 + + Disabled + Enabled (default) + Dynamic + + + 0 + 1 + 2 800 mAh *WARNING* @@ -24,7 +20,6 @@ 600 400 - State 5 State 4 @@ -69,7 +64,7 @@ 70 100 - + 0% 25% 50% (default) @@ -112,4 +107,4 @@ 6 - + \ No newline at end of file diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml index e1651b7..1d9c3f4 100644 --- a/DeviceSettings/res/values/strings.xml +++ b/DeviceSettings/res/values/strings.xml @@ -1,44 +1,24 @@ + Galaxy S Advance Settings - - General - Radio mode HSPA Enable HSDPA/HSUPA - Vibrator Vibrator Intensity Set vibrator intensity - - Advanced + Deep Sleep Deepest sleep state Specify the highest deep sleep level - Screen - Colors Screen Gamma Set screen gamma value - Touchscreen Touch sensitivity Set touch panel sensitivity - - Touchkeys - Enable keys backlight - Light up touchkeys when screen is on - Backlight timeout - Delay after a keypress before backlight turns off - - CRT-OFF Effect - FB Early Suspend Delay - Enable / Disable framebuffer early suspend delay, it will enable the crt-off effect - Delay in ms - Amount in milliseconds to wait before the screen turns off - Accelerometer Use calibration data Use the accelerometer calibration values. Do a calibration after checking this! @@ -46,20 +26,18 @@ Put your phone on a flat surface, and press this to calibrate Calibration done The sensor has been successfully calibrated. - Usb - USB OTG Settings - USB-OTG Power + USB-VBUS Power Enables output voltage to the USB port - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage the battery life - + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage the battery life - - - + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + Advanced + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + \ No newline at end of file diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml new file mode 100644 index 0000000..89d3db6 --- /dev/null +++ b/DeviceSettings/res/xml/advanced_preferences.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/DeviceSettings/res/xml/general_preferences.xml b/DeviceSettings/res/xml/general_preferences.xml index 6c8b6c1..70fad61 100644 --- a/DeviceSettings/res/xml/general_preferences.xml +++ b/DeviceSettings/res/xml/general_preferences.xml @@ -27,27 +27,5 @@ android:title="@string/calibrate_accelerometer_title_head" /> - - - - - - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/xml/screen_preferences.xml b/DeviceSettings/res/xml/screen_preferences.xml index 73819ed..9c1c113 100644 --- a/DeviceSettings/res/xml/screen_preferences.xml +++ b/DeviceSettings/res/xml/screen_preferences.xml @@ -1,71 +1,26 @@ + android:title="@string/app_name" > - - - - + + + - - + + - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/DeviceSettings/res/xml/usb_preferences.xml b/DeviceSettings/res/xml/usb_preferences.xml index bad9016..7ac5f86 100644 --- a/DeviceSettings/res/xml/usb_preferences.xml +++ b/DeviceSettings/res/xml/usb_preferences.xml @@ -13,7 +13,7 @@ - + mTabs = new ArrayList(); - - static final class TabInfo { - private final Class clss; - private final Bundle args; - - TabInfo(Class _class, Bundle _args) { - clss = _class; - args = _args; - } - } - - public TabsAdapter(Activity activity, ViewPager pager) { - super(activity.getFragmentManager()); - mContext = activity; - mActionBar = activity.getActionBar(); - mViewPager = pager; - mViewPager.setAdapter(this); - mViewPager.setOnPageChangeListener(this); - } - - public void addTab(ActionBar.Tab tab, Class clss, Bundle args) { - TabInfo info = new TabInfo(clss, args); - tab.setTag(info); - tab.setTabListener(this); - mTabs.add(info); - mActionBar.addTab(tab); - notifyDataSetChanged(); - } - - @Override - public int getCount() { - return mTabs.size(); - } - - @Override - public Fragment getItem(int position) { - TabInfo info = mTabs.get(position); - return Fragment.instantiate(mContext, info.clss.getName(), info.args); - } - - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - public void onPageSelected(int position) { - mActionBar.setSelectedNavigationItem(position); - } - - public void onPageScrollStateChanged(int state) { - } - - public void onTabSelected(Tab tab, FragmentTransaction ft) { - Object tag = tab.getTag(); - for (int i=0; i mTabs = new ArrayList(); + + static final class TabInfo { + private final Class clss; + private final Bundle args; + + TabInfo(Class _class, Bundle _args) { + clss = _class; + args = _args; + } + } + + public TabsAdapter(Activity activity, ViewPager pager) { + super(activity.getFragmentManager()); + mContext = activity; + mActionBar = activity.getActionBar(); + mViewPager = pager; + mViewPager.setAdapter(this); + mViewPager.setOnPageChangeListener(this); + } + + public void addTab(ActionBar.Tab tab, Class clss, Bundle args) { + TabInfo info = new TabInfo(clss, args); + tab.setTag(info); + tab.setTabListener(this); + mTabs.add(info); + mActionBar.addTab(tab); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mTabs.size(); + } + + @Override + public Fragment getItem(int position) { + TabInfo info = mTabs.get(position); + return Fragment.instantiate(mContext, info.clss.getName(), + info.args); + } + + public void onPageScrolled(int position, float positionOffset, + int positionOffsetPixels) { + } + + public void onPageSelected(int position) { + mActionBar.setSelectedNavigationItem(position); + } + + public void onPageScrollStateChanged(int state) { + } + + public void onTabSelected(Tab tab, FragmentTransaction ft) { + Object tag = tab.getTag(); + for (int i = 0; i < mTabs.size(); i++) { + if (mTabs.get(i) == tag) { + mViewPager.setCurrentItem(i); + } + } + } + + public void onTabUnselected(Tab tab, FragmentTransaction ft) { + } + + public void onTabReselected(Tab tab, FragmentTransaction ft) { + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + DeviceSettings.this.onBackPressed(); + default: + return super.onOptionsItemSelected(item); + } + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java b/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java new file mode 100644 index 0000000..2fe70a2 --- /dev/null +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; + +import android.content.Context; +import android.util.AttributeSet; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.ListPreference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceManager; + +public class FsyncMode extends ListPreference implements + OnPreferenceChangeListener { + + public FsyncMode(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/kernel/fsync/mode"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore deepest sleep state from SharedPreferences. + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, + sharedPrefs.getString(DeviceSettings.KEY_FSYNC_MODE, "1")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.writeValue(FILE, (String) newValue); + return true; + } + +} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java index f1767a6..e67c5c0 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java @@ -34,18 +34,13 @@ public class GeneralFragmentActivity extends PreferenceFragment { private static final String FILE_ACCELEROMETER_CALIB = "/sys/class/sensors/accelerometer_sensor/calibration"; - VibratorIntensity mVibratorIntensity; - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.general_preferences); - PreferenceScreen prefSet = getPreferenceScreen(); - - mVibratorIntensity = (VibratorIntensity)findPreference(DeviceSettings.KEY_VIBRATOR_INTENSITY); - prefSet.findPreference(DeviceSettings.KEY_VIBRATOR_INTENSITY).setEnabled(VibratorIntensity.isSupported()); + // PreferenceScreen prefSet = getPreferenceScreen(); } @Override diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java index f19eff7..d196dc6 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java @@ -27,41 +27,45 @@ public class Hspa extends ListPreference implements OnPreferenceChangeListener { - private static final String FILE = "/system/app/SamsungServiceMode.apk"; - private Context mCtx; + private static final String FILE = "/system/app/SamsungServiceMode.apk"; + private Context mCtx; - public Hspa(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - mCtx = context; - } + public Hspa(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + mCtx = context; + } - public static boolean isSupported() { - return Utils.fileExists(FILE); - } + public static boolean isSupported() { + return Utils.fileExists(FILE); + } - /** - * Restore hspa setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } + /** + * Restore hspa setting from SharedPreferences. (Write to kernel.) + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - sendIntent(context, sharedPrefs.getString(DeviceSettings.KEY_HSPA, "23")); - } + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + sendIntent(context, + sharedPrefs.getString(DeviceSettings.KEY_HSPA, "23")); + } - public boolean onPreferenceChange(Preference preference, Object newValue) { - sendIntent(mCtx, (String) newValue); - return true; - } + public boolean onPreferenceChange(Preference preference, Object newValue) { + sendIntent(mCtx, (String) newValue); + return true; + } - private static void sendIntent(Context context, String value) { - Intent i = new Intent("com.cyanogenmod.SamsungServiceMode.EXECUTE"); - i.putExtra("sub_type", 20); // HSPA Setting - i.putExtra("data", value); - context.sendBroadcast(i); - } + private static void sendIntent(Context context, String value) { + Intent i = new Intent("com.cyanogenmod.SamsungServiceMode.EXECUTE"); + i.putExtra("sub_type", 20); // HSPA Setting + i.putExtra("data", value); + context.sendBroadcast(i); + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java b/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java index 15e6f6c..a3c8555 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java @@ -25,36 +25,41 @@ import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceManager; -public class PanelGamma extends ListPreference implements OnPreferenceChangeListener { - - public PanelGamma(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/class/lcd/panel/device/gamma_mode"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore panel gamma setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString(DeviceSettings.KEY_PANEL_GAMMA, "0")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Log.d("SGS2","Writing " + ((String)newValue) + " to " + FILE); - Utils.writeValue(FILE, (String) newValue); - return true; - } +public class PanelGamma extends ListPreference implements + OnPreferenceChangeListener { + + public PanelGamma(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/class/lcd/panel/device/gamma_mode"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore panel gamma setting from SharedPreferences. (Write to kernel.) + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, + sharedPrefs.getString(DeviceSettings.KEY_PANEL_GAMMA, "0")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Log.d("SGS2", "Writing " + ((String) newValue) + " to " + FILE); + Utils.writeValue(FILE, (String) newValue); + return true; + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java index 1ba84f5..2b64558 100755 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java @@ -19,95 +19,52 @@ import com.cyanogenmod.settings.device.R; import android.content.Context; -import android.content.SharedPreferences; +//import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.CheckBoxPreference; +//import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; +//import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; public class ScreenFragmentActivity extends PreferenceFragment { - private static final String TAG = "GalaxySAdvance_Settings_Screen"; - - private static final String FILE_TOUCHKEY_BRIGHTNESS = "/sys/class/leds/button-backlight/brightness"; - private static final String FILE_FB_DELAY = "/sys/module/fbearlysuspend/parameters/fbdelay"; - - - private TouchscreenSensitivity mTouchscreenSensitivity; - private TouchkeyTimeout mTouchkeyTimeout; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.screen_preferences); - PreferenceScreen prefSet = getPreferenceScreen(); - - mTouchscreenSensitivity = (TouchscreenSensitivity) findPreference(DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY); - mTouchscreenSensitivity.setEnabled(TouchscreenSensitivity.isSupported()); - - mTouchkeyTimeout = (TouchkeyTimeout) findPreference(DeviceSettings.KEY_TOUCHKEY_TIMEOUT); - mTouchkeyTimeout.setEnabled(TouchkeyTimeout.isSupported()); - - if (((CheckBoxPreference)prefSet.findPreference(DeviceSettings.KEY_TOUCHKEY_LIGHT)).isChecked()) { - prefSet.findPreference(DeviceSettings.KEY_TOUCHKEY_TIMEOUT).setEnabled(true); - } else { - prefSet.findPreference(DeviceSettings.KEY_TOUCHKEY_TIMEOUT).setEnabled(false); - } - - if (((CheckBoxPreference)prefSet.findPreference(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY)).isChecked()) { - prefSet.findPreference(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY_MS).setEnabled(true); - } else { - prefSet.findPreference(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY_MS).setEnabled(false); - } - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - - String key = preference.getKey(); - - Log.w(TAG, "key: " + key); - - if (key.equals(DeviceSettings.KEY_TOUCHKEY_LIGHT)) { - if (((CheckBoxPreference)preference).isChecked()) { - //Utils.writeValue(FILE_TOUCHKEY_DISABLE, "0"); - Utils.writeValue(FILE_TOUCHKEY_BRIGHTNESS, "1"); - preferenceScreen.findPreference(DeviceSettings.KEY_TOUCHKEY_TIMEOUT).setEnabled(true); - } else { - //Utils.writeValue(FILE_TOUCHKEY_DISABLE, "1"); - Utils.writeValue(FILE_TOUCHKEY_BRIGHTNESS, "0"); - preferenceScreen.findPreference(DeviceSettings.KEY_TOUCHKEY_TIMEOUT).setEnabled(false); - } - } - - if(key.equals(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY)) { - if (((CheckBoxPreference)preference).isChecked()) { - Utils.writeValue(FILE_FB_DELAY, "1"); - preferenceScreen.findPreference(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY_MS).setEnabled(true); - } else { - Utils.writeValue(FILE_FB_DELAY, "0"); - preferenceScreen.findPreference(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY_MS).setEnabled(false); - } - } - - return true; - } - - public static boolean isSupported(String FILE) { - return Utils.fileExists(FILE); - } - - public static void restore(Context context) { - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - - boolean light = sharedPrefs.getBoolean(DeviceSettings.KEY_TOUCHKEY_LIGHT, true); - Utils.writeValue(FILE_TOUCHKEY_BRIGHTNESS, light ? "1" : "0"); - - boolean fbdelay = sharedPrefs.getBoolean(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY, true); - Utils.writeValue(FILE_FB_DELAY, fbdelay ? "1" : "0"); - } + private static final String TAG = "GalaxySAdvance_Settings_Screen"; + + private TouchscreenSensitivity mTouchscreenSensitivity; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.screen_preferences); + // PreferenceScreen prefSet = getPreferenceScreen(); + + mTouchscreenSensitivity = (TouchscreenSensitivity) findPreference(DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY); + mTouchscreenSensitivity + .setEnabled(TouchscreenSensitivity.isSupported()); + + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + Preference preference) { + + String key = preference.getKey(); + + Log.w(TAG, "key: " + key); + + return true; + } + + public static boolean isSupported(String FILE) { + return Utils.fileExists(FILE); + } + + public static void restore(Context context) { + // SharedPreferences sharedPrefs = + // PreferenceManager.getDefaultSharedPreferences(context); + + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java index 1718835..44e33a7 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java @@ -22,17 +22,14 @@ public class Startup extends BroadcastReceiver { - @Override - public void onReceive(final Context context, final Intent bootintent) { - ScreenFragmentActivity.restore(context); - TouchkeyTimeout.restore(context); - VibratorIntensity.restore(context); - USBFragmentActivity.restore(context); - ChargerCurrency.restore(context); - UsbCurrency.restore(context); - FbDelay.restore(context); - DeepestSleepState.restore(context); - GeneralFragmentActivity.restore(context); - PanelGamma.restore(context); - } + @Override + public void onReceive(final Context context, final Intent bootintent) { + ScreenFragmentActivity.restore(context); + USBFragmentActivity.restore(context); + ChargerCurrency.restore(context); + UsbCurrency.restore(context); + DeepestSleepState.restore(context); + GeneralFragmentActivity.restore(context); + PanelGamma.restore(context); + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java index 94c85a6..4bb2980 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java @@ -24,35 +24,41 @@ import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceManager; -public class TouchscreenSensitivity extends ListPreference implements OnPreferenceChangeListener { - - public TouchscreenSensitivity(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/class/sec/sec_touchscreen/tsp_threshold"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore touchscreen sensitivity setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString(DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY, "50")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } +public class TouchscreenSensitivity extends ListPreference implements + OnPreferenceChangeListener { + + public TouchscreenSensitivity(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/class/sec/sec_touchscreen/tsp_threshold"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore touchscreen sensitivity setting from SharedPreferences. (Write to + * kernel.) + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, sharedPrefs.getString( + DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY, "50")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.writeValue(FILE, (String) newValue); + return true; + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java index 8cc94c8..690c023 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java @@ -25,52 +25,55 @@ import android.preference.CheckBoxPreference; import android.util.Log; - import com.cyanogenmod.settings.device.R; public class USBFragmentActivity extends PreferenceFragment { - private static final String TAG = "GalaxySAdvance_Settings_Usb"; - private final String FILE = "/sys/kernel/abb-regu/VOTG"; + private static final String TAG = "GalaxySAdvance_Settings_Usb"; + private final String FILE = "/sys/kernel/abb-regu/VOTG"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.usb_preferences); - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + PreferenceScreen prefSet = getPreferenceScreen(); - addPreferencesFromResource(R.xml.usb_preferences); + prefSet.findPreference(DeviceSettings.KEY_AC_CURRENCY).setEnabled( + ChargerCurrency.isSupported()); + prefSet.findPreference(DeviceSettings.KEY_USB_CURRENCY).setEnabled( + UsbCurrency.isSupported()); + prefSet.findPreference(DeviceSettings.KEY_USB_OTG_POWER).setEnabled( + isSupported(FILE)); - PreferenceScreen prefSet = getPreferenceScreen(); - - prefSet.findPreference(DeviceSettings.KEY_AC_CURRENCY).setEnabled(ChargerCurrency.isSupported()); - prefSet.findPreference(DeviceSettings.KEY_USB_CURRENCY).setEnabled(UsbCurrency.isSupported()); - prefSet.findPreference(DeviceSettings.KEY_USB_OTG_POWER).setEnabled(isSupported(FILE)); + } - } + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + Preference preference) { - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + // String boxValue; + String key = preference.getKey(); - //String boxValue; - String key = preference.getKey(); + Log.w(TAG, "key: " + key); - Log.w(TAG, "key: " + key); - - if (key.equals(DeviceSettings.KEY_USB_OTG_POWER)) { - if (((CheckBoxPreference)preference).isChecked()) { - Utils.writeValue(FILE, "1"); - } else { - Utils.writeValue(FILE, "0"); - } - } + if (key.equals(DeviceSettings.KEY_USB_OTG_POWER)) { + if (((CheckBoxPreference) preference).isChecked()) { + Utils.writeValue(FILE, "1"); + } else { + Utils.writeValue(FILE, "0"); + } + } - return true; - } + return true; + } - public static boolean isSupported(String FILE) { - return Utils.fileExists(FILE); - } + public static boolean isSupported(String FILE) { + return Utils.fileExists(FILE); + } - public static void restore(Context context) { - PreferenceManager.getDefaultSharedPreferences(context); - } + public static void restore(Context context) { + PreferenceManager.getDefaultSharedPreferences(context); + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java index 97e5ec8..35261ef 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java @@ -24,35 +24,40 @@ import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceManager; -public class UsbCurrency extends ListPreference implements OnPreferenceChangeListener { - - public UsbCurrency(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/kernel/abb-charger/max_usb_c"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore currency setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString(DeviceSettings.KEY_USB_CURRENCY, "600")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } +public class UsbCurrency extends ListPreference implements + OnPreferenceChangeListener { + + public UsbCurrency(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/kernel/abb-charger/max_usb_c"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore currency setting from SharedPreferences. (Write to kernel.) + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, + sharedPrefs.getString(DeviceSettings.KEY_USB_CURRENCY, "600")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.writeValue(FILE, (String) newValue); + return true; + } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java index 887991e..e7c7b2b 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java @@ -29,114 +29,125 @@ public class Utils { - private static final String TAG = "GalaxySAdvance_Settings_Utils"; - //private static final String TAG_READ = "GalaxySAdvance_Settings_Utils_Read"; - private static final String TAG_WRITE = "GalaxySAdvance_Settings_Utils_Write"; + private static final String TAG = "GalaxySAdvance_Settings_Utils"; + // private static final String TAG_READ = + // "GalaxySAdvance_Settings_Utils_Read"; + private static final String TAG_WRITE = "GalaxySAdvance_Settings_Utils_Write"; - /** - * Write a string value to the specified file. - * - * @param filename The filename - * @param value The value - */ - public static void writeValue(String filename, String value) { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(new File(filename), false); - fos.write(value.getBytes()); - fos.flush(); - // fos.getFD().sync(); - } catch (FileNotFoundException ex) { - Log.w(TAG, "file " + filename + " not found: " + ex); - } catch (SyncFailedException ex) { - Log.w(TAG, "file " + filename + " sync failed: " + ex); - } catch (IOException ex) { - Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while syncing file: ", ex); - } finally { - if (fos != null) { - try { - Log.w(TAG_WRITE, "file " + filename + ": " + value); - fos.close(); - } catch (IOException ex) { - Log.w(TAG, "IOException while closing synced file: ", ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while closing file: ", ex); - } - } - } + /** + * Write a string value to the specified file. + * + * @param filename + * The filename + * @param value + * The value + */ + public static void writeValue(String filename, String value) { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(new File(filename), false); + fos.write(value.getBytes()); + fos.flush(); + // fos.getFD().sync(); + } catch (FileNotFoundException ex) { + Log.w(TAG, "file " + filename + " not found: " + ex); + } catch (SyncFailedException ex) { + Log.w(TAG, "file " + filename + " sync failed: " + ex); + } catch (IOException ex) { + Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); + } catch (RuntimeException ex) { + Log.w(TAG, "exception while syncing file: ", ex); + } finally { + if (fos != null) { + try { + Log.w(TAG_WRITE, "file " + filename + ": " + value); + fos.close(); + } catch (IOException ex) { + Log.w(TAG, "IOException while closing synced file: ", ex); + } catch (RuntimeException ex) { + Log.w(TAG, "exception while closing file: ", ex); + } + } + } - } + } - /** - * Write a string value to the specified file. - * - * @param filename The filename - * @param value The value - */ - public static void writeValue(String filename, Boolean value) { - FileOutputStream fos = null; - String sEnvia; - try { - fos = new FileOutputStream(new File(filename), false); - if (value) - sEnvia = "1"; - else - sEnvia = "0"; - fos.write(sEnvia.getBytes()); - fos.flush(); - // fos.getFD().sync(); - } catch (FileNotFoundException ex) { - Log.w(TAG, "file " + filename + " not found: " + ex); - } catch (SyncFailedException ex) { - Log.w(TAG, "file " + filename + " sync failed: " + ex); - } catch (IOException ex) { - Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while syncing file: ", ex); - } finally { - if (fos != null) { - try { - Log.w(TAG_WRITE, "file " + filename + ": " + value); - fos.close(); - } catch (IOException ex) { - Log.w(TAG, "IOException while closing synced file: ", ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while closing file: ", ex); - } - } - } - } + /** + * Write a string value to the specified file. + * + * @param filename + * The filename + * @param value + * The value + */ + public static void writeValue(String filename, Boolean value) { + FileOutputStream fos = null; + String sEnvia; + try { + fos = new FileOutputStream(new File(filename), false); + if (value) + sEnvia = "1"; + else + sEnvia = "0"; + fos.write(sEnvia.getBytes()); + fos.flush(); + // fos.getFD().sync(); + } catch (FileNotFoundException ex) { + Log.w(TAG, "file " + filename + " not found: " + ex); + } catch (SyncFailedException ex) { + Log.w(TAG, "file " + filename + " sync failed: " + ex); + } catch (IOException ex) { + Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); + } catch (RuntimeException ex) { + Log.w(TAG, "exception while syncing file: ", ex); + } finally { + if (fos != null) { + try { + Log.w(TAG_WRITE, "file " + filename + ": " + value); + fos.close(); + } catch (IOException ex) { + Log.w(TAG, "IOException while closing synced file: ", ex); + } catch (RuntimeException ex) { + Log.w(TAG, "exception while closing file: ", ex); + } + } + } + } - /** - * Write the "color value" to the specified file. The value is scaled from - * an integer to an unsigned integer by multiplying by 2. - * @param filename The filename - * @param value The value of max value Integer.MAX - */ - public static void writeColor(String filename, int value) { - writeValue(filename, String.valueOf((long) value * 2)); - } + /** + * Write the "color value" to the specified file. The value is scaled from + * an integer to an unsigned integer by multiplying by 2. + * + * @param filename + * The filename + * @param value + * The value of max value Integer.MAX + */ + public static void writeColor(String filename, int value) { + writeValue(filename, String.valueOf((long) value * 2)); + } - /** - * Check if the specified file exists. - * @param filename The filename - * @return Whether the file exists or not - */ - public static boolean fileExists(String filename) { - return new File(filename).exists(); - } + /** + * Check if the specified file exists. + * + * @param filename + * The filename + * @return Whether the file exists or not + */ + public static boolean fileExists(String filename) { + return new File(filename).exists(); + } - public static void showDialog(Context ctx, String title, String message) { - final AlertDialog alertDialog = new AlertDialog.Builder(ctx).create(); - alertDialog.setTitle(title); - alertDialog.setMessage(message); - alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL,"OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - alertDialog.dismiss(); - } - }); - alertDialog.show(); - } + public static void showDialog(Context ctx, String title, String message) { + final AlertDialog alertDialog = new AlertDialog.Builder(ctx).create(); + alertDialog.setTitle(title); + alertDialog.setMessage(message); + alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + alertDialog.dismiss(); + } + }); + alertDialog.show(); + } } From 816b663b7358541c67d53b58f7e97a0283bc510f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 02:05:45 -0300 Subject: [PATCH 051/248] fix default fsync settings --- DeviceSettings/res/values/arrays.xml | 2 +- .../src/com/cyanogenmod/settings/device/FsyncMode.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index c7b86ea..361a02d 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -1,8 +1,8 @@ - Disabled Enabled (default) + Disabled Dynamic diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java b/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java index 2fe70a2..fc1c123 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java @@ -52,7 +52,7 @@ public static void restore(Context context) { SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(context); Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_FSYNC_MODE, "1")); + sharedPrefs.getString(DeviceSettings.KEY_FSYNC_MODE, "0")); } public boolean onPreferenceChange(Preference preference, Object newValue) { From ff10fdf554341c06ff73198e3ed14b711e2355d0 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 02:18:29 -0300 Subject: [PATCH 052/248] Fix fsync settings startup --- DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java | 1 + 1 file changed, 1 insertion(+) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java index 44e33a7..2d361bd 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java @@ -31,5 +31,6 @@ public void onReceive(final Context context, final Intent bootintent) { DeepestSleepState.restore(context); GeneralFragmentActivity.restore(context); PanelGamma.restore(context); + FsyncMode.restore(context); } } From 83c3632733ff9b9ce3eb9a9bee55f50d173273d8 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 14:30:33 -0300 Subject: [PATCH 053/248] deleted unnecessary classes --- .../cyanogenmod/settings/device/FbDelay.java | 58 ------------------- .../settings/device/TouchkeyTimeout.java | 58 ------------------- .../settings/device/VibratorIntensity.java | 58 ------------------- 3 files changed, 174 deletions(-) delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/FbDelay.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/TouchkeyTimeout.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/FbDelay.java b/DeviceSettings/src/com/cyanogenmod/settings/device/FbDelay.java deleted file mode 100644 index 663f331..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/FbDelay.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class FbDelay extends ListPreference implements OnPreferenceChangeListener { - - public FbDelay(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE_FB_DELAY_MS = "/sys/module/fbearlysuspend/parameters/fbdelay_ms"; - - public static boolean isSupported() { - return Utils.fileExists(FILE_FB_DELAY_MS); - } - - /** - * Restore touchscreen sensitivity setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE_FB_DELAY_MS, sharedPrefs.getString(DeviceSettings.KEY_FB_EARLYSUSPEND_DELAY_MS, "350")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE_FB_DELAY_MS, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchkeyTimeout.java b/DeviceSettings/src/com/cyanogenmod/settings/device/TouchkeyTimeout.java deleted file mode 100644 index 5d35d31..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchkeyTimeout.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class TouchkeyTimeout extends ListPreference implements OnPreferenceChangeListener { - - public TouchkeyTimeout(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE_TOUCHKEY_TIMEOUT = "/sys/class/sec/sec_touchkey/led_timeout"; - - public static boolean isSupported() { - return Utils.fileExists(FILE_TOUCHKEY_TIMEOUT); - } - - /** - * Restore touchscreen sensitivity setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE_TOUCHKEY_TIMEOUT, sharedPrefs.getString(DeviceSettings.KEY_TOUCHKEY_TIMEOUT, "3")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE_TOUCHKEY_TIMEOUT, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java deleted file mode 100644 index cacce37..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class VibratorIntensity extends ListPreference implements OnPreferenceChangeListener { - - public VibratorIntensity(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/vibrator/pwm_val"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore vibrator intensity setting from SharedPreferences. (Write to kernel.) - * @param context The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString(DeviceSettings.KEY_VIBRATOR_INTENSITY, "50")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} From d6b1423beb79fed5539847bc4e5fc4feabf2f0fb Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 14:39:39 -0300 Subject: [PATCH 054/248] Fix fsync permissions --- rootdir/init.samsungjanice.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 7a26763..7ec8250 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -468,6 +468,7 @@ on boot chown system system /sys/kernel/abb-regu/VOTG chown system system /sys/kernel/abb-charger/max_ac_c chown system system /sys/kernel/abb-charger/max_usb_c + chown system system /sys/kernel/fsync/mode # Define TCP buffer sizes for various networks From ffa8ca05d86f6de7ee0020c7c6ff2423cf766279 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 15:44:33 -0300 Subject: [PATCH 055/248] DeviceSettings update Mali GPU parameters added --- DeviceSettings/res/values/arrays.xml | 54 +++++++--------- DeviceSettings/res/values/strings.xml | 13 ++-- .../res/xml/advanced_preferences.xml | 21 +++++++ .../device/AdvancedFragmentActivity.java | 10 +-- .../settings/device/DeviceSettings.java | 2 + .../settings/device/MaliL2MaxReads.java | 63 +++++++++++++++++++ .../settings/device/MaliPreAllocMem.java | 63 +++++++++++++++++++ .../cyanogenmod/settings/device/Startup.java | 2 + 8 files changed, 186 insertions(+), 42 deletions(-) create mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java create mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index 361a02d..8adf941 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -1,6 +1,26 @@ - + + 28kb (stock) + 48kb (default) + + + 28 + 48 + + + + 16mb + + + 16777216 + + + + + + + Enabled (default) Disabled Dynamic @@ -64,20 +84,6 @@ 70 100 - - 0% - 25% - 50% (default) - 75% - 100% - - - 0 - 25 - 50 - 75 - 100 - UMTS Only HSDPA Only @@ -88,23 +94,5 @@ 22 23 - - Never - 1 second - 2 seconds - 3 seconds (default) - 4 seconds - 5 seconds - 6 seconds - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - \ No newline at end of file diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml index 1d9c3f4..339824c 100644 --- a/DeviceSettings/res/values/strings.xml +++ b/DeviceSettings/res/values/strings.xml @@ -3,12 +3,8 @@ Galaxy S Advance Settings General - Radio mode HSPA Enable HSDPA/HSUPA - Vibrator - Vibrator Intensity - Set vibrator intensity Deep Sleep Deepest sleep state Specify the highest deep sleep level @@ -40,4 +36,13 @@ FSync mode Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml index 89d3db6..251266e 100644 --- a/DeviceSettings/res/xml/advanced_preferences.xml +++ b/DeviceSettings/res/xml/advanced_preferences.xml @@ -21,5 +21,26 @@ android:summary="@string/fsync_summary_head" android:title="@string/fsync_title_head" /> + + + + + + + + + \ No newline at end of file diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java index c139b8d..5946231 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java @@ -19,12 +19,12 @@ import com.cyanogenmod.settings.device.R; import android.content.Context; -import android.content.SharedPreferences; +//import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.CheckBoxPreference; +//import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; +//import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; @@ -54,8 +54,8 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, } public static void restore(Context context) { - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); + //SharedPreferences sharedPrefs = PreferenceManager + // .getDefaultSharedPreferences(context); } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java index 30f039c..1b90a5c 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java @@ -47,6 +47,8 @@ public class DeviceSettings extends FragmentActivity { public static final String KEY_AC_CURRENCY = "ac_currency"; public static final String KEY_USB_CURRENCY = "usb_currency"; public static final String KEY_FSYNC_MODE = "fsync_mode"; + public static final String KEY_MALI_L2MR = "mali_l2_mr"; + public static final String KEY_MALI_PAM = "mali_pam"; ViewPager mViewPager; TabsAdapter mTabsAdapter; diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java new file mode 100644 index 0000000..8de66a5 --- /dev/null +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; + +import android.content.Context; +import android.util.AttributeSet; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.ListPreference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceManager; + +public class MaliL2MaxReads extends ListPreference implements + OnPreferenceChangeListener { + + public MaliL2MaxReads(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/module/mali/parameters/mali_l2_max_reads"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore deepest sleep state from SharedPreferences. + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, + sharedPrefs.getString(DeviceSettings.KEY_MALI_L2MR, "0")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.writeValue(FILE, (String) newValue); + return true; + } + +} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java new file mode 100644 index 0000000..a55d7f8 --- /dev/null +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; + +import android.content.Context; +import android.util.AttributeSet; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.ListPreference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceManager; + +public class MaliPreAllocMem extends ListPreference implements + OnPreferenceChangeListener { + + public MaliPreAllocMem(Context context, AttributeSet attrs) { + super(context, attrs); + this.setOnPreferenceChangeListener(this); + } + + private static final String FILE = "/sys/module/mali/parameters/pre_allocated_memory_size_max"; + + public static boolean isSupported() { + return Utils.fileExists(FILE); + } + + /** + * Restore deepest sleep state from SharedPreferences. + * + * @param context + * The context to read the SharedPreferences from + */ + public static void restore(Context context) { + if (!isSupported()) { + return; + } + + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + Utils.writeValue(FILE, + sharedPrefs.getString(DeviceSettings.KEY_MALI_PAM, "0")); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.writeValue(FILE, (String) newValue); + return true; + } + +} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java index 2d361bd..7aed41e 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java @@ -32,5 +32,7 @@ public void onReceive(final Context context, final Intent bootintent) { GeneralFragmentActivity.restore(context); PanelGamma.restore(context); FsyncMode.restore(context); + MaliL2MaxReads.restore(context); + MaliPreAllocMem.restore(context); } } From 88c02296ff9740c4746a2b6e7caf49fbcfbe97e6 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 15:48:08 -0300 Subject: [PATCH 056/248] Fix mali parameters permissions --- rootdir/init.samsungjanice.rc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 7ec8250..c050850 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -460,10 +460,8 @@ on boot chmod 0222 /sys/class/sec/flash/enable # system permissions for device parts - chown system system /sys/module/fbearlysuspend/parameters/fbdelay - chown system system /sys/module/fbearlysuspend/parameters/fbdelay_ms - chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first - chown system system /sys/module/fbearlysuspend/parameters/fbdelay_first_ms + chown system system /sys/module/mali/parameters/mali_l2_max_reads + chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max chown system system /d/cpuidle/deepest_state chown system system /sys/kernel/abb-regu/VOTG chown system system /sys/kernel/abb-charger/max_ac_c From 341503ebc8acd181433569a6e3e9b9cf1bca84ed Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 18:48:09 -0300 Subject: [PATCH 057/248] Update arrays.xml --- DeviceSettings/res/values-it/arrays.xml | 62 ------------------------- 1 file changed, 62 deletions(-) diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml index ed2c36e..3807231 100644 --- a/DeviceSettings/res/values-it/arrays.xml +++ b/DeviceSettings/res/values-it/arrays.xml @@ -1,58 +1,25 @@ - - 600 ms - 400 ms - 350 ms (Predefinito) - 200 ms - 100 ms - - - 600 - 400 - 350 - 200 - 100 - 800 mAh *ATTENZIONE* 600 mAh (Ricarica Veloce) 400 mAh - - 800 - 600 - 400 - Stato 5 Stato 4 Stato 3 (Predefinito) - - 5 - 4 - 3 - 800 mAh *ATTENZIONE* 600 mAh (Predefinito) 400 mAh - - 800 - 600 - 400 - 2.2 (Predefinito) 1.9 - - 0 - 1 - 10 20 @@ -60,14 +27,6 @@ 50 (Predefinito) 70 100 - - - 10 - 20 - 30 - 50 - 70 - 100 0% @@ -76,23 +35,11 @@ 75% 100% - - 0 - 25 - 50 - 75 - 100 - Solo UMTS Solo HSDPA HSDPA + HSUPA - - 21 - 22 - 23 - Mai 1 secondo @@ -102,14 +49,5 @@ 5 secondi 6 secondi - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - From 1ead9899646f3f00b4ec76467170ecd9d151df3f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 21 Jul 2013 21:56:50 -0300 Subject: [PATCH 058/248] Localization and formatting --- DeviceSettings/res/values-de/arrays.xml | 79 ++++------ DeviceSettings/res/values-de/strings.xml | 74 +++++---- DeviceSettings/res/values-es/arrays.xml | 51 ++++-- DeviceSettings/res/values-es/strings.xml | 69 ++++++--- DeviceSettings/res/values-fi/arrays.xml | 79 ++++------ DeviceSettings/res/values-fi/strings.xml | 74 +++++---- DeviceSettings/res/values-hu/arrays.xml | 79 ++++------ DeviceSettings/res/values-hu/strings.xml | 74 +++++---- DeviceSettings/res/values-it/arrays.xml | 35 +++-- DeviceSettings/res/values-it/strings.xml | 59 +++---- DeviceSettings/res/values-nl/arrays.xml | 145 +++++++++--------- DeviceSettings/res/values-nl/strings.xml | 144 +++++++++-------- DeviceSettings/res/values-pt-rBR/arrays.xml | 125 ++++++++------- DeviceSettings/res/values-pt-rBR/strings.xml | 44 ++++++ DeviceSettings/res/values-sw600dp/dimens.xml | 16 +- .../res/values-sw720dp-land/dimens.xml | 18 +-- DeviceSettings/res/values-v11/styles.xml | 22 +-- DeviceSettings/res/values-v14/styles.xml | 24 +-- DeviceSettings/res/values-zh-rCN/arrays.xml | 139 ++++++++--------- DeviceSettings/res/values-zh-rCN/strings.xml | 53 ++++++- DeviceSettings/res/values/arrays.xml | 16 +- DeviceSettings/res/values/strings.xml | 52 +++++-- DeviceSettings/res/values/styles.xml | 40 ++--- .../res/xml/advanced_preferences.xml | 12 +- .../res/xml/general_preferences.xml | 3 +- DeviceSettings/res/xml/usb_preferences.xml | 32 ++-- .../device/AdvancedFragmentActivity.java | 4 +- 27 files changed, 861 insertions(+), 701 deletions(-) diff --git a/DeviceSettings/res/values-de/arrays.xml b/DeviceSettings/res/values-de/arrays.xml index 04797c6..7674950 100644 --- a/DeviceSettings/res/values-de/arrays.xml +++ b/DeviceSettings/res/values-de/arrays.xml @@ -1,38 +1,9 @@ - - Kamera (Standard) - Video - Video warm - Video kalt - UI - Navigation - Gallerie - VT - - - - Standard - Dynamisch - Natürlich - Film - - - - Normal - Invertiert - - - - Deaktiviert - Aktiviert - - 2.2 (Standard) 1.9 - 10 20 @@ -41,29 +12,43 @@ 70 100 - - - 0% - 25% - 50% (Standard) - 75% - 100% - - Nur UMTS Nur HSDPA HSDPA + HSUPA - - Niemals - 1 Sekunde - 2 Sekunden - 3 Sekunden (Standard) - 4 Sekunden - 5 Sekunden - 6 Sekunden + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh - + \ No newline at end of file diff --git a/DeviceSettings/res/values-de/strings.xml b/DeviceSettings/res/values-de/strings.xml index 95fd558..d51b3d1 100644 --- a/DeviceSettings/res/values-de/strings.xml +++ b/DeviceSettings/res/values-de/strings.xml @@ -1,31 +1,14 @@ - Galaxy S Advance Einstellungen + Galaxy S Advance Einstellungen Bildschirm Farben - mDNIe-Szenario - mDNIe-Szenario auswählen - mDNIe-Modus - mDNIe-Modus auswählen - Negativ - Farben invertieren an/aus - Outdoor - Outdoor-Modus an/aus Gamma Gamma Wert - Touchscreen Empfindlichkeit Berührungs-Empfindlichkeit - - Touchkeys - Beleuchtung - Touchkeys leuchten auf während das Display aktiv ist - Beleuchtungs-Timeout - Zeit für die autom. Abschaltung der Touchkey-Beleuchtung - - Sensoren Beschleunigungssensor Kalibierungsdaten Kalibrierungswerte verwenden\nNach Aktivierung bitte Kalibrierung ausführen @@ -33,18 +16,49 @@ Sensor kalibrieren\nZum Starten das Telefon auf eine horizontale, ebene Fläche legen Kalibrierung beendet Der Beschleunigungssensor wurde kalibriert - - Haptik - Vibration - Intensität - Vibrations-Intensität - - Mobilfunk HSPA HSDPA/HSUPA an/aus - Dock - Audio - USB-Dock Audio - Passive Audio-Ausgabe des USB-Docks verwenden - + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-es/arrays.xml b/DeviceSettings/res/values-es/arrays.xml index 0c8a697..1c2ee33 100644 --- a/DeviceSettings/res/values-es/arrays.xml +++ b/DeviceSettings/res/values-es/arrays.xml @@ -1,4 +1,5 @@ + 2.2 (por defecto) 1.9 @@ -11,25 +12,43 @@ 70 100 - - 0% - 25% - 50% (por defecto) - 75% - 100% - Solo UMTS Solo HSDPA HSDPA + HSUPA - - Nunca - 1 segundo - 2 segundos - 3 segundos (por defecto) - 4 segundos - 5 segundos - 6 segundos + + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh - + + \ No newline at end of file diff --git a/DeviceSettings/res/values-es/strings.xml b/DeviceSettings/res/values-es/strings.xml index c8c453b..4e5485e 100644 --- a/DeviceSettings/res/values-es/strings.xml +++ b/DeviceSettings/res/values-es/strings.xml @@ -1,27 +1,14 @@ + "Ajustes Galaxy S Advance" "Pantalla" "Colores" - "Escenario" - "Establecer escenario mDNIe" - "Modo" - "Establecer modo mDNIe" - "Modo negativo" - "Habilitar/deshabilitar colores invertidos" - "Modo al aire libre" - "Habilitar/deshabilitar modo al aire libre" "Gamma" "Establece el valor Gamma de la pantalla" "Pantalla táctil" "Sensibilidad táctil" "Establecer la sensibilidad del panel táctil" - "Teclas táctiles" - "Habilitar retroiluminación de teclas táctiles" - "Retroiluminación teclas táctiles cuando la pantalla está activa" - "Tiempo de espera de retroiluminación" - "Tiempo tras pulsar una tecla antes de apagar la retroiluminación" - "Sensores" "Acelerómetro" "Usar datos de calibración" "Usar los valores de calibración del acelerómetro. ¡Realizar una calibración después de habilitar esta funcionalidad!" @@ -29,15 +16,49 @@ "Poner el teléfono sobre una superficie plana, y presionar este menú para calibrar de nuevo" "Calibración realizada" "El sensor ha sido calibrado satisfactoriamente" - "Háptica" - "Vibración" - "Intensidad de vibración" - "Establecer la intensidad de vibración" - "Radio" "HSPA" "Habilitar HSDPA/HSUPA" - "Conector" - "Audio" - "Usar el conector de audio USB" - "Usar la salida de audio pasiva cuando el conector USB esté activado" - + + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-fi/arrays.xml b/DeviceSettings/res/values-fi/arrays.xml index 6db9aa8..2488adf 100644 --- a/DeviceSettings/res/values-fi/arrays.xml +++ b/DeviceSettings/res/values-fi/arrays.xml @@ -1,38 +1,9 @@ - - Kamera (Oletus) - Video - Video(Lämmin) - Video(Kylmä) - Käyttöliittymä - Navigointi - Galleria - VT - - - - Standardi (Oletus) - Dynaaminen - Luonnollinen - Elokuva - - - - Normaali - Käänteinen - - - - Pois päältä (Oletus) - Päällä - - 2.2 (Oletus) 1.9 - 10 20 @@ -41,29 +12,43 @@ 70 100 - - - 0% - 25% - 50% (Oletus) - 75% - 100% - - Vain UMTS Vain HSDPA HSDPA + HSUPA - - Never - 1 second - 2 seconds - 3 seconds (Oletus) - 4 seconds - 5 seconds - 6 seconds + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh - + \ No newline at end of file diff --git a/DeviceSettings/res/values-fi/strings.xml b/DeviceSettings/res/values-fi/strings.xml index 36578bd..823d55c 100644 --- a/DeviceSettings/res/values-fi/strings.xml +++ b/DeviceSettings/res/values-fi/strings.xml @@ -1,31 +1,14 @@ - Galaxy S Advance-asetukset + Galaxy S Advance-asetukset Näyttö Värit - Skenaario - Vaihda mDNIe-skenaario - Tila - Vaihda mDNIe-tila - Negatiivi-tila - Käytä käänteisiä värejä - Ulkoilma-tila - Ota ulkoilma-tila käyttöön Näytön gamma Säädä näytön gamma-arvo - Kosketusnäyttö Kosketuksen herkkyys Säädä näytön herkkyyttä - - Kosketusnäppäimet - Ota näppäinten taustavalo käyttöön - Näytön ollessa päällä valot syttyvät - Taustavalon aikakatkaisu - Säädä taustavalon sammumisen aikaväliä kosketuksesta - - Sensorit Kiihtyvyysanturi Käytä kalibrointitietoja Käytä kiihtyvyysanturin kalibrointiarvoja. Kalibroi merkattuasi tämän! @@ -33,18 +16,49 @@ Aseta puhelin tasaiselle alustalle ja paina tätä kalibroidaksesi Kalibrointi valmis Sensori kalibroitu onnistuneesti - - Haptinen - Värinä - Värinän voimakkuus - Säädä värinän voimakkuutta - - Radio HSPA Ota HSDPA/HSUPA käyttöön - Telakka - Audio - Käytä USB-audiotelakkaa - Käytä telakan audioulostuloa - + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-hu/arrays.xml b/DeviceSettings/res/values-hu/arrays.xml index bab1ea5..ca62552 100644 --- a/DeviceSettings/res/values-hu/arrays.xml +++ b/DeviceSettings/res/values-hu/arrays.xml @@ -1,38 +1,9 @@ - - Kamera (Alapbeállítás) - Videó - Videó (Meleg árnyalat) - Videó (Hideg árnyalat) - Felhasználói felület - Navigáció - Galéria - VT - - - - Hagyományos (Alapbeállítás) - Dinamikus - Természetes - Film - - - - Hagyományos - Fordított - - - - Kikapcsolva (Alapbeállítás) - Bekapcsolva - - 2.2 (Alapbeállítás) 1.9 - 10 20 @@ -41,29 +12,43 @@ 70 100 - - - 0% - 25% - 50% (Alapbeállítás) - 75% - 100% - - UMTS HSDPA HSDPA + HSUPA - - Soha - 1 másodperc - 2 másodperc - 3 másodperc (Alapbeállítás) - 4 másodperc - 5 másodperc - 6 másodperc + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh - + \ No newline at end of file diff --git a/DeviceSettings/res/values-hu/strings.xml b/DeviceSettings/res/values-hu/strings.xml index 5e852b2..a326c11 100644 --- a/DeviceSettings/res/values-hu/strings.xml +++ b/DeviceSettings/res/values-hu/strings.xml @@ -1,31 +1,14 @@ - Galaxy S Advance Beállítások + Galaxy S Advance Beállítások KijelzÅ‘ Színek - Megjelenítés - mDNIe megjelenítési beállítások - Ãœzemmód - mDNIe üzemmódok - Negatív üzemmód - Fordított színek ki/be - Szabadtéri üzemmód - Szabadtéri üzemmód ki/be KijelzÅ‘ gamma-értéke KijelzÅ‘ gamma-érték beállítása - ÉrintÅ‘képernyÅ‘ Érzékenység ÉrintÅ‘képernyÅ‘ érzékenységének beállítása - - ÉrintÅ‘gombok - ÉrintÅ‘gombok háttérvilágítása - Bekapcsolja az érintÅ‘gombok háttérvilágítását bekapcsolt képernyÅ‘nél - Háttérvilágítás idÅ‘korlátja - Háttérvilágítás késleltetése - - Szenzorok Giroszkóp Kalibrálási érték használata Kalibrálási érték használata. Érdemes újra kalibrálni, ha ez a funkció használatban van! @@ -33,18 +16,49 @@ Kalibráláshoz a telefont vízszintes felületre kell helyezni, és megérinteni ezt a gombot Kalibrálás befejezve Az érzékelÅ‘ sikeresen bekalibrálva. - - Érintési visszajelzés - Rezgés - Rezgés erÅ‘ssége - Rezgés erÅ‘sségének beállítása - - GSM Rádió HSPA HSDPA/HSUPA engedélyezése - Dokkoló - Dokkoló hangszórók - Dokkoló hangszóróinak használata - Használja a dokkoló passzív hangkimenetét - + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml index 3807231..4bd1186 100644 --- a/DeviceSettings/res/values-it/arrays.xml +++ b/DeviceSettings/res/values-it/arrays.xml @@ -5,7 +5,6 @@ 600 mAh (Ricarica Veloce) 400 mAh - Stato 5 Stato 4 @@ -27,27 +26,29 @@ 50 (Predefinito) 70 100 - - - 0% - 25% - 50% (Predefinito) - 75% - 100% Solo UMTS Solo HSDPA HSDPA + HSUPA - - Mai - 1 secondo - 2 secondi - 3 secondi (Predefinito) - 4 secondi - 5 secondi - 6 secondi + + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic - + \ No newline at end of file diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index b9e9f51..c888f3d 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -1,10 +1,8 @@ + Impostazioni Galaxy S Advance - - Generale - Modalità Rete HSPA Abilita HSDPA/HSUPA Accelerometro @@ -14,14 +12,8 @@ Posizionare il telefono su una superficie orizzontale piana e premere per effettuare la calibrazione Calibrazione effettuata Il sensore è stato correttamente calibrato. - Vibratore - Intensità vibrazione - Imposta l\'intensità della vibrazione - Avanzate Profondissimo Deep Sleep Specifica il più alto livello di deep sleep - - Schermo Colori Gamma schermo @@ -29,25 +21,40 @@ Schermo tattile Sensibilità tocco Imposta la sensibilità al tocco dello schermo - Tasti a sfioramento - Retroilluminazione - Abilita la retroilluminazione dei tasti a sfioramento quando lo schermo è attivo - Timer retroilluminazione - Imposta l\'intervallo dopo cui la retroilluminazione dei tasti si spegne - Effetto CRT Spegnimento Schermo - Ritarda Sospensione - Abilita / Disabilita il ritardamento della sospensione dello schermo, abiliterà l\'effetto CRT - Ritardo in ms - Millisecondi da aspettare prima di spegnere lo schermo - - - Impostazioni USB OTG + Impostazioni USB OTG Attivazione USB-OTG Abilita alimentazione (in uscita) della porta USB - Controllo Caricabatterie - Voltaggio Caricabatterie + Controllo Caricabatterie + Voltaggio Caricabatterie Voltaggio caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - Voltaggio Caricabatterie USB + Voltaggio Caricabatterie USB Voltaggio carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - + + + + + Radio mode + + + Usb + + + Advanced + + + Deep Sleep + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-nl/arrays.xml b/DeviceSettings/res/values-nl/arrays.xml index 3e15c11..0b36d1d 100644 --- a/DeviceSettings/res/values-nl/arrays.xml +++ b/DeviceSettings/res/values-nl/arrays.xml @@ -1,75 +1,70 @@ - - - - - Camera (standaard) - Video - Video (warm) - Video (koud) - Uiterlijk - Navigatie - Galerij - VT - - - Standaard - Dynamisch - Natuurlijk - Film - - - Normaal - Omgedraaid - - - Uit (standaard) - Aan - - - 2,2 (standaard) - 1,9 - - - 10 - 20 - 30 - 50 (standaard) - 70 - 100 - - - 0% - 25% - 50% (standaard) - 75% - 100% - - - Alleen UMTS - Alleen HSDPA - HSDPA & HSUPA - - - Nooit - 1 seconde - 2 seconden - 3 seconden (standaard) - 4 seconden - 5 seconden - 6 seconden - - + + + + + + 2,2 (standaard) + 1,9 + + + 10 + 20 + 30 + 50 (standaard) + 70 + 100 + + + Alleen UMTS + Alleen HSDPA + HSDPA & HSUPA + + + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh + + + \ No newline at end of file diff --git a/DeviceSettings/res/values-nl/strings.xml b/DeviceSettings/res/values-nl/strings.xml index 82ee12c..0770ce7 100644 --- a/DeviceSettings/res/values-nl/strings.xml +++ b/DeviceSettings/res/values-nl/strings.xml @@ -1,65 +1,79 @@ - - - - Galaxy S Advance-instellingen - - Kleuren - Scherm - Scenario - mDNIe-scenario instellen - Modus - mDNIe-modus instellen - Negatieve modus - Negatieve kleuren in-/uitschakelen - Buitenmodus - Buitenmodus in-/uitschakelen - Schermgamma - Schermgammawaarden instellen - - Aanraakscherm - Aanraakgevoeligheid - Gevoeligheid aanraakscherm instellen - - Aanraakknop - Achtergrondlicht bij knoppen inschakelen - Aanraakknoppen oplichten indien scherm aan is - Time-out achtergrondlicht - Vertraging na druk op een knop voor uitschakelen achtergrondlicht - - Sensoren - Gyroscoop - Kalibratiegegevens gebruiken - Kalibratiewaarden van de gyroscoop gebruiken. Voer hierna a.u.b. een kalibratie uit. - Kalibreren - Plaats de telefoon op een vlakke ondergrond en tik hier om te kalibreren - Kalibratie afgerond - De sensor is succesvol gekalibreerd. - - Trillen - Trillen - Trilintensiteit - Trilintensiteit instellen - - Radio - HSPA - HSDPA/HSUPA inschakelen - - Dock - Geluid - USB-geluidsdock - Passieve geluidsuitgang van het dock gebruiken - + + + + + Galaxy S Advance-instellingen + Kleuren + Scherm + Schermgamma + Schermgammawaarden instellen + Aanraakscherm + Aanraakgevoeligheid + Gevoeligheid aanraakscherm instellen + Gyroscoop + Kalibratiegegevens gebruiken + Kalibratiewaarden van de gyroscoop gebruiken. Voer hierna a.u.b. een kalibratie uit. + Kalibreren + Plaats de telefoon op een vlakke ondergrond en tik hier om te kalibreren + Kalibratie afgerond + De sensor is succesvol gekalibreerd. + HSPA + HSDPA/HSUPA inschakelen + + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values-pt-rBR/arrays.xml b/DeviceSettings/res/values-pt-rBR/arrays.xml index 3e634d0..de9188c 100755 --- a/DeviceSettings/res/values-pt-rBR/arrays.xml +++ b/DeviceSettings/res/values-pt-rBR/arrays.xml @@ -1,60 +1,71 @@ - - Câmera (Padrão) - Vídeo - Vídeo Quente - Vídeo Frio - IU - Navegação - Galeria - VT - - - Padrão - Dinâmico - Natural - Filme - - - Normal - Invertido - - - Desligado (Padrão) - Ligado - - - 2.2 (Padrão) - 1.9 - - - 10 - 20 - 30 - 50 (Padrão) - 70 - 100 - - - 0% - 25% - 50% (Padrão) - 75% - 100% - - - Somente UMTS - Somente HSDPA - HSDPA + HSUPA - - - Nunca - 1 segundo - 2 segundos - 3 segundos (padrão) - 4 segundos - 5 segundos - 6 segundos - + + + 2.2 (Padrão) + 1.9 + + + 10 + 20 + 30 + 50 (Padrão) + 70 + 100 + + + 0% + 25% + 50% (Padrão) + 75% + 100% + + + Somente UMTS + Somente HSDPA + HSDPA + HSUPA + + + Nunca + 1 segundo + 2 segundos + 3 segundos (padrão) + 4 segundos + 5 segundos + 6 segundos + + + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh + + \ No newline at end of file diff --git a/DeviceSettings/res/values-pt-rBR/strings.xml b/DeviceSettings/res/values-pt-rBR/strings.xml index 0058f36..5d860ec 100755 --- a/DeviceSettings/res/values-pt-rBR/strings.xml +++ b/DeviceSettings/res/values-pt-rBR/strings.xml @@ -1,5 +1,6 @@ + Config. Galaxy S Advance Cores Cenário @@ -40,4 +41,47 @@ Ãudio Usar Ãudio USB do Dock Usar o áudio de saída passivo no dock + + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + \ No newline at end of file diff --git a/DeviceSettings/res/values-sw600dp/dimens.xml b/DeviceSettings/res/values-sw600dp/dimens.xml index 44f01db..defabf9 100644 --- a/DeviceSettings/res/values-sw600dp/dimens.xml +++ b/DeviceSettings/res/values-sw600dp/dimens.xml @@ -1,8 +1,8 @@ - - - - - + + + + + \ No newline at end of file diff --git a/DeviceSettings/res/values-sw720dp-land/dimens.xml b/DeviceSettings/res/values-sw720dp-land/dimens.xml index 61e3fa8..a011af2 100644 --- a/DeviceSettings/res/values-sw720dp-land/dimens.xml +++ b/DeviceSettings/res/values-sw720dp-land/dimens.xml @@ -1,9 +1,9 @@ - - - - 128dp - - + + + + 128dp + + \ No newline at end of file diff --git a/DeviceSettings/res/values-v11/styles.xml b/DeviceSettings/res/values-v11/styles.xml index 3c02242..1fb733c 100644 --- a/DeviceSettings/res/values-v11/styles.xml +++ b/DeviceSettings/res/values-v11/styles.xml @@ -1,11 +1,11 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/DeviceSettings/res/values-v14/styles.xml b/DeviceSettings/res/values-v14/styles.xml index a91fd03..a832b69 100644 --- a/DeviceSettings/res/values-v14/styles.xml +++ b/DeviceSettings/res/values-v14/styles.xml @@ -1,12 +1,12 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/DeviceSettings/res/values-zh-rCN/arrays.xml b/DeviceSettings/res/values-zh-rCN/arrays.xml index d9e9a34..90fcdc6 100644 --- a/DeviceSettings/res/values-zh-rCN/arrays.xml +++ b/DeviceSettings/res/values-zh-rCN/arrays.xml @@ -1,69 +1,70 @@ - - - - 照相 (默认) - 影片 - 影片 (温) - 影片 (冷) - ç•Œé¢ - 导航 - 图库 - VT - - - - 标准 (默认) - åŠ¨æ€ - 自然 - 电影 - - - - 正常 - å色 - - - - ç¦ç”¨ (默认) - å¯ç”¨ - - - - 2.2 (默认) - 1.9 - - - - 10 - 20 - 30 - 50 (默认) - 70 - 100 - - - - 0% - 25% - 50% (默认) - 75% - 100% - - - - 仅使用 UMTS - 仅使用 HSDPA - 使用 HSDPA + HSUPA - - - - ä»Žä¸ - 1 秒 - 2 秒 - 3 秒 (默认) - 4 秒 - 5 秒 - 6 秒 - - - + + + + 2.2 (默认) + 1.9 + + + 10 + 20 + 30 + 50 (默认) + 70 + 100 + + + 0% + 25% + 50% (默认) + 75% + 100% + + + 仅使用 UMTS + 仅使用 HSDPA + 使用 HSDPA + HSUPA + + + ä»Žä¸ + 1 秒 + 2 秒 + 3 秒 (默认) + 4 秒 + 5 秒 + 6 秒 + + + + + + 28kb (stock) + 48kb (default) + + + 16mb + 24mb + 32mb + 48mb + + + Enabled (default) + Disabled + Dynamic + + + 800 mAh *WARNING* + 600 mAh (fast charge) + 400 mAh + + + State 5 + State 4 + State 3 (default) + + + 800 mAh *WARNING* + 600 mAh (default) + 400 mAh + + + \ No newline at end of file diff --git a/DeviceSettings/res/values-zh-rCN/strings.xml b/DeviceSettings/res/values-zh-rCN/strings.xml index 3603584..555c5d3 100644 --- a/DeviceSettings/res/values-zh-rCN/strings.xml +++ b/DeviceSettings/res/values-zh-rCN/strings.xml @@ -1,7 +1,7 @@ - Galaxy S Advance 设置 + Galaxy S Advance 设置 å±å¹• 颜色 场景 @@ -14,17 +14,14 @@ å¯ç”¨/ç¦ç”¨æˆ·å¤–æ¨¡å¼ å±å¹•çˆçŽ› 设置å±å¹•çˆçŽ› - è§¦æ‘¸å± è§¦æ‘¸å±çµæ•åº¦ 设置触摸å±çµæ•åº¦ - 触摸键 å¯ç”¨è§¦æ‘¸é”®èƒŒå…‰ç¯ å±å¹•å¼€å¯æ—¶è§¦æ‘¸é”®å°†ä¼šç‚¹äº® 背光ç¯è¶…æ—¶ 设置背光ç¯è¶…时时间 - 感应器 加速规 ä½¿ç”¨æ ¡å‡†æ•°æ® @@ -33,18 +30,58 @@ 把手机放在平é¢ä¸Šï¼Œç„¶åŽç‚¹å‡»æ­¤æŒ‰é”®è¿›è¡Œæ ¡å‡† æ ¡å‡†å®Œæˆ æ„Ÿåº”å™¨å·²è¢«æˆåŠŸçš„校准. - 振动 振动器 振动器强度 设置振动器强度 - 无线电 HSPA å¯ç”¨ HSDPA/HSUPA - 基座 音频 使用基座的 USB 音频 使用基座上的被动音频输出 - + + + + General + + + Radio mode + + + Usb + + + USB OTG Settings + USB-VBUS Power + Enables output voltage to the USB port + + + Charger control + Wall charger currency + Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life + USB cable currency + USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + + FSync + FSync mode + Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + + + GPU + Mali L2 Max Reads + Increasing it may improve graphics performance. + Mali Pre-allocated memory size + Increasing it may improve graphics performance. + + \ No newline at end of file diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index 8adf941..3973f1f 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -8,19 +8,19 @@ 28 48 - - + 16mb + 24mb + 32mb + 48mb 16777216 + 25165824 + 33554432 + 50331648 - - - - - - + Enabled (default) Disabled Dynamic diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml index 339824c..24029d6 100644 --- a/DeviceSettings/res/values/strings.xml +++ b/DeviceSettings/res/values/strings.xml @@ -1,20 +1,18 @@ + Galaxy S Advance Settings + + General + + + Radio mode HSPA Enable HSDPA/HSUPA - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - Screen - Colors - Screen Gamma - Set screen gamma value - Touchscreen - Touch sensitivity - Set touch panel sensitivity + + Accelerometer Use calibration data Use the accelerometer calibration values. Do a calibration after checking this! @@ -22,27 +20,53 @@ Put your phone on a flat surface, and press this to calibrate Calibration done The sensor has been successfully calibrated. + + + Screen + + + Colors + Screen Gamma + Set screen gamma value + + + Touchscreen + Touch sensitivity + Set touch panel sensitivity + + Usb + + USB OTG Settings USB-VBUS Power Enables output voltage to the USB port + + Charger control Wall charger currency Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life USB cable currency USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life + + Advanced + + + Deep Sleep + Deepest sleep state + Specify the highest deep sleep level + + FSync FSync mode Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - + GPU Mali L2 Max Reads Increasing it may improve graphics performance. - Mali Pre-allocated memory size Increasing it may improve graphics performance. - - + \ No newline at end of file diff --git a/DeviceSettings/res/values/styles.xml b/DeviceSettings/res/values/styles.xml index 6ce89c7..d3d4eb7 100644 --- a/DeviceSettings/res/values/styles.xml +++ b/DeviceSettings/res/values/styles.xml @@ -1,20 +1,20 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml index 251266e..dd20002 100644 --- a/DeviceSettings/res/xml/advanced_preferences.xml +++ b/DeviceSettings/res/xml/advanced_preferences.xml @@ -10,8 +10,6 @@ android:summary="@string/deepest_sleep_summary_head" android:title="@string/deepest_sleep_title_head" /> - - - - - - + - - - \ No newline at end of file diff --git a/DeviceSettings/res/xml/general_preferences.xml b/DeviceSettings/res/xml/general_preferences.xml index 70fad61..5ea9a9d 100644 --- a/DeviceSettings/res/xml/general_preferences.xml +++ b/DeviceSettings/res/xml/general_preferences.xml @@ -1,7 +1,7 @@ - + - \ No newline at end of file diff --git a/DeviceSettings/res/xml/usb_preferences.xml b/DeviceSettings/res/xml/usb_preferences.xml index 7ac5f86..161ff95 100644 --- a/DeviceSettings/res/xml/usb_preferences.xml +++ b/DeviceSettings/res/xml/usb_preferences.xml @@ -1,19 +1,16 @@ - - - - - + + + + + - + android:defaultValue="true" + android:key="usb_otg_power" + android:summary="@string/otg_power_summary_head" + android:title="@string/otg_power_title_head" /> - - + - - - + + - - + + \ No newline at end of file diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java index 5946231..47779ed 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java @@ -54,8 +54,8 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, } public static void restore(Context context) { - //SharedPreferences sharedPrefs = PreferenceManager - // .getDefaultSharedPreferences(context); + // SharedPreferences sharedPrefs = PreferenceManager + // .getDefaultSharedPreferences(context); } } From e2cd9079f5507eaacb5ec96c74a94c4d1cbd80c1 Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Mon, 22 Jul 2013 12:43:02 +0200 Subject: [PATCH 059/248] Update arrays.xml --- DeviceSettings/res/values-it/arrays.xml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml index 4bd1186..cc7b0ab 100644 --- a/DeviceSettings/res/values-it/arrays.xml +++ b/DeviceSettings/res/values-it/arrays.xml @@ -32,12 +32,9 @@ Solo HSDPA HSDPA + HSUPA - - - 28kb (stock) - 48kb (default) + 48kb (predefinito) 16mb @@ -46,9 +43,9 @@ 48mb - Enabled (default) - Disabled - Dynamic + Abilitato (predefinito) + Disabilitato + Dinamico - \ No newline at end of file + From 86c7d9547004d8c0519aee63cb420174350141cd Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Mon, 22 Jul 2013 12:49:27 +0200 Subject: [PATCH 060/248] Update strings.xml --- DeviceSettings/res/values-it/strings.xml | 31 +++++++++++------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index c888f3d..dd423c4 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -25,36 +25,33 @@ Attivazione USB-OTG Abilita alimentazione (in uscita) della porta USB Controllo Caricabatterie - Voltaggio Caricabatterie - Voltaggio caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - Voltaggio Caricabatterie USB - Voltaggio carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - - - - + Intensità Caricabatterie + Intensità caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria + Intensità Caricabatterie USB + Intensità carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria + - Radio mode + Modalità Rete Usb - Advanced + Avanzate Deep Sleep FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. + Modalità FSync + Disabilitando Fsync puoi migliorare le performace I/O, ma potrebbe causare la corruzione dei dati. L\'Fsync dinamico sincronizzerà i buffer quando lo schermo si spegnerà. GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. + Mali L2 Letture Massime + Aumentandole potrebbero migliorare le performance grafiche. + Grandezza memoria Mali Pre-allocata + Aumentandola potrebbero migliorare le performance grafiche. - \ No newline at end of file + From 1867a6a21218d79523f086fc5b2f57b59a145cba Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 22 Jul 2013 19:33:32 -0300 Subject: [PATCH 061/248] Sweep2Wake added --- DeviceSettings/res/values-de/strings.xml | 4 +++ DeviceSettings/res/values-es/strings.xml | 4 +++ DeviceSettings/res/values-fi/strings.xml | 4 +++ DeviceSettings/res/values-hu/strings.xml | 4 +++ DeviceSettings/res/values-pt-rBR/arrays.xml | 16 ---------- DeviceSettings/res/values-pt-rBR/strings.xml | 27 +++-------------- DeviceSettings/res/values-zh-rCN/strings.xml | 4 +++ DeviceSettings/res/values/strings.xml | 7 ++++- DeviceSettings/res/xml/screen_preferences.xml | 6 ++++ .../settings/device/DeviceSettings.java | 1 + .../device/ScreenFragmentActivity.java | 29 +++++++++++++------ 11 files changed, 57 insertions(+), 49 deletions(-) diff --git a/DeviceSettings/res/values-de/strings.xml b/DeviceSettings/res/values-de/strings.xml index d51b3d1..2237cc6 100644 --- a/DeviceSettings/res/values-de/strings.xml +++ b/DeviceSettings/res/values-de/strings.xml @@ -26,6 +26,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values-es/strings.xml b/DeviceSettings/res/values-es/strings.xml index 4e5485e..5ae3aab 100644 --- a/DeviceSettings/res/values-es/strings.xml +++ b/DeviceSettings/res/values-es/strings.xml @@ -26,6 +26,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values-fi/strings.xml b/DeviceSettings/res/values-fi/strings.xml index 823d55c..1bbf406 100644 --- a/DeviceSettings/res/values-fi/strings.xml +++ b/DeviceSettings/res/values-fi/strings.xml @@ -26,6 +26,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values-hu/strings.xml b/DeviceSettings/res/values-hu/strings.xml index a326c11..133ee1a 100644 --- a/DeviceSettings/res/values-hu/strings.xml +++ b/DeviceSettings/res/values-hu/strings.xml @@ -26,6 +26,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values-pt-rBR/arrays.xml b/DeviceSettings/res/values-pt-rBR/arrays.xml index de9188c..2cab625 100755 --- a/DeviceSettings/res/values-pt-rBR/arrays.xml +++ b/DeviceSettings/res/values-pt-rBR/arrays.xml @@ -13,27 +13,11 @@ 70 100 - - 0% - 25% - 50% (Padrão) - 75% - 100% - Somente UMTS Somente HSDPA HSDPA + HSUPA - - Nunca - 1 segundo - 2 segundos - 3 segundos (padrão) - 4 segundos - 5 segundos - 6 segundos - diff --git a/DeviceSettings/res/values-pt-rBR/strings.xml b/DeviceSettings/res/values-pt-rBR/strings.xml index 5d860ec..d0df007 100755 --- a/DeviceSettings/res/values-pt-rBR/strings.xml +++ b/DeviceSettings/res/values-pt-rBR/strings.xml @@ -3,30 +3,11 @@ Config. Galaxy S Advance Cores - Cenário - Define o Cenário mDNIe - Modo - Define o Modo mDNIe - Modo Negativo - Ativa/Desativa cores invertidas - Modo Ao Ar Livre - Ativa/Desativa modo ao ar livre Gama da Tela Define valor da gama da tela Tela sensível ao toque Sensitividade do toque Define a sensitividade do toque na tela - Tecla sensível ao toque - Ativar luz de fundo das teclas - Acender as teclas sensíveis ao toque quando a tela estiver ligada - Tempo limite da luz de fundo - Quanto tempo a luz de fundo irá ficar acesa depois do botão ser pressionado - Sensores - Resposta Tátil - Vibração - Intensidade da Vibração - Define a intensidade da vibração - Rádio HSPA Ativa HSDPA/HSUPA Tela @@ -37,10 +18,6 @@ Coloque seu telefone em uma superfície plana, e pressione isto para calibrar Calibragem terminada O sensor foi calibrado com sucesso. - Dock - Ãudio - Usar Ãudio USB do Dock - Usar o áudio de saída passivo no dock @@ -49,6 +26,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values-zh-rCN/strings.xml b/DeviceSettings/res/values-zh-rCN/strings.xml index 555c5d3..04f755c 100644 --- a/DeviceSettings/res/values-zh-rCN/strings.xml +++ b/DeviceSettings/res/values-zh-rCN/strings.xml @@ -49,6 +49,10 @@ Radio mode + + Sweep2Wake + Unlock device with a swype + Usb diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml index 24029d6..62124e7 100644 --- a/DeviceSettings/res/values/strings.xml +++ b/DeviceSettings/res/values/strings.xml @@ -33,7 +33,12 @@ Touchscreen Touch sensitivity Set touch panel sensitivity - + + Sweep2Wake + Unlock device with a swype + + + Usb diff --git a/DeviceSettings/res/xml/screen_preferences.xml b/DeviceSettings/res/xml/screen_preferences.xml index 9c1c113..0c0926b 100644 --- a/DeviceSettings/res/xml/screen_preferences.xml +++ b/DeviceSettings/res/xml/screen_preferences.xml @@ -21,6 +21,12 @@ android:key="touchscreen_sensitivity" android:summary="@string/touchscreen_sensitivity_summary_head" android:title="@string/touchscreen_sensitivity_title_head" /> + + + \ No newline at end of file diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java index 1b90a5c..ccd42f0 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java @@ -49,6 +49,7 @@ public class DeviceSettings extends FragmentActivity { public static final String KEY_FSYNC_MODE = "fsync_mode"; public static final String KEY_MALI_L2MR = "mali_l2_mr"; public static final String KEY_MALI_PAM = "mali_pam"; + public static final String KEY_USE_SWEEP2WAKE = "use_sweep2wake"; ViewPager mViewPager; TabsAdapter mTabsAdapter; diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java index 2b64558..9ad65c3 100755 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java @@ -19,12 +19,12 @@ import com.cyanogenmod.settings.device.R; import android.content.Context; -//import android.content.SharedPreferences; +import android.content.SharedPreferences; import android.os.Bundle; -//import android.preference.CheckBoxPreference; +import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -//import android.preference.PreferenceManager; +import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; @@ -34,6 +34,8 @@ public class ScreenFragmentActivity extends PreferenceFragment { private TouchscreenSensitivity mTouchscreenSensitivity; + public static final String FILE_SWEEP2WAKE = "/sys/kernel/mxt224e/sweep2wake"; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -51,20 +53,29 @@ public void onCreate(Bundle savedInstanceState) { public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + String boxValue; String key = preference.getKey(); Log.w(TAG, "key: " + key); - return true; - } + if (key.equals(DeviceSettings.KEY_USE_SWEEP2WAKE)) { + boxValue = (((CheckBoxPreference) preference).isChecked() ? "on" + : "off"); + Utils.writeValue(FILE_SWEEP2WAKE, boxValue); - public static boolean isSupported(String FILE) { - return Utils.fileExists(FILE); + } + + return true; } public static void restore(Context context) { - // SharedPreferences sharedPrefs = - // PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + sharedPrefs.getBoolean(DeviceSettings.KEY_USE_SWEEP2WAKE, false); + + String value = sharedPrefs.getBoolean( + DeviceSettings.KEY_USE_SWEEP2WAKE, false) ? "on" : "off"; + Utils.writeValue(FILE_SWEEP2WAKE, value); } } From b46c3cc3515a8f946d4e496d6703a6645d390585 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 22 Jul 2013 19:37:21 -0300 Subject: [PATCH 062/248] Fix Sweep2Wake fs permissions --- rootdir/init.samsungjanice.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index c050850..a754c65 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -467,6 +467,7 @@ on boot chown system system /sys/kernel/abb-charger/max_ac_c chown system system /sys/kernel/abb-charger/max_usb_c chown system system /sys/kernel/fsync/mode + chown system system /sys/kernel/mxt224e/sweep2wake # Define TCP buffer sizes for various networks From b31ebe34607454525fa3e214b6ca8e0aa8fda26a Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Tue, 23 Jul 2013 02:49:05 +0200 Subject: [PATCH 063/248] Sweep2Wake --- DeviceSettings/res/values-it/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index dd423c4..efd3381 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -32,6 +32,10 @@ Modalità Rete + + ++ Sweep2Wake ++ Sblocca il telefono con uno swype Usb From 7ee5a54a24969f4b1b1951eae05ea5fbcc26e921 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 23 Jul 2013 22:57:54 -0300 Subject: [PATCH 064/248] Update strings.xml --- DeviceSettings/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index efd3381..a14f120 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -34,8 +34,8 @@ Modalità Rete -+ Sweep2Wake -+ Sblocca il telefono con uno swype + Sweep2Wake + Sblocca il telefono con uno swype Usb From 42ff6ba8f2f46e7d0b75112456c008db4bffb33b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 23 Jul 2013 23:02:33 -0300 Subject: [PATCH 065/248] Update AndroidManifest.xml --- DeviceSettings/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DeviceSettings/AndroidManifest.xml b/DeviceSettings/AndroidManifest.xml index 676922e..f02ae75 100644 --- a/DeviceSettings/AndroidManifest.xml +++ b/DeviceSettings/AndroidManifest.xml @@ -23,9 +23,10 @@ - + + From f2670bd72add3cf5fb0d33295ed8667a6eb63438 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 23 Jul 2013 23:05:56 -0300 Subject: [PATCH 066/248] Update arrays.xml --- DeviceSettings/res/values-zh-rCN/arrays.xml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/DeviceSettings/res/values-zh-rCN/arrays.xml b/DeviceSettings/res/values-zh-rCN/arrays.xml index 90fcdc6..0615c0c 100644 --- a/DeviceSettings/res/values-zh-rCN/arrays.xml +++ b/DeviceSettings/res/values-zh-rCN/arrays.xml @@ -12,27 +12,11 @@ 70 100 - - 0% - 25% - 50% (默认) - 75% - 100% - 仅使用 UMTS 仅使用 HSDPA 使用 HSDPA + HSUPA - - ä»Žä¸ - 1 秒 - 2 秒 - 3 秒 (默认) - 4 秒 - 5 秒 - 6 秒 - @@ -67,4 +51,4 @@ 400 mAh - \ No newline at end of file + From 157fe6ee0777855d4016a187ee804d70c671dc89 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 23 Jul 2013 23:08:05 -0300 Subject: [PATCH 067/248] Update strings.xml --- DeviceSettings/res/values-zh-rCN/strings.xml | 25 ++------------------ 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/DeviceSettings/res/values-zh-rCN/strings.xml b/DeviceSettings/res/values-zh-rCN/strings.xml index 04f755c..61d76fd 100644 --- a/DeviceSettings/res/values-zh-rCN/strings.xml +++ b/DeviceSettings/res/values-zh-rCN/strings.xml @@ -4,25 +4,11 @@ Galaxy S Advance 设置 å±å¹• 颜色 - 场景 - 设置 mDNIe 场景 - æ¨¡å¼ - 设置 mDNIe æ¨¡å¼ - è´Ÿæžæ¨¡å¼ - å¯ç”¨/ç¦ç”¨å色 - æˆ·å¤–æ¨¡å¼ - å¯ç”¨/ç¦ç”¨æˆ·å¤–æ¨¡å¼ å±å¹•çˆçŽ› 设置å±å¹•çˆçŽ› è§¦æ‘¸å± è§¦æ‘¸å±çµæ•åº¦ 设置触摸å±çµæ•åº¦ - 触摸键 - å¯ç”¨è§¦æ‘¸é”®èƒŒå…‰ç¯ - å±å¹•å¼€å¯æ—¶è§¦æ‘¸é”®å°†ä¼šç‚¹äº® - 背光ç¯è¶…æ—¶ - 设置背光ç¯è¶…时时间 - 感应器 加速规 ä½¿ç”¨æ ¡å‡†æ•°æ® ä½¿ç”¨åŠ é€Ÿè§„çš„æ ¡å‡†æ•°æ®. 请在检查此之åŽé‡æ–°æ ¡å‡†! @@ -30,19 +16,12 @@ 把手机放在平é¢ä¸Šï¼Œç„¶åŽç‚¹å‡»æ­¤æŒ‰é”®è¿›è¡Œæ ¡å‡† æ ¡å‡†å®Œæˆ æ„Ÿåº”å™¨å·²è¢«æˆåŠŸçš„校准. - 振动 - 振动器 - 振动器强度 - 设置振动器强度 无线电 HSPA å¯ç”¨ HSDPA/HSUPA - 基座 - 音频 - 使用基座的 USB 音频 - 使用基座上的被动音频输出 + General @@ -88,4 +67,4 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. - \ No newline at end of file + From b25bd4a54204baccc6b6f601a1430f678119d06a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 25 Jul 2013 17:51:11 -0300 Subject: [PATCH 068/248] Fix SPI_CRC (MMC) permissions --- rootdir/init.samsungjanice.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index a754c65..2a1d18c 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -468,6 +468,7 @@ on boot chown system system /sys/kernel/abb-charger/max_usb_c chown system system /sys/kernel/fsync/mode chown system system /sys/kernel/mxt224e/sweep2wake + chown system system /sys/module/mmc_core/parameters/use_spi_crc # Define TCP buffer sizes for various networks From 4280d68577a3e40b5d575bc8adb88be12103481e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 25 Jul 2013 17:44:07 -0300 Subject: [PATCH 069/248] MMC SPI CRC added --- DeviceSettings/res/values-de/strings.xml | 5 ++++ DeviceSettings/res/values-es/strings.xml | 5 ++++ DeviceSettings/res/values-fi/strings.xml | 5 ++++ DeviceSettings/res/values-hu/strings.xml | 5 ++++ DeviceSettings/res/values-it/strings.xml | 14 ++++++++-- DeviceSettings/res/values-nl/arrays.xml | 2 +- DeviceSettings/res/values-nl/strings.xml | 12 +++++++- DeviceSettings/res/values-pt-rBR/strings.xml | 5 ++++ DeviceSettings/res/values-sw600dp/dimens.xml | 2 +- .../res/values-sw720dp-land/dimens.xml | 2 +- DeviceSettings/res/values-v11/styles.xml | 2 +- DeviceSettings/res/values-v14/styles.xml | 2 +- DeviceSettings/res/values-zh-rCN/strings.xml | 11 ++++++-- DeviceSettings/res/values/strings.xml | 12 ++++---- DeviceSettings/res/values/styles.xml | 4 +-- .../res/xml/advanced_preferences.xml | 6 ++++ .../device/AdvancedFragmentActivity.java | 28 +++++++++++++------ .../settings/device/DeviceSettings.java | 1 + .../cyanogenmod/settings/device/Startup.java | 1 + 19 files changed, 97 insertions(+), 27 deletions(-) diff --git a/DeviceSettings/res/values-de/strings.xml b/DeviceSettings/res/values-de/strings.xml index 2237cc6..50d20b5 100644 --- a/DeviceSettings/res/values-de/strings.xml +++ b/DeviceSettings/res/values-de/strings.xml @@ -65,4 +65,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-es/strings.xml b/DeviceSettings/res/values-es/strings.xml index 5ae3aab..0f8e3f7 100644 --- a/DeviceSettings/res/values-es/strings.xml +++ b/DeviceSettings/res/values-es/strings.xml @@ -65,4 +65,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-fi/strings.xml b/DeviceSettings/res/values-fi/strings.xml index 1bbf406..c3b2c91 100644 --- a/DeviceSettings/res/values-fi/strings.xml +++ b/DeviceSettings/res/values-fi/strings.xml @@ -65,4 +65,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-hu/strings.xml b/DeviceSettings/res/values-hu/strings.xml index 133ee1a..a1ac33e 100644 --- a/DeviceSettings/res/values-hu/strings.xml +++ b/DeviceSettings/res/values-hu/strings.xml @@ -65,4 +65,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index a14f120..e022ef0 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -29,10 +29,10 @@ Intensità caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria Intensità Caricabatterie USB Intensità carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - + Modalità Rete - + Sweep2Wake Sblocca il telefono con uno swype @@ -58,4 +58,12 @@ Grandezza memoria Mali Pre-allocata Aumentandola potrebbero migliorare le performance grafiche. - + + + + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + + \ No newline at end of file diff --git a/DeviceSettings/res/values-nl/arrays.xml b/DeviceSettings/res/values-nl/arrays.xml index 0b36d1d..723a7cc 100644 --- a/DeviceSettings/res/values-nl/arrays.xml +++ b/DeviceSettings/res/values-nl/arrays.xml @@ -12,7 +12,7 @@ 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. + limitations under the License. --> diff --git a/DeviceSettings/res/values-nl/strings.xml b/DeviceSettings/res/values-nl/strings.xml index 0770ce7..9ca34f0 100644 --- a/DeviceSettings/res/values-nl/strings.xml +++ b/DeviceSettings/res/values-nl/strings.xml @@ -12,7 +12,7 @@ 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. + limitations under the License. --> @@ -41,6 +41,11 @@ Radio mode + + + Sweep2Wake + Unlock device with a swype + Usb @@ -76,4 +81,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-pt-rBR/strings.xml b/DeviceSettings/res/values-pt-rBR/strings.xml index d0df007..fb96874 100755 --- a/DeviceSettings/res/values-pt-rBR/strings.xml +++ b/DeviceSettings/res/values-pt-rBR/strings.xml @@ -65,4 +65,9 @@ Mali Pre-allocated memory size Increasing it may improve graphics performance. + + MMC + Disable SPI CRC + Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + \ No newline at end of file diff --git a/DeviceSettings/res/values-sw600dp/dimens.xml b/DeviceSettings/res/values-sw600dp/dimens.xml index defabf9..3534241 100644 --- a/DeviceSettings/res/values-sw600dp/dimens.xml +++ b/DeviceSettings/res/values-sw600dp/dimens.xml @@ -2,7 +2,7 @@ \ No newline at end of file diff --git a/DeviceSettings/res/values-sw720dp-land/dimens.xml b/DeviceSettings/res/values-sw720dp-land/dimens.xml index a011af2..941d575 100644 --- a/DeviceSettings/res/values-sw720dp-land/dimens.xml +++ b/DeviceSettings/res/values-sw720dp-land/dimens.xml @@ -2,7 +2,7 @@ 128dp diff --git a/DeviceSettings/res/values-v11/styles.xml b/DeviceSettings/res/values-v11/styles.xml index 1fb733c..037ee98 100644 --- a/DeviceSettings/res/values-v11/styles.xml +++ b/DeviceSettings/res/values-v11/styles.xml @@ -2,7 +2,7 @@ diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml index dd20002..1ed18fb 100644 --- a/DeviceSettings/res/xml/advanced_preferences.xml +++ b/DeviceSettings/res/xml/advanced_preferences.xml @@ -36,5 +36,11 @@ android:summary="@string/mali_pam_summary_head" android:title="@string/mali_pam_title_head" /> + + + \ No newline at end of file diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java index 47779ed..e8995e8 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java @@ -19,18 +19,20 @@ import com.cyanogenmod.settings.device.R; import android.content.Context; -//import android.content.SharedPreferences; +import android.content.SharedPreferences; import android.os.Bundle; -//import android.preference.CheckBoxPreference; +import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -//import android.preference.PreferenceManager; +import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; public class AdvancedFragmentActivity extends PreferenceFragment { - private static final String TAG = "GalaxySAdvance_Settings_General"; + private static final String TAG = "GalaxySAdvance_Settings_Advanced"; + + public static final String FILE_SPI_CRC = "/sys/module/mmc_core/parameters/use_spi_crc"; @Override public void onCreate(Bundle savedInstanceState) { @@ -38,24 +40,34 @@ public void onCreate(Bundle savedInstanceState) { addPreferencesFromResource(R.xml.advanced_preferences); - // PreferenceScreen prefSet = getPreferenceScreen(); + PreferenceScreen prefSet = getPreferenceScreen(); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - // String boxValue; + String boxValue; String key = preference.getKey(); Log.w(TAG, "key: " + key); + if (key.equals(DeviceSettings.KEY_USE_SPI_CRC)) { + boxValue = (((CheckBoxPreference) preference).isChecked() ? "0" + : "1"); + Utils.writeValue(FILE_SPI_CRC, boxValue); + } + return true; } public static void restore(Context context) { - // SharedPreferences sharedPrefs = PreferenceManager - // .getDefaultSharedPreferences(context); + SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(context); + + String value = sharedPrefs.getBoolean(DeviceSettings.KEY_USE_SPI_CRC, + false) ? "0" : "1"; + Utils.writeValue(FILE_SPI_CRC, value); } } diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java index ccd42f0..8b7165f 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java @@ -50,6 +50,7 @@ public class DeviceSettings extends FragmentActivity { public static final String KEY_MALI_L2MR = "mali_l2_mr"; public static final String KEY_MALI_PAM = "mali_pam"; public static final String KEY_USE_SWEEP2WAKE = "use_sweep2wake"; + public static final String KEY_USE_SPI_CRC = "use_spi_crc"; ViewPager mViewPager; TabsAdapter mTabsAdapter; diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java index 7aed41e..06d5495 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java @@ -34,5 +34,6 @@ public void onReceive(final Context context, final Intent bootintent) { FsyncMode.restore(context); MaliL2MaxReads.restore(context); MaliPreAllocMem.restore(context); + AdvancedFragmentActivity.restore(context); } } From 450c20279e48dafefa720dbb53dcb1a9deb2bd80 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 25 Jul 2013 17:59:32 -0300 Subject: [PATCH 070/248] Update strings.xml --- DeviceSettings/res/values/strings.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml index c53ebf6..b85a29d 100644 --- a/DeviceSettings/res/values/strings.xml +++ b/DeviceSettings/res/values/strings.xml @@ -51,13 +51,14 @@ USB cable currency USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - Advanced - Deep Sleep Deepest sleep state Specify the highest deep sleep level + + + + Advanced FSync @@ -76,4 +77,4 @@ Disable SPI CRC Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - \ No newline at end of file + From a9ed7ae3467043457c90e4eae9112bf57dc2b09c Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 26 Jul 2013 18:32:21 -0300 Subject: [PATCH 071/248] Camera config update Enable shutter speed settings, continuous focus, use preferred preview size for effects recording. --- overlay/packages/apps/Camera/res/values/config.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/overlay/packages/apps/Camera/res/values/config.xml b/overlay/packages/apps/Camera/res/values/config.xml index f9fb949..cedd0ad 100644 --- a/overlay/packages/apps/Camera/res/values/config.xml +++ b/overlay/packages/apps/Camera/res/values/config.xml @@ -29,4 +29,11 @@ true + + true + + true + + true From 2f18bd809585e8449cc0a8014f6521b633795f71 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 26 Jul 2013 18:49:08 -0300 Subject: [PATCH 072/248] Update settings options --- overlay/packages/apps/Settings/res/values/config.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml index 2ed670e..308f8a5 100644 --- a/overlay/packages/apps/Settings/res/values/config.xml +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -24,4 +24,11 @@ true + + + true + + + true From 445f4e2bb5766f088251e67ada48987b7ac61d92 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 27 Jul 2013 00:11:33 -0300 Subject: [PATCH 073/248] Fix min and max freq (thanks cocafe :D) --- overlay/packages/apps/Settings/res/values/config.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml index 308f8a5..e7543d8 100644 --- a/overlay/packages/apps/Settings/res/values/config.xml +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -30,5 +30,9 @@ true - true + true + + + /sys/power/cpufreq_max_limit + /sys/power/cpufreq_min_limit From 36c7ef79a86871ca7ec66daa3523dea1faca3bcd Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 27 Jul 2013 22:29:04 -0300 Subject: [PATCH 074/248] Using old workaround for flickering again due to untouched EGL libraries http://review.cyanogenmod.org/#/c/28005/ As early suggested by Paul-L --- BoardConfig.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index c0a5506..04c8c9b 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -25,6 +25,8 @@ BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 # Experimental testing for flickering BOARD_EGL_NEEDS_LEGACY_FB := true +TARGET_DISABLE_TRIPLE_BUFFERING := true +COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 # EXPERIMENTAL SOUND From a3204435501439305f2c13d16046aa2e693475d6 Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Mon, 29 Jul 2013 14:30:01 +0200 Subject: [PATCH 075/248] Added MMC Translation --- DeviceSettings/res/values-it/strings.xml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml index e022ef0..9a56793 100644 --- a/DeviceSettings/res/values-it/strings.xml +++ b/DeviceSettings/res/values-it/strings.xml @@ -58,12 +58,9 @@ Grandezza memoria Mali Pre-allocata Aumentandola potrebbero migliorare le performance grafiche. - - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly + Scheda SD + Disabilita SPI CRC + Disabilitando lo SPI CRC, possono migliorare le performance della Scheda SD (10% - 30%) ma il telefono potrebbe freezare in modo casuale - \ No newline at end of file + From f9c9c4ab6fd56dcd92082e7ad2210861ca9e39f1 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 30 Jul 2013 16:21:52 -0300 Subject: [PATCH 076/248] Enable multiuser support and other fix tests --- .../base/core/res/res/values/config.xml | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index feeec3f..9d26677 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -116,57 +116,14 @@ true + + + true true - - - 0 - 1 - 20 - 21 - - - - - 0 - 10 - 20 - 30 - - - - - 20 - - - - - 0 - 1 - 20 - 21 - - - - - 0 - 1 - 20 - 21 - 500 - 600 - - - - - 0 - 15 - 10 - 10 - - pdp0 @@ -232,4 +189,22 @@ 0 + + 4 + + + + true + From 9e2d8d508f3ded8ef224537c6f3c9780d76f0643 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 1 Aug 2013 15:12:13 -0300 Subject: [PATCH 077/248] Focal overlay added --- .../packages/apps/Focal/res/values/config.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 overlay/packages/apps/Focal/res/values/config.xml diff --git a/overlay/packages/apps/Focal/res/values/config.xml b/overlay/packages/apps/Focal/res/values/config.xml new file mode 100644 index 0000000..9e531fd --- /dev/null +++ b/overlay/packages/apps/Focal/res/values/config.xml @@ -0,0 +1,28 @@ + + + + + + false + + + true + + From 53c3fd3d3a3c2a3c3bfd591897fb22b27b5f59fa Mon Sep 17 00:00:00 2001 From: OliverG96 Date: Thu, 1 Aug 2013 20:35:09 +0100 Subject: [PATCH 078/248] board: Clean-up Revert if you don't like it --- BoardConfig.mk | 62 +++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 04c8c9b..d576edd 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -1,19 +1,20 @@ -include device/samsung/u8500-common/BoardCommonConfig.mk -TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt - -# Bluetooth -BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth - +TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 -BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ +# Board +TARGET_BOOTLOADER_BOARD_NAME := montblanc +TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt +TARGET_NO_BOOTLOADER := true +TARGET_NO_RADIOIMAGE := true -# Kernel -BOARD_KERNEL_PAGESIZE := 4096 -BOARD_KERNEL_BASE := 0x40000000 -BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" +# Platform +TARGET_BOARD_PLATFORM := montblanc +BOARD_USES_STE_HARDWARE := true +TARGET_SOC := u8500 +COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE -DSTE_SAMSUNG_HARDWARE -# Filesystem +# Partitions BOARD_NAND_PAGE_SIZE := 4096 BOARD_NAND_SPARE_SIZE := 128 BOARD_FLASH_BLOCK_SIZE := 4096 @@ -22,15 +23,20 @@ BOARD_BOOTIMAGE_PARTITION_SIZE := 16777216 BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 +# Kernel +TARGET_KERNEL_SOURCE := kernel/samsung/u8500 +TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_BASE := 0x40000000 +BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" -# Experimental testing for flickering +# Graphics BOARD_EGL_NEEDS_LEGACY_FB := true TARGET_DISABLE_TRIPLE_BUFFERING := true COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 - -# EXPERIMENTAL SOUND -# BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true +# Bluetooth +BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth # Wifi BOARD_WLAN_DEVICE := bcmdhd @@ -52,40 +58,18 @@ WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true BOARD_HAVE_SAMSUNG_WIFI := true -# Platform -TARGET_SOC := u8500 -TARGET_BOARD_PLATFORM := montblanc -TARGET_BOOTLOADER_BOARD_NAME := montblanc -COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE - -TARGET_NO_BOOTLOADER := true -TARGET_NO_RADIOIMAGE := true - -TARGET_PROVIDES_INIT := true -TARGET_PROVIDES_INIT_TARGET_RC := true - +# RIL +BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ # Vibrator BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c -# Kernel -TARGET_KERNEL_SOURCE := kernel/samsung/u8500 -TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig - - # Vold BOARD_VOLD_MAX_PARTITIONS := 12 BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true - # Recovery BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/janice/recovery/graphics.c TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc -# Assert -TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 - - -# Inherit from the proprietary version --include vendor/samsung/u8500-common/BoardConfigVendor.mk From 2c40fe7bc39a5b9cd9effdac5c109fb65d492b9e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 3 Aug 2013 22:54:10 -0300 Subject: [PATCH 079/248] Update config.xml --- overlay/frameworks/base/core/res/res/values/config.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 9d26677..e09b239 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -117,10 +117,6 @@ true - - true - true From a4760f76e66903d5c36d907f89158e8f1738ca27 Mon Sep 17 00:00:00 2001 From: OliverG96 Date: Wed, 7 Aug 2013 12:36:08 +0100 Subject: [PATCH 080/248] ril: Remove unimplemented property --- ril/SamsungU8500RIL.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ril/SamsungU8500RIL.java b/ril/SamsungU8500RIL.java index b615c84..dfc0ba4 100644 --- a/ril/SamsungU8500RIL.java +++ b/ril/SamsungU8500RIL.java @@ -183,7 +183,6 @@ public class SamsungU8500RIL extends RIL implements CommandsInterface { private AudioManager audioManager; private boolean mSignalbarCount = SystemProperties.getInt("ro.telephony.sends_barcount", 0) == 1 ? true : false; private boolean mIsSamsungCdma = SystemProperties.getBoolean("ro.ril.samsung_cdma", false); - private boolean mIsGBModem = SystemProperties.getBoolean("ro.ril.gbmodem", false); public SamsungU8500RIL(Context context, int networkMode, int cdmaSubscription) { super(context, networkMode, cdmaSubscription); From 029959b7899716ee4f2c430362cd11ee5ea0c242 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 25 Aug 2013 20:48:40 -0300 Subject: [PATCH 081/248] Focal package added --- janice.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index d0802d1..881b04c 100644 --- a/janice.mk +++ b/janice.mk @@ -33,7 +33,8 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ - GalaxySAdvanceSettings + GalaxySAdvanceSettings \ + Focal # Init files PRODUCT_COPY_FILES += \ From 8d0a4bc99727cd8bc5ab4c67faf4d3dd78d5f038 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 25 Aug 2013 22:54:47 -0300 Subject: [PATCH 082/248] Revert "Focal package added" This reverts commit 029959b7899716ee4f2c430362cd11ee5ea0c242. --- janice.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/janice.mk b/janice.mk index 881b04c..d0802d1 100644 --- a/janice.mk +++ b/janice.mk @@ -33,8 +33,7 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ - GalaxySAdvanceSettings \ - Focal + GalaxySAdvanceSettings # Init files PRODUCT_COPY_FILES += \ From 91d3fe62de5f97817771f835e9956bcc4b586fcd Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 27 Aug 2013 11:25:14 -0300 Subject: [PATCH 083/248] Rename arrays.xml to cm_arrays.xml --- .../base/core/res/res/values/{arrays.xml => cm_arrays.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename overlay/frameworks/base/core/res/res/values/{arrays.xml => cm_arrays.xml} (100%) diff --git a/overlay/frameworks/base/core/res/res/values/arrays.xml b/overlay/frameworks/base/core/res/res/values/cm_arrays.xml similarity index 100% rename from overlay/frameworks/base/core/res/res/values/arrays.xml rename to overlay/frameworks/base/core/res/res/values/cm_arrays.xml From 02793a7a87f335b969a2ed34c673afb4fac33c86 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 28 Aug 2013 02:53:05 -0300 Subject: [PATCH 084/248] Samsung sim toolkit enabled --- overlay/frameworks/base/core/res/res/values/config.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index e09b239..2da50fb 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -203,4 +203,7 @@ --> true + + true + From 0d6b8e0bcf4dea33dd7cc5e9814a1d23b1b00927 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 29 Aug 2013 00:44:07 -0300 Subject: [PATCH 085/248] LWP Fix http://forum.xda-developers.com/showpost.php?p=45082513&postcount=1525 --- janice.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/janice.mk b/janice.mk index d0802d1..b28fea4 100644 --- a/janice.mk +++ b/janice.mk @@ -31,6 +31,10 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 +# LWP FIX +PRODUCT_PROPERTY_OVERRIDES += \ + debug.egl.force_msaa=true + # Packages PRODUCT_PACKAGES += \ GalaxySAdvanceSettings From cd2a719d38cf78c605b03c6d1b55c02c23e81e56 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 30 Aug 2013 23:13:41 -0300 Subject: [PATCH 086/248] fix default mali pam value --- .../src/com/cyanogenmod/settings/device/MaliPreAllocMem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java index a55d7f8..002b881 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java @@ -52,7 +52,7 @@ public static void restore(Context context) { SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(context); Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_MALI_PAM, "0")); + sharedPrefs.getString(DeviceSettings.KEY_MALI_PAM, "50331648")); } public boolean onPreferenceChange(Preference preference, Object newValue) { From e21f33de6b5cd01d2b86073d5bda511142e39af7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 30 Aug 2013 23:15:03 -0300 Subject: [PATCH 087/248] fix default mali l2 mr value --- .../src/com/cyanogenmod/settings/device/MaliL2MaxReads.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java index 8de66a5..bd89c0e 100644 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java @@ -52,7 +52,7 @@ public static void restore(Context context) { SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(context); Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_MALI_L2MR, "0")); + sharedPrefs.getString(DeviceSettings.KEY_MALI_L2MR, "48")); } public boolean onPreferenceChange(Preference preference, Object newValue) { From 7dc85fc755943799975da16faa1dac8306feeb0e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 30 Aug 2013 23:18:56 -0300 Subject: [PATCH 088/248] fix advanced tab def values --- DeviceSettings/res/xml/advanced_preferences.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml index 1ed18fb..079c003 100644 --- a/DeviceSettings/res/xml/advanced_preferences.xml +++ b/DeviceSettings/res/xml/advanced_preferences.xml @@ -3,7 +3,7 @@ - \ No newline at end of file + From dbbb7403e5f43bfe67fc8e25f2c313d804437714 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 30 Aug 2013 23:20:36 -0300 Subject: [PATCH 089/248] fix general tab def values --- DeviceSettings/res/xml/general_preferences.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceSettings/res/xml/general_preferences.xml b/DeviceSettings/res/xml/general_preferences.xml index 5ea9a9d..d3959a1 100644 --- a/DeviceSettings/res/xml/general_preferences.xml +++ b/DeviceSettings/res/xml/general_preferences.xml @@ -5,7 +5,7 @@ - \ No newline at end of file + From c1e5b857e6fddcf87def920f2b4ab675236dcc65 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 30 Aug 2013 23:22:51 -0300 Subject: [PATCH 090/248] fix usb tab def values --- DeviceSettings/res/xml/usb_preferences.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DeviceSettings/res/xml/usb_preferences.xml b/DeviceSettings/res/xml/usb_preferences.xml index 161ff95..7d933a4 100644 --- a/DeviceSettings/res/xml/usb_preferences.xml +++ b/DeviceSettings/res/xml/usb_preferences.xml @@ -14,7 +14,7 @@ - \ No newline at end of file + From e4600ade9edf22716154b155685efb1fe7910cc7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 5 Sep 2013 02:35:05 -0300 Subject: [PATCH 091/248] Fix touchscreen sensitivity settings 1/2 --- DeviceSettings/res/values/arrays.xml | 20 +++++++++---------- DeviceSettings/res/xml/screen_preferences.xml | 2 +- .../device/TouchscreenSensitivity.java | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml index 3973f1f..d838b6c 100644 --- a/DeviceSettings/res/values/arrays.xml +++ b/DeviceSettings/res/values/arrays.xml @@ -69,20 +69,20 @@ 1 + 7 10 - 20 + 13 + 17 (Default) + 25 30 - 50 (Default) - 70 - 100 - 10 - 20 - 30 - 50 - 70 - 100 + val=7 + val=10 + val=13 + val=17 + val=25 + val=30 UMTS Only diff --git a/DeviceSettings/res/xml/screen_preferences.xml b/DeviceSettings/res/xml/screen_preferences.xml index 0c0926b..e5684e9 100644 --- a/DeviceSettings/res/xml/screen_preferences.xml +++ b/DeviceSettings/res/xml/screen_preferences.xml @@ -15,7 +15,7 @@ Date: Thu, 5 Sep 2013 02:48:48 -0300 Subject: [PATCH 092/248] fix touchscreen sensitivity settings 2/2 --- rootdir/init.samsungjanice.rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 2a1d18c..da84f41 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -469,6 +469,8 @@ on boot chown system system /sys/kernel/fsync/mode chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/module/mmc_core/parameters/use_spi_crc + chown system system /sys/kernel/mxt224e/threshold_t48 + write /sys/kernel/mxt224e/threshold_t48 on # Define TCP buffer sizes for various networks From 80e9b6f299f2bef9520acf02d072d6678643922f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 5 Sep 2013 02:59:09 -0300 Subject: [PATCH 093/248] test wifi tethering fix https://github.com/Rox-/android_device_samsung_codina/commit/96a0902b87211d0eb37e554db6f3df2245c87868 --- rootdir/init.samsungjanice.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index da84f41..fc372a8 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -228,6 +228,7 @@ on post-fs-data mkdir /data/misc/wifi 0770 wifi system chmod 0770 /data/misc/wifi chmod 0660 /data/misc/wifi/wpa_supplicant.conf + mkdir /data/misc/wifi/hostapd.sockets 0770 wifi wifi mkdir /data/misc/dhcp 0775 dhcp dhcp From da60472a001592d2173a88a7abb7bc38dde02ff5 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 8 Sep 2013 04:43:12 -0300 Subject: [PATCH 094/248] usb votg disabled by default --- DeviceSettings/res/xml/usb_preferences.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceSettings/res/xml/usb_preferences.xml b/DeviceSettings/res/xml/usb_preferences.xml index 7d933a4..67f7c01 100644 --- a/DeviceSettings/res/xml/usb_preferences.xml +++ b/DeviceSettings/res/xml/usb_preferences.xml @@ -5,7 +5,7 @@ From 1996f51acfdc4733812be8adcc38911cd49d7f21 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 8 Sep 2013 17:55:29 -0300 Subject: [PATCH 095/248] Revert "LWP Fix" This reverts commit 0d6b8e0bcf4dea33dd7cc5e9814a1d23b1b00927. --- janice.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/janice.mk b/janice.mk index b28fea4..d0802d1 100644 --- a/janice.mk +++ b/janice.mk @@ -31,10 +31,6 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 -# LWP FIX -PRODUCT_PROPERTY_OVERRIDES += \ - debug.egl.force_msaa=true - # Packages PRODUCT_PACKAGES += \ GalaxySAdvanceSettings From 60fec30df9fef43709662a6d4628375dc8208a5a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 8 Sep 2013 18:06:20 -0300 Subject: [PATCH 096/248] fix screen sensitivity translations --- DeviceSettings/res/values-de/arrays.xml | 8 ++++---- DeviceSettings/res/values-es/arrays.xml | 8 ++++---- DeviceSettings/res/values-fi/arrays.xml | 8 ++++---- DeviceSettings/res/values-hu/arrays.xml | 12 +++++++----- DeviceSettings/res/values-it/arrays.xml | 8 ++++---- DeviceSettings/res/values-nl/arrays.xml | 8 ++++---- DeviceSettings/res/values-pt-rBR/arrays.xml | 8 ++++---- DeviceSettings/res/values-zh-rCN/arrays.xml | 8 ++++---- 8 files changed, 35 insertions(+), 33 deletions(-) diff --git a/DeviceSettings/res/values-de/arrays.xml b/DeviceSettings/res/values-de/arrays.xml index 7674950..4cca017 100644 --- a/DeviceSettings/res/values-de/arrays.xml +++ b/DeviceSettings/res/values-de/arrays.xml @@ -5,12 +5,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (Standard) + 25 30 - 50 (Standard) - 70 - 100 Nur UMTS diff --git a/DeviceSettings/res/values-es/arrays.xml b/DeviceSettings/res/values-es/arrays.xml index 1c2ee33..bbcfd98 100644 --- a/DeviceSettings/res/values-es/arrays.xml +++ b/DeviceSettings/res/values-es/arrays.xml @@ -5,12 +5,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (por defecto) + 25 30 - 50 (por defecto) - 70 - 100 Solo UMTS diff --git a/DeviceSettings/res/values-fi/arrays.xml b/DeviceSettings/res/values-fi/arrays.xml index 2488adf..606eec8 100644 --- a/DeviceSettings/res/values-fi/arrays.xml +++ b/DeviceSettings/res/values-fi/arrays.xml @@ -5,12 +5,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (Oletus) + 25 30 - 50 (Oletus) - 70 - 100 Vain UMTS diff --git a/DeviceSettings/res/values-hu/arrays.xml b/DeviceSettings/res/values-hu/arrays.xml index ca62552..b3c00d7 100644 --- a/DeviceSettings/res/values-hu/arrays.xml +++ b/DeviceSettings/res/values-hu/arrays.xml @@ -4,14 +4,16 @@ 2.2 (Alapbeállítás) 1.9 - + + + 7 10 - 20 + 13 + 17 (Alapbeállítás) + 25 30 - 50 (Alapbeállítás) - 70 - 100 + UMTS HSDPA diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml index cc7b0ab..b6b4387 100644 --- a/DeviceSettings/res/values-it/arrays.xml +++ b/DeviceSettings/res/values-it/arrays.xml @@ -20,12 +20,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (Predefinito) + 25 30 - 50 (Predefinito) - 70 - 100 Solo UMTS diff --git a/DeviceSettings/res/values-nl/arrays.xml b/DeviceSettings/res/values-nl/arrays.xml index 723a7cc..f8a84d8 100644 --- a/DeviceSettings/res/values-nl/arrays.xml +++ b/DeviceSettings/res/values-nl/arrays.xml @@ -21,12 +21,12 @@ 1,9 + 7 10 - 20 + 13 + 17 (default) + 25 30 - 50 (standaard) - 70 - 100 Alleen UMTS diff --git a/DeviceSettings/res/values-pt-rBR/arrays.xml b/DeviceSettings/res/values-pt-rBR/arrays.xml index 2cab625..cdd75d4 100755 --- a/DeviceSettings/res/values-pt-rBR/arrays.xml +++ b/DeviceSettings/res/values-pt-rBR/arrays.xml @@ -6,12 +6,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (Padrão) + 25 30 - 50 (Padrão) - 70 - 100 Somente UMTS diff --git a/DeviceSettings/res/values-zh-rCN/arrays.xml b/DeviceSettings/res/values-zh-rCN/arrays.xml index 0615c0c..11085e0 100644 --- a/DeviceSettings/res/values-zh-rCN/arrays.xml +++ b/DeviceSettings/res/values-zh-rCN/arrays.xml @@ -5,12 +5,12 @@ 1.9 + 7 10 - 20 + 13 + 17 (默认) + 25 30 - 50 (默认) - 70 - 100 仅使用 UMTS From f7ee5060d53eea180f9e3509f02f7e5097ca3451 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 8 Sep 2013 23:11:30 -0300 Subject: [PATCH 097/248] Update BoardConfig.mk --- BoardConfig.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index d576edd..1964381 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -56,7 +56,8 @@ WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.b WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true -BOARD_HAVE_SAMSUNG_WIFI := true +BOARD_HAVE_SAMSUNG_WIF := true +BOARD_NO_APSME_ATTR := true # RIL BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ From 49748e5d315822ea4a31da1fa3df2bacd32a9116 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 8 Sep 2013 23:14:35 -0300 Subject: [PATCH 098/248] Update BoardConfig.mk --- BoardConfig.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 1964381..dae5b09 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -56,8 +56,8 @@ WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.b WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true -BOARD_HAVE_SAMSUNG_WIF := true -BOARD_NO_APSME_ATTR := true +BOARD_HAVE_SAMSUNG_WIF := true +BOARD_NO_APSME_ATTR := true # RIL BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ From 6e324a5c7f65dfb6dc78693a54a2c04ef22312d6 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 9 Sep 2013 17:56:07 -0300 Subject: [PATCH 099/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index fc372a8..0f08c96 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -407,6 +407,13 @@ on boot chown root system sys/class/sec/gps/GPS_nRST/value chmod 0664 sys/class/sec/gps/GPS_nRST/value + +service gpsd /system/bin/gpsd -c /system/etc/gps.xml + class main + socket gps seqpacket 0660 gps system + user gps + group system inet sdcard_rw + ioprio be 0 # permissions for FMRadio of Broadcom chmod 0777 /system/bin/btld @@ -683,8 +690,9 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT # user wifi @@ -712,6 +720,11 @@ service dhcpcd_rmnet0 /system/bin/dhcpcd -aABKL class main disabled oneshot + +service dhcpcd_p2p /system/bin/dhcpcd -aABKL + class main + disabled + oneshot service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG # This properly enables bluetooth tethering, it asigns a IP to any conected device @@ -731,6 +744,11 @@ service iprenew_rmnet0 /system/bin/dhcpcd -n class main disabled oneshot + +service iprenew_p2p /system/bin/dhcpcd -n + class main + disabled + oneshot service iprenew_bnep0 /system/bin/dhcpcd -n class main From 9f572f3dfc2b15d49600d5063db99d2fa0cb81c4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 9 Sep 2013 20:54:39 -0300 Subject: [PATCH 100/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 0f08c96..5668a9f 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -408,13 +408,6 @@ on boot chown root system sys/class/sec/gps/GPS_nRST/value chmod 0664 sys/class/sec/gps/GPS_nRST/value -service gpsd /system/bin/gpsd -c /system/etc/gps.xml - class main - socket gps seqpacket 0660 gps system - user gps - group system inet sdcard_rw - ioprio be 0 - # permissions for FMRadio of Broadcom chmod 0777 /system/bin/btld @@ -690,7 +683,7 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 service p2p_supplicant /system/bin/wpa_supplicant \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 # we will start as root and wpa_supplicant will switch to user wifi @@ -720,11 +713,6 @@ service dhcpcd_rmnet0 /system/bin/dhcpcd -aABKL class main disabled oneshot - -service dhcpcd_p2p /system/bin/dhcpcd -aABKL - class main - disabled - oneshot service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG # This properly enables bluetooth tethering, it asigns a IP to any conected device @@ -744,11 +732,6 @@ service iprenew_rmnet0 /system/bin/dhcpcd -n class main disabled oneshot - -service iprenew_p2p /system/bin/dhcpcd -n - class main - disabled - oneshot service iprenew_bnep0 /system/bin/dhcpcd -n class main From eaaca531558c093124ec38baa4d9bf98366011a3 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 9 Sep 2013 23:21:53 -0300 Subject: [PATCH 101/248] Update janice.mk --- janice.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index d0802d1..915897c 100644 --- a/janice.mk +++ b/janice.mk @@ -43,11 +43,14 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/prerecovery.rc:root/prerecovery.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc + # RIL PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ $(LOCAL_PATH)/configs/model_id.cfg:system/etc/AT/model_id.cfg \ - $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg + $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg \ + $(LOCAL_PATH)/configs/yas.cfg:system/etc/yas.cfg \ + $(LOCAL_PATH)/configs/compass_calibration:system/etc/init.d/compass_calibration # Keylayout PRODUCT_COPY_FILES += \ From 04cd2884848451265d3f9202df47abff0efdd8bc Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 10 Sep 2013 00:03:24 -0300 Subject: [PATCH 102/248] Update janice.mk --- janice.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/janice.mk b/janice.mk index 915897c..66c2765 100644 --- a/janice.mk +++ b/janice.mk @@ -49,7 +49,6 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ $(LOCAL_PATH)/configs/model_id.cfg:system/etc/AT/model_id.cfg \ $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg \ - $(LOCAL_PATH)/configs/yas.cfg:system/etc/yas.cfg \ $(LOCAL_PATH)/configs/compass_calibration:system/etc/init.d/compass_calibration # Keylayout From 93ab46504046014de03fc07f95f406da6c3e0293 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 10 Sep 2013 00:07:08 -0300 Subject: [PATCH 103/248] Create compass_calibration --- configs/compass_calibration | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 configs/compass_calibration diff --git a/configs/compass_calibration b/configs/compass_calibration new file mode 100644 index 0000000..50d413e --- /dev/null +++ b/configs/compass_calibration @@ -0,0 +1,14 @@ +#!/system/bin/sh + +# Default values for compass calibration, +# this is a workaround only, to make it +# work from the first boot without calibrating +# it manually. + +cfg_path="/data/system/yas.cfg" + +if [ -f $cfg_path ] +then +echo "-1,-3,9,256815,32824,-9722435,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path +chmod 0644 $cfg_path +fi From 7ff6ea6c1d1f4c63f4554281528d03d0f598db4f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 11 Sep 2013 01:04:39 -0300 Subject: [PATCH 104/248] remove new line character --- configs/compass_calibration | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/compass_calibration b/configs/compass_calibration index 50d413e..f881c5e 100644 --- a/configs/compass_calibration +++ b/configs/compass_calibration @@ -9,6 +9,6 @@ cfg_path="/data/system/yas.cfg" if [ -f $cfg_path ] then -echo "-1,-3,9,256815,32824,-9722435,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path +echo -n "-1,-3,9,256815,32824,-9722435,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path chmod 0644 $cfg_path fi From 51bec22c62328e2979c8d9e81c869e588b20eabf Mon Sep 17 00:00:00 2001 From: OliverG96 Date: Wed, 11 Sep 2013 19:45:54 +0100 Subject: [PATCH 105/248] include: Update gps.h from i9100 --- overlay/include/hardware/gps.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/overlay/include/hardware/gps.h b/overlay/include/hardware/gps.h index 05b3b11..1176b72 100644 --- a/overlay/include/hardware/gps.h +++ b/overlay/include/hardware/gps.h @@ -228,6 +228,11 @@ typedef uint16_t AGpsStatusValue; */ #define AGPS_RIL_INTERFACE "agps_ril" +/** + * The GPS chipset can use Psc for AGPS. + */ +#define AGPS_USE_PSC + /** Represents a location. */ typedef struct { /** set to sizeof(GpsLocation) */ @@ -314,6 +319,9 @@ typedef struct { uint16_t mcc; uint16_t mnc; uint16_t lac; +#ifdef AGPS_USE_PSC + uint16_t psc; +#endif uint32_t cid; } AGpsRefLocationCellID; @@ -683,4 +691,3 @@ typedef struct { __END_DECLS #endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ - From e2ff6e7a92584806eab2c00b1a14b6ee99dbe11a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 11 Sep 2013 20:43:12 -0300 Subject: [PATCH 106/248] Update BoardConfig.mk --- BoardConfig.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index dae5b09..bcc5cab 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -56,7 +56,9 @@ WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.b WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true -BOARD_HAVE_SAMSUNG_WIF := true +#BOARD_HAVE_SAMSUNG_WIFI := true + +# WIFI TETHERING FIX BOARD_NO_APSME_ATTR := true # RIL From 451aaf6d99dae4f45b8491aaca415f5790622691 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 11 Sep 2013 20:44:31 -0300 Subject: [PATCH 107/248] Update BoardConfig.mk --- BoardConfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index bcc5cab..df9d181 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -56,7 +56,7 @@ WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.b WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true -#BOARD_HAVE_SAMSUNG_WIFI := true +# BOARD_HAVE_SAMSUNG_WIFI := true # WIFI TETHERING FIX BOARD_NO_APSME_ATTR := true From abed573481dbe8c49484f16742386fc5f7195dc3 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 12 Sep 2013 19:44:31 -0300 Subject: [PATCH 108/248] Update compass_calibration --- configs/compass_calibration | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/compass_calibration b/configs/compass_calibration index f881c5e..193d0ef 100644 --- a/configs/compass_calibration +++ b/configs/compass_calibration @@ -9,6 +9,6 @@ cfg_path="/data/system/yas.cfg" if [ -f $cfg_path ] then -echo -n "-1,-3,9,256815,32824,-9722435,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path +echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path chmod 0644 $cfg_path fi From c48982204845e1e73264857fd0d73311fd57486e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 12 Sep 2013 22:22:22 -0300 Subject: [PATCH 109/248] testing low call volume workaround by Oliver --- janice.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/janice.mk b/janice.mk index 66c2765..c5612e3 100644 --- a/janice.mk +++ b/janice.mk @@ -30,6 +30,10 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.ril.gprsclass=10 \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 + +# Low in-call volume workaround test + PRODUCT_PROPERTY_OVERRIDES += \ + ro.config.vc_call_vol_steps=8 # Packages PRODUCT_PACKAGES += \ From 525c4b642c025065e77c1b337c7198b9513d6aa0 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 12 Sep 2013 22:35:57 -0300 Subject: [PATCH 110/248] formatting 8) --- janice.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index c5612e3..ab6cf14 100644 --- a/janice.mk +++ b/janice.mk @@ -32,7 +32,7 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.telephony.sends_barcount=1 # Low in-call volume workaround test - PRODUCT_PROPERTY_OVERRIDES += \ +PRODUCT_PROPERTY_OVERRIDES += \ ro.config.vc_call_vol_steps=8 # Packages From 5deec8a010340992ad78720a3d765928234acaf0 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 15 Sep 2013 01:24:24 -0300 Subject: [PATCH 111/248] testing low call volume fix --- .../java/android/media/AudioService.java | 6341 +++++++++++++++++ 1 file changed, 6341 insertions(+) create mode 100644 overlay/frameworks/base/media/java/android/media/AudioService.java diff --git a/overlay/frameworks/base/media/java/android/media/AudioService.java b/overlay/frameworks/base/media/java/android/media/AudioService.java new file mode 100644 index 0000000..feb8ec3 --- /dev/null +++ b/overlay/frameworks/base/media/java/android/media/AudioService.java @@ -0,0 +1,6341 @@ +/* + * 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 android.media; + +import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK; +import static android.media.AudioManager.RINGER_MODE_NORMAL; +import static android.media.AudioManager.RINGER_MODE_SILENT; +import static android.media.AudioManager.RINGER_MODE_VIBRATE; + +import android.app.Activity; +import android.app.ActivityManagerNative; +import android.app.KeyguardManager; +import android.app.PendingIntent; +import android.app.PendingIntent.CanceledException; +import android.app.PendingIntent.OnFinished; +import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHeadset; +import android.bluetooth.BluetoothProfile; +import android.content.ActivityNotFoundException; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.media.MediaPlayer.OnCompletionListener; +import android.media.MediaPlayer.OnErrorListener; +import android.net.Uri; +import android.os.Binder; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.PowerManager; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; +import android.os.UserHandle; +import android.os.Vibrator; +import android.provider.Settings; +import android.provider.Settings.System; +import android.provider.Settings.SettingNotFoundException; +import android.speech.RecognizerIntent; +import android.telephony.PhoneStateListener; +import android.telephony.ServiceState; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.VolumePanel; + +import com.android.internal.app.ThemeUtils; +import com.android.internal.telephony.ITelephony; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.Stack; + +/** + * The implementation of the volume manager service. + *

+ * This implementation focuses on delivering a responsive UI. Most methods are + * asynchronous to external calls. For example, the task of setting a volume + * will update our internal state, but in a separate thread will set the system + * volume and later persist to the database. Similarly, setting the ringer mode + * will update the state and broadcast a change and in a separate thread later + * persist the ringer mode. + * + * @hide + */ +public class AudioService extends IAudioService.Stub implements OnFinished { + + private static final String TAG = "AudioService"; + + /** Debug remote control client/display feature */ + protected static final boolean DEBUG_RC = false; + /** Debug volumes */ + protected static final boolean DEBUG_VOL = false; + + /** How long to delay before persisting a change in volume/ringer mode. */ + private static final int PERSIST_DELAY = 500; + + private Context mContext; + private ContentResolver mContentResolver; + private boolean mVoiceCapable; + + /** The UI */ + private VolumePanel mVolumePanel; + private Context mUiContext; + private Handler mHandler; + + // sendMsg() flags + /** If the msg is already queued, replace it with this one. */ + private static final int SENDMSG_REPLACE = 0; + /** If the msg is already queued, ignore this one and leave the old. */ + private static final int SENDMSG_NOOP = 1; + /** If the msg is already queued, queue this one and leave the old. */ + private static final int SENDMSG_QUEUE = 2; + + // AudioHandler messages + private static final int MSG_SET_DEVICE_VOLUME = 0; + private static final int MSG_PERSIST_VOLUME = 1; + private static final int MSG_PERSIST_MASTER_VOLUME = 2; + private static final int MSG_PERSIST_RINGER_MODE = 3; + private static final int MSG_MEDIA_SERVER_DIED = 4; + private static final int MSG_MEDIA_SERVER_STARTED = 5; + private static final int MSG_PLAY_SOUND_EFFECT = 6; + private static final int MSG_BTA2DP_DOCK_TIMEOUT = 7; + private static final int MSG_LOAD_SOUND_EFFECTS = 8; + private static final int MSG_SET_FORCE_USE = 9; + private static final int MSG_PERSIST_MEDIABUTTONRECEIVER = 10; + private static final int MSG_BT_HEADSET_CNCT_FAILED = 11; + private static final int MSG_RCDISPLAY_CLEAR = 12; + private static final int MSG_RCDISPLAY_UPDATE = 13; + private static final int MSG_SET_ALL_VOLUMES = 14; + private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 15; + private static final int MSG_REPORT_NEW_ROUTES = 16; + private static final int MSG_REEVALUATE_REMOTE = 17; + private static final int MSG_RCC_NEW_PLAYBACK_INFO = 18; + private static final int MSG_RCC_NEW_VOLUME_OBS = 19; + private static final int MSG_SET_FORCE_BT_A2DP_USE = 20; + // start of messages handled under wakelock + // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), + // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) + private static final int MSG_SET_WIRED_DEVICE_CONNECTION_STATE = 21; + private static final int MSG_SET_A2DP_CONNECTION_STATE = 22; + // end of messages handled under wakelock + private static final int MSG_SET_RSX_CONNECTION_STATE = 23; // change remote submix connection + private static final int MSG_CHECK_MUSIC_ACTIVE = 24; + private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 25; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 26; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 27; + private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 28; + + // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be + // persisted + private static final int PERSIST_CURRENT = 0x1; + private static final int PERSIST_LAST_AUDIBLE = 0x2; + + private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000; + // Timeout for connection to bluetooth headset service + private static final int BT_HEADSET_CNCT_TIMEOUT_MS = 3000; + + /** @see AudioSystemThread */ + private AudioSystemThread mAudioSystemThread; + /** @see AudioHandler */ + private AudioHandler mAudioHandler; + /** @see VolumeStreamState */ + private VolumeStreamState[] mStreamStates; + private SettingsObserver mSettingsObserver; + private boolean noDelayInATwoDP = + Resources.getSystem().getBoolean(com.android.internal.R.bool.config_noDelayInATwoDP); + + private int mMode; + // protects mRingerMode + private final Object mSettingsLock = new Object(); + + private boolean mMediaServerOk; + + private SoundPool mSoundPool; + private final Object mSoundEffectsLock = new Object(); + private static final int NUM_SOUNDPOOL_CHANNELS = 4; + + // Internally master volume is a float in the 0.0 - 1.0 range, + // but to support integer based AudioManager API we translate it to 0 - 100 + private static final int MAX_MASTER_VOLUME = 100; + + // Maximum volume adjust steps allowed in a single batch call. + private static final int MAX_BATCH_VOLUME_ADJUST_STEPS = 4; + + /* Sound effect file names */ + private static final String SOUND_EFFECTS_PATH = "/media/audio/ui/"; + private static final String[] SOUND_EFFECT_FILES = new String[] { + "Effect_Tick.ogg", + "KeypressStandard.ogg", + "KeypressSpacebar.ogg", + "KeypressDelete.ogg", + "KeypressReturn.ogg" + }; + + /* Sound effect file name mapping sound effect id (AudioManager.FX_xxx) to + * file index in SOUND_EFFECT_FILES[] (first column) and indicating if effect + * uses soundpool (second column) */ + private final int[][] SOUND_EFFECT_FILES_MAP = new int[][] { + {0, -1}, // FX_KEY_CLICK + {0, -1}, // FX_FOCUS_NAVIGATION_UP + {0, -1}, // FX_FOCUS_NAVIGATION_DOWN + {0, -1}, // FX_FOCUS_NAVIGATION_LEFT + {0, -1}, // FX_FOCUS_NAVIGATION_RIGHT + {1, -1}, // FX_KEYPRESS_STANDARD + {2, -1}, // FX_KEYPRESS_SPACEBAR + {3, -1}, // FX_FOCUS_DELETE + {4, -1} // FX_FOCUS_RETURN + }; + + /** @hide Maximum volume index values for audio streams */ + private final int[] MAX_STREAM_VOLUME = new int[] { + 7, // STREAM_VOICE_CALL + 7, // STREAM_SYSTEM + 7, // STREAM_RING + 15, // STREAM_MUSIC + 7, // STREAM_ALARM + 7, // STREAM_NOTIFICATION + 15, // STREAM_BLUETOOTH_SCO + 7, // STREAM_SYSTEM_ENFORCED + 15, // STREAM_DTMF + 15 // STREAM_TTS + }; + /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings + * of another stream: This avoids multiplying the volume settings for hidden + * stream types that follow other stream behavior for volume settings + * NOTE: do not create loops in aliases! + * Some streams alias to different streams according to device category (phone or tablet) or + * use case (in call s off call...).See updateStreamVolumeAlias() for more details + * STREAM_VOLUME_ALIAS contains the default aliases for a voice capable device (phone) and + * STREAM_VOLUME_ALIAS_NON_VOICE for a non voice capable device (tablet).*/ + private final int[] STREAM_VOLUME_ALIAS = new int[] { + AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL + AudioSystem.STREAM_RING, // STREAM_SYSTEM + AudioSystem.STREAM_RING, // STREAM_RING + AudioSystem.STREAM_MUSIC, // STREAM_MUSIC + AudioSystem.STREAM_ALARM, // STREAM_ALARM + AudioSystem.STREAM_RING, // STREAM_NOTIFICATION + AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO + AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED + AudioSystem.STREAM_RING, // STREAM_DTMF + AudioSystem.STREAM_MUSIC // STREAM_TTS + }; + private final int[] STREAM_VOLUME_ALIAS_NON_VOICE = new int[] { + AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL + AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM + AudioSystem.STREAM_RING, // STREAM_RING + AudioSystem.STREAM_MUSIC, // STREAM_MUSIC + AudioSystem.STREAM_ALARM, // STREAM_ALARM + AudioSystem.STREAM_RING, // STREAM_NOTIFICATION + AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO + AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM_ENFORCED + AudioSystem.STREAM_MUSIC, // STREAM_DTMF + AudioSystem.STREAM_MUSIC // STREAM_TTS + }; + private int[] mStreamVolumeAlias; + + // stream names used by dumpStreamStates() + private final String[] STREAM_NAMES = new String[] { + "STREAM_VOICE_CALL", + "STREAM_SYSTEM", + "STREAM_RING", + "STREAM_MUSIC", + "STREAM_ALARM", + "STREAM_NOTIFICATION", + "STREAM_BLUETOOTH_SCO", + "STREAM_SYSTEM_ENFORCED", + "STREAM_DTMF", + "STREAM_TTS" + }; + + private boolean mLinkNotificationWithVolume; + + private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() { + public void onError(int error) { + switch (error) { + case AudioSystem.AUDIO_STATUS_SERVER_DIED: + if (mMediaServerOk) { + sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, + null, 1500); + mMediaServerOk = false; + } + break; + case AudioSystem.AUDIO_STATUS_OK: + if (!mMediaServerOk) { + sendMsg(mAudioHandler, MSG_MEDIA_SERVER_STARTED, SENDMSG_NOOP, 0, 0, + null, 0); + mMediaServerOk = true; + } + break; + default: + break; + } + } + }; + + /** + * Current ringer mode from one of {@link AudioManager#RINGER_MODE_NORMAL}, + * {@link AudioManager#RINGER_MODE_SILENT}, or + * {@link AudioManager#RINGER_MODE_VIBRATE}. + */ + // protected by mSettingsLock + private int mRingerMode; + // last non-normal ringer mode + private int mLastSilentRingerMode = -1; + + /** @see System#MODE_RINGER_STREAMS_AFFECTED */ + private int mRingerModeAffectedStreams; + + // Streams currently muted by ringer mode + private int mRingerModeMutedStreams; + + /** @see System#MUTE_STREAMS_AFFECTED */ + private int mMuteAffectedStreams; + + /** + * NOTE: setVibrateSetting(), getVibrateSetting(), shouldVibrate() are deprecated. + * mVibrateSetting is just maintained during deprecation period but vibration policy is + * now only controlled by mHasVibrator and mRingerMode + */ + private int mVibrateSetting; + + // Is there a vibrator + private final boolean mHasVibrator; + + // Broadcast receiver for device connections intent broadcasts + private final BroadcastReceiver mReceiver = new AudioServiceBroadcastReceiver(); + + // Used to alter media button redirection when the phone is ringing. + private boolean mIsRinging = false; + + // Devices currently connected + private final HashMap mConnectedDevices = new HashMap (); + + // Forced device usage for communications + private int mForcedUseForComm; + + // True if we have master volume support + private final boolean mUseMasterVolume; + + private final int[] mMasterVolumeRamp; + + // List of binder death handlers for setMode() client processes. + // The last process to have called setMode() is at the top of the list. + private final ArrayList mSetModeDeathHandlers = new ArrayList (); + + // List of clients having issued a SCO start request + private final ArrayList mScoClients = new ArrayList (); + + // BluetoothHeadset API to control SCO connection + private BluetoothHeadset mBluetoothHeadset; + + // Bluetooth headset device + private BluetoothDevice mBluetoothHeadsetDevice; + + // Indicate if SCO audio connection is currently active and if the initiator is + // audio service (internal) or bluetooth headset (external) + private int mScoAudioState; + // SCO audio state is not active + private static final int SCO_STATE_INACTIVE = 0; + // SCO audio activation request waiting for headset service to connect + private static final int SCO_STATE_ACTIVATE_REQ = 1; + // SCO audio state is active or starting due to a local request to start a virtual call + private static final int SCO_STATE_ACTIVE_INTERNAL = 3; + // SCO audio deactivation request waiting for headset service to connect + private static final int SCO_STATE_DEACTIVATE_REQ = 5; + + // SCO audio state is active due to an action in BT handsfree (either voice recognition or + // in call audio) + private static final int SCO_STATE_ACTIVE_EXTERNAL = 2; + // Deactivation request for all SCO connections (initiated by audio mode change) + // waiting for headset service to connect + private static final int SCO_STATE_DEACTIVATE_EXT_REQ = 4; + + // Current connection state indicated by bluetooth headset + private int mScoConnectionState; + + // true if boot sequence has been completed + private boolean mBootCompleted; + // listener for SoundPool sample load completion indication + private SoundPoolCallback mSoundPoolCallBack; + // thread for SoundPool listener + private SoundPoolListenerThread mSoundPoolListenerThread; + // message looper for SoundPool listener + private Looper mSoundPoolLooper = null; + // volume applied to sound played with playSoundEffect() + private static int sSoundEffectVolumeDb; + // getActiveStreamType() will return: + // - STREAM_NOTIFICATION on tablets during this period after a notification stopped + // - STREAM_MUSIC on phones during this period after music or talkback/voice search prompt + // stopped + private static final int DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS = 5000; + // previous volume adjustment direction received by checkForRingerModeChange() + private int mPrevVolDirection = AudioManager.ADJUST_SAME; + // Keyguard manager proxy + private KeyguardManager mKeyguardManager; + // mVolumeControlStream is set by VolumePanel to temporarily force the stream type which volume + // is controlled by Vol keys. + private int mVolumeControlStream = -1; + private final Object mForceControlStreamLock = new Object(); + // VolumePanel is currently the only client of forceVolumeControlStream() and runs in system + // server process so in theory it is not necessary to monitor the client death. + // However it is good to be ready for future evolutions. + private ForceControlStreamClient mForceControlStreamClient = null; + // Used to play ringtones outside system_server + private volatile IRingtonePlayer mRingtonePlayer; + + private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED; + + // Request to override default use of A2DP for media. + private boolean mBluetoothA2dpEnabled; + private final Object mBluetoothA2dpEnabledLock = new Object(); + + // Monitoring of audio routes. Protected by mCurAudioRoutes. + final AudioRoutesInfo mCurAudioRoutes = new AudioRoutesInfo(); + final RemoteCallbackList mRoutesObservers + = new RemoteCallbackList(); + + /** + * A fake stream type to match the notion of remote media playback + */ + public final static int STREAM_REMOTE_MUSIC = -200; + + // Devices for which the volume is fixed and VolumePanel slider should be disabled + final int mFixedVolumeDevices = AudioSystem.DEVICE_OUT_AUX_DIGITAL | + AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET | + AudioSystem.DEVICE_OUT_ALL_USB; + + private final boolean mMonitorOrientation; + + private boolean mDockAudioMediaEnabled = true; + + private boolean mForceAnalogDeskDock; + private boolean mForceAnalogCarDock; + + private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; + + private boolean mVolumeKeysControlRingStream; + + /////////////////////////////////////////////////////////////////////////// + // Construction + /////////////////////////////////////////////////////////////////////////// + + /** @hide */ + public AudioService(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mHandler = new Handler(); + mVoiceCapable = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_voice_capable); + + PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); + mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent"); + + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = vibrator == null ? false : vibrator.hasVibrator(); + + // Intialized volume + MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = SystemProperties.getInt( + "ro.config.vc_call_vol_steps", + MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]); + + sSoundEffectVolumeDb = context.getResources().getInteger( + com.android.internal.R.integer.config_soundEffectVolumeDb); + + mMode = AudioSystem.MODE_NORMAL; + mForcedUseForComm = AudioSystem.FORCE_NONE; + + createAudioSystemThread(); + + boolean cameraSoundForced = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_camera_sound_forced); + mCameraSoundForced = new Boolean(cameraSoundForced); + sendMsg(mAudioHandler, + MSG_SET_FORCE_USE, + SENDMSG_QUEUE, + AudioSystem.FOR_SYSTEM, + cameraSoundForced ? + AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE, + null, + 0); + + mSafeMediaVolumeState = new Integer(Settings.Global.getInt(mContentResolver, + Settings.Global.AUDIO_SAFE_VOLUME_STATE, + SAFE_MEDIA_VOLUME_NOT_CONFIGURED)); + // The default safe volume index read here will be replaced by the actual value when + // the mcc is read by onConfigureSafeVolume() + mSafeMediaVolumeIndex = mContext.getResources().getInteger( + com.android.internal.R.integer.config_safe_media_volume_index) * 10; + + readPersistedSettings(); + mSettingsObserver = new SettingsObserver(); + updateStreamVolumeAlias(false /*updateVolumes*/); + createStreamStates(); + + mMediaServerOk = true; + + // Call setRingerModeInt() to apply correct mute + // state on streams affected by ringer mode. + mRingerModeMutedStreams = 0; + setRingerModeInt(getRingerMode(), false); + + AudioSystem.setErrorCallback(mAudioSystemCallback); + + // Register for device connection intent broadcasts. + IntentFilter intentFilter = + new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); + if (noDelayInATwoDP) { + intentFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); + } + intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); + intentFilter.addAction(Intent.ACTION_DOCK_EVENT); + intentFilter.addAction(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG); + intentFilter.addAction(Intent.ACTION_USB_AUDIO_DEVICE_PLUG); + intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED); + intentFilter.addAction(Intent.ACTION_SCREEN_ON); + intentFilter.addAction(Intent.ACTION_SCREEN_OFF); + intentFilter.addAction(Intent.ACTION_USER_BACKGROUND); + intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + intentFilter.addAction(Intent.ACTION_WIFI_DISPLAY_AUDIO); + intentFilter.addAction(Intent.ACTION_HEADSET_PLUG); + + intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + // Register a configuration change listener only if requested by system properties + // to monitor orientation changes (off by default) + mMonitorOrientation = SystemProperties.getBoolean("ro.audio.monitorOrientation", false); + if (mMonitorOrientation) { + Log.v(TAG, "monitoring device orientation"); + // initialize orientation in AudioSystem + setOrientationForAudioSystem(); + } + + context.registerReceiver(mReceiver, intentFilter); + + // Register for package removal intent broadcasts for media button receiver persistence + IntentFilter pkgFilter = new IntentFilter(); + pkgFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); + pkgFilter.addDataScheme("package"); + context.registerReceiver(mReceiver, pkgFilter); + + ThemeUtils.registerThemeChangeReceiver(context, new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mUiContext = null; + } + }); + + // Register for phone state monitoring + TelephonyManager tmgr = (TelephonyManager) + context.getSystemService(Context.TELEPHONY_SERVICE); + tmgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); + + mUseMasterVolume = context.getResources().getBoolean( + com.android.internal.R.bool.config_useMasterVolume); + restoreMasterVolume(); + + mMasterVolumeRamp = context.getResources().getIntArray( + com.android.internal.R.array.config_masterVolumeRamp); + + mForceAnalogDeskDock = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_forceAnalogDeskDock); + + mForceAnalogCarDock = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_forceAnalogCarDock); + + mMainRemote = new RemotePlaybackState(-1, MAX_STREAM_VOLUME[AudioManager.STREAM_MUSIC], + MAX_STREAM_VOLUME[AudioManager.STREAM_MUSIC]); + mHasRemotePlayback = false; + mMainRemoteIsActive = false; + postReevaluateRemote(); + } + + private void createAudioSystemThread() { + mAudioSystemThread = new AudioSystemThread(); + mAudioSystemThread.start(); + waitForAudioHandlerCreation(); + } + + /** Waits for the volume handler to be created by the other thread. */ + private void waitForAudioHandlerCreation() { + synchronized(this) { + while (mAudioHandler == null) { + try { + // Wait for mAudioHandler to be set by the other thread + wait(); + } catch (InterruptedException e) { + Log.e(TAG, "Interrupted while waiting on volume handler."); + } + } + } + } + + private void checkAllAliasStreamVolumes() { + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = 0; streamType < numStreamTypes; streamType++) { + if (streamType != mStreamVolumeAlias[streamType]) { + mStreamStates[streamType]. + setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]], + false /*lastAudible*/); + mStreamStates[streamType]. + setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]], + true /*lastAudible*/); + } + // apply stream volume + if (mStreamStates[streamType].muteCount() == 0) { + mStreamStates[streamType].applyAllVolumes(); + } + } + } + + private void createStreamStates() { + int numStreamTypes = AudioSystem.getNumStreamTypes(); + VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes]; + + for (int i = 0; i < numStreamTypes; i++) { + streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); + } + + checkAllAliasStreamVolumes(); + } + + private void dumpStreamStates(PrintWriter pw) { + pw.println("\nStream volumes (device: index)"); + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int i = 0; i < numStreamTypes; i++) { + pw.println("- "+STREAM_NAMES[i]+":"); + mStreamStates[i].dump(pw); + pw.println(""); + } + pw.print("\n- mute affected streams = 0x"); + pw.println(Integer.toHexString(mMuteAffectedStreams)); + } + + + private void updateStreamVolumeAlias(boolean updateVolumes) { + int dtmfStreamAlias; + if (mVoiceCapable) { + mStreamVolumeAlias = STREAM_VOLUME_ALIAS; + dtmfStreamAlias = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias = STREAM_VOLUME_ALIAS_NON_VOICE; + dtmfStreamAlias = AudioSystem.STREAM_MUSIC; + } + if (isInCommunication()) { + dtmfStreamAlias = AudioSystem.STREAM_VOICE_CALL; + } + mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias; + + if (mLinkNotificationWithVolume) { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } + + if (updateVolumes) { + mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias], + false /*lastAudible*/); + mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias], + true /*lastAudible*/); + sendMsg(mAudioHandler, + MSG_SET_ALL_VOLUMES, + SENDMSG_QUEUE, + 0, + 0, + mStreamStates[AudioSystem.STREAM_DTMF], 0); + } + } + + private void readDockAudioSettings(ContentResolver cr) + { + mDockAudioMediaEnabled = Settings.Global.getInt( + cr, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) == 1; + + if (mDockAudioMediaEnabled) { + mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; + } else { + mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; + } + + sendMsg(mAudioHandler, + MSG_SET_FORCE_USE, + SENDMSG_QUEUE, + AudioSystem.FOR_DOCK, + mDockAudioMediaEnabled ? + AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE, + null, + 0); + } + + private boolean safeVolumeEnabled(ContentResolver cr) { + boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_safe_media_volume_enabled); + boolean safeHeadsetVolumeEnabled = Settings.System.getIntForUser(cr, + Settings.System.SAFE_HEADSET_VOLUME, safeMediaVolumeEnabled ? 1 : 0, + UserHandle.USER_CURRENT_OR_SELF) != 0; + return safeHeadsetVolumeEnabled; + } + + private void readPersistedSettings() { + final ContentResolver cr = mContentResolver; + + int ringerModeFromSettings = + Settings.Global.getInt( + cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); + int ringerMode = ringerModeFromSettings; + // sanity check in case the settings are restored from a device with incompatible + // ringer modes + if (!AudioManager.isValidRingerMode(ringerMode)) { + ringerMode = AudioManager.RINGER_MODE_NORMAL; + } + if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { + ringerMode = AudioManager.RINGER_MODE_SILENT; + } + if (ringerMode != ringerModeFromSettings) { + Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); + } + synchronized(mSettingsLock) { + mRingerMode = ringerMode; + + // System.VIBRATE_ON is not used any more but defaults for mVibrateSetting + // are still needed while setVibrateSetting() and getVibrateSetting() are being + // deprecated. + mVibrateSetting = getValueForVibrateSetting(0, + AudioManager.VIBRATE_TYPE_NOTIFICATION, + mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT + : AudioManager.VIBRATE_SETTING_OFF); + mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, + AudioManager.VIBRATE_TYPE_RINGER, + mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT + : AudioManager.VIBRATE_SETTING_OFF); + + // make sure settings for ringer mode are consistent with device type: non voice capable + // devices (tablets) include media stream in silent mode whereas phones don't. + mRingerModeAffectedStreams = Settings.System.getIntForUser(cr, + Settings.System.MODE_RINGER_STREAMS_AFFECTED, + ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| + (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), + UserHandle.USER_CURRENT); + + // ringtone and system streams are always affected by ringer mode + mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_RING)| + (1 << AudioSystem.STREAM_SYSTEM); + + if (mVoiceCapable) { + mRingerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); + } else { + mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); + } + synchronized (mCameraSoundForced) { + if (mCameraSoundForced) { + mRingerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } else { + mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } + } + + Settings.System.putIntForUser(cr, + Settings.System.MODE_RINGER_STREAMS_AFFECTED, + mRingerModeAffectedStreams, + UserHandle.USER_CURRENT); + + readDockAudioSettings(cr); + + mSafeVolumeEnabled = new Boolean(safeVolumeEnabled(cr)); + + mVolumeKeysControlRingStream = Settings.System.getIntForUser(cr, + Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM, 1, UserHandle.USER_CURRENT) == 1; + } + + mLinkNotificationWithVolume = Settings.System.getIntForUser(cr, + Settings.System.VOLUME_LINK_NOTIFICATION, 1, UserHandle.USER_CURRENT) == 1; + + mMuteAffectedStreams = System.getIntForUser(cr, + System.MUTE_STREAMS_AFFECTED, + ((1 << AudioSystem.STREAM_MUSIC)| + (1 << AudioSystem.STREAM_RING)| + (1 << AudioSystem.STREAM_SYSTEM)), + UserHandle.USER_CURRENT); + + boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE, + 0, UserHandle.USER_CURRENT) == 1; + AudioSystem.setMasterMute(masterMute); + broadcastMasterMuteStatus(masterMute); + + // Each stream will read its own persisted settings + + // Broadcast the sticky intent + broadcastRingerMode(ringerMode); + + // Broadcast vibrate settings + broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); + broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION); + + // Restore the default media button receiver from the system settings + restoreMediaButtonReceiver(); + } + + private int rescaleIndex(int index, int srcStream, int dstStream) { + return (index * mStreamStates[dstStream].getMaxIndex() + mStreamStates[srcStream].getMaxIndex() / 2) / mStreamStates[srcStream].getMaxIndex(); + } + + /////////////////////////////////////////////////////////////////////////// + // IPC methods + /////////////////////////////////////////////////////////////////////////// + + /** @see AudioManager#adjustVolume(int, int) */ + public void adjustVolume(int direction, int flags) { + adjustSuggestedStreamVolume(direction, AudioManager.USE_DEFAULT_STREAM_TYPE, flags); + } + + /** @see AudioManager#adjustLocalOrRemoteStreamVolume(int, int) with current assumption + * on streamType: fixed to STREAM_MUSIC */ + public void adjustLocalOrRemoteStreamVolume(int streamType, int direction) { + if (DEBUG_VOL) Log.d(TAG, "adjustLocalOrRemoteStreamVolume(dir="+direction+")"); + if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { + adjustRemoteVolume(AudioSystem.STREAM_MUSIC, direction, 0); + } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) { + adjustStreamVolume(AudioSystem.STREAM_MUSIC, direction, 0); + } + } + + /** @see AudioManager#adjustVolume(int, int, int) */ + public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) { + if (DEBUG_VOL) Log.d(TAG, "adjustSuggestedStreamVolume() stream="+suggestedStreamType); + int streamType; + if (mVolumeControlStream != -1) { + streamType = mVolumeControlStream; + } else { + streamType = getActiveStreamType(suggestedStreamType); + } + + // Play sounds on STREAM_RING only and if lock screen is not on. + if ((streamType != STREAM_REMOTE_MUSIC) && + (flags & AudioManager.FLAG_PLAY_SOUND) != 0 && + ((mStreamVolumeAlias[streamType] != AudioSystem.STREAM_RING) + || (mKeyguardManager != null && mKeyguardManager.isKeyguardLocked()))) { + flags &= ~AudioManager.FLAG_PLAY_SOUND; + } + + if (streamType == STREAM_REMOTE_MUSIC) { + // don't play sounds for remote + flags &= ~(AudioManager.FLAG_PLAY_SOUND|AudioManager.FLAG_FIXED_VOLUME); + //if (DEBUG_VOL) Log.i(TAG, "Need to adjust remote volume: calling adjustRemoteVolume()"); + adjustRemoteVolume(AudioSystem.STREAM_MUSIC, direction, flags); + } else { + adjustStreamVolume(streamType, direction, flags); + } + } + + /** @see AudioManager#adjustStreamVolume(int, int, int) */ + public void adjustStreamVolume(int streamType, int direction, int flags) { + if (DEBUG_VOL) Log.d(TAG, "adjustStreamVolume() stream="+streamType+", dir="+direction); + + ensureValidDirection(direction); + ensureValidStreamType(streamType); + + // use stream type alias here so that streams with same alias have the same behavior, + // including with regard to silent mode control (e.g the use of STREAM_RING below and in + // checkForRingerModeChange() in place of STREAM_RING or STREAM_NOTIFICATION) + int streamTypeAlias = mStreamVolumeAlias[streamType]; + VolumeStreamState streamState = mStreamStates[streamTypeAlias]; + + final int device = getDeviceForStream(streamTypeAlias); + // get last audible index if stream is muted, current index otherwise + final int aliasIndex = streamState.getIndex(device, + (streamState.muteCount() != 0) /* lastAudible */); + boolean adjustVolume = true; + + // convert one UI step (+/-1) into a number of internal units on the stream alias + int step = rescaleIndex(10, streamType, streamTypeAlias); + + int index; + int oldIndex; + + if ((direction == AudioManager.ADJUST_RAISE) && + !checkSafeMediaVolume(streamTypeAlias, aliasIndex + step, device)) { + index = mStreamStates[streamType].getIndex(device, + (streamState.muteCount() != 0) /* lastAudible */); + oldIndex = index; + } else { + flags &= ~AudioManager.FLAG_FIXED_VOLUME; + if ((streamTypeAlias == AudioSystem.STREAM_MUSIC) && + ((device & mFixedVolumeDevices) != 0)) { + flags |= AudioManager.FLAG_FIXED_VOLUME; + index = mStreamStates[streamType].getMaxIndex(); + oldIndex = index; + } else { + // If either the client forces allowing ringer modes for this adjustment, + // or the stream type is one that is affected by ringer modes + if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || + (streamTypeAlias == getMasterStreamType())) { + int ringerMode = getRingerMode(); + // do not vibrate if already in vibrate mode + if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { + flags &= ~AudioManager.FLAG_VIBRATE; + } + // Check if the ringer mode changes with this volume adjustment. If + // it does, it will handle adjusting the volume, so we won't below + adjustVolume = checkForRingerModeChange(aliasIndex, direction, step); + if ((streamTypeAlias == getMasterStreamType()) && + (mRingerMode == AudioManager.RINGER_MODE_SILENT)) { + streamState.setLastAudibleIndex(0, device); + } + } + + // If stream is muted, adjust last audible index only + oldIndex = mStreamStates[streamType].getIndex(device, + (mStreamStates[streamType].muteCount() != 0) /* lastAudible */); + + if (streamState.muteCount() != 0) { + if (adjustVolume) { + // Post a persist volume msg + // no need to persist volume on all streams sharing the same alias + streamState.adjustLastAudibleIndex(direction * step, device); + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_LAST_AUDIBLE, + device, + streamState, + PERSIST_DELAY); + } + index = mStreamStates[streamType].getIndex(device, true /* lastAudible */); + } else { + if (adjustVolume && streamState.adjustIndex(direction * step, device)) { + // Post message to set system volume (it in turn will post a message + // to persist). Do not change volume if stream is muted. + sendMsg(mAudioHandler, + MSG_SET_DEVICE_VOLUME, + SENDMSG_QUEUE, + device, + 0, + streamState, + 0); + } + index = mStreamStates[streamType].getIndex(device, false /* lastAudible */); + } + } + } + sendVolumeUpdate(streamType, oldIndex, index, flags); + } + + /** @see AudioManager#adjustMasterVolume(int) */ + public void adjustMasterVolume(int steps, int flags) { + ensureValidSteps(steps); + int volume = Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); + int delta = 0; + int numSteps = Math.abs(steps); + int direction = steps > 0 ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER; + for (int i = 0; i < numSteps; ++i) { + delta = findVolumeDelta(direction, volume); + volume += delta; + } + + //Log.d(TAG, "adjustMasterVolume volume: " + volume + " steps: " + steps); + setMasterVolume(volume, flags); + } + + /** @see AudioManager#setStreamVolume(int, int, int) */ + public void setStreamVolume(int streamType, int index, int flags) { + ensureValidStreamType(streamType); + VolumeStreamState streamState = mStreamStates[mStreamVolumeAlias[streamType]]; + + final int device = getDeviceForStream(streamType); + int oldIndex; + + flags &= ~AudioManager.FLAG_FIXED_VOLUME; + if ((mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && + ((device & mFixedVolumeDevices) != 0)) { + flags |= AudioManager.FLAG_FIXED_VOLUME; + index = mStreamStates[streamType].getMaxIndex(); + oldIndex = index; + } else { + // get last audible index if stream is muted, current index otherwise + oldIndex = streamState.getIndex(device, + (streamState.muteCount() != 0) /* lastAudible */); + + index = rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]); + + if (!checkSafeMediaVolume(mStreamVolumeAlias[streamType], index, device)) { + return; + } + + // setting volume on master stream type also controls silent mode + if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || + (mStreamVolumeAlias[streamType] == getMasterStreamType())) { + int newRingerMode; + if (index == 0) { + synchronized (mSettingsLock) { + if (mLastSilentRingerMode != -1) { + newRingerMode = mLastSilentRingerMode; + } else { + newRingerMode = mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE + : AudioManager.RINGER_MODE_SILENT; + } + } + setStreamVolumeInt(mStreamVolumeAlias[streamType], + index, + device, + false, + true); + } else { + newRingerMode = AudioManager.RINGER_MODE_NORMAL; + } + setRingerMode(newRingerMode); + } + + setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, false, true); + // get last audible index if stream is muted, current index otherwise + index = mStreamStates[streamType].getIndex(device, + (mStreamStates[streamType].muteCount() != 0) /* lastAudible */); + } + sendVolumeUpdate(streamType, oldIndex, index, flags); + } + + /** @see AudioManager#forceVolumeControlStream(int) */ + public void forceVolumeControlStream(int streamType, IBinder cb) { + synchronized(mForceControlStreamLock) { + mVolumeControlStream = streamType; + if (mVolumeControlStream == -1) { + if (mForceControlStreamClient != null) { + mForceControlStreamClient.release(); + mForceControlStreamClient = null; + } + } else { + mForceControlStreamClient = new ForceControlStreamClient(cb); + } + } + } + + private class ForceControlStreamClient implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + + ForceControlStreamClient(IBinder cb) { + if (cb != null) { + try { + cb.linkToDeath(this, 0); + } catch (RemoteException e) { + // Client has died! + Log.w(TAG, "ForceControlStreamClient() could not link to "+cb+" binder death"); + cb = null; + } + } + mCb = cb; + } + + public void binderDied() { + synchronized(mForceControlStreamLock) { + Log.w(TAG, "SCO client died"); + if (mForceControlStreamClient != this) { + Log.w(TAG, "unregistered control stream client died"); + } else { + mForceControlStreamClient = null; + mVolumeControlStream = -1; + } + } + } + + public void release() { + if (mCb != null) { + mCb.unlinkToDeath(this, 0); + mCb = null; + } + } + } + + private int findVolumeDelta(int direction, int volume) { + int delta = 0; + if (direction == AudioManager.ADJUST_RAISE) { + if (volume == MAX_MASTER_VOLUME) { + return 0; + } + // This is the default value if we make it to the end + delta = mMasterVolumeRamp[1]; + // If we're raising the volume move down the ramp array until we + // find the volume we're above and use that groups delta. + for (int i = mMasterVolumeRamp.length - 1; i > 1; i -= 2) { + if (volume >= mMasterVolumeRamp[i - 1]) { + delta = mMasterVolumeRamp[i]; + break; + } + } + } else if (direction == AudioManager.ADJUST_LOWER){ + if (volume == 0) { + return 0; + } + int length = mMasterVolumeRamp.length; + // This is the default value if we make it to the end + delta = -mMasterVolumeRamp[length - 1]; + // If we're lowering the volume move up the ramp array until we + // find the volume we're below and use the group below it's delta + for (int i = 2; i < length; i += 2) { + if (volume <= mMasterVolumeRamp[i]) { + delta = -mMasterVolumeRamp[i - 1]; + break; + } + } + } + return delta; + } + + private void sendBroadcastToAll(Intent intent) { + final long ident = Binder.clearCallingIdentity(); + try { + mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void sendStickyBroadcastToAll(Intent intent) { + final long ident = Binder.clearCallingIdentity(); + try { + mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + // UI update and Broadcast Intent + private void sendVolumeUpdate(int streamType, int oldIndex, int index, int flags) { + if (!mVoiceCapable && (streamType == AudioSystem.STREAM_RING)) { + streamType = AudioSystem.STREAM_NOTIFICATION; + } + + showVolumeChangeUi(streamType, flags); + + if ((flags & AudioManager.FLAG_FIXED_VOLUME) == 0) { + oldIndex = (oldIndex + 5) / 10; + index = (index + 5) / 10; + Intent intent = new Intent(AudioManager.VOLUME_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, streamType); + intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index); + intent.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex); + sendBroadcastToAll(intent); + } + } + + // UI update and Broadcast Intent + private void sendMasterVolumeUpdate(int flags, int oldVolume, int newVolume) { + masterVolumeChanged(flags); + + Intent intent = new Intent(AudioManager.MASTER_VOLUME_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_PREV_MASTER_VOLUME_VALUE, oldVolume); + intent.putExtra(AudioManager.EXTRA_MASTER_VOLUME_VALUE, newVolume); + sendBroadcastToAll(intent); + } + + // UI update and Broadcast Intent + private void sendMasterMuteUpdate(boolean muted, int flags) { + masterMuteChanged(flags); + broadcastMasterMuteStatus(muted); + } + + private void broadcastMasterMuteStatus(boolean muted) { + Intent intent = new Intent(AudioManager.MASTER_MUTE_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_MASTER_VOLUME_MUTED, muted); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT + | Intent.FLAG_RECEIVER_REPLACE_PENDING); + sendStickyBroadcastToAll(intent); + } + + /** + * Sets the stream state's index, and posts a message to set system volume. + * This will not call out to the UI. Assumes a valid stream type. + * + * @param streamType Type of the stream + * @param index Desired volume index of the stream + * @param device the device whose volume must be changed + * @param force If true, set the volume even if the desired volume is same + * as the current volume. + * @param lastAudible If true, stores new index as last audible one + */ + private void setStreamVolumeInt(int streamType, + int index, + int device, + boolean force, + boolean lastAudible) { + VolumeStreamState streamState = mStreamStates[streamType]; + + // If stream is muted, set last audible index only + if (streamState.muteCount() != 0) { + // Do not allow last audible index to be 0 + if (index != 0) { + streamState.setLastAudibleIndex(index, device); + // Post a persist volume msg + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_LAST_AUDIBLE, + device, + streamState, + PERSIST_DELAY); + } + } else { + if (streamState.setIndex(index, device, lastAudible) || force) { + // Post message to set system volume (it in turn will post a message + // to persist). + sendMsg(mAudioHandler, + MSG_SET_DEVICE_VOLUME, + SENDMSG_QUEUE, + device, + 0, + streamState, + 0); + } + } + } + + /** @see AudioManager#setStreamSolo(int, boolean) */ + public void setStreamSolo(int streamType, boolean state, IBinder cb) { + for (int stream = 0; stream < mStreamStates.length; stream++) { + if (!isStreamAffectedByMute(stream) || stream == streamType) continue; + // Bring back last audible volume + mStreamStates[stream].mute(cb, state); + } + } + + /** @see AudioManager#setStreamMute(int, boolean) */ + public void setStreamMute(int streamType, boolean state, IBinder cb) { + if (isStreamAffectedByMute(streamType)) { + mStreamStates[streamType].mute(cb, state); + } + } + + /** get stream mute state. */ + public boolean isStreamMute(int streamType) { + return (mStreamStates[streamType].muteCount() != 0); + } + + /** @see AudioManager#setMasterMute(boolean, IBinder) */ + public void setMasterMute(boolean state, int flags, IBinder cb) { + if (state != AudioSystem.getMasterMute()) { + AudioSystem.setMasterMute(state); + // Post a persist master volume msg + sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME_MUTE, SENDMSG_REPLACE, state ? 1 + : 0, 0, null, PERSIST_DELAY); + sendMasterMuteUpdate(state, flags); + } + } + + /** get master mute state. */ + public boolean isMasterMute() { + return AudioSystem.getMasterMute(); + } + + /** @see AudioManager#getStreamVolume(int) */ + public int getStreamVolume(int streamType) { + ensureValidStreamType(streamType); + int device = getDeviceForStream(streamType); + int index; + + if ((mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && + (device & mFixedVolumeDevices) != 0) { + index = mStreamStates[streamType].getMaxIndex(); + } else { + index = mStreamStates[streamType].getIndex(device, false /* lastAudible */); + } + return (index + 5) / 10; + } + + public int getMasterVolume() { + if (isMasterMute()) return 0; + return getLastAudibleMasterVolume(); + } + + public void setMasterVolume(int volume, int flags) { + if (volume < 0) { + volume = 0; + } else if (volume > MAX_MASTER_VOLUME) { + volume = MAX_MASTER_VOLUME; + } + doSetMasterVolume((float)volume / MAX_MASTER_VOLUME, flags); + } + + private void doSetMasterVolume(float volume, int flags) { + // don't allow changing master volume when muted + if (!AudioSystem.getMasterMute()) { + int oldVolume = getMasterVolume(); + AudioSystem.setMasterVolume(volume); + + int newVolume = getMasterVolume(); + if (newVolume != oldVolume) { + // Post a persist master volume msg + sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME, SENDMSG_REPLACE, + Math.round(volume * (float)1000.0), 0, null, PERSIST_DELAY); + } + // Send the volume update regardless whether there was a change. + sendMasterVolumeUpdate(flags, oldVolume, newVolume); + } + } + + /** @see AudioManager#getStreamMaxVolume(int) */ + public int getStreamMaxVolume(int streamType) { + ensureValidStreamType(streamType); + return (mStreamStates[streamType].getMaxIndex() + 5) / 10; + } + + public int getMasterMaxVolume() { + return MAX_MASTER_VOLUME; + } + + /** Get last audible volume before stream was muted. */ + public int getLastAudibleStreamVolume(int streamType) { + ensureValidStreamType(streamType); + int device = getDeviceForStream(streamType); + return (mStreamStates[streamType].getIndex(device, true /* lastAudible */) + 5) / 10; + } + + /** Get last audible master volume before it was muted. */ + public int getLastAudibleMasterVolume() { + return Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); + } + + /** @see AudioManager#getMasterStreamType(int) */ + public int getMasterStreamType() { + if (mVoiceCapable) { + return AudioSystem.STREAM_RING; + } else { + return AudioSystem.STREAM_MUSIC; + } + } + + /** @see AudioManager#getRingerMode() */ + public int getRingerMode() { + synchronized(mSettingsLock) { + return mRingerMode; + } + } + + private void ensureValidRingerMode(int ringerMode) { + if (!AudioManager.isValidRingerMode(ringerMode)) { + throw new IllegalArgumentException("Bad ringer mode " + ringerMode); + } + } + + /** @see AudioManager#setRingerMode(int) */ + public void setRingerMode(int ringerMode) { + if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { + ringerMode = AudioManager.RINGER_MODE_SILENT; + } + if (ringerMode != getRingerMode()) { + setRingerModeInt(ringerMode, true); + // Send sticky broadcast + broadcastRingerMode(ringerMode); + } + } + + private void setRingerModeInt(int ringerMode, boolean persist) { + synchronized(mSettingsLock) { + mRingerMode = ringerMode; + if (ringerMode != AudioManager.RINGER_MODE_NORMAL) { + mLastSilentRingerMode = ringerMode; + } + } + + // Mute stream if not previously muted by ringer mode and ringer mode + // is not RINGER_MODE_NORMAL and stream is affected by ringer mode. + // Unmute stream if previously muted by ringer mode and ringer mode + // is RINGER_MODE_NORMAL or stream is not affected by ringer mode. + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + if (isStreamMutedByRingerMode(streamType)) { + if (!isStreamAffectedByRingerMode(streamType) || + ringerMode == AudioManager.RINGER_MODE_NORMAL) { + // ring and notifications volume should never be 0 when not silenced + // on voice capable devices + if (mVoiceCapable && + mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { + synchronized (mStreamStates[streamType]) { + Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + if ((Integer)entry.getValue() == 0) { + entry.setValue(10); + } + } + } + } + mStreamStates[streamType].mute(null, false); + mRingerModeMutedStreams &= ~(1 << streamType); + } + } else { + if (isStreamAffectedByRingerMode(streamType) && + ringerMode != AudioManager.RINGER_MODE_NORMAL) { + mStreamStates[streamType].mute(null, true); + mRingerModeMutedStreams |= (1 << streamType); + } + } + } + + // Post a persist ringer mode msg + if (persist) { + sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, + SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY); + } + } + + private void restoreMasterVolume() { + if (mUseMasterVolume) { + float volume = Settings.System.getFloatForUser(mContentResolver, + Settings.System.VOLUME_MASTER, -1.0f, UserHandle.USER_CURRENT); + if (volume >= 0.0f) { + AudioSystem.setMasterVolume(volume); + } + } + } + + /** @see AudioManager#shouldVibrate(int) */ + public boolean shouldVibrate(int vibrateType) { + if (!mHasVibrator) return false; + + switch (getVibrateSetting(vibrateType)) { + + case AudioManager.VIBRATE_SETTING_ON: + return getRingerMode() != AudioManager.RINGER_MODE_SILENT; + + case AudioManager.VIBRATE_SETTING_ONLY_SILENT: + return getRingerMode() == AudioManager.RINGER_MODE_VIBRATE; + + case AudioManager.VIBRATE_SETTING_OFF: + // return false, even for incoming calls + return false; + + default: + return false; + } + } + + /** @see AudioManager#getVibrateSetting(int) */ + public int getVibrateSetting(int vibrateType) { + if (!mHasVibrator) return AudioManager.VIBRATE_SETTING_OFF; + return (mVibrateSetting >> (vibrateType * 2)) & 3; + } + + /** @see AudioManager#setVibrateSetting(int, int) */ + public void setVibrateSetting(int vibrateType, int vibrateSetting) { + + if (!mHasVibrator) return; + + mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting); + + // Broadcast change + broadcastVibrateSetting(vibrateType); + + } + + /** + * @see #setVibrateSetting(int, int) + */ + public static int getValueForVibrateSetting(int existingValue, int vibrateType, + int vibrateSetting) { + + // First clear the existing setting. Each vibrate type has two bits in + // the value. Note '3' is '11' in binary. + existingValue &= ~(3 << (vibrateType * 2)); + + // Set into the old value + existingValue |= (vibrateSetting & 3) << (vibrateType * 2); + + return existingValue; + } + + private class SetModeDeathHandler implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + private int mPid; + private int mMode = AudioSystem.MODE_NORMAL; // Current mode set by this client + + SetModeDeathHandler(IBinder cb, int pid) { + mCb = cb; + mPid = pid; + } + + public void binderDied() { + int newModeOwnerPid = 0; + synchronized(mSetModeDeathHandlers) { + Log.w(TAG, "setMode() client died"); + int index = mSetModeDeathHandlers.indexOf(this); + if (index < 0) { + Log.w(TAG, "unregistered setMode() client died"); + } else { + newModeOwnerPid = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid); + } + } + // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all + // SCO connections not started by the application changing the mode + if (newModeOwnerPid != 0) { + disconnectBluetoothSco(newModeOwnerPid); + } + } + + public int getPid() { + return mPid; + } + + public void setMode(int mode) { + mMode = mode; + } + + public int getMode() { + return mMode; + } + + public IBinder getBinder() { + return mCb; + } + } + + /** @see AudioManager#setMode(int) */ + public void setMode(int mode, IBinder cb) { + if (!checkAudioSettingsPermission("setMode()")) { + return; + } + + if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) { + return; + } + + int newModeOwnerPid = 0; + synchronized(mSetModeDeathHandlers) { + if (mode == AudioSystem.MODE_CURRENT) { + mode = mMode; + } + newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid()); + } + // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all + // SCO connections not started by the application changing the mode + if (newModeOwnerPid != 0) { + disconnectBluetoothSco(newModeOwnerPid); + } + } + + // must be called synchronized on mSetModeDeathHandlers + // setModeInt() returns a valid PID if the audio mode was successfully set to + // any mode other than NORMAL. + int setModeInt(int mode, IBinder cb, int pid) { + int newModeOwnerPid = 0; + if (cb == null) { + Log.e(TAG, "setModeInt() called with null binder"); + return newModeOwnerPid; + } + + SetModeDeathHandler hdlr = null; + Iterator iter = mSetModeDeathHandlers.iterator(); + while (iter.hasNext()) { + SetModeDeathHandler h = (SetModeDeathHandler)iter.next(); + if (h.getPid() == pid) { + hdlr = h; + // Remove from client list so that it is re-inserted at top of list + iter.remove(); + hdlr.getBinder().unlinkToDeath(hdlr, 0); + break; + } + } + int status = AudioSystem.AUDIO_STATUS_OK; + do { + if (mode == AudioSystem.MODE_NORMAL) { + // get new mode from client at top the list if any + if (!mSetModeDeathHandlers.isEmpty()) { + hdlr = mSetModeDeathHandlers.get(0); + cb = hdlr.getBinder(); + mode = hdlr.getMode(); + } + } else { + if (hdlr == null) { + hdlr = new SetModeDeathHandler(cb, pid); + } + // Register for client death notification + try { + cb.linkToDeath(hdlr, 0); + } catch (RemoteException e) { + // Client has died! + Log.w(TAG, "setMode() could not link to "+cb+" binder death"); + } + + // Last client to call setMode() is always at top of client list + // as required by SetModeDeathHandler.binderDied() + mSetModeDeathHandlers.add(0, hdlr); + hdlr.setMode(mode); + } + + if (mode != mMode) { + status = AudioSystem.setPhoneState(mode); + if (status == AudioSystem.AUDIO_STATUS_OK) { + mMode = mode; + } else { + if (hdlr != null) { + mSetModeDeathHandlers.remove(hdlr); + cb.unlinkToDeath(hdlr, 0); + } + // force reading new top of mSetModeDeathHandlers stack + mode = AudioSystem.MODE_NORMAL; + } + } else { + status = AudioSystem.AUDIO_STATUS_OK; + } + } while (status != AudioSystem.AUDIO_STATUS_OK && !mSetModeDeathHandlers.isEmpty()); + + if (status == AudioSystem.AUDIO_STATUS_OK) { + if (mode != AudioSystem.MODE_NORMAL) { + if (mSetModeDeathHandlers.isEmpty()) { + Log.e(TAG, "setMode() different from MODE_NORMAL with empty mode client stack"); + } else { + newModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); + } + } + int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE); + if (streamType == STREAM_REMOTE_MUSIC) { + // here handle remote media playback the same way as local playback + streamType = AudioManager.STREAM_MUSIC; + } + int device = getDeviceForStream(streamType); + int index = mStreamStates[mStreamVolumeAlias[streamType]].getIndex(device, false); + setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, true, false); + + updateStreamVolumeAlias(true /*updateVolumes*/); + } + return newModeOwnerPid; + } + + /** @see AudioManager#getMode() */ + public int getMode() { + return mMode; + } + + /** @see AudioManager#playSoundEffect(int) */ + public void playSoundEffect(int effectType) { + sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_NOOP, + effectType, -1, null, 0); + } + + /** @see AudioManager#playSoundEffect(int, float) */ + public void playSoundEffectVolume(int effectType, float volume) { + loadSoundEffects(); + sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_NOOP, + effectType, (int) (volume * 1000), null, 0); + } + + /** + * Loads samples into the soundpool. + * This method must be called at first when sound effects are enabled + */ + public boolean loadSoundEffects() { + int status; + + synchronized (mSoundEffectsLock) { + if (!mBootCompleted) { + Log.w(TAG, "loadSoundEffects() called before boot complete"); + return false; + } + + if (mSoundPool != null) { + return true; + } + mSoundPool = new SoundPool(NUM_SOUNDPOOL_CHANNELS, AudioSystem.STREAM_SYSTEM, 0); + + try { + mSoundPoolCallBack = null; + mSoundPoolListenerThread = new SoundPoolListenerThread(); + mSoundPoolListenerThread.start(); + // Wait for mSoundPoolCallBack to be set by the other thread + mSoundEffectsLock.wait(); + } catch (InterruptedException e) { + Log.w(TAG, "Interrupted while waiting sound pool listener thread."); + } + + if (mSoundPoolCallBack == null) { + Log.w(TAG, "loadSoundEffects() could not create SoundPool listener or thread"); + if (mSoundPoolLooper != null) { + mSoundPoolLooper.quit(); + mSoundPoolLooper = null; + } + mSoundPoolListenerThread = null; + mSoundPool.release(); + mSoundPool = null; + return false; + } + /* + * poolId table: The value -1 in this table indicates that corresponding + * file (same index in SOUND_EFFECT_FILES[] has not been loaded. + * Once loaded, the value in poolId is the sample ID and the same + * sample can be reused for another effect using the same file. + */ + int[] poolId = new int[SOUND_EFFECT_FILES.length]; + for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.length; fileIdx++) { + poolId[fileIdx] = -1; + } + /* + * Effects whose value in SOUND_EFFECT_FILES_MAP[effect][1] is -1 must be loaded. + * If load succeeds, value in SOUND_EFFECT_FILES_MAP[effect][1] is > 0: + * this indicates we have a valid sample loaded for this effect. + */ + + int lastSample = 0; + for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { + // Do not load sample if this effect uses the MediaPlayer + if (SOUND_EFFECT_FILES_MAP[effect][1] == 0) { + continue; + } + if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == -1) { + String filePath = Environment.getRootDirectory() + + SOUND_EFFECTS_PATH + + SOUND_EFFECT_FILES[SOUND_EFFECT_FILES_MAP[effect][0]]; + int sampleId = mSoundPool.load(filePath, 0); + if (sampleId <= 0) { + Log.w(TAG, "Soundpool could not load file: "+filePath); + } else { + SOUND_EFFECT_FILES_MAP[effect][1] = sampleId; + poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = sampleId; + lastSample = sampleId; + } + } else { + SOUND_EFFECT_FILES_MAP[effect][1] = poolId[SOUND_EFFECT_FILES_MAP[effect][0]]; + } + } + // wait for all samples to be loaded + if (lastSample != 0) { + mSoundPoolCallBack.setLastSample(lastSample); + + try { + mSoundEffectsLock.wait(); + status = mSoundPoolCallBack.status(); + } catch (java.lang.InterruptedException e) { + Log.w(TAG, "Interrupted while waiting sound pool callback."); + status = -1; + } + } else { + status = -1; + } + + if (mSoundPoolLooper != null) { + mSoundPoolLooper.quit(); + mSoundPoolLooper = null; + } + mSoundPoolListenerThread = null; + if (status != 0) { + Log.w(TAG, + "loadSoundEffects(), Error " + + ((lastSample != 0) ? mSoundPoolCallBack.status() : -1) + + " while loading samples"); + for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { + if (SOUND_EFFECT_FILES_MAP[effect][1] > 0) { + SOUND_EFFECT_FILES_MAP[effect][1] = -1; + } + } + + mSoundPool.release(); + mSoundPool = null; + } + } + return (status == 0); + } + + /** + * Unloads samples from the sound pool. + * This method can be called to free some memory when + * sound effects are disabled. + */ + public void unloadSoundEffects() { + synchronized (mSoundEffectsLock) { + if (mSoundPool == null) { + return; + } + + mAudioHandler.removeMessages(MSG_LOAD_SOUND_EFFECTS); + mAudioHandler.removeMessages(MSG_PLAY_SOUND_EFFECT); + + int[] poolId = new int[SOUND_EFFECT_FILES.length]; + for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.length; fileIdx++) { + poolId[fileIdx] = 0; + } + + for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { + if (SOUND_EFFECT_FILES_MAP[effect][1] <= 0) { + continue; + } + if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == 0) { + mSoundPool.unload(SOUND_EFFECT_FILES_MAP[effect][1]); + SOUND_EFFECT_FILES_MAP[effect][1] = -1; + poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = -1; + } + } + mSoundPool.release(); + mSoundPool = null; + } + } + + class SoundPoolListenerThread extends Thread { + public SoundPoolListenerThread() { + super("SoundPoolListenerThread"); + } + + @Override + public void run() { + + Looper.prepare(); + mSoundPoolLooper = Looper.myLooper(); + + synchronized (mSoundEffectsLock) { + if (mSoundPool != null) { + mSoundPoolCallBack = new SoundPoolCallback(); + mSoundPool.setOnLoadCompleteListener(mSoundPoolCallBack); + } + mSoundEffectsLock.notify(); + } + Looper.loop(); + } + } + + private final class SoundPoolCallback implements + android.media.SoundPool.OnLoadCompleteListener { + + int mStatus; + int mLastSample; + + public int status() { + return mStatus; + } + + public void setLastSample(int sample) { + mLastSample = sample; + } + + public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { + synchronized (mSoundEffectsLock) { + if (status != 0) { + mStatus = status; + } + if (sampleId == mLastSample) { + mSoundEffectsLock.notify(); + } + } + } + } + + /** @see AudioManager#reloadAudioSettings() */ + public void reloadAudioSettings() { + readAudioSettings(false /*userSwitch*/); + } + + private void readAudioSettings(boolean userSwitch) { + // restore ringer mode, ringer mode affected streams, mute affected streams and vibrate settings + readPersistedSettings(); + + // restore volume settings + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = 0; streamType < numStreamTypes; streamType++) { + VolumeStreamState streamState = mStreamStates[streamType]; + + if (userSwitch && mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) { + continue; + } + + synchronized (streamState) { + streamState.readSettings(); + + // unmute stream that was muted but is not affect by mute anymore + if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType) && + !isStreamMutedByRingerMode(streamType)) { + int size = streamState.mDeathHandlers.size(); + for (int i = 0; i < size; i++) { + streamState.mDeathHandlers.get(i).mMuteCount = 1; + streamState.mDeathHandlers.get(i).mute(false); + } + } + } + } + + // apply new ringer mode before checking volume for alias streams so that streams + // muted by ringer mode have the correct volume + setRingerModeInt(getRingerMode(), false); + + checkAllAliasStreamVolumes(); + + synchronized (mSafeMediaVolumeState) { + if (mSafeVolumeEnabled && + mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { + enforceSafeMediaVolume(); + } + } + } + + /** @see AudioManager#setSpeakerphoneOn() */ + public void setSpeakerphoneOn(boolean on){ + if (!checkAudioSettingsPermission("setSpeakerphoneOn()")) { + return; + } + mForcedUseForComm = on ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; + + sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, + AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, null, 0); + } + + /** @see AudioManager#isSpeakerphoneOn() */ + public boolean isSpeakerphoneOn() { + return (mForcedUseForComm == AudioSystem.FORCE_SPEAKER); + } + + /** @see AudioManager#setBluetoothScoOn() */ + public void setBluetoothScoOn(boolean on){ + if (!checkAudioSettingsPermission("setBluetoothScoOn()")) { + return; + } + mForcedUseForComm = on ? AudioSystem.FORCE_BT_SCO : AudioSystem.FORCE_NONE; + + sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, + AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, null, 0); + sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, + AudioSystem.FOR_RECORD, mForcedUseForComm, null, 0); + } + + /** @see AudioManager#isBluetoothScoOn() */ + public boolean isBluetoothScoOn() { + return (mForcedUseForComm == AudioSystem.FORCE_BT_SCO); + } + + /** @see AudioManager#setBluetoothA2dpOn() */ + public void setBluetoothA2dpOn(boolean on) { + if (!checkAudioSettingsPermission("setBluetoothA2dpOn()") && noDelayInATwoDP) { + return; + } + synchronized (mBluetoothA2dpEnabledLock) { + mBluetoothA2dpEnabled = on; + sendMsg(mAudioHandler, MSG_SET_FORCE_BT_A2DP_USE, SENDMSG_QUEUE, + AudioSystem.FOR_MEDIA, + mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP, + null, 0); + } + } + + /** @see AudioManager#isBluetoothA2dpOn() */ + public boolean isBluetoothA2dpOn() { + synchronized (mBluetoothA2dpEnabledLock) { + return mBluetoothA2dpEnabled; + } + } + + /** @see AudioManager#startBluetoothSco() */ + public void startBluetoothSco(IBinder cb){ + if (!checkAudioSettingsPermission("startBluetoothSco()") || + !mBootCompleted) { + return; + } + ScoClient client = getScoClient(cb, true); + client.incCount(); + } + + /** @see AudioManager#stopBluetoothSco() */ + public void stopBluetoothSco(IBinder cb){ + if (!checkAudioSettingsPermission("stopBluetoothSco()") || + !mBootCompleted) { + return; + } + ScoClient client = getScoClient(cb, false); + if (client != null) { + client.decCount(); + } + } + + + private class ScoClient implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + private int mCreatorPid; + private int mStartcount; // number of SCO connections started by this client + + ScoClient(IBinder cb) { + mCb = cb; + mCreatorPid = Binder.getCallingPid(); + mStartcount = 0; + } + + public void binderDied() { + synchronized(mScoClients) { + Log.w(TAG, "SCO client died"); + int index = mScoClients.indexOf(this); + if (index < 0) { + Log.w(TAG, "unregistered SCO client died"); + } else { + clearCount(true); + mScoClients.remove(this); + } + } + } + + public void incCount() { + synchronized(mScoClients) { + requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED); + if (mStartcount == 0) { + try { + mCb.linkToDeath(this, 0); + } catch (RemoteException e) { + // client has already died! + Log.w(TAG, "ScoClient incCount() could not link to "+mCb+" binder death"); + } + } + mStartcount++; + } + } + + public void decCount() { + synchronized(mScoClients) { + if (mStartcount == 0) { + Log.w(TAG, "ScoClient.decCount() already 0"); + } else { + mStartcount--; + if (mStartcount == 0) { + try { + mCb.unlinkToDeath(this, 0); + } catch (NoSuchElementException e) { + Log.w(TAG, "decCount() going to 0 but not registered to binder"); + } + } + requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); + } + } + } + + public void clearCount(boolean stopSco) { + synchronized(mScoClients) { + if (mStartcount != 0) { + try { + mCb.unlinkToDeath(this, 0); + } catch (NoSuchElementException e) { + Log.w(TAG, "clearCount() mStartcount: "+mStartcount+" != 0 but not registered to binder"); + } + } + mStartcount = 0; + if (stopSco) { + requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); + } + } + } + + public int getCount() { + return mStartcount; + } + + public IBinder getBinder() { + return mCb; + } + + public int getPid() { + return mCreatorPid; + } + + public int totalCount() { + synchronized(mScoClients) { + int count = 0; + int size = mScoClients.size(); + for (int i = 0; i < size; i++) { + count += mScoClients.get(i).getCount(); + } + return count; + } + } + + private void requestScoState(int state) { + checkScoAudioState(); + if (totalCount() == 0) { + if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) { + // Make sure that the state transitions to CONNECTING even if we cannot initiate + // the connection. + broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTING); + // Accept SCO audio activation only in NORMAL audio mode or if the mode is + // currently controlled by the same client process. + synchronized(mSetModeDeathHandlers) { + if ((mSetModeDeathHandlers.isEmpty() || + mSetModeDeathHandlers.get(0).getPid() == mCreatorPid) && + (mScoAudioState == SCO_STATE_INACTIVE || + mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) { + if (mScoAudioState == SCO_STATE_INACTIVE) { + if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) { + if (mBluetoothHeadset.startScoUsingVirtualVoiceCall( + mBluetoothHeadsetDevice)) { + mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; + } else { + broadcastScoConnectionState( + AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + } + } else if (getBluetoothHeadset()) { + mScoAudioState = SCO_STATE_ACTIVATE_REQ; + } + } else { + mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; + broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTED); + } + } else { + broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + } + } + } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED && + (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL || + mScoAudioState == SCO_STATE_ACTIVATE_REQ)) { + if (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL) { + if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) { + if (!mBluetoothHeadset.stopScoUsingVirtualVoiceCall( + mBluetoothHeadsetDevice)) { + mScoAudioState = SCO_STATE_INACTIVE; + broadcastScoConnectionState( + AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + } + } else if (getBluetoothHeadset()) { + mScoAudioState = SCO_STATE_DEACTIVATE_REQ; + } + } else { + mScoAudioState = SCO_STATE_INACTIVE; + broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + } + } + } + } + } + + private void checkScoAudioState() { + if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null && + mScoAudioState == SCO_STATE_INACTIVE && + mBluetoothHeadset.getAudioState(mBluetoothHeadsetDevice) + != BluetoothHeadset.STATE_AUDIO_DISCONNECTED) { + mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; + } + } + + private ScoClient getScoClient(IBinder cb, boolean create) { + synchronized(mScoClients) { + ScoClient client = null; + int size = mScoClients.size(); + for (int i = 0; i < size; i++) { + client = mScoClients.get(i); + if (client.getBinder() == cb) + return client; + } + if (create) { + client = new ScoClient(cb); + mScoClients.add(client); + } + return client; + } + } + + public void clearAllScoClients(int exceptPid, boolean stopSco) { + synchronized(mScoClients) { + ScoClient savedClient = null; + int size = mScoClients.size(); + for (int i = 0; i < size; i++) { + ScoClient cl = mScoClients.get(i); + if (cl.getPid() != exceptPid) { + cl.clearCount(stopSco); + } else { + savedClient = cl; + } + } + mScoClients.clear(); + if (savedClient != null) { + mScoClients.add(savedClient); + } + } + } + + private boolean getBluetoothHeadset() { + boolean result = false; + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if (adapter != null) { + result = adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, + BluetoothProfile.HEADSET); + } + // If we could not get a bluetooth headset proxy, send a failure message + // without delay to reset the SCO audio state and clear SCO clients. + // If we could get a proxy, send a delayed failure message that will reset our state + // in case we don't receive onServiceConnected(). + sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, + SENDMSG_REPLACE, 0, 0, null, result ? BT_HEADSET_CNCT_TIMEOUT_MS : 0); + return result; + } + + private void disconnectBluetoothSco(int exceptPid) { + synchronized(mScoClients) { + checkScoAudioState(); + if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL || + mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) { + if (mBluetoothHeadsetDevice != null) { + if (mBluetoothHeadset != null) { + if (!mBluetoothHeadset.stopVoiceRecognition( + mBluetoothHeadsetDevice)) { + sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, + SENDMSG_REPLACE, 0, 0, null, 0); + } + } else if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL && + getBluetoothHeadset()) { + mScoAudioState = SCO_STATE_DEACTIVATE_EXT_REQ; + } + } + } else { + clearAllScoClients(exceptPid, true); + } + } + } + + private void resetBluetoothSco() { + synchronized(mScoClients) { + clearAllScoClients(0, false); + mScoAudioState = SCO_STATE_INACTIVE; + broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + } + } + + private void broadcastScoConnectionState(int state) { + if (state != mScoConnectionState) { + Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED); + newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, state); + newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, + mScoConnectionState); + sendStickyBroadcastToAll(newIntent); + mScoConnectionState = state; + } + } + + private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener = + new BluetoothProfile.ServiceListener() { + public void onServiceConnected(int profile, BluetoothProfile proxy) { + BluetoothDevice btDevice; + List deviceList; + switch(profile) { + case BluetoothProfile.A2DP: + BluetoothA2dp a2dp = (BluetoothA2dp) proxy; + deviceList = a2dp.getConnectedDevices(); + if (deviceList.size() > 0) { + btDevice = deviceList.get(0); + if (!noDelayInATwoDP) { + synchronized (mConnectedDevices) { + int state = a2dp.getConnectionState(btDevice); + int delay = checkSendBecomingNoisyIntent( + AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); + queueMsgUnderWakeLock(mAudioHandler, + MSG_SET_A2DP_CONNECTION_STATE, + state, + 0, + btDevice, + delay); + } + } else { + onSetA2dpConnectionState(btDevice, a2dp.getConnectionState(btDevice)); + } + } + break; + + case BluetoothProfile.HEADSET: + synchronized (mScoClients) { + // Discard timeout message + mAudioHandler.removeMessages(MSG_BT_HEADSET_CNCT_FAILED); + mBluetoothHeadset = (BluetoothHeadset) proxy; + deviceList = mBluetoothHeadset.getConnectedDevices(); + if (deviceList.size() > 0) { + mBluetoothHeadsetDevice = deviceList.get(0); + } else { + mBluetoothHeadsetDevice = null; + } + // Refresh SCO audio state + checkScoAudioState(); + // Continue pending action if any + if (mScoAudioState == SCO_STATE_ACTIVATE_REQ || + mScoAudioState == SCO_STATE_DEACTIVATE_REQ || + mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) { + boolean status = false; + if (mBluetoothHeadsetDevice != null) { + switch (mScoAudioState) { + case SCO_STATE_ACTIVATE_REQ: + mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; + status = mBluetoothHeadset.startScoUsingVirtualVoiceCall( + mBluetoothHeadsetDevice); + break; + case SCO_STATE_DEACTIVATE_REQ: + status = mBluetoothHeadset.stopScoUsingVirtualVoiceCall( + mBluetoothHeadsetDevice); + break; + case SCO_STATE_DEACTIVATE_EXT_REQ: + status = mBluetoothHeadset.stopVoiceRecognition( + mBluetoothHeadsetDevice); + } + } + if (!status) { + sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, + SENDMSG_REPLACE, 0, 0, null, 0); + } + } + } + break; + + default: + break; + } + } + public void onServiceDisconnected(int profile) { + switch(profile) { + case BluetoothProfile.A2DP: + synchronized (mConnectedDevices) { + if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) { + makeA2dpDeviceUnavailableNow( + mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); + } + } + break; + + case BluetoothProfile.HEADSET: + synchronized (mScoClients) { + mBluetoothHeadset = null; + } + break; + + default: + break; + } + } + }; + + /** see AudioManager.setRemoteSubmixOn(boolean on) */ + public void setRemoteSubmixOn(boolean on, int address) { + sendMsg(mAudioHandler, MSG_SET_RSX_CONNECTION_STATE, + SENDMSG_REPLACE /* replace with QUEUE when multiple addresses are supported */, + on ? 1 : 0 /*arg1*/, + address /*arg2*/, + null/*obj*/, 0/*delay*/); + } + + private void onSetRsxConnectionState(int available, int address) { + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_REMOTE_SUBMIX, + available == 1 ? + AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, + String.valueOf(address) /*device_address*/); + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX, + available == 1 ? + AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, + String.valueOf(address) /*device_address*/); + } + + private void onCheckMusicActive() { + synchronized (mSafeMediaVolumeState) { + if (mSafeVolumeEnabled && + mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { + int device = getDeviceForStream(AudioSystem.STREAM_MUSIC); + + if ((device & mSafeMediaVolumeDevices) != 0) { + sendMsg(mAudioHandler, + MSG_CHECK_MUSIC_ACTIVE, + SENDMSG_REPLACE, + 0, + 0, + null, + MUSIC_ACTIVE_POLL_PERIOD_MS); + int index = mStreamStates[AudioSystem.STREAM_MUSIC].getIndex(device, + false /*lastAudible*/); + if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0) && + (index > mSafeMediaVolumeIndex)) { + // Approximate cumulative active music time + mMusicActiveMs += MUSIC_ACTIVE_POLL_PERIOD_MS; + if (mMusicActiveMs > UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX) { + setSafeMediaVolumeEnabled(true); + mMusicActiveMs = 0; + displaySafeVolumeWarning(); + } + } + } + } + } + } + + private void onConfigureSafeVolume(boolean force) { + synchronized (mSafeMediaVolumeState) { + int mcc = mContext.getResources().getConfiguration().mcc; + if ((mMcc != mcc) || ((mMcc == 0) && force)) { + mSafeMediaVolumeIndex = mContext.getResources().getInteger( + com.android.internal.R.integer.config_safe_media_volume_index) * 10; + boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_safe_media_volume_enabled); + + // The persisted state is either "disabled" or "active": this is the state applied + // next time we boot and cannot be "inactive" + int persistedState; + if (safeMediaVolumeEnabled) { + persistedState = SAFE_MEDIA_VOLUME_ACTIVE; + // The state can already be "inactive" here if the user has forced it before + // the 30 seconds timeout for forced configuration. In this case we don't reset + // it to "active". + if (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_INACTIVE) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; + enforceSafeMediaVolume(); + } + } else { + persistedState = SAFE_MEDIA_VOLUME_DISABLED; + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED; + } + mMcc = mcc; + sendMsg(mAudioHandler, + MSG_PERSIST_SAFE_VOLUME_STATE, + SENDMSG_QUEUE, + persistedState, + 0, + null, + 0); + } + } + } + + /////////////////////////////////////////////////////////////////////////// + // Internal methods + /////////////////////////////////////////////////////////////////////////// + + /** + * Checks if the adjustment should change ringer mode instead of just + * adjusting volume. If so, this will set the proper ringer mode and volume + * indices on the stream states. + */ + private boolean checkForRingerModeChange(int oldIndex, int direction, int step) { + boolean adjustVolumeIndex = true; + int ringerMode = getRingerMode(); + + switch (ringerMode) { + case RINGER_MODE_NORMAL: + if (direction == AudioManager.ADJUST_LOWER) { + if (mHasVibrator) { + // "step" is the delta in internal index units corresponding to a + // change of 1 in UI index units. + // Because of rounding when rescaling from one stream index range to its alias + // index range, we cannot simply test oldIndex == step: + // (step <= oldIndex < 2 * step) is equivalent to: (old UI index == 1) + if (step <= oldIndex && oldIndex < 2 * step) { + ringerMode = RINGER_MODE_VIBRATE; + if (mVoiceCapable) + adjustVolumeIndex = false; + } + } else { + // (oldIndex < step) is equivalent to (old UI index == 0) + if ((oldIndex < step) && mPrevVolDirection != AudioManager.ADJUST_LOWER) { + ringerMode = RINGER_MODE_SILENT; + if (mVoiceCapable) + adjustVolumeIndex = false; + } + } + } + break; + case RINGER_MODE_VIBRATE: + if (!mHasVibrator) { + Log.e(TAG, "checkForRingerModeChange() current ringer mode is vibrate" + + "but no vibrator is present"); + break; + } + if ((direction == AudioManager.ADJUST_LOWER)) { + if (mPrevVolDirection != AudioManager.ADJUST_LOWER) { + ringerMode = RINGER_MODE_SILENT; + } + } else if (direction == AudioManager.ADJUST_RAISE) { + ringerMode = RINGER_MODE_NORMAL; + } + adjustVolumeIndex = false; + break; + case RINGER_MODE_SILENT: + if (direction == AudioManager.ADJUST_RAISE) { + if (mHasVibrator) { + ringerMode = RINGER_MODE_VIBRATE; + } else { + ringerMode = RINGER_MODE_NORMAL; + } + } + adjustVolumeIndex = false; + break; + default: + Log.e(TAG, "checkForRingerModeChange() wrong ringer mode: "+ringerMode); + break; + } + + setRingerMode(ringerMode); + + mPrevVolDirection = direction; + + return adjustVolumeIndex; + } + + public boolean isStreamAffectedByRingerMode(int streamType) { + return (mRingerModeAffectedStreams & (1 << streamType)) != 0; + } + + private boolean isStreamMutedByRingerMode(int streamType) { + return (mRingerModeMutedStreams & (1 << streamType)) != 0; + } + + public boolean isStreamAffectedByMute(int streamType) { + return (mMuteAffectedStreams & (1 << streamType)) != 0; + } + + private void ensureValidDirection(int direction) { + if (direction < AudioManager.ADJUST_LOWER || direction > AudioManager.ADJUST_RAISE) { + throw new IllegalArgumentException("Bad direction " + direction); + } + } + + private void ensureValidSteps(int steps) { + if (Math.abs(steps) > MAX_BATCH_VOLUME_ADJUST_STEPS) { + throw new IllegalArgumentException("Bad volume adjust steps " + steps); + } + } + + private void ensureValidStreamType(int streamType) { + if (streamType < 0 || streamType >= mStreamStates.length) { + throw new IllegalArgumentException("Bad stream type " + streamType); + } + } + + private boolean isInCommunication() { + boolean isOffhook = false; + + if (mVoiceCapable) { + try { + ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); + if (phone != null) isOffhook = phone.isOffhook(); + } catch (RemoteException e) { + Log.w(TAG, "Couldn't connect to phone service", e); + } + } + return (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION); + } + + private int getActiveStreamType(int suggestedStreamType) { + if (mVoiceCapable) { + if (isInCommunication()) { + if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) + == AudioSystem.FORCE_BT_SCO) { + // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO..."); + return AudioSystem.STREAM_BLUETOOTH_SCO; + } else { + // Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL..."); + return AudioSystem.STREAM_VOICE_CALL; + } + } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) { + // Having the suggested stream be USE_DEFAULT_STREAM_TYPE is how remote control + // volume can have priority over STREAM_MUSIC + if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC"); + return STREAM_REMOTE_MUSIC; + } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, + DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active"); + return AudioSystem.STREAM_MUSIC; + } else { + if (mVolumeKeysControlRingStream) { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: Forcing STREAM_RING b/c default"); + return AudioSystem.STREAM_RING; + } else { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC b/c default setting"); + return AudioSystem.STREAM_MUSIC; + } + } + } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active"); + return AudioSystem.STREAM_MUSIC; + } else { + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type " + + suggestedStreamType); + return suggestedStreamType; + } + } else { + if (isInCommunication()) { + if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) + == AudioSystem.FORCE_BT_SCO) { + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO"); + return AudioSystem.STREAM_BLUETOOTH_SCO; + } else { + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL"); + return AudioSystem.STREAM_VOICE_CALL; + } + } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_NOTIFICATION, + DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS) || + AudioSystem.isStreamActive(AudioSystem.STREAM_RING, + DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) { + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION"); + return AudioSystem.STREAM_NOTIFICATION; + } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) { + if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { + // Having the suggested stream be USE_DEFAULT_STREAM_TYPE is how remote control + // volume can have priority over STREAM_MUSIC + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC"); + return STREAM_REMOTE_MUSIC; + } else { + if (DEBUG_VOL) + Log.v(TAG, "getActiveStreamType: using STREAM_MUSIC as default"); + return AudioSystem.STREAM_MUSIC; + } + } else { + if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type " + + suggestedStreamType); + return suggestedStreamType; + } + } + } + + private void broadcastRingerMode(int ringerMode) { + // Send sticky broadcast + Intent broadcast = new Intent(AudioManager.RINGER_MODE_CHANGED_ACTION); + broadcast.putExtra(AudioManager.EXTRA_RINGER_MODE, ringerMode); + broadcast.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT + | Intent.FLAG_RECEIVER_REPLACE_PENDING); + sendStickyBroadcastToAll(broadcast); + } + + private void broadcastVibrateSetting(int vibrateType) { + // Send broadcast + if (ActivityManagerNative.isSystemReady()) { + Intent broadcast = new Intent(AudioManager.VIBRATE_SETTING_CHANGED_ACTION); + broadcast.putExtra(AudioManager.EXTRA_VIBRATE_TYPE, vibrateType); + broadcast.putExtra(AudioManager.EXTRA_VIBRATE_SETTING, getVibrateSetting(vibrateType)); + sendBroadcastToAll(broadcast); + } + } + + // Message helper methods + /** + * Queue a message on the given handler's message queue, after acquiring the service wake lock. + * Note that the wake lock needs to be released after the message has been handled. + */ + private void queueMsgUnderWakeLock(Handler handler, int msg, + int arg1, int arg2, Object obj, int delay) { + mMediaEventWakeLock.acquire(); + sendMsg(handler, msg, SENDMSG_QUEUE, arg1, arg2, obj, delay); + } + + private static void sendMsg(Handler handler, int msg, + int existingMsgPolicy, int arg1, int arg2, Object obj, int delay) { + + if (existingMsgPolicy == SENDMSG_REPLACE) { + handler.removeMessages(msg); + } else if (existingMsgPolicy == SENDMSG_NOOP && handler.hasMessages(msg)) { + return; + } + + handler.sendMessageDelayed(handler.obtainMessage(msg, arg1, arg2, obj), delay); + } + + boolean checkAudioSettingsPermission(String method) { + if (mContext.checkCallingOrSelfPermission("android.permission.MODIFY_AUDIO_SETTINGS") + == PackageManager.PERMISSION_GRANTED) { + return true; + } + String msg = "Audio Settings Permission Denial: " + method + " from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid(); + Log.w(TAG, msg); + return false; + } + + private int getDeviceForStream(int stream) { + int device = AudioSystem.getDevicesForStream(stream); + if ((device & (device - 1)) != 0) { + // Multiple device selection is either: + // - speaker + one other device: give priority to speaker in this case. + // - one A2DP device + another device: happens with duplicated output. In this case + // retain the device on the A2DP output as the other must not correspond to an active + // selection if not the speaker. + if ((device & AudioSystem.DEVICE_OUT_SPEAKER) != 0) { + device = AudioSystem.DEVICE_OUT_SPEAKER; + } else { + device &= AudioSystem.DEVICE_OUT_ALL_A2DP; + } + } + return device; + } + + public void setWiredDeviceConnectionState(int device, int state, String name) { + synchronized (mConnectedDevices) { + int delay = checkSendBecomingNoisyIntent(device, state); + queueMsgUnderWakeLock(mAudioHandler, + MSG_SET_WIRED_DEVICE_CONNECTION_STATE, + device, + state, + name, + delay); + } + } + + public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state) { + int delay; + if (!noDelayInATwoDP) { + synchronized (mConnectedDevices) { + delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); + queueMsgUnderWakeLock(mAudioHandler, + MSG_SET_A2DP_CONNECTION_STATE, + state, + 0, + device, + delay); + } + } else { + delay = 0; + } + return delay; + } + + /////////////////////////////////////////////////////////////////////////// + // Inner classes + /////////////////////////////////////////////////////////////////////////// + + public class VolumeStreamState { + private final int mStreamType; + + private String mVolumeIndexSettingName; + private String mLastAudibleVolumeIndexSettingName; + private int mIndexMax; + private final ConcurrentHashMap mIndex = + new ConcurrentHashMap(8, 0.75f, 4); + private final ConcurrentHashMap mLastAudibleIndex = + new ConcurrentHashMap(8, 0.75f, 4); + private ArrayList mDeathHandlers; //handles mute/solo clients death + + private VolumeStreamState(String settingName, int streamType) { + + mVolumeIndexSettingName = settingName; + mLastAudibleVolumeIndexSettingName = settingName + System.APPEND_FOR_LAST_AUDIBLE; + + mStreamType = streamType; + mIndexMax = MAX_STREAM_VOLUME[streamType]; + AudioSystem.initStreamVolume(streamType, 0, mIndexMax); + mIndexMax *= 10; + + // mDeathHandlers must be created before calling readSettings() + mDeathHandlers = new ArrayList(); + + readSettings(); + } + + public String getSettingNameForDevice(boolean lastAudible, int device) { + String name = lastAudible ? + mLastAudibleVolumeIndexSettingName : + mVolumeIndexSettingName; + String suffix = AudioSystem.getDeviceName(device); + if (suffix.isEmpty()) { + return name; + } + return name + "_" + suffix; + } + + public synchronized void readSettings() { + int remainingDevices = AudioSystem.DEVICE_OUT_ALL; + + // do not read system stream volume from settings: this stream is always aliased + // to another stream type and its volume is never persisted. Values in settings can + // only be stale values + // on first call to readSettings() at init time, muteCount() is always 0 so we will + // always create entries for default device + if ((mStreamType == AudioSystem.STREAM_SYSTEM) || + (mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED)) { + int index = 10 * AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; + synchronized (mCameraSoundForced) { + if (mCameraSoundForced) { + index = mIndexMax; + } + } + if (muteCount() == 0) { + mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); + } + mLastAudibleIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); + return; + } + + for (int i = 0; remainingDevices != 0; i++) { + int device = (1 << i); + if ((device & remainingDevices) == 0) { + continue; + } + remainingDevices &= ~device; + + // ignore settings for fixed volume devices: volume should always be at max + if ((mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_MUSIC) && + ((device & mFixedVolumeDevices) != 0)) { + if (muteCount() == 0) { + mIndex.put(device, mIndexMax); + } + mLastAudibleIndex.put(device, mIndexMax); + continue; + } + // retrieve current volume for device + String name = getSettingNameForDevice(false /* lastAudible */, device); + // if no volume stored for current stream and device, use default volume if default + // device, continue otherwise + int defaultIndex = (device == AudioSystem.DEVICE_OUT_DEFAULT) ? + AudioManager.DEFAULT_STREAM_VOLUME[mStreamType] : -1; + int index = Settings.System.getIntForUser( + mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); + if (index == -1) { + continue; + } + + // retrieve last audible volume for device + name = getSettingNameForDevice(true /* lastAudible */, device); + // use stored last audible index if present, otherwise use current index if not 0 + // or default index + defaultIndex = (index > 0) ? + index : AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; + int lastAudibleIndex = Settings.System.getIntForUser( + mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); + + // a last audible index of 0 should never be stored for ring and notification + // streams on phones (voice capable devices). + if ((lastAudibleIndex == 0) && mVoiceCapable && + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) { + lastAudibleIndex = AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; + // Correct the data base + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_LAST_AUDIBLE, + device, + this, + PERSIST_DELAY); + } + mLastAudibleIndex.put(device, getValidIndex(10 * lastAudibleIndex)); + // the initial index should never be 0 for ring and notification streams on phones + // (voice capable devices) if not in silent or vibrate mode. + if ((index == 0) && (mRingerMode == AudioManager.RINGER_MODE_NORMAL) && + mVoiceCapable && + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) { + index = lastAudibleIndex; + // Correct the data base + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_CURRENT, + device, + this, + PERSIST_DELAY); + } + if (muteCount() == 0) { + mIndex.put(device, getValidIndex(10 * index)); + } + } + } + + public void applyDeviceVolume(int device) { + AudioSystem.setStreamVolumeIndex(mStreamType, + (getIndex(device, false /* lastAudible */) + 5)/10, + device); + } + + public synchronized void applyAllVolumes() { + // apply default volume first: by convention this will reset all + // devices volumes in audio policy manager to the supplied value + AudioSystem.setStreamVolumeIndex(mStreamType, + (getIndex(AudioSystem.DEVICE_OUT_DEFAULT, false /* lastAudible */) + 5)/10, + AudioSystem.DEVICE_OUT_DEFAULT); + // then apply device specific volumes + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + int device = ((Integer)entry.getKey()).intValue(); + if (device != AudioSystem.DEVICE_OUT_DEFAULT) { + AudioSystem.setStreamVolumeIndex(mStreamType, + ((Integer)entry.getValue() + 5)/10, + device); + } + } + } + + public boolean adjustIndex(int deltaIndex, int device) { + return setIndex(getIndex(device, + false /* lastAudible */) + deltaIndex, + device, + true /* lastAudible */); + } + + public synchronized boolean setIndex(int index, int device, boolean lastAudible) { + int oldIndex = getIndex(device, false /* lastAudible */); + index = getValidIndex(index); + synchronized (mCameraSoundForced) { + if ((mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED) && mCameraSoundForced) { + index = mIndexMax; + } + } + mIndex.put(device, getValidIndex(index)); + + if (oldIndex != index) { + if (lastAudible) { + mLastAudibleIndex.put(device, index); + } + // Apply change to all streams using this one as alias + // if changing volume of current device, also change volume of current + // device on aliased stream + boolean currentDevice = (device == getDeviceForStream(mStreamType)); + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + if (streamType != mStreamType && + mStreamVolumeAlias[streamType] == mStreamType) { + int scaledIndex = rescaleIndex(index, mStreamType, streamType); + mStreamStates[streamType].setIndex(scaledIndex, + device, + lastAudible); + if (currentDevice) { + mStreamStates[streamType].setIndex(scaledIndex, + getDeviceForStream(streamType), + lastAudible); + } + } + } + return true; + } else { + return false; + } + } + + public synchronized int getIndex(int device, boolean lastAudible) { + ConcurrentHashMap indexes; + if (lastAudible) { + indexes = mLastAudibleIndex; + } else { + indexes = mIndex; + } + Integer index = indexes.get(device); + if (index == null) { + // there is always an entry for AudioSystem.DEVICE_OUT_DEFAULT + index = indexes.get(AudioSystem.DEVICE_OUT_DEFAULT); + } + return index.intValue(); + } + + public synchronized void setLastAudibleIndex(int index, int device) { + // Apply change to all streams using this one as alias + // if changing volume of current device, also change volume of current + // device on aliased stream + boolean currentDevice = (device == getDeviceForStream(mStreamType)); + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + if (streamType != mStreamType && + mStreamVolumeAlias[streamType] == mStreamType) { + int scaledIndex = rescaleIndex(index, mStreamType, streamType); + mStreamStates[streamType].setLastAudibleIndex(scaledIndex, device); + if (currentDevice) { + mStreamStates[streamType].setLastAudibleIndex(scaledIndex, + getDeviceForStream(streamType)); + } + } + } + mLastAudibleIndex.put(device, getValidIndex(index)); + } + + public synchronized void adjustLastAudibleIndex(int deltaIndex, int device) { + setLastAudibleIndex(getIndex(device, + true /* lastAudible */) + deltaIndex, + device); + } + + public int getMaxIndex() { + return mIndexMax; + } + + // only called by setAllIndexes() which is already synchronized + public ConcurrentHashMap getAllIndexes(boolean lastAudible) { + if (lastAudible) { + return mLastAudibleIndex; + } else { + return mIndex; + } + } + + public synchronized void setAllIndexes(VolumeStreamState srcStream, boolean lastAudible) { + ConcurrentHashMap indexes = srcStream.getAllIndexes(lastAudible); + Set set = indexes.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + int device = ((Integer)entry.getKey()).intValue(); + int index = ((Integer)entry.getValue()).intValue(); + index = rescaleIndex(index, srcStream.getStreamType(), mStreamType); + + if (lastAudible) { + setLastAudibleIndex(index, device); + } else { + setIndex(index, device, false /* lastAudible */); + } + } + } + + public synchronized void setAllIndexesToMax() { + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + entry.setValue(mIndexMax); + } + set = mLastAudibleIndex.entrySet(); + i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + entry.setValue(mIndexMax); + } + } + + public synchronized void mute(IBinder cb, boolean state) { + VolumeDeathHandler handler = getDeathHandler(cb, state); + if (handler == null) { + Log.e(TAG, "Could not get client death handler for stream: "+mStreamType); + return; + } + handler.mute(state); + } + + public int getStreamType() { + return mStreamType; + } + + private int getValidIndex(int index) { + if (index < 0) { + return 0; + } else if (index > mIndexMax) { + return mIndexMax; + } + + return index; + } + + private class VolumeDeathHandler implements IBinder.DeathRecipient { + private IBinder mICallback; // To be notified of client's death + private int mMuteCount; // Number of active mutes for this client + + VolumeDeathHandler(IBinder cb) { + mICallback = cb; + } + + // must be called while synchronized on parent VolumeStreamState + public void mute(boolean state) { + if (state) { + if (mMuteCount == 0) { + // Register for client death notification + try { + // mICallback can be 0 if muted by AudioService + if (mICallback != null) { + mICallback.linkToDeath(this, 0); + } + mDeathHandlers.add(this); + // If the stream is not yet muted by any client, set level to 0 + if (muteCount() == 0) { + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + int device = ((Integer)entry.getKey()).intValue(); + setIndex(0, device, false /* lastAudible */); + } + sendMsg(mAudioHandler, + MSG_SET_ALL_VOLUMES, + SENDMSG_QUEUE, + 0, + 0, + VolumeStreamState.this, 0); + } + } catch (RemoteException e) { + // Client has died! + binderDied(); + return; + } + } else { + Log.w(TAG, "stream: "+mStreamType+" was already muted by this client"); + } + mMuteCount++; + } else { + if (mMuteCount == 0) { + Log.e(TAG, "unexpected unmute for stream: "+mStreamType); + } else { + mMuteCount--; + if (mMuteCount == 0) { + // Unregister from client death notification + mDeathHandlers.remove(this); + // mICallback can be 0 if muted by AudioService + if (mICallback != null) { + mICallback.unlinkToDeath(this, 0); + } + if (muteCount() == 0) { + // If the stream is not muted any more, restore its volume if + // ringer mode allows it + if (!isStreamAffectedByRingerMode(mStreamType) || + mRingerMode == AudioManager.RINGER_MODE_NORMAL) { + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + int device = ((Integer)entry.getKey()).intValue(); + setIndex(getIndex(device, + true /* lastAudible */), + device, + false /* lastAudible */); + } + sendMsg(mAudioHandler, + MSG_SET_ALL_VOLUMES, + SENDMSG_QUEUE, + 0, + 0, + VolumeStreamState.this, 0); + } + } + } + } + } + } + + public void binderDied() { + Log.w(TAG, "Volume service client died for stream: "+mStreamType); + if (mMuteCount != 0) { + // Reset all active mute requests from this client. + mMuteCount = 1; + mute(false); + } + } + } + + private synchronized int muteCount() { + int count = 0; + int size = mDeathHandlers.size(); + for (int i = 0; i < size; i++) { + count += mDeathHandlers.get(i).mMuteCount; + } + return count; + } + + // only called by mute() which is already synchronized + private VolumeDeathHandler getDeathHandler(IBinder cb, boolean state) { + VolumeDeathHandler handler; + int size = mDeathHandlers.size(); + for (int i = 0; i < size; i++) { + handler = mDeathHandlers.get(i); + if (cb == handler.mICallback) { + return handler; + } + } + // If this is the first mute request for this client, create a new + // client death handler. Otherwise, it is an out of sequence unmute request. + if (state) { + handler = new VolumeDeathHandler(cb); + } else { + Log.w(TAG, "stream was not muted by this client"); + handler = null; + } + return handler; + } + + private void dump(PrintWriter pw) { + pw.print(" Mute count: "); + pw.println(muteCount()); + pw.print(" Current: "); + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) + + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); + } + pw.print("\n Last audible: "); + set = mLastAudibleIndex.entrySet(); + i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) + + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); + } + } + } + + /** Thread that handles native AudioSystem control. */ + private class AudioSystemThread extends Thread { + AudioSystemThread() { + super("AudioService"); + } + + @Override + public void run() { + // Set this thread up so the handler will work on it + Looper.prepare(); + + synchronized(AudioService.this) { + mAudioHandler = new AudioHandler(); + + // Notify that the handler has been created + AudioService.this.notify(); + } + + // Listen for volume change requests that are set by VolumePanel + Looper.loop(); + } + } + + /** Handles internal volume messages in separate volume thread. */ + private class AudioHandler extends Handler { + + private void setDeviceVolume(VolumeStreamState streamState, int device) { + + // Apply volume + streamState.applyDeviceVolume(device); + + // Apply change to all streams using this one as alias + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + if (streamType != streamState.mStreamType && + mStreamVolumeAlias[streamType] == streamState.mStreamType) { + mStreamStates[streamType].applyDeviceVolume(getDeviceForStream(streamType)); + } + } + + // Post a persist volume msg + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_CURRENT|PERSIST_LAST_AUDIBLE, + device, + streamState, + PERSIST_DELAY); + + } + + private void setAllVolumes(VolumeStreamState streamState) { + + // Apply volume + streamState.applyAllVolumes(); + + // Apply change to all streams using this one as alias + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + if (streamType != streamState.mStreamType && + mStreamVolumeAlias[streamType] == streamState.mStreamType) { + mStreamStates[streamType].applyAllVolumes(); + } + } + } + + private void persistVolume(VolumeStreamState streamState, + int persistType, + int device) { + if ((persistType & PERSIST_CURRENT) != 0) { + System.putIntForUser(mContentResolver, + streamState.getSettingNameForDevice(false /* lastAudible */, device), + (streamState.getIndex(device, false /* lastAudible */) + 5)/ 10, + UserHandle.USER_CURRENT); + } + if ((persistType & PERSIST_LAST_AUDIBLE) != 0) { + System.putIntForUser(mContentResolver, + streamState.getSettingNameForDevice(true /* lastAudible */, device), + (streamState.getIndex(device, true /* lastAudible */) + 5) / 10, + UserHandle.USER_CURRENT); + } + } + + private void persistRingerMode(int ringerMode) { + Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); + } + + private void playSoundEffect(int effectType, int volume) { + synchronized (mSoundEffectsLock) { + if (mSoundPool == null) { + return; + } + float volFloat; + // use default if volume is not specified by caller + if (volume < 0) { + volFloat = (float)Math.pow(10, (float)sSoundEffectVolumeDb/20); + } else { + volFloat = (float) volume / 1000.0f; + } + + if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) { + mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], volFloat, volFloat, 0, 0, 1.0f); + } else { + MediaPlayer mediaPlayer = new MediaPlayer(); + try { + String filePath = Environment.getRootDirectory() + SOUND_EFFECTS_PATH + SOUND_EFFECT_FILES[SOUND_EFFECT_FILES_MAP[effectType][0]]; + mediaPlayer.setDataSource(filePath); + mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); + mediaPlayer.prepare(); + mediaPlayer.setVolume(volFloat, volFloat); + mediaPlayer.setOnCompletionListener(new OnCompletionListener() { + public void onCompletion(MediaPlayer mp) { + cleanupPlayer(mp); + } + }); + mediaPlayer.setOnErrorListener(new OnErrorListener() { + public boolean onError(MediaPlayer mp, int what, int extra) { + cleanupPlayer(mp); + return true; + } + }); + mediaPlayer.start(); + } catch (IOException ex) { + Log.w(TAG, "MediaPlayer IOException: "+ex); + } catch (IllegalArgumentException ex) { + Log.w(TAG, "MediaPlayer IllegalArgumentException: "+ex); + } catch (IllegalStateException ex) { + Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); + } + } + } + } + + private void onHandlePersistMediaButtonReceiver(ComponentName receiver) { + Settings.System.putStringForUser(mContentResolver, + Settings.System.MEDIA_BUTTON_RECEIVER, + receiver == null ? "" : receiver.flattenToString(), + UserHandle.USER_CURRENT); + } + + private void cleanupPlayer(MediaPlayer mp) { + if (mp != null) { + try { + mp.stop(); + mp.release(); + } catch (IllegalStateException ex) { + Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); + } + } + } + + private void setForceUse(int usage, int config) { + AudioSystem.setForceUse(usage, config); + } + + private void onPersistSafeVolumeState(int state) { + Settings.Global.putInt(mContentResolver, + Settings.Global.AUDIO_SAFE_VOLUME_STATE, + state); + } + + @Override + public void handleMessage(Message msg) { + + switch (msg.what) { + + case MSG_SET_DEVICE_VOLUME: + setDeviceVolume((VolumeStreamState) msg.obj, msg.arg1); + break; + + case MSG_SET_ALL_VOLUMES: + setAllVolumes((VolumeStreamState) msg.obj); + break; + + case MSG_PERSIST_VOLUME: + persistVolume((VolumeStreamState) msg.obj, msg.arg1, msg.arg2); + break; + + case MSG_PERSIST_MASTER_VOLUME: + Settings.System.putFloatForUser(mContentResolver, + Settings.System.VOLUME_MASTER, + (float)msg.arg1 / (float)1000.0, + UserHandle.USER_CURRENT); + break; + + case MSG_PERSIST_MASTER_VOLUME_MUTE: + Settings.System.putIntForUser(mContentResolver, + Settings.System.VOLUME_MASTER_MUTE, + msg.arg1, + UserHandle.USER_CURRENT); + break; + + case MSG_PERSIST_RINGER_MODE: + // note that the value persisted is the current ringer mode, not the + // value of ringer mode as of the time the request was made to persist + persistRingerMode(getRingerMode()); + break; + + case MSG_MEDIA_SERVER_DIED: + if (!mMediaServerOk) { + Log.e(TAG, "Media server died."); + // Force creation of new IAudioFlinger interface so that we are notified + // when new media_server process is back to life. + AudioSystem.setErrorCallback(mAudioSystemCallback); + sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, + null, 500); + } + break; + + case MSG_MEDIA_SERVER_STARTED: + Log.e(TAG, "Media server started."); + // indicate to audio HAL that we start the reconfiguration phase after a media + // server crash + // Note that MSG_MEDIA_SERVER_STARTED message is only received when the media server + // process restarts after a crash, not the first time it is started. + AudioSystem.setParameters("restarting=true"); + + // Restore device connection states + synchronized (mConnectedDevices) { + Set set = mConnectedDevices.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry device = (Map.Entry)i.next(); + AudioSystem.setDeviceConnectionState( + ((Integer)device.getKey()).intValue(), + AudioSystem.DEVICE_STATE_AVAILABLE, + (String)device.getValue()); + } + } + // Restore call state + AudioSystem.setPhoneState(mMode); + + // Restore forced usage for communcations and record + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm); + AudioSystem.setForceUse(AudioSystem.FOR_RECORD, mForcedUseForComm); + AudioSystem.setForceUse(AudioSystem.FOR_SYSTEM, mCameraSoundForced ? + AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE); + + // Restore stream volumes + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + VolumeStreamState streamState = mStreamStates[streamType]; + AudioSystem.initStreamVolume(streamType, 0, (streamState.mIndexMax + 5) / 10); + + streamState.applyAllVolumes(); + } + + // Restore ringer mode + setRingerModeInt(getRingerMode(), false); + + // Restore master volume + restoreMasterVolume(); + + // Reset device orientation (if monitored for this device) + if (mMonitorOrientation) { + setOrientationForAudioSystem(); + } + + synchronized (mBluetoothA2dpEnabledLock) { + AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, + mBluetoothA2dpEnabled ? + AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); + } + + synchronized (mSettingsLock) { + AudioSystem.setForceUse(AudioSystem.FOR_DOCK, + mDockAudioMediaEnabled ? + AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE); + } + + // indicate the end of reconfiguration phase to audio HAL + AudioSystem.setParameters("restarting=false"); + break; + + case MSG_LOAD_SOUND_EFFECTS: + loadSoundEffects(); + break; + + case MSG_PLAY_SOUND_EFFECT: + playSoundEffect(msg.arg1, msg.arg2); + break; + + case MSG_BTA2DP_DOCK_TIMEOUT: + // msg.obj == address of BTA2DP device + synchronized (mConnectedDevices) { + makeA2dpDeviceUnavailableNow( (String) msg.obj ); + } + break; + + case MSG_SET_FORCE_USE: + case MSG_SET_FORCE_BT_A2DP_USE: + setForceUse(msg.arg1, msg.arg2); + break; + + case MSG_PERSIST_MEDIABUTTONRECEIVER: + onHandlePersistMediaButtonReceiver( (ComponentName) msg.obj ); + break; + + case MSG_RCDISPLAY_CLEAR: + onRcDisplayClear(); + break; + + case MSG_RCDISPLAY_UPDATE: + // msg.obj is guaranteed to be non null + onRcDisplayUpdate( (RemoteControlStackEntry) msg.obj, msg.arg1); + break; + + case MSG_BT_HEADSET_CNCT_FAILED: + resetBluetoothSco(); + break; + + case MSG_SET_WIRED_DEVICE_CONNECTION_STATE: + onSetWiredDeviceConnectionState(msg.arg1, msg.arg2, (String)msg.obj); + mMediaEventWakeLock.release(); + break; + + case MSG_SET_A2DP_CONNECTION_STATE: + onSetA2dpConnectionState((BluetoothDevice)msg.obj, msg.arg1); + mMediaEventWakeLock.release(); + break; + + case MSG_REPORT_NEW_ROUTES: { + int N = mRoutesObservers.beginBroadcast(); + if (N > 0) { + AudioRoutesInfo routes; + synchronized (mCurAudioRoutes) { + routes = new AudioRoutesInfo(mCurAudioRoutes); + } + while (N > 0) { + N--; + IAudioRoutesObserver obs = mRoutesObservers.getBroadcastItem(N); + try { + obs.dispatchAudioRoutesChanged(routes); + } catch (RemoteException e) { + } + } + } + mRoutesObservers.finishBroadcast(); + break; + } + + case MSG_REEVALUATE_REMOTE: + onReevaluateRemote(); + break; + + case MSG_RCC_NEW_PLAYBACK_INFO: + onNewPlaybackInfoForRcc(msg.arg1 /* rccId */, msg.arg2 /* key */, + ((Integer)msg.obj).intValue() /* value */); + break; + case MSG_RCC_NEW_VOLUME_OBS: + onRegisterVolumeObserverForRcc(msg.arg1 /* rccId */, + (IRemoteVolumeObserver)msg.obj /* rvo */); + break; + + case MSG_SET_RSX_CONNECTION_STATE: + onSetRsxConnectionState(msg.arg1/*available*/, msg.arg2/*address*/); + break; + + case MSG_CHECK_MUSIC_ACTIVE: + onCheckMusicActive(); + break; + + case MSG_BROADCAST_AUDIO_BECOMING_NOISY: + onSendBecomingNoisyIntent(); + break; + + case MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED: + case MSG_CONFIGURE_SAFE_MEDIA_VOLUME: + onConfigureSafeVolume((msg.what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED)); + break; + case MSG_PERSIST_SAFE_VOLUME_STATE: + onPersistSafeVolumeState(msg.arg1); + break; + } + } + } + + private class SettingsObserver extends ContentObserver { + + SettingsObserver() { + super(new Handler()); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this); + mContentResolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.VOLUME_LINK_NOTIFICATION), false, this); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SAFE_HEADSET_VOLUME), false, this); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM), false, this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + // FIXME This synchronized is not necessary if mSettingsLock only protects mRingerMode. + // However there appear to be some missing locks around mRingerModeMutedStreams + // and mRingerModeAffectedStreams, so will leave this synchronized for now. + // mRingerModeMutedStreams and mMuteAffectedStreams are safe (only accessed once). + synchronized (mSettingsLock) { + if (uri.equals(Settings.System.getUriFor(Settings.System.MODE_RINGER_STREAMS_AFFECTED))) { + int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, + Settings.System.MODE_RINGER_STREAMS_AFFECTED, + ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| + (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), + UserHandle.USER_CURRENT); + if (mVoiceCapable) { + ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); + } else { + ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); + } + synchronized (mCameraSoundForced) { + if (mCameraSoundForced) { + ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } else { + ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } + } + if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { + /* + * Ensure all stream types that should be affected by ringer mode + * are in the proper state. + */ + mRingerModeAffectedStreams = ringerModeAffectedStreams; + setRingerModeInt(getRingerMode(), false); + } + + } else if (uri.equals(Settings.Global.getUriFor(Settings.Global.DOCK_AUDIO_MEDIA_ENABLED))) { + readDockAudioSettings(mContentResolver); + + } else if (uri.equals(Settings.System.getUriFor(Settings.System.VOLUME_LINK_NOTIFICATION))) { + mLinkNotificationWithVolume = Settings.System.getInt(mContentResolver, + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + if (mLinkNotificationWithVolume) { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } + + } else if (uri.equals(Settings.System.getUriFor(Settings.System.SAFE_HEADSET_VOLUME))) { + mSafeVolumeEnabled = safeVolumeEnabled(mContentResolver); + } else if (uri.equals(Settings.System.getUriFor(Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM))) { + mVolumeKeysControlRingStream = Settings.System.getIntForUser(mContentResolver, + Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM, 1, UserHandle.USER_CURRENT) == 1; + } + } + } + } + + // must be called synchronized on mConnectedDevices + private void makeA2dpDeviceAvailable(String address) { + // enable A2DP before notifying A2DP connection to avoid unecessary processing in + // audio policy manager + setBluetoothA2dpOnInt(true); + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + AudioSystem.DEVICE_STATE_AVAILABLE, + address); + // Reset A2DP suspend state each time a new sink is connected + AudioSystem.setParameters("A2dpSuspended=false"); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP), + address); + } + + private void onSendBecomingNoisyIntent() { + sendBroadcastToAll(new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); + } + + // must be called synchronized on mConnectedDevices + private void makeA2dpDeviceUnavailableNow(String address) { + if (noDelayInATwoDP) { + onSendBecomingNoisyIntent(); + } + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + AudioSystem.DEVICE_STATE_UNAVAILABLE, + address); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); + } + + // must be called synchronized on mConnectedDevices + private void makeA2dpDeviceUnavailableLater(String address) { + // prevent any activity on the A2DP audio output to avoid unwanted + // reconnection of the sink. + AudioSystem.setParameters("A2dpSuspended=true"); + // the device will be made unavailable later, so consider it disconnected right away + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); + // send the delayed message to make the device unavailable later + Message msg = mAudioHandler.obtainMessage(MSG_BTA2DP_DOCK_TIMEOUT, address); + mAudioHandler.sendMessageDelayed(msg, BTA2DP_DOCK_TIMEOUT_MILLIS); + + } + + // must be called synchronized on mConnectedDevices + private void cancelA2dpDeviceTimeout() { + mAudioHandler.removeMessages(MSG_BTA2DP_DOCK_TIMEOUT); + } + + // must be called synchronized on mConnectedDevices + private boolean hasScheduledA2dpDockTimeout() { + return mAudioHandler.hasMessages(MSG_BTA2DP_DOCK_TIMEOUT); + } + + private void onSetA2dpConnectionState(BluetoothDevice btDevice, int state) + { + if (btDevice == null) { + return; + } + String address = btDevice.getAddress(); + if (!BluetoothAdapter.checkBluetoothAddress(address)) { + address = ""; + } + synchronized (mConnectedDevices) { + boolean isConnected = + (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) && + mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP).equals(address)); + + if (isConnected && state != BluetoothProfile.STATE_CONNECTED) { + if (btDevice.isBluetoothDock()) { + if (state == BluetoothProfile.STATE_DISCONNECTED) { + // introduction of a delay for transient disconnections of docks when + // power is rapidly turned off/on, this message will be canceled if + // we reconnect the dock under a preset delay + makeA2dpDeviceUnavailableLater(address); + // the next time isConnected is evaluated, it will be false for the dock + } + } else { + makeA2dpDeviceUnavailableNow(address); + } + synchronized (mCurAudioRoutes) { + if (mCurAudioRoutes.mBluetoothName != null) { + mCurAudioRoutes.mBluetoothName = null; + sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, + SENDMSG_NOOP, 0, 0, null, 0); + } + } + } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { + if (btDevice.isBluetoothDock()) { + // this could be a reconnection after a transient disconnection + cancelA2dpDeviceTimeout(); + mDockAddress = address; + } else { + // this could be a connection of another A2DP device before the timeout of + // a dock: cancel the dock timeout, and make the dock unavailable now + if(hasScheduledA2dpDockTimeout()) { + cancelA2dpDeviceTimeout(); + makeA2dpDeviceUnavailableNow(mDockAddress); + } + } + makeA2dpDeviceAvailable(address); + synchronized (mCurAudioRoutes) { + String name = btDevice.getAliasName(); + if (!TextUtils.equals(mCurAudioRoutes.mBluetoothName, name)) { + mCurAudioRoutes.mBluetoothName = name; + sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, + SENDMSG_NOOP, 0, 0, null, 0); + } + } + } + } + } + + private boolean handleDeviceConnection(boolean connected, int device, String params) { + synchronized (mConnectedDevices) { + boolean isConnected = (mConnectedDevices.containsKey(device) && + (params.isEmpty() || mConnectedDevices.get(device).equals(params))); + + if (isConnected && !connected) { + AudioSystem.setDeviceConnectionState(device, + AudioSystem.DEVICE_STATE_UNAVAILABLE, + mConnectedDevices.get(device)); + mConnectedDevices.remove(device); + return true; + } else if (!isConnected && connected) { + AudioSystem.setDeviceConnectionState(device, + AudioSystem.DEVICE_STATE_AVAILABLE, + params); + mConnectedDevices.put(new Integer(device), params); + return true; + } + } + return false; + } + + // Devices which removal triggers intent ACTION_AUDIO_BECOMING_NOISY. The intent is only + // sent if none of these devices is connected. + int mBecomingNoisyIntentDevices = + AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE | + AudioSystem.DEVICE_OUT_ALL_A2DP | AudioSystem.DEVICE_OUT_AUX_DIGITAL | + AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET | AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET | + AudioSystem.DEVICE_OUT_ALL_USB; + + // must be called before removing the device from mConnectedDevices + private int checkSendBecomingNoisyIntent(int device, int state) { + int delay = 0; + if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) { + int devices = 0; + for (int dev : mConnectedDevices.keySet()) { + if ((dev & mBecomingNoisyIntentDevices) != 0) { + devices |= dev; + } + } + if (devices == device) { + sendMsg(mAudioHandler, + MSG_BROADCAST_AUDIO_BECOMING_NOISY, + SENDMSG_REPLACE, + 0, + 0, + null, + 0); + delay = 1000; + } + } + + if (mAudioHandler.hasMessages(MSG_SET_A2DP_CONNECTION_STATE) || + mAudioHandler.hasMessages(MSG_SET_WIRED_DEVICE_CONNECTION_STATE)) { + delay = 1000; + } + return delay; + } + + private void sendDeviceConnectionIntent(int device, int state, String name) + { + Intent intent = new Intent(); + + intent.putExtra("state", state); + intent.putExtra("name", name); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + + int connType = 0; + + if (device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) { + connType = AudioRoutesInfo.MAIN_HEADSET; + intent.setAction(Intent.ACTION_HEADSET_PLUG); + intent.putExtra("microphone", 1); + } else if (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) { + connType = AudioRoutesInfo.MAIN_HEADPHONES; + intent.setAction(Intent.ACTION_HEADSET_PLUG); + intent.putExtra("microphone", 0); + } else if (device == AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET) { + connType = AudioRoutesInfo.MAIN_DOCK_SPEAKERS; + intent.setAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG); + } else if (device == AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET) { + connType = AudioRoutesInfo.MAIN_DOCK_SPEAKERS; + intent.setAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG); + } else if (device == AudioSystem.DEVICE_OUT_AUX_DIGITAL) { + connType = AudioRoutesInfo.MAIN_HDMI; + intent.setAction(Intent.ACTION_HDMI_AUDIO_PLUG); + } + + synchronized (mCurAudioRoutes) { + if (connType != 0) { + int newConn = mCurAudioRoutes.mMainType; + if (state != 0) { + newConn |= connType; + } else { + newConn &= ~connType; + } + if (newConn != mCurAudioRoutes.mMainType) { + mCurAudioRoutes.mMainType = newConn; + sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, + SENDMSG_NOOP, 0, 0, null, 0); + } + } + } + + final long ident = Binder.clearCallingIdentity(); + try { + ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void onSetWiredDeviceConnectionState(int device, int state, String name) + { + synchronized (mConnectedDevices) { + if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || + (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE))) { + setBluetoothA2dpOnInt(true); + } + boolean isUsb = ((device & AudioSystem.DEVICE_OUT_ALL_USB) != 0); + handleDeviceConnection((state == 1), device, (isUsb ? name : "")); + if (state != 0) { + if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || + (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)) { + setBluetoothA2dpOnInt(false); + } + if ((device & mSafeMediaVolumeDevices) != 0) { + sendMsg(mAudioHandler, + MSG_CHECK_MUSIC_ACTIVE, + SENDMSG_REPLACE, + 0, + 0, + null, + MUSIC_ACTIVE_POLL_PERIOD_MS); + } + } + if (!isUsb) { + sendDeviceConnectionIntent(device, state, name); + } + } + } + + /* cache of the address of the last dock the device was connected to */ + private String mDockAddress; + + /** + * Receiver for misc intent broadcasts the Phone app cares about. + */ + private class AudioServiceBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + int device; + int state; + + if (action.equals(Intent.ACTION_DOCK_EVENT)) { + int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, + Intent.EXTRA_DOCK_STATE_UNDOCKED); + int config; + switch (dockState) { + case Intent.EXTRA_DOCK_STATE_DESK: + config = mForceAnalogDeskDock ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_BT_DESK_DOCK; + break; + case Intent.EXTRA_DOCK_STATE_CAR: + config = mForceAnalogCarDock ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_BT_CAR_DOCK; + break; + case Intent.EXTRA_DOCK_STATE_LE_DESK: + config = AudioSystem.FORCE_ANALOG_DOCK; + break; + case Intent.EXTRA_DOCK_STATE_HE_DESK: + config = AudioSystem.FORCE_DIGITAL_DOCK; + break; + case Intent.EXTRA_DOCK_STATE_UNDOCKED: + default: + config = AudioSystem.FORCE_NONE; + } + + // Low end docks have a menu to enable or disable audio + // (see mDockAudioMediaEnabled) + if (!((dockState == Intent.EXTRA_DOCK_STATE_LE_DESK) || + ((dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) && + (mDockState == Intent.EXTRA_DOCK_STATE_LE_DESK)))) { + AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config); + } + mDockState = dockState; + } else if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED) && noDelayInATwoDP) { + state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, + BluetoothProfile.STATE_DISCONNECTED); + BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + + onSetA2dpConnectionState(btDevice, state); + } else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) { + state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, + BluetoothProfile.STATE_DISCONNECTED); + device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO; + String address = null; + + BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (btDevice == null) { + return; + } + + address = btDevice.getAddress(); + BluetoothClass btClass = btDevice.getBluetoothClass(); + if (btClass != null) { + switch (btClass.getDeviceClass()) { + case BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET: + case BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE: + device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET; + break; + case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO: + device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT; + break; + } + } + + if (!BluetoothAdapter.checkBluetoothAddress(address)) { + address = ""; + } + + boolean connected = (state == BluetoothProfile.STATE_CONNECTED); + if (handleDeviceConnection(connected, device, address)) { + synchronized (mScoClients) { + if (connected) { + mBluetoothHeadsetDevice = btDevice; + } else { + mBluetoothHeadsetDevice = null; + resetBluetoothSco(); + } + } + } + } else if (action.equals(Intent.ACTION_HEADSET_PLUG)) { + state = intent.getIntExtra("state", 0); + if (state == 1) { + // Headset plugged in + adjustCurrentStreamVolume(); + // TODO: Cap volume at safe levels + } else { + // Headset disconnected + adjustCurrentStreamVolume(); + } + } else if (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) || + action.equals(Intent.ACTION_USB_AUDIO_DEVICE_PLUG)) { + state = intent.getIntExtra("state", 0); + int alsaCard = intent.getIntExtra("card", -1); + int alsaDevice = intent.getIntExtra("device", -1); + String params = (alsaCard == -1 && alsaDevice == -1 ? "" + : "card=" + alsaCard + ";device=" + alsaDevice); + device = action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ? + AudioSystem.DEVICE_OUT_USB_ACCESSORY : AudioSystem.DEVICE_OUT_USB_DEVICE; + Log.v(TAG, "Broadcast Receiver: Got " + + (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ? + "ACTION_USB_AUDIO_ACCESSORY_PLUG" : "ACTION_USB_AUDIO_DEVICE_PLUG") + + ", state = " + state + ", card: " + alsaCard + ", device: " + alsaDevice); + setWiredDeviceConnectionState(device, state, params); + } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) { + boolean broadcast = false; + int scoAudioState = AudioManager.SCO_AUDIO_STATE_ERROR; + synchronized (mScoClients) { + int btState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); + // broadcast intent if the connection was initated by AudioService + if (!mScoClients.isEmpty() && + (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL || + mScoAudioState == SCO_STATE_ACTIVATE_REQ || + mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) { + broadcast = true; + } + switch (btState) { + case BluetoothHeadset.STATE_AUDIO_CONNECTED: + scoAudioState = AudioManager.SCO_AUDIO_STATE_CONNECTED; + if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL && + mScoAudioState != SCO_STATE_DEACTIVATE_REQ && + mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) { + mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; + } + break; + case BluetoothHeadset.STATE_AUDIO_DISCONNECTED: + scoAudioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED; + mScoAudioState = SCO_STATE_INACTIVE; + clearAllScoClients(0, false); + break; + case BluetoothHeadset.STATE_AUDIO_CONNECTING: + if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL && + mScoAudioState != SCO_STATE_DEACTIVATE_REQ && + mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) { + mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; + } + default: + // do not broadcast CONNECTING or invalid state + broadcast = false; + break; + } + } + if (broadcast) { + broadcastScoConnectionState(scoAudioState); + //FIXME: this is to maintain compatibility with deprecated intent + // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate. + Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); + newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, scoAudioState); + sendStickyBroadcastToAll(newIntent); + } + } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { + mBootCompleted = true; + sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SENDMSG_NOOP, + 0, 0, null, 0); + + mKeyguardManager = + (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + mScoConnectionState = AudioManager.SCO_AUDIO_STATE_ERROR; + resetBluetoothSco(); + getBluetoothHeadset(); + //FIXME: this is to maintain compatibility with deprecated intent + // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate. + Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); + newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, + AudioManager.SCO_AUDIO_STATE_DISCONNECTED); + sendStickyBroadcastToAll(newIntent); + + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if (adapter != null) { + adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, + BluetoothProfile.A2DP); + } + + sendMsg(mAudioHandler, + MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED, + SENDMSG_REPLACE, + 0, + 0, + null, + SAFE_VOLUME_CONFIGURE_TIMEOUT_MS); + + adjustCurrentStreamVolume(); + } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) { + if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { + // a package is being removed, not replaced + String packageName = intent.getData().getSchemeSpecificPart(); + if (packageName != null) { + removeMediaButtonReceiverForPackage(packageName); + } + } + } else if (action.equals(Intent.ACTION_SCREEN_ON)) { + AudioSystem.setParameters("screen_state=on"); + } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { + AudioSystem.setParameters("screen_state=off"); + } else if (action.equalsIgnoreCase(Intent.ACTION_CONFIGURATION_CHANGED)) { + handleConfigurationChanged(context); + } else if (action.equals(Intent.ACTION_USER_BACKGROUND)) { + // attempt to stop music playback for background user + sendMsg(mAudioHandler, + MSG_BROADCAST_AUDIO_BECOMING_NOISY, + SENDMSG_REPLACE, + 0, + 0, + null, + 0); + } else if (action.equals(Intent.ACTION_USER_SWITCHED)) { + // the current audio focus owner is no longer valid + discardAudioFocusOwner(); + + // load volume settings for new user + readAudioSettings(true /*userSwitch*/); + // preserve STREAM_MUSIC volume from one user to the next. + sendMsg(mAudioHandler, + MSG_SET_ALL_VOLUMES, + SENDMSG_QUEUE, + 0, + 0, + mStreamStates[AudioSystem.STREAM_MUSIC], 0); + } else if (action.equals(Intent.ACTION_WIFI_DISPLAY_AUDIO)) { + state = intent.getIntExtra("state", 0); + Log.v(TAG, "WiFi Display device state "+state); + boolean isConnected = mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_PROXY); + if(state == 1 && !isConnected){ + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_PROXY, + AudioSystem.DEVICE_STATE_AVAILABLE, + ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_PROXY), ""); + }else if(state == 0 && isConnected){ + AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_PROXY, + AudioSystem.DEVICE_STATE_UNAVAILABLE, + ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_PROXY); + } + } + } + + private void adjustCurrentStreamVolume() { + VolumeStreamState streamState; + int device; + + for (int stream = 0; stream < AudioSystem.getNumStreamTypes(); stream++) { + if (stream == mStreamVolumeAlias[stream]) { + streamState = mStreamStates[mStreamVolumeAlias[stream]]; + device = getDeviceForStream(stream); + // apply stored value for device + streamState.applyDeviceVolume(device); + } + } + } + } + + private void masterVolumeChanged(final int flags) { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postMasterVolumeChanged(flags); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postMasterVolumeChanged(flags); + } + }); + } + } + + private void masterMuteChanged(final int flags) { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postMasterMuteChanged(flags); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postMasterMuteChanged(flags); + } + }); + } + } + + private void remoteSliderVisibility(final boolean hasRemotePlayback) { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postRemoteSliderVisibility(hasRemotePlayback); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postRemoteSliderVisibility(hasRemotePlayback); + } + }); + } + } + + private void showVolumeChangeUi(final int streamType, final int flags) { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postVolumeChanged(streamType, flags); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postVolumeChanged(streamType, flags); + } + }); + } + } + + private void remoteVolumeChanged(final int streamType, final int flags) { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postRemoteVolumeChanged(streamType, flags); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postRemoteVolumeChanged(streamType, flags); + } + }); + } + } + + private void displaySafeVolumeWarning() { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postDisplaySafeVolumeWarning(); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postDisplaySafeVolumeWarning(); + } + }); + } + } + + private void hasNewRemotePlaybackInfo() { + if (mUiContext != null && mVolumePanel != null) { + mVolumePanel.postHasNewRemotePlaybackInfo(); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mUiContext == null) { + mUiContext = ThemeUtils.createUiContext(mContext); + } + + final Context context = mUiContext != null ? mUiContext : mContext; + mVolumePanel = new VolumePanel(context, AudioService.this); + mVolumePanel.postHasNewRemotePlaybackInfo(); + } + }); + } + } + + //========================================================================================== + // AudioFocus + //========================================================================================== + + /* constant to identify focus stack entry that is used to hold the focus while the phone + * is ringing or during a call. Used by com.android.internal.telephony.CallManager when + * entering and exiting calls. + */ + public final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls"; + + private final static Object mAudioFocusLock = new Object(); + + private final static Object mRingingLock = new Object(); + + private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { + @Override + public void onCallStateChanged(int state, String incomingNumber) { + if (state == TelephonyManager.CALL_STATE_RINGING) { + //Log.v(TAG, " CALL_STATE_RINGING"); + synchronized(mRingingLock) { + mIsRinging = true; + } + } else if ((state == TelephonyManager.CALL_STATE_OFFHOOK) + || (state == TelephonyManager.CALL_STATE_IDLE)) { + synchronized(mRingingLock) { + mIsRinging = false; + } + } + } + }; + + /** + * Discard the current audio focus owner. + * Notify top of audio focus stack that it lost focus (regardless of possibility to reassign + * focus), remove it from the stack, and clear the remote control display. + */ + private void discardAudioFocusOwner() { + synchronized(mAudioFocusLock) { + if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { + // notify the current focus owner it lost focus after removing it from stack + FocusStackEntry focusOwner = mFocusStack.pop(); + try { + focusOwner.mFocusDispatcher.dispatchAudioFocusChange( + AudioManager.AUDIOFOCUS_LOSS, focusOwner.mClientId); + } catch (RemoteException e) { + Log.e(TAG, "Failure to signal loss of audio focus due to "+ e); + e.printStackTrace(); + } + focusOwner.unlinkToDeath(); + // clear RCD + synchronized(mRCStack) { + clearRemoteControlDisplay_syncAfRcs(); + } + } + } + } + + private void notifyTopOfAudioFocusStack() { + // notify the top of the stack it gained focus + if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { + String clientId = mFocusStack.peek().mClientId; + if (canReassignAudioFocusTo(clientId)) { + try { + mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange( + AudioManager.AUDIOFOCUS_GAIN, clientId); + } catch (RemoteException e) { + Log.e(TAG, "Failure to signal gain of audio control focus due to "+ e); + e.printStackTrace(); + } + } + } + } + + private static class FocusStackEntry { + public int mStreamType = -1;// no stream type + public IAudioFocusDispatcher mFocusDispatcher = null; + public IBinder mSourceRef = null; + public String mClientId; + public int mFocusChangeType; + public AudioFocusDeathHandler mHandler; + public String mPackageName; + public int mCallingUid; + + public FocusStackEntry() { + } + + public FocusStackEntry(int streamType, int duration, + IAudioFocusDispatcher afl, IBinder source, String id, AudioFocusDeathHandler hdlr, + String pn, int uid) { + mStreamType = streamType; + mFocusDispatcher = afl; + mSourceRef = source; + mClientId = id; + mFocusChangeType = duration; + mHandler = hdlr; + mPackageName = pn; + mCallingUid = uid; + } + + public void unlinkToDeath() { + try { + if (mSourceRef != null && mHandler != null) { + mSourceRef.unlinkToDeath(mHandler, 0); + mHandler = null; + } + } catch (java.util.NoSuchElementException e) { + Log.e(TAG, "Encountered " + e + " in FocusStackEntry.unlinkToDeath()"); + } + } + + @Override + protected void finalize() throws Throwable { + unlinkToDeath(); // unlink exception handled inside method + super.finalize(); + } + } + + private final Stack mFocusStack = new Stack(); + + /** + * Helper function: + * Display in the log the current entries in the audio focus stack + */ + private void dumpFocusStack(PrintWriter pw) { + pw.println("\nAudio Focus stack entries:"); + synchronized(mAudioFocusLock) { + Iterator stackIterator = mFocusStack.iterator(); + while(stackIterator.hasNext()) { + FocusStackEntry fse = stackIterator.next(); + pw.println(" source:" + fse.mSourceRef + + " -- pack: " + fse.mPackageName + + " -- client: " + fse.mClientId + + " -- duration: " + fse.mFocusChangeType + + " -- uid: " + fse.mCallingUid + + " -- stream: " + fse.mStreamType); + } + } + } + + /** + * Helper function: + * Called synchronized on mAudioFocusLock + * Remove a focus listener from the focus stack. + * @param focusListenerToRemove the focus listener + * @param signal if true and the listener was at the top of the focus stack, i.e. it was holding + * focus, notify the next item in the stack it gained focus. + */ + private void removeFocusStackEntry(String clientToRemove, boolean signal) { + // is the current top of the focus stack abandoning focus? (because of request, not death) + if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientToRemove)) + { + //Log.i(TAG, " removeFocusStackEntry() removing top of stack"); + FocusStackEntry fse = mFocusStack.pop(); + fse.unlinkToDeath(); + if (signal) { + // notify the new top of the stack it gained focus + notifyTopOfAudioFocusStack(); + // there's a new top of the stack, let the remote control know + synchronized(mRCStack) { + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } else { + // focus is abandoned by a client that's not at the top of the stack, + // no need to update focus. + Iterator stackIterator = mFocusStack.iterator(); + while(stackIterator.hasNext()) { + FocusStackEntry fse = (FocusStackEntry)stackIterator.next(); + if(fse.mClientId.equals(clientToRemove)) { + Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for " + + fse.mClientId); + stackIterator.remove(); + fse.unlinkToDeath(); + } + } + } + } + + /** + * Helper function: + * Called synchronized on mAudioFocusLock + * Remove focus listeners from the focus stack for a particular client when it has died. + */ + private void removeFocusStackEntryForClient(IBinder cb) { + // is the owner of the audio focus part of the client to remove? + boolean isTopOfStackForClientToRemove = !mFocusStack.isEmpty() && + mFocusStack.peek().mSourceRef.equals(cb); + Iterator stackIterator = mFocusStack.iterator(); + while(stackIterator.hasNext()) { + FocusStackEntry fse = (FocusStackEntry)stackIterator.next(); + if(fse.mSourceRef.equals(cb)) { + Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for " + + fse.mClientId); + stackIterator.remove(); + // the client just died, no need to unlink to its death + } + } + if (isTopOfStackForClientToRemove) { + // we removed an entry at the top of the stack: + // notify the new top of the stack it gained focus. + notifyTopOfAudioFocusStack(); + // there's a new top of the stack, let the remote control know + synchronized(mRCStack) { + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } + + /** + * Helper function: + * Returns true if the system is in a state where the focus can be reevaluated, false otherwise. + */ + private boolean canReassignAudioFocusTo(String clientId) { + // focus requests are rejected during a phone call or when the phone is ringing + // this is equivalent to IN_VOICE_COMM_FOCUS_ID having the focus + if (IN_VOICE_COMM_FOCUS_ID.equals(clientId)) { + return true; + } + if (!mFocusStack.isEmpty() && IN_VOICE_COMM_FOCUS_ID.equals(mFocusStack.peek().mClientId)) { + return false; + } + return true; + } + + /** + * Inner class to monitor audio focus client deaths, and remove them from the audio focus + * stack if necessary. + */ + private class AudioFocusDeathHandler implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + + AudioFocusDeathHandler(IBinder cb) { + mCb = cb; + } + + public void binderDied() { + synchronized(mAudioFocusLock) { + Log.w(TAG, " AudioFocus audio focus client died"); + removeFocusStackEntryForClient(mCb); + } + } + + public IBinder getBinder() { + return mCb; + } + } + + + /** @see AudioManager#requestAudioFocus(IAudioFocusDispatcher, int, int) */ + public int requestAudioFocus(int mainStreamType, int focusChangeHint, IBinder cb, + IAudioFocusDispatcher fd, String clientId, String callingPackageName) { + Log.i(TAG, " AudioFocus requestAudioFocus() from " + clientId); + // the main stream type for the audio focus request is currently not used. It may + // potentially be used to handle multiple stream type-dependent audio focuses. + + // we need a valid binder callback for clients + if (!cb.pingBinder()) { + Log.e(TAG, " AudioFocus DOA client for requestAudioFocus(), aborting."); + return AudioManager.AUDIOFOCUS_REQUEST_FAILED; + } + + synchronized(mAudioFocusLock) { + if (!canReassignAudioFocusTo(clientId)) { + return AudioManager.AUDIOFOCUS_REQUEST_FAILED; + } + + // handle the potential premature death of the new holder of the focus + // (premature death == death before abandoning focus) + // Register for client death notification + AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb); + try { + cb.linkToDeath(afdh, 0); + } catch (RemoteException e) { + // client has already died! + Log.w(TAG, "AudioFocus requestAudioFocus() could not link to "+cb+" binder death"); + return AudioManager.AUDIOFOCUS_REQUEST_FAILED; + } + + if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientId)) { + // if focus is already owned by this client and the reason for acquiring the focus + // hasn't changed, don't do anything + if (mFocusStack.peek().mFocusChangeType == focusChangeHint) { + // unlink death handler so it can be gc'ed. + // linkToDeath() creates a JNI global reference preventing collection. + cb.unlinkToDeath(afdh, 0); + return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; + } + // the reason for the audio focus request has changed: remove the current top of + // stack and respond as if we had a new focus owner + FocusStackEntry fse = mFocusStack.pop(); + fse.unlinkToDeath(); + } + + // notify current top of stack it is losing focus + if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { + try { + mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange( + -1 * focusChangeHint, // loss and gain codes are inverse of each other + mFocusStack.peek().mClientId); + } catch (RemoteException e) { + Log.e(TAG, " Failure to signal loss of focus due to "+ e); + e.printStackTrace(); + } + } + + // focus requester might already be somewhere below in the stack, remove it + removeFocusStackEntry(clientId, false /* signal */); + + // push focus requester at the top of the audio focus stack + mFocusStack.push(new FocusStackEntry(mainStreamType, focusChangeHint, fd, cb, + clientId, afdh, callingPackageName, Binder.getCallingUid())); + + // there's a new top of the stack, let the remote control know + synchronized(mRCStack) { + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + }//synchronized(mAudioFocusLock) + + return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; + } + + /** @see AudioManager#abandonAudioFocus(IAudioFocusDispatcher) */ + public int abandonAudioFocus(IAudioFocusDispatcher fl, String clientId) { + Log.i(TAG, " AudioFocus abandonAudioFocus() from " + clientId); + try { + // this will take care of notifying the new focus owner if needed + synchronized(mAudioFocusLock) { + removeFocusStackEntry(clientId, true); + } + } catch (java.util.ConcurrentModificationException cme) { + // Catching this exception here is temporary. It is here just to prevent + // a crash seen when the "Silent" notification is played. This is believed to be fixed + // but this try catch block is left just to be safe. + Log.e(TAG, "FATAL EXCEPTION AudioFocus abandonAudioFocus() caused " + cme); + cme.printStackTrace(); + } + + return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; + } + + + public void unregisterAudioFocusClient(String clientId) { + synchronized(mAudioFocusLock) { + removeFocusStackEntry(clientId, false); + } + } + + + //========================================================================================== + // RemoteControl + //========================================================================================== + public void dispatchMediaKeyEvent(KeyEvent keyEvent) { + filterMediaKeyEvent(keyEvent, false /*needWakeLock*/); + } + + public void dispatchMediaKeyEventUnderWakelock(KeyEvent keyEvent) { + filterMediaKeyEvent(keyEvent, true /*needWakeLock*/); + } + + private void filterMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { + // sanity check on the incoming key event + if (!isValidMediaKeyEvent(keyEvent)) { + Log.e(TAG, "not dispatching invalid media key event " + keyEvent); + return; + } + // event filtering for telephony + synchronized(mRingingLock) { + synchronized(mRCStack) { + if ((mMediaReceiverForCalls != null) && + (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL))) { + dispatchMediaKeyEventForCalls(keyEvent, needWakeLock); + return; + } + } + } + // event filtering based on voice-based interactions + if (isValidVoiceInputKeyCode(keyEvent.getKeyCode())) { + filterVoiceInputKeyEvent(keyEvent, needWakeLock); + } else { + dispatchMediaKeyEvent(keyEvent, needWakeLock); + } + } + + /** + * Handles the dispatching of the media button events to the telephony package. + * Precondition: mMediaReceiverForCalls != null + * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons + * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event + * is dispatched. + */ + private void dispatchMediaKeyEventForCalls(KeyEvent keyEvent, boolean needWakeLock) { + Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); + keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); + keyIntent.setPackage(mMediaReceiverForCalls.getPackageName()); + if (needWakeLock) { + mMediaEventWakeLock.acquire(); + keyIntent.putExtra(EXTRA_WAKELOCK_ACQUIRED, WAKELOCK_RELEASE_ON_FINISHED); + } + final long ident = Binder.clearCallingIdentity(); + try { + mContext.sendOrderedBroadcastAsUser(keyIntent, UserHandle.ALL, + null, mKeyEventDone, mAudioHandler, Activity.RESULT_OK, null, null); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Handles the dispatching of the media button events to one of the registered listeners, + * or if there was none, broadcast an ACTION_MEDIA_BUTTON intent to the rest of the system. + * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons + * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event + * is dispatched. + */ + private void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { + if (needWakeLock) { + mMediaEventWakeLock.acquire(); + } + Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); + keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); + synchronized(mRCStack) { + if (!mRCStack.empty()) { + // send the intent that was registered by the client + try { + mRCStack.peek().mMediaIntent.send(mContext, + needWakeLock ? WAKELOCK_RELEASE_ON_FINISHED : 0 /*code*/, + keyIntent, AudioService.this, mAudioHandler); + } catch (CanceledException e) { + Log.e(TAG, "Error sending pending intent " + mRCStack.peek()); + e.printStackTrace(); + } + } else { + // legacy behavior when nobody registered their media button event receiver + // through AudioManager + if (needWakeLock) { + keyIntent.putExtra(EXTRA_WAKELOCK_ACQUIRED, WAKELOCK_RELEASE_ON_FINISHED); + } + final long ident = Binder.clearCallingIdentity(); + try { + mContext.sendOrderedBroadcastAsUser(keyIntent, UserHandle.ALL, + null, mKeyEventDone, + mAudioHandler, Activity.RESULT_OK, null, null); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + } + } + + /** + * The different actions performed in response to a voice button key event. + */ + private final static int VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS = 1; + private final static int VOICEBUTTON_ACTION_START_VOICE_INPUT = 2; + private final static int VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS = 3; + + private final Object mVoiceEventLock = new Object(); + private boolean mVoiceButtonDown; + private boolean mVoiceButtonHandled; + + /** + * Filter key events that may be used for voice-based interactions + * @param keyEvent a non-null KeyEvent whose key code is that of one of the supported + * media buttons that can be used to trigger voice-based interactions. + * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event + * is dispatched. + */ + private void filterVoiceInputKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { + if (DEBUG_RC) { + Log.v(TAG, "voice input key event: " + keyEvent + ", needWakeLock=" + needWakeLock); + } + + int voiceButtonAction = VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS; + int keyAction = keyEvent.getAction(); + synchronized (mVoiceEventLock) { + if (keyAction == KeyEvent.ACTION_DOWN) { + if (keyEvent.getRepeatCount() == 0) { + // initial down + mVoiceButtonDown = true; + mVoiceButtonHandled = false; + } else if (mVoiceButtonDown && !mVoiceButtonHandled + && (keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) { + // long-press, start voice-based interactions + mVoiceButtonHandled = true; + voiceButtonAction = VOICEBUTTON_ACTION_START_VOICE_INPUT; + } + } else if (keyAction == KeyEvent.ACTION_UP) { + if (mVoiceButtonDown) { + // voice button up + mVoiceButtonDown = false; + if (!mVoiceButtonHandled && !keyEvent.isCanceled()) { + voiceButtonAction = VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS; + } + } + } + }//synchronized (mVoiceEventLock) + + // take action after media button event filtering for voice-based interactions + switch (voiceButtonAction) { + case VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS: + if (DEBUG_RC) Log.v(TAG, " ignore key event"); + break; + case VOICEBUTTON_ACTION_START_VOICE_INPUT: + if (DEBUG_RC) Log.v(TAG, " start voice-based interactions"); + // then start the voice-based interactions + startVoiceBasedInteractions(needWakeLock); + break; + case VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS: + if (DEBUG_RC) Log.v(TAG, " send simulated key event, wakelock=" + needWakeLock); + sendSimulatedMediaButtonEvent(keyEvent, needWakeLock); + break; + } + } + + private void sendSimulatedMediaButtonEvent(KeyEvent originalKeyEvent, boolean needWakeLock) { + // send DOWN event + KeyEvent keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_DOWN); + dispatchMediaKeyEvent(keyEvent, needWakeLock); + // send UP event + keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_UP); + dispatchMediaKeyEvent(keyEvent, needWakeLock); + + } + + + private static boolean isValidMediaKeyEvent(KeyEvent keyEvent) { + if (keyEvent == null) { + return false; + } + final int keyCode = keyEvent.getKeyCode(); + switch (keyCode) { + case KeyEvent.KEYCODE_MUTE: + case KeyEvent.KEYCODE_HEADSETHOOK: + case KeyEvent.KEYCODE_MEDIA_PLAY: + case KeyEvent.KEYCODE_MEDIA_PAUSE: + case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: + case KeyEvent.KEYCODE_MEDIA_STOP: + case KeyEvent.KEYCODE_MEDIA_NEXT: + case KeyEvent.KEYCODE_MEDIA_PREVIOUS: + case KeyEvent.KEYCODE_MEDIA_REWIND: + case KeyEvent.KEYCODE_MEDIA_RECORD: + case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: + case KeyEvent.KEYCODE_MEDIA_CLOSE: + case KeyEvent.KEYCODE_MEDIA_EJECT: + break; + default: + return false; + } + return true; + } + + /** + * Checks whether the given key code is one that can trigger the launch of voice-based + * interactions. + * @param keyCode the key code associated with the key event + * @return true if the key is one of the supported voice-based interaction triggers + */ + private static boolean isValidVoiceInputKeyCode(int keyCode) { + if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { + return true; + } else { + return false; + } + } + + /** + * Tell the system to start voice-based interactions / voice commands + */ + private void startVoiceBasedInteractions(boolean needWakeLock) { + Intent voiceIntent = null; + // select which type of search to launch: + // - screen on and device unlocked: action is ACTION_WEB_SEARCH + // - device locked or screen off: action is ACTION_VOICE_SEARCH_HANDS_FREE + // with EXTRA_SECURE set to true if the device is securely locked + PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); + boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked(); + if (!isLocked && pm.isScreenOn()) { + voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH); + } else { + voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE); + voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE, + isLocked && mKeyguardManager.isKeyguardSecure()); + } + // start the search activity + if (needWakeLock) { + mMediaEventWakeLock.acquire(); + } + try { + if (voiceIntent != null) { + voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + mContext.startActivity(voiceIntent); + } + } catch (ActivityNotFoundException e) { + Log.w(TAG, "No activity for search: " + e); + } finally { + if (needWakeLock) { + mMediaEventWakeLock.release(); + } + } + } + + private PowerManager.WakeLock mMediaEventWakeLock; + + private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; //magic number + + // only set when wakelock was acquired, no need to check value when received + private static final String EXTRA_WAKELOCK_ACQUIRED = + "android.media.AudioService.WAKELOCK_ACQUIRED"; + + public void onSendFinished(PendingIntent pendingIntent, Intent intent, + int resultCode, String resultData, Bundle resultExtras) { + if (resultCode == WAKELOCK_RELEASE_ON_FINISHED) { + mMediaEventWakeLock.release(); + } + } + + BroadcastReceiver mKeyEventDone = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + Bundle extras = intent.getExtras(); + if (extras == null) { + return; + } + if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)) { + mMediaEventWakeLock.release(); + } + } + }; + + private final Object mCurrentRcLock = new Object(); + /** + * The one remote control client which will receive a request for display information. + * This object may be null. + * Access protected by mCurrentRcLock. + */ + private IRemoteControlClient mCurrentRcClient = null; + + private final static int RC_INFO_NONE = 0; + private final static int RC_INFO_ALL = + RemoteControlClient.FLAG_INFORMATION_REQUEST_ALBUM_ART | + RemoteControlClient.FLAG_INFORMATION_REQUEST_KEY_MEDIA | + RemoteControlClient.FLAG_INFORMATION_REQUEST_METADATA | + RemoteControlClient.FLAG_INFORMATION_REQUEST_PLAYSTATE; + + /** + * A monotonically increasing generation counter for mCurrentRcClient. + * Only accessed with a lock on mCurrentRcLock. + * No value wrap-around issues as we only act on equal values. + */ + private int mCurrentRcClientGen = 0; + + /** + * Inner class to monitor remote control client deaths, and remove the client for the + * remote control stack if necessary. + */ + private class RcClientDeathHandler implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + private PendingIntent mMediaIntent; + + RcClientDeathHandler(IBinder cb, PendingIntent pi) { + mCb = cb; + mMediaIntent = pi; + } + + public void binderDied() { + Log.w(TAG, " RemoteControlClient died"); + // remote control client died, make sure the displays don't use it anymore + // by setting its remote control client to null + registerRemoteControlClient(mMediaIntent, null/*rcClient*/, null/*ignored*/); + // the dead client was maybe handling remote playback, reevaluate + postReevaluateRemote(); + } + + public IBinder getBinder() { + return mCb; + } + } + + /** + * A global counter for RemoteControlClient identifiers + */ + private static int sLastRccId = 0; + + private class RemotePlaybackState { + int mRccId; + int mVolume; + int mVolumeMax; + int mVolumeHandling; + + private RemotePlaybackState(int id, int vol, int volMax) { + mRccId = id; + mVolume = vol; + mVolumeMax = volMax; + mVolumeHandling = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME_HANDLING; + } + } + + /** + * Internal cache for the playback information of the RemoteControlClient whose volume gets to + * be controlled by the volume keys ("main"), so we don't have to iterate over the RC stack + * every time we need this info. + */ + private RemotePlaybackState mMainRemote; + /** + * Indicates whether the "main" RemoteControlClient is considered active. + * Use synchronized on mMainRemote. + */ + private boolean mMainRemoteIsActive; + /** + * Indicates whether there is remote playback going on. True even if there is no "active" + * remote playback (mMainRemoteIsActive is false), but a RemoteControlClient has declared it + * handles remote playback. + * Use synchronized on mMainRemote. + */ + private boolean mHasRemotePlayback; + + private static class RemoteControlStackEntry { + public int mRccId = RemoteControlClient.RCSE_ID_UNREGISTERED; + /** + * The target for the ACTION_MEDIA_BUTTON events. + * Always non null. + */ + public PendingIntent mMediaIntent; + /** + * The registered media button event receiver. + * Always non null. + */ + public ComponentName mReceiverComponent; + public String mCallingPackageName; + public int mCallingUid; + /** + * Provides access to the information to display on the remote control. + * May be null (when a media button event receiver is registered, + * but no remote control client has been registered) */ + public IRemoteControlClient mRcClient; + public RcClientDeathHandler mRcClientDeathHandler; + /** + * Information only used for non-local playback + */ + public int mPlaybackType; + public int mPlaybackVolume; + public int mPlaybackVolumeMax; + public int mPlaybackVolumeHandling; + public int mPlaybackStream; + public int mPlaybackState; + public IRemoteVolumeObserver mRemoteVolumeObs; + + public void resetPlaybackInfo() { + mPlaybackType = RemoteControlClient.PLAYBACK_TYPE_LOCAL; + mPlaybackVolume = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME; + mPlaybackVolumeMax = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME; + mPlaybackVolumeHandling = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME_HANDLING; + mPlaybackStream = AudioManager.STREAM_MUSIC; + mPlaybackState = RemoteControlClient.PLAYSTATE_STOPPED; + mRemoteVolumeObs = null; + } + + /** precondition: mediaIntent != null, eventReceiver != null */ + public RemoteControlStackEntry(PendingIntent mediaIntent, ComponentName eventReceiver) { + mMediaIntent = mediaIntent; + mReceiverComponent = eventReceiver; + mCallingUid = -1; + mRcClient = null; + mRccId = ++sLastRccId; + + resetPlaybackInfo(); + } + + public void unlinkToRcClientDeath() { + if ((mRcClientDeathHandler != null) && (mRcClientDeathHandler.mCb != null)) { + try { + mRcClientDeathHandler.mCb.unlinkToDeath(mRcClientDeathHandler, 0); + mRcClientDeathHandler = null; + } catch (java.util.NoSuchElementException e) { + // not much we can do here + Log.e(TAG, "Encountered " + e + " in unlinkToRcClientDeath()"); + e.printStackTrace(); + } + } + } + + @Override + protected void finalize() throws Throwable { + unlinkToRcClientDeath();// unlink exception handled inside method + super.finalize(); + } + } + + /** + * The stack of remote control event receivers. + * Code sections and methods that modify the remote control event receiver stack are + * synchronized on mRCStack, but also BEFORE on mFocusLock as any change in either + * stack, audio focus or RC, can lead to a change in the remote control display + */ + private final Stack mRCStack = new Stack(); + + /** + * The component the telephony package can register so telephony calls have priority to + * handle media button events + */ + private ComponentName mMediaReceiverForCalls = null; + + /** + * Helper function: + * Display in the log the current entries in the remote control focus stack + */ + private void dumpRCStack(PrintWriter pw) { + pw.println("\nRemote Control stack entries:"); + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + pw.println(" pi: " + rcse.mMediaIntent + + " -- pack: " + rcse.mCallingPackageName + + " -- ercvr: " + rcse.mReceiverComponent + + " -- client: " + rcse.mRcClient + + " -- uid: " + rcse.mCallingUid + + " -- type: " + rcse.mPlaybackType + + " state: " + rcse.mPlaybackState); + } + } + } + + /** + * Helper function: + * Display in the log the current entries in the remote control stack, focusing + * on RemoteControlClient data + */ + private void dumpRCCStack(PrintWriter pw) { + pw.println("\nRemote Control Client stack entries:"); + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + pw.println(" uid: " + rcse.mCallingUid + + " -- id: " + rcse.mRccId + + " -- type: " + rcse.mPlaybackType + + " -- state: " + rcse.mPlaybackState + + " -- vol handling: " + rcse.mPlaybackVolumeHandling + + " -- vol: " + rcse.mPlaybackVolume + + " -- volMax: " + rcse.mPlaybackVolumeMax + + " -- volObs: " + rcse.mRemoteVolumeObs); + + } + } + synchronized (mMainRemote) { + pw.println("\nRemote Volume State:"); + pw.println(" has remote: " + mHasRemotePlayback); + pw.println(" is remote active: " + mMainRemoteIsActive); + pw.println(" rccId: " + mMainRemote.mRccId); + pw.println(" volume handling: " + + ((mMainRemote.mVolumeHandling == RemoteControlClient.PLAYBACK_VOLUME_FIXED) ? + "PLAYBACK_VOLUME_FIXED(0)" : "PLAYBACK_VOLUME_VARIABLE(1)")); + pw.println(" volume: " + mMainRemote.mVolume); + pw.println(" volume steps: " + mMainRemote.mVolumeMax); + } + } + + /** + * Helper function: + * Remove any entry in the remote control stack that has the same package name as packageName + * Pre-condition: packageName != null + */ + private void removeMediaButtonReceiverForPackage(String packageName) { + synchronized(mRCStack) { + if (mRCStack.empty()) { + return; + } else { + RemoteControlStackEntry oldTop = mRCStack.peek(); + Iterator stackIterator = mRCStack.iterator(); + // iterate over the stack entries + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = (RemoteControlStackEntry)stackIterator.next(); + if (packageName.equalsIgnoreCase(rcse.mReceiverComponent.getPackageName())) { + // a stack entry is from the package being removed, remove it from the stack + stackIterator.remove(); + rcse.unlinkToRcClientDeath(); + } + } + if (mRCStack.empty()) { + // no saved media button receiver + mAudioHandler.sendMessage( + mAudioHandler.obtainMessage(MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, + null)); + } else if (oldTop != mRCStack.peek()) { + // the top of the stack has changed, save it in the system settings + // by posting a message to persist it + mAudioHandler.sendMessage( + mAudioHandler.obtainMessage(MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, + mRCStack.peek().mReceiverComponent)); + } + } + } + } + + /** + * Helper function: + * Restore remote control receiver from the system settings. + */ + private void restoreMediaButtonReceiver() { + String receiverName = Settings.System.getStringForUser(mContentResolver, + Settings.System.MEDIA_BUTTON_RECEIVER, UserHandle.USER_CURRENT); + if ((null != receiverName) && !receiverName.isEmpty()) { + ComponentName eventReceiver = ComponentName.unflattenFromString(receiverName); + // construct a PendingIntent targeted to the restored component name + // for the media button and register it + Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); + // the associated intent will be handled by the component being registered + mediaButtonIntent.setComponent(eventReceiver); + PendingIntent pi = PendingIntent.getBroadcast(mContext, + 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); + registerMediaButtonIntent(pi, eventReceiver); + } + } + + /** + * Helper function: + * Set the new remote control receiver at the top of the RC focus stack. + * precondition: mediaIntent != null, target != null + */ + private void pushMediaButtonReceiver(PendingIntent mediaIntent, ComponentName target) { + // already at top of stack? + if (!mRCStack.empty() && mRCStack.peek().mMediaIntent.equals(mediaIntent)) { + return; + } + Iterator stackIterator = mRCStack.iterator(); + RemoteControlStackEntry rcse = null; + boolean wasInsideStack = false; + while(stackIterator.hasNext()) { + rcse = (RemoteControlStackEntry)stackIterator.next(); + if(rcse.mMediaIntent.equals(mediaIntent)) { + wasInsideStack = true; + stackIterator.remove(); + break; + } + } + if (!wasInsideStack) { + rcse = new RemoteControlStackEntry(mediaIntent, target); + } + mRCStack.push(rcse); + + // post message to persist the default media button receiver + mAudioHandler.sendMessage( mAudioHandler.obtainMessage( + MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, target/*obj*/) ); + } + + /** + * Helper function: + * Remove the remote control receiver from the RC focus stack. + * precondition: pi != null + */ + private void removeMediaButtonReceiver(PendingIntent pi) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = (RemoteControlStackEntry)stackIterator.next(); + if(rcse.mMediaIntent.equals(pi)) { + stackIterator.remove(); + rcse.unlinkToRcClientDeath(); + break; + } + } + } + + /** + * Helper function: + * Called synchronized on mRCStack + */ + private boolean isCurrentRcController(PendingIntent pi) { + if (!mRCStack.empty() && mRCStack.peek().mMediaIntent.equals(pi)) { + return true; + } + return false; + } + + //========================================================================================== + // Remote control display / client + //========================================================================================== + /** + * Update the remote control displays with the new "focused" client generation + */ + private void setNewRcClientOnDisplays_syncRcsCurrc(int newClientGeneration, + PendingIntent newMediaIntent, boolean clearing) { + // NOTE: Only one IRemoteControlDisplay supported in this implementation + if (mRcDisplay != null) { + try { + mRcDisplay.setCurrentClientId( + newClientGeneration, newMediaIntent, clearing); + } catch (RemoteException e) { + Log.e(TAG, "Dead display in setNewRcClientOnDisplays_syncRcsCurrc() "+e); + // if we had a display before, stop monitoring its death + rcDisplay_stopDeathMonitor_syncRcStack(); + mRcDisplay = null; + } + } + } + + /** + * Update the remote control clients with the new "focused" client generation + */ + private void setNewRcClientGenerationOnClients_syncRcsCurrc(int newClientGeneration) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry se = stackIterator.next(); + if ((se != null) && (se.mRcClient != null)) { + try { + se.mRcClient.setCurrentClientGenerationId(newClientGeneration); + } catch (RemoteException e) { + Log.w(TAG, "Dead client in setNewRcClientGenerationOnClients_syncRcsCurrc()"+e); + stackIterator.remove(); + se.unlinkToRcClientDeath(); + } + } + } + } + + /** + * Update the displays and clients with the new "focused" client generation and name + * @param newClientGeneration the new generation value matching a client update + * @param newClientEventReceiver the media button event receiver associated with the client. + * May be null, which implies there is no registered media button event receiver. + * @param clearing true if the new client generation value maps to a remote control update + * where the display should be cleared. + */ + private void setNewRcClient_syncRcsCurrc(int newClientGeneration, + PendingIntent newMediaIntent, boolean clearing) { + // send the new valid client generation ID to all displays + setNewRcClientOnDisplays_syncRcsCurrc(newClientGeneration, newMediaIntent, clearing); + // send the new valid client generation ID to all clients + setNewRcClientGenerationOnClients_syncRcsCurrc(newClientGeneration); + } + + /** + * Called when processing MSG_RCDISPLAY_CLEAR event + */ + private void onRcDisplayClear() { + if (DEBUG_RC) Log.i(TAG, "Clear remote control display"); + + synchronized(mRCStack) { + synchronized(mCurrentRcLock) { + mCurrentRcClientGen++; + // synchronously update the displays and clients with the new client generation + setNewRcClient_syncRcsCurrc(mCurrentRcClientGen, + null /*newMediaIntent*/, true /*clearing*/); + } + } + } + + /** + * Called when processing MSG_RCDISPLAY_UPDATE event + */ + private void onRcDisplayUpdate(RemoteControlStackEntry rcse, int flags /* USED ?*/) { + synchronized(mRCStack) { + synchronized(mCurrentRcLock) { + if ((mCurrentRcClient != null) && (mCurrentRcClient.equals(rcse.mRcClient))) { + if (DEBUG_RC) Log.i(TAG, "Display/update remote control "); + + mCurrentRcClientGen++; + // synchronously update the displays and clients with + // the new client generation + setNewRcClient_syncRcsCurrc(mCurrentRcClientGen, + rcse.mMediaIntent /*newMediaIntent*/, + false /*clearing*/); + + // tell the current client that it needs to send info + try { + mCurrentRcClient.onInformationRequested(mCurrentRcClientGen, + flags, mArtworkExpectedWidth, mArtworkExpectedHeight); + } catch (RemoteException e) { + Log.e(TAG, "Current valid remote client is dead: "+e); + mCurrentRcClient = null; + } + } else { + // the remote control display owner has changed between the + // the message to update the display was sent, and the time it + // gets to be processed (now) + } + } + } + } + + + /** + * Helper function: + * Called synchronized on mRCStack + */ + private void clearRemoteControlDisplay_syncAfRcs() { + synchronized(mCurrentRcLock) { + mCurrentRcClient = null; + } + // will cause onRcDisplayClear() to be called in AudioService's handler thread + mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_CLEAR) ); + } + + /** + * Helper function for code readability: only to be called from + * checkUpdateRemoteControlDisplay_syncAfRcs() which checks the preconditions for + * this method. + * Preconditions: + * - called synchronized mAudioFocusLock then on mRCStack + * - mRCStack.isEmpty() is false + */ + private void updateRemoteControlDisplay_syncAfRcs(int infoChangedFlags) { + RemoteControlStackEntry rcse = mRCStack.peek(); + int infoFlagsAboutToBeUsed = infoChangedFlags; + // this is where we enforce opt-in for information display on the remote controls + // with the new AudioManager.registerRemoteControlClient() API + if (rcse.mRcClient == null) { + //Log.w(TAG, "Can't update remote control display with null remote control client"); + clearRemoteControlDisplay_syncAfRcs(); + return; + } + synchronized(mCurrentRcLock) { + if (!rcse.mRcClient.equals(mCurrentRcClient)) { + // new RC client, assume every type of information shall be queried + infoFlagsAboutToBeUsed = RC_INFO_ALL; + } + mCurrentRcClient = rcse.mRcClient; + } + // will cause onRcDisplayUpdate() to be called in AudioService's handler thread + mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_UPDATE, + infoFlagsAboutToBeUsed /* arg1 */, 0, rcse /* obj, != null */) ); + } + + /** + * Helper function: + * Called synchronized on mAudioFocusLock, then mRCStack + * Check whether the remote control display should be updated, triggers the update if required + * @param infoChangedFlags the flags corresponding to the remote control client information + * that has changed, if applicable (checking for the update conditions might trigger a + * clear, rather than an update event). + */ + private void checkUpdateRemoteControlDisplay_syncAfRcs(int infoChangedFlags) { + // determine whether the remote control display should be refreshed + // if either stack is empty, there is a mismatch, so clear the RC display + if (mRCStack.isEmpty() || mFocusStack.isEmpty()) { + clearRemoteControlDisplay_syncAfRcs(); + return; + } + + // determine which entry in the AudioFocus stack to consider, and compare against the + // top of the stack for the media button event receivers : simply using the top of the + // stack would make the entry disappear from the RemoteControlDisplay in conditions such as + // notifications playing during music playback. + // Crawl the AudioFocus stack from the top until an entry is found with the following + // characteristics: + // - focus gain on STREAM_MUSIC stream + // - non-transient focus gain on a stream other than music + FocusStackEntry af = null; + try { + for (int index = mFocusStack.size()-1; index >= 0; index--) { + FocusStackEntry fse = mFocusStack.elementAt(index); + if ((fse.mStreamType == AudioManager.STREAM_MUSIC) + || (fse.mFocusChangeType == AudioManager.AUDIOFOCUS_GAIN)) { + af = fse; + break; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + Log.e(TAG, "Wrong index accessing audio focus stack when updating RCD: " + e); + af = null; + } + if (af == null) { + clearRemoteControlDisplay_syncAfRcs(); + return; + } + + // if the audio focus and RC owners belong to different packages, there is a mismatch, clear + if ((mRCStack.peek().mCallingPackageName != null) + && (af.mPackageName != null) + && !(mRCStack.peek().mCallingPackageName.compareTo( + af.mPackageName) == 0)) { + clearRemoteControlDisplay_syncAfRcs(); + return; + } + // if the audio focus didn't originate from the same Uid as the one in which the remote + // control information will be retrieved, clear + if (mRCStack.peek().mCallingUid != af.mCallingUid) { + clearRemoteControlDisplay_syncAfRcs(); + return; + } + + // refresh conditions were verified: update the remote controls + // ok to call: synchronized mAudioFocusLock then on mRCStack, mRCStack is not empty + updateRemoteControlDisplay_syncAfRcs(infoChangedFlags); + } + + /** + * see AudioManager.registerMediaButtonIntent(PendingIntent pi, ComponentName c) + * precondition: mediaIntent != null, target != null + */ + public void registerMediaButtonIntent(PendingIntent mediaIntent, ComponentName eventReceiver) { + Log.i(TAG, " Remote Control registerMediaButtonIntent() for " + mediaIntent); + + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + pushMediaButtonReceiver(mediaIntent, eventReceiver); + // new RC client, assume every type of information shall be queried + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } + + /** + * see AudioManager.unregisterMediaButtonIntent(PendingIntent mediaIntent) + * precondition: mediaIntent != null, eventReceiver != null + */ + public void unregisterMediaButtonIntent(PendingIntent mediaIntent, ComponentName eventReceiver) + { + Log.i(TAG, " Remote Control unregisterMediaButtonIntent() for " + mediaIntent); + + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + boolean topOfStackWillChange = isCurrentRcController(mediaIntent); + removeMediaButtonReceiver(mediaIntent); + if (topOfStackWillChange) { + // current RC client will change, assume every type of info needs to be queried + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } + } + + /** + * see AudioManager.registerMediaButtonEventReceiverForCalls(ComponentName c) + * precondition: c != null + */ + public void registerMediaButtonEventReceiverForCalls(ComponentName c) { + if (mContext.checkCallingPermission("android.permission.MODIFY_PHONE_STATE") + != PackageManager.PERMISSION_GRANTED) { + Log.e(TAG, "Invalid permissions to register media button receiver for calls"); + return; + } + synchronized(mRCStack) { + mMediaReceiverForCalls = c; + } + } + + /** + * see AudioManager.unregisterMediaButtonEventReceiverForCalls() + */ + public void unregisterMediaButtonEventReceiverForCalls() { + if (mContext.checkCallingPermission("android.permission.MODIFY_PHONE_STATE") + != PackageManager.PERMISSION_GRANTED) { + Log.e(TAG, "Invalid permissions to unregister media button receiver for calls"); + return; + } + synchronized(mRCStack) { + mMediaReceiverForCalls = null; + } + } + + /** + * see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...) + * @return the unique ID of the RemoteControlStackEntry associated with the RemoteControlClient + * Note: using this method with rcClient == null is a way to "disable" the IRemoteControlClient + * without modifying the RC stack, but while still causing the display to refresh (will + * become blank as a result of this) + */ + public int registerRemoteControlClient(PendingIntent mediaIntent, + IRemoteControlClient rcClient, String callingPackageName) { + if (DEBUG_RC) Log.i(TAG, "Register remote control client rcClient="+rcClient); + int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + // store the new display information + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if(rcse.mMediaIntent.equals(mediaIntent)) { + // already had a remote control client? + if (rcse.mRcClientDeathHandler != null) { + // stop monitoring the old client's death + rcse.unlinkToRcClientDeath(); + } + // save the new remote control client + rcse.mRcClient = rcClient; + rcse.mCallingPackageName = callingPackageName; + rcse.mCallingUid = Binder.getCallingUid(); + if (rcClient == null) { + // here rcse.mRcClientDeathHandler is null; + rcse.resetPlaybackInfo(); + break; + } + rccId = rcse.mRccId; + + // there is a new (non-null) client: + // 1/ give the new client the current display (if any) + if (mRcDisplay != null) { + try { + rcse.mRcClient.plugRemoteControlDisplay(mRcDisplay); + } catch (RemoteException e) { + Log.e(TAG, "Error connecting remote control display to client: "+e); + e.printStackTrace(); + } + } + // 2/ monitor the new client's death + IBinder b = rcse.mRcClient.asBinder(); + RcClientDeathHandler rcdh = + new RcClientDeathHandler(b, rcse.mMediaIntent); + try { + b.linkToDeath(rcdh, 0); + } catch (RemoteException e) { + // remote control client is DOA, disqualify it + Log.w(TAG, "registerRemoteControlClient() has a dead client " + b); + rcse.mRcClient = null; + } + rcse.mRcClientDeathHandler = rcdh; + break; + } + } + // if the eventReceiver is at the top of the stack + // then check for potential refresh of the remote controls + if (isCurrentRcController(mediaIntent)) { + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } + return rccId; + } + + /** + * see AudioManager.unregisterRemoteControlClient(PendingIntent pi, ...) + * rcClient is guaranteed non-null + */ + public void unregisterRemoteControlClient(PendingIntent mediaIntent, + IRemoteControlClient rcClient) { + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if ((rcse.mMediaIntent.equals(mediaIntent)) + && rcClient.equals(rcse.mRcClient)) { + // we found the IRemoteControlClient to unregister + // stop monitoring its death + rcse.unlinkToRcClientDeath(); + // reset the client-related fields + rcse.mRcClient = null; + rcse.mCallingPackageName = null; + } + } + } + } + } + + /** + * The remote control displays. + * Access synchronized on mRCStack + * NOTE: Only one IRemoteControlDisplay supported in this implementation + */ + private IRemoteControlDisplay mRcDisplay; + private RcDisplayDeathHandler mRcDisplayDeathHandler; + private int mArtworkExpectedWidth = -1; + private int mArtworkExpectedHeight = -1; + /** + * Inner class to monitor remote control display deaths, and unregister them from the list + * of displays if necessary. + */ + private class RcDisplayDeathHandler implements IBinder.DeathRecipient { + private IBinder mCb; // To be notified of client's death + + public RcDisplayDeathHandler(IBinder b) { + if (DEBUG_RC) Log.i(TAG, "new RcDisplayDeathHandler for "+b); + mCb = b; + } + + public void binderDied() { + synchronized(mRCStack) { + Log.w(TAG, "RemoteControl: display died"); + mRcDisplay = null; + } + } + + public void unlinkToRcDisplayDeath() { + if (DEBUG_RC) Log.i(TAG, "unlinkToRcDisplayDeath for "+mCb); + try { + mCb.unlinkToDeath(this, 0); + } catch (java.util.NoSuchElementException e) { + // not much we can do here, the display was being unregistered anyway + Log.e(TAG, "Encountered " + e + " in unlinkToRcDisplayDeath()"); + e.printStackTrace(); + } + } + + } + + private void rcDisplay_stopDeathMonitor_syncRcStack() { + if (mRcDisplay != null) { // implies (mRcDisplayDeathHandler != null) + // we had a display before, stop monitoring its death + mRcDisplayDeathHandler.unlinkToRcDisplayDeath(); + } + } + + private void rcDisplay_startDeathMonitor_syncRcStack() { + if (mRcDisplay != null) { + // new non-null display, monitor its death + IBinder b = mRcDisplay.asBinder(); + mRcDisplayDeathHandler = new RcDisplayDeathHandler(b); + try { + b.linkToDeath(mRcDisplayDeathHandler, 0); + } catch (RemoteException e) { + // remote control display is DOA, disqualify it + Log.w(TAG, "registerRemoteControlDisplay() has a dead client " + b); + mRcDisplay = null; + } + } + } + + /** + * Register an IRemoteControlDisplay. + * Notify all IRemoteControlClient of the new display and cause the RemoteControlClient + * at the top of the stack to update the new display with its information. + * Since only one IRemoteControlDisplay is supported, this will unregister the previous display. + * @param rcd the IRemoteControlDisplay to register. No effect if null. + */ + public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { + if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")"); + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + if ((mRcDisplay == rcd) || (rcd == null)) { + return; + } + // if we had a display before, stop monitoring its death + rcDisplay_stopDeathMonitor_syncRcStack(); + mRcDisplay = rcd; + // new display, start monitoring its death + rcDisplay_startDeathMonitor_syncRcStack(); + + // let all the remote control clients there is a new display + // no need to unplug the previous because we only support one display + // and the clients don't track the death of the display + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if(rcse.mRcClient != null) { + try { + rcse.mRcClient.plugRemoteControlDisplay(mRcDisplay); + } catch (RemoteException e) { + Log.e(TAG, "Error connecting remote control display to client: " + e); + e.printStackTrace(); + } + } + } + + // we have a new display, of which all the clients are now aware: have it be updated + checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); + } + } + } + + /** + * Unregister an IRemoteControlDisplay. + * Since only one IRemoteControlDisplay is supported, this has no effect if the one to + * unregister is not the current one. + * @param rcd the IRemoteControlDisplay to unregister. No effect if null. + */ + public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) { + if (DEBUG_RC) Log.d(TAG, "<<< unregisterRemoteControlDisplay("+rcd+")"); + synchronized(mRCStack) { + // only one display here, so you can only unregister the current display + if ((rcd == null) || (rcd != mRcDisplay)) { + if (DEBUG_RC) Log.w(TAG, " trying to unregister unregistered RCD"); + return; + } + // if we had a display before, stop monitoring its death + rcDisplay_stopDeathMonitor_syncRcStack(); + mRcDisplay = null; + + // disconnect this remote control display from all the clients + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if(rcse.mRcClient != null) { + try { + rcse.mRcClient.unplugRemoteControlDisplay(rcd); + } catch (RemoteException e) { + Log.e(TAG, "Error disconnecting remote control display to client: " + e); + e.printStackTrace(); + } + } + } + } + } + + public void remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay rcd, int w, int h) { + synchronized(mRCStack) { + // NOTE: Only one IRemoteControlDisplay supported in this implementation + mArtworkExpectedWidth = w; + mArtworkExpectedHeight = h; + } + } + + public void setPlaybackInfoForRcc(int rccId, int what, int value) { + sendMsg(mAudioHandler, MSG_RCC_NEW_PLAYBACK_INFO, SENDMSG_QUEUE, + rccId /* arg1 */, what /* arg2 */, Integer.valueOf(value) /* obj */, 0 /* delay */); + } + + // handler for MSG_RCC_NEW_PLAYBACK_INFO + private void onNewPlaybackInfoForRcc(int rccId, int key, int value) { + if(DEBUG_RC) Log.d(TAG, "onNewPlaybackInfoForRcc(id=" + rccId + + ", what=" + key + ",val=" + value + ")"); + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if (rcse.mRccId == rccId) { + switch (key) { + case RemoteControlClient.PLAYBACKINFO_PLAYBACK_TYPE: + rcse.mPlaybackType = value; + postReevaluateRemote(); + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME: + rcse.mPlaybackVolume = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolume = value; + hasNewRemotePlaybackInfo(); + } + } + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME_MAX: + rcse.mPlaybackVolumeMax = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolumeMax = value; + hasNewRemotePlaybackInfo(); + } + } + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME_HANDLING: + rcse.mPlaybackVolumeHandling = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolumeHandling = value; + hasNewRemotePlaybackInfo(); + } + } + break; + case RemoteControlClient.PLAYBACKINFO_USES_STREAM: + rcse.mPlaybackStream = value; + break; + case RemoteControlClient.PLAYBACKINFO_PLAYSTATE: + rcse.mPlaybackState = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemoteIsActive = isPlaystateActive(value); + postReevaluateRemote(); + } + } + break; + default: + Log.e(TAG, "unhandled key " + key + " for RCC " + rccId); + break; + } + return; + } + } + } + } + + public void registerRemoteVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { + sendMsg(mAudioHandler, MSG_RCC_NEW_VOLUME_OBS, SENDMSG_QUEUE, + rccId /* arg1 */, 0, rvo /* obj */, 0 /* delay */); + } + + // handler for MSG_RCC_NEW_VOLUME_OBS + private void onRegisterVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if (rcse.mRccId == rccId) { + rcse.mRemoteVolumeObs = rvo; + break; + } + } + } + } + + /** + * Checks if a remote client is active on the supplied stream type. Update the remote stream + * volume state if found and playing + * @param streamType + * @return false if no remote playing is currently playing + */ + private boolean checkUpdateRemoteStateIfActive(int streamType) { + synchronized(mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if ((rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) + && isPlaystateActive(rcse.mPlaybackState) + && (rcse.mPlaybackStream == streamType)) { + if (DEBUG_RC) Log.d(TAG, "remote playback active on stream " + streamType + + ", vol =" + rcse.mPlaybackVolume); + synchronized (mMainRemote) { + mMainRemote.mRccId = rcse.mRccId; + mMainRemote.mVolume = rcse.mPlaybackVolume; + mMainRemote.mVolumeMax = rcse.mPlaybackVolumeMax; + mMainRemote.mVolumeHandling = rcse.mPlaybackVolumeHandling; + mMainRemoteIsActive = true; + } + return true; + } + } + } + synchronized (mMainRemote) { + mMainRemoteIsActive = false; + } + return false; + } + + /** + * Returns true if the given playback state is considered "active", i.e. it describes a state + * where playback is happening, or about to + * @param playState the playback state to evaluate + * @return true if active, false otherwise (inactive or unknown) + */ + private static boolean isPlaystateActive(int playState) { + switch (playState) { + case RemoteControlClient.PLAYSTATE_PLAYING: + case RemoteControlClient.PLAYSTATE_BUFFERING: + case RemoteControlClient.PLAYSTATE_FAST_FORWARDING: + case RemoteControlClient.PLAYSTATE_REWINDING: + case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS: + case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS: + return true; + default: + return false; + } + } + + private void adjustRemoteVolume(int streamType, int direction, int flags) { + int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; + boolean volFixed = false; + synchronized (mMainRemote) { + if (!mMainRemoteIsActive) { + if (DEBUG_VOL) Log.w(TAG, "adjustRemoteVolume didn't find an active client"); + return; + } + rccId = mMainRemote.mRccId; + volFixed = (mMainRemote.mVolumeHandling == + RemoteControlClient.PLAYBACK_VOLUME_FIXED); + } + // unlike "local" stream volumes, we can't compute the new volume based on the direction, + // we can only notify the remote that volume needs to be updated, and we'll get an async' + // update through setPlaybackInfoForRcc() + if (!volFixed) { + sendVolumeUpdateToRemote(rccId, direction); + } + + // fire up the UI + remoteVolumeChanged(streamType, flags); + } + + private void sendVolumeUpdateToRemote(int rccId, int direction) { + if (DEBUG_VOL) { Log.d(TAG, "sendVolumeUpdateToRemote(rccId="+rccId+" , dir="+direction); } + if (direction == 0) { + // only handling discrete events + return; + } + IRemoteVolumeObserver rvo = null; + synchronized (mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate? + if (rcse.mRccId == rccId) { + rvo = rcse.mRemoteVolumeObs; + break; + } + } + } + if (rvo != null) { + try { + rvo.dispatchRemoteVolumeUpdate(direction, -1); + } catch (RemoteException e) { + Log.e(TAG, "Error dispatching relative volume update", e); + } + } + } + + public int getRemoteStreamMaxVolume() { + synchronized (mMainRemote) { + if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { + return 0; + } + return mMainRemote.mVolumeMax; + } + } + + public int getRemoteStreamVolume() { + synchronized (mMainRemote) { + if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { + return 0; + } + return mMainRemote.mVolume; + } + } + + public void setRemoteStreamVolume(int vol) { + if (DEBUG_VOL) { Log.d(TAG, "setRemoteStreamVolume(vol="+vol+")"); } + int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; + synchronized (mMainRemote) { + if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { + return; + } + rccId = mMainRemote.mRccId; + } + IRemoteVolumeObserver rvo = null; + synchronized (mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if (rcse.mRccId == rccId) { + //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate? + rvo = rcse.mRemoteVolumeObs; + break; + } + } + } + if (rvo != null) { + try { + rvo.dispatchRemoteVolumeUpdate(0, vol); + } catch (RemoteException e) { + Log.e(TAG, "Error dispatching absolute volume update", e); + } + } + } + + /** + * Call to make AudioService reevaluate whether it's in a mode where remote players should + * have their volume controlled. In this implementation this is only to reset whether + * VolumePanel should display remote volumes + */ + private void postReevaluateRemote() { + sendMsg(mAudioHandler, MSG_REEVALUATE_REMOTE, SENDMSG_QUEUE, 0, 0, null, 0); + } + + private void onReevaluateRemote() { + if (DEBUG_VOL) { Log.w(TAG, "onReevaluateRemote()"); } + // is there a registered RemoteControlClient that is handling remote playback + boolean hasRemotePlayback = false; + synchronized (mRCStack) { + Iterator stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if (rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) { + hasRemotePlayback = true; + break; + } + } + } + synchronized (mMainRemote) { + if (mHasRemotePlayback != hasRemotePlayback) { + mHasRemotePlayback = hasRemotePlayback; + remoteSliderVisibility(hasRemotePlayback); + } + } + } + + //========================================================================================== + // Device orientation + //========================================================================================== + /** + * Handles device configuration changes that may map to a change in the orientation. + * This feature is optional, and is defined by the definition and value of the + * "ro.audio.monitorOrientation" system property. + */ + private void handleConfigurationChanged(Context context) { + try { + // reading new orientation "safely" (i.e. under try catch) in case anything + // goes wrong when obtaining resources and configuration + Configuration config = context.getResources().getConfiguration(); + if (mMonitorOrientation) { + int newOrientation = config.orientation; + if (newOrientation != mDeviceOrientation) { + mDeviceOrientation = newOrientation; + setOrientationForAudioSystem(); + } + } + sendMsg(mAudioHandler, + MSG_CONFIGURE_SAFE_MEDIA_VOLUME, + SENDMSG_REPLACE, + 0, + 0, + null, + 0); + + boolean cameraSoundForced = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_camera_sound_forced); + synchronized (mSettingsLock) { + synchronized (mCameraSoundForced) { + if (cameraSoundForced != mCameraSoundForced) { + mCameraSoundForced = cameraSoundForced; + + VolumeStreamState s = mStreamStates[AudioSystem.STREAM_SYSTEM_ENFORCED]; + if (cameraSoundForced) { + s.setAllIndexesToMax(); + mRingerModeAffectedStreams &= + ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } else { + s.setAllIndexes(mStreamStates[AudioSystem.STREAM_SYSTEM], + false /*lastAudible*/); + s.setAllIndexes(mStreamStates[AudioSystem.STREAM_SYSTEM], + true /*lastAudible*/); + mRingerModeAffectedStreams |= + (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } + // take new state into account for streams muted by ringer mode + setRingerModeInt(getRingerMode(), false); + + sendMsg(mAudioHandler, + MSG_SET_FORCE_USE, + SENDMSG_QUEUE, + AudioSystem.FOR_SYSTEM, + cameraSoundForced ? + AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE, + null, + 0); + + sendMsg(mAudioHandler, + MSG_SET_ALL_VOLUMES, + SENDMSG_QUEUE, + 0, + 0, + mStreamStates[AudioSystem.STREAM_SYSTEM_ENFORCED], 0); + } + } + } + } catch (Exception e) { + Log.e(TAG, "Error retrieving device orientation: " + e); + } + } + + private void setOrientationForAudioSystem() { + switch (mDeviceOrientation) { + case Configuration.ORIENTATION_LANDSCAPE: + //Log.i(TAG, "orientation is landscape"); + AudioSystem.setParameters("orientation=landscape"); + break; + case Configuration.ORIENTATION_PORTRAIT: + //Log.i(TAG, "orientation is portrait"); + AudioSystem.setParameters("orientation=portrait"); + break; + case Configuration.ORIENTATION_SQUARE: + //Log.i(TAG, "orientation is square"); + AudioSystem.setParameters("orientation=square"); + break; + case Configuration.ORIENTATION_UNDEFINED: + //Log.i(TAG, "orientation is undefined"); + AudioSystem.setParameters("orientation=undefined"); + break; + default: + Log.e(TAG, "Unknown orientation"); + } + } + + + // Handles request to override default use of A2DP for media. + public void setBluetoothA2dpOnInt(boolean on) { + synchronized (mBluetoothA2dpEnabledLock) { + mBluetoothA2dpEnabled = on; + mAudioHandler.removeMessages(MSG_SET_FORCE_BT_A2DP_USE); + AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, + mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); + } + } + + @Override + public void setRingtonePlayer(IRingtonePlayer player) { + mContext.enforceCallingOrSelfPermission(REMOTE_AUDIO_PLAYBACK, null); + mRingtonePlayer = player; + } + + @Override + public IRingtonePlayer getRingtonePlayer() { + return mRingtonePlayer; + } + + @Override + public AudioRoutesInfo startWatchingRoutes(IAudioRoutesObserver observer) { + synchronized (mCurAudioRoutes) { + AudioRoutesInfo routes = new AudioRoutesInfo(mCurAudioRoutes); + mRoutesObservers.register(observer); + return routes; + } + } + + + //========================================================================================== + // Safe media volume management. + // MUSIC stream volume level is limited when headphones are connected according to safety + // regulation. When the user attempts to raise the volume above the limit, a warning is + // displayed and the user has to acknowlegde before the volume is actually changed. + // The volume index corresponding to the limit is stored in config_safe_media_volume_index + // property. Platforms with a different limit must set this property accordingly in their + // overlay. + //========================================================================================== + + // mSafeMediaVolumeState indicates whether the media volume is limited over headphones. + // It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected + // or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or + // SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it + // can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume() + // (when user opts out). + private final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0; + private final int SAFE_MEDIA_VOLUME_DISABLED = 1; + private final int SAFE_MEDIA_VOLUME_INACTIVE = 2; + private final int SAFE_MEDIA_VOLUME_ACTIVE = 3; + private Integer mSafeMediaVolumeState; + + private int mMcc = 0; + // mSafeVolumeEnabled indicates whether to check the volume of media play via headset + private boolean mSafeVolumeEnabled; + // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property + private int mSafeMediaVolumeIndex; + // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced, + private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET | + AudioSystem.DEVICE_OUT_WIRED_HEADPHONE; + // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled. + // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled + // automatically. mMusicActiveMs is rounded to a multiple of MUSIC_ACTIVE_POLL_PERIOD_MS. + private int mMusicActiveMs; + private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours + private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000; // 1 minute polling interval + private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; // 30s after boot completed + + private void setSafeMediaVolumeEnabled(boolean on) { + synchronized (mSafeMediaVolumeState) { + if (mSafeVolumeEnabled && + (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) && + (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_DISABLED)) { + if (on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE)) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; + enforceSafeMediaVolume(); + } else if (!on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE)) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_INACTIVE; + mMusicActiveMs = 0; + sendMsg(mAudioHandler, + MSG_CHECK_MUSIC_ACTIVE, + SENDMSG_REPLACE, + 0, + 0, + null, + MUSIC_ACTIVE_POLL_PERIOD_MS); + } + } + } + } + + private void enforceSafeMediaVolume() { + VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC]; + boolean lastAudible = (streamState.muteCount() != 0); + int devices = mSafeMediaVolumeDevices; + int i = 0; + + while (devices != 0) { + int device = 1 << i++; + if ((device & devices) == 0) { + continue; + } + int index = streamState.getIndex(device, lastAudible); + if (index > mSafeMediaVolumeIndex) { + if (lastAudible) { + streamState.setLastAudibleIndex(mSafeMediaVolumeIndex, device); + sendMsg(mAudioHandler, + MSG_PERSIST_VOLUME, + SENDMSG_QUEUE, + PERSIST_LAST_AUDIBLE, + device, + streamState, + PERSIST_DELAY); + } else { + streamState.setIndex(mSafeMediaVolumeIndex, device, true); + sendMsg(mAudioHandler, + MSG_SET_DEVICE_VOLUME, + SENDMSG_QUEUE, + device, + 0, + streamState, + 0); + } + } + devices &= ~device; + } + } + + private boolean checkSafeMediaVolume(int streamType, int index, int device) { + synchronized (mSafeMediaVolumeState) { + if (mSafeVolumeEnabled && + (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && + (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && + ((device & mSafeMediaVolumeDevices) != 0) && + (index > mSafeMediaVolumeIndex)) { + displaySafeVolumeWarning(); + return false; + } + return true; + } + } + + public void disableSafeMediaVolume() { + synchronized (mSafeMediaVolumeState) { + setSafeMediaVolumeEnabled(false); + } + } + + + //========================================================================================== + // Camera shutter sound policy. + // config_camera_sound_forced configuration option in config.xml defines if the camera shutter + // sound is forced (sound even if the device is in silent mode) or not. This option is false by + // default and can be overridden by country specific overlay in values-mccXXX/config.xml. + //========================================================================================== + + // cached value of com.android.internal.R.bool.config_camera_sound_forced + private Boolean mCameraSoundForced; + + // called by android.hardware.Camera to populate CameraInfo.canDisableShutterSound + public boolean isCameraSoundForced() { + synchronized (mCameraSoundForced) { + return mCameraSoundForced; + } + } + + private static final String[] RINGER_MODE_NAMES = new String[] { + "SILENT", + "VIBRATE", + "NORMAL" + }; + + private void dumpRingerMode(PrintWriter pw) { + pw.println("\nRinger mode: "); + pw.println("- mode: "+RINGER_MODE_NAMES[mRingerMode]); + pw.print("- ringer mode affected streams = 0x"); + pw.println(Integer.toHexString(mRingerModeAffectedStreams)); + pw.print("- ringer mode muted streams = 0x"); + pw.println(Integer.toHexString(mRingerModeMutedStreams)); + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); + + dumpFocusStack(pw); + dumpRCStack(pw); + dumpRCCStack(pw); + dumpStreamStates(pw); + dumpRingerMode(pw); + pw.println("\nAudio routes:"); + pw.print(" mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mMainType)); + pw.print(" mBluetoothName="); pw.println(mCurAudioRoutes.mBluetoothName); + } +} From f3671f375ce35e5b8a1654052db18d41c24c33d7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 15 Sep 2013 01:49:56 -0300 Subject: [PATCH 112/248] Revert "testing low call volume fix" This reverts commit 5deec8a010340992ad78720a3d765928234acaf0. --- .../java/android/media/AudioService.java | 6341 ----------------- 1 file changed, 6341 deletions(-) delete mode 100644 overlay/frameworks/base/media/java/android/media/AudioService.java diff --git a/overlay/frameworks/base/media/java/android/media/AudioService.java b/overlay/frameworks/base/media/java/android/media/AudioService.java deleted file mode 100644 index feb8ec3..0000000 --- a/overlay/frameworks/base/media/java/android/media/AudioService.java +++ /dev/null @@ -1,6341 +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 android.media; - -import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK; -import static android.media.AudioManager.RINGER_MODE_NORMAL; -import static android.media.AudioManager.RINGER_MODE_SILENT; -import static android.media.AudioManager.RINGER_MODE_VIBRATE; - -import android.app.Activity; -import android.app.ActivityManagerNative; -import android.app.KeyguardManager; -import android.app.PendingIntent; -import android.app.PendingIntent.CanceledException; -import android.app.PendingIntent.OnFinished; -import android.bluetooth.BluetoothA2dp; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothClass; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothHeadset; -import android.bluetooth.BluetoothProfile; -import android.content.ActivityNotFoundException; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.database.ContentObserver; -import android.media.MediaPlayer.OnCompletionListener; -import android.media.MediaPlayer.OnErrorListener; -import android.net.Uri; -import android.os.Binder; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.os.Message; -import android.os.PowerManager; -import android.os.RemoteCallbackList; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.SystemProperties; -import android.os.UserHandle; -import android.os.Vibrator; -import android.provider.Settings; -import android.provider.Settings.System; -import android.provider.Settings.SettingNotFoundException; -import android.speech.RecognizerIntent; -import android.telephony.PhoneStateListener; -import android.telephony.ServiceState; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; -import android.view.KeyEvent; -import android.view.VolumePanel; - -import com.android.internal.app.ThemeUtils; -import com.android.internal.telephony.ITelephony; - -import java.io.FileDescriptor; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.concurrent.ConcurrentHashMap; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; -import java.util.Stack; - -/** - * The implementation of the volume manager service. - *

- * This implementation focuses on delivering a responsive UI. Most methods are - * asynchronous to external calls. For example, the task of setting a volume - * will update our internal state, but in a separate thread will set the system - * volume and later persist to the database. Similarly, setting the ringer mode - * will update the state and broadcast a change and in a separate thread later - * persist the ringer mode. - * - * @hide - */ -public class AudioService extends IAudioService.Stub implements OnFinished { - - private static final String TAG = "AudioService"; - - /** Debug remote control client/display feature */ - protected static final boolean DEBUG_RC = false; - /** Debug volumes */ - protected static final boolean DEBUG_VOL = false; - - /** How long to delay before persisting a change in volume/ringer mode. */ - private static final int PERSIST_DELAY = 500; - - private Context mContext; - private ContentResolver mContentResolver; - private boolean mVoiceCapable; - - /** The UI */ - private VolumePanel mVolumePanel; - private Context mUiContext; - private Handler mHandler; - - // sendMsg() flags - /** If the msg is already queued, replace it with this one. */ - private static final int SENDMSG_REPLACE = 0; - /** If the msg is already queued, ignore this one and leave the old. */ - private static final int SENDMSG_NOOP = 1; - /** If the msg is already queued, queue this one and leave the old. */ - private static final int SENDMSG_QUEUE = 2; - - // AudioHandler messages - private static final int MSG_SET_DEVICE_VOLUME = 0; - private static final int MSG_PERSIST_VOLUME = 1; - private static final int MSG_PERSIST_MASTER_VOLUME = 2; - private static final int MSG_PERSIST_RINGER_MODE = 3; - private static final int MSG_MEDIA_SERVER_DIED = 4; - private static final int MSG_MEDIA_SERVER_STARTED = 5; - private static final int MSG_PLAY_SOUND_EFFECT = 6; - private static final int MSG_BTA2DP_DOCK_TIMEOUT = 7; - private static final int MSG_LOAD_SOUND_EFFECTS = 8; - private static final int MSG_SET_FORCE_USE = 9; - private static final int MSG_PERSIST_MEDIABUTTONRECEIVER = 10; - private static final int MSG_BT_HEADSET_CNCT_FAILED = 11; - private static final int MSG_RCDISPLAY_CLEAR = 12; - private static final int MSG_RCDISPLAY_UPDATE = 13; - private static final int MSG_SET_ALL_VOLUMES = 14; - private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 15; - private static final int MSG_REPORT_NEW_ROUTES = 16; - private static final int MSG_REEVALUATE_REMOTE = 17; - private static final int MSG_RCC_NEW_PLAYBACK_INFO = 18; - private static final int MSG_RCC_NEW_VOLUME_OBS = 19; - private static final int MSG_SET_FORCE_BT_A2DP_USE = 20; - // start of messages handled under wakelock - // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), - // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) - private static final int MSG_SET_WIRED_DEVICE_CONNECTION_STATE = 21; - private static final int MSG_SET_A2DP_CONNECTION_STATE = 22; - // end of messages handled under wakelock - private static final int MSG_SET_RSX_CONNECTION_STATE = 23; // change remote submix connection - private static final int MSG_CHECK_MUSIC_ACTIVE = 24; - private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 25; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 26; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 27; - private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 28; - - // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be - // persisted - private static final int PERSIST_CURRENT = 0x1; - private static final int PERSIST_LAST_AUDIBLE = 0x2; - - private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000; - // Timeout for connection to bluetooth headset service - private static final int BT_HEADSET_CNCT_TIMEOUT_MS = 3000; - - /** @see AudioSystemThread */ - private AudioSystemThread mAudioSystemThread; - /** @see AudioHandler */ - private AudioHandler mAudioHandler; - /** @see VolumeStreamState */ - private VolumeStreamState[] mStreamStates; - private SettingsObserver mSettingsObserver; - private boolean noDelayInATwoDP = - Resources.getSystem().getBoolean(com.android.internal.R.bool.config_noDelayInATwoDP); - - private int mMode; - // protects mRingerMode - private final Object mSettingsLock = new Object(); - - private boolean mMediaServerOk; - - private SoundPool mSoundPool; - private final Object mSoundEffectsLock = new Object(); - private static final int NUM_SOUNDPOOL_CHANNELS = 4; - - // Internally master volume is a float in the 0.0 - 1.0 range, - // but to support integer based AudioManager API we translate it to 0 - 100 - private static final int MAX_MASTER_VOLUME = 100; - - // Maximum volume adjust steps allowed in a single batch call. - private static final int MAX_BATCH_VOLUME_ADJUST_STEPS = 4; - - /* Sound effect file names */ - private static final String SOUND_EFFECTS_PATH = "/media/audio/ui/"; - private static final String[] SOUND_EFFECT_FILES = new String[] { - "Effect_Tick.ogg", - "KeypressStandard.ogg", - "KeypressSpacebar.ogg", - "KeypressDelete.ogg", - "KeypressReturn.ogg" - }; - - /* Sound effect file name mapping sound effect id (AudioManager.FX_xxx) to - * file index in SOUND_EFFECT_FILES[] (first column) and indicating if effect - * uses soundpool (second column) */ - private final int[][] SOUND_EFFECT_FILES_MAP = new int[][] { - {0, -1}, // FX_KEY_CLICK - {0, -1}, // FX_FOCUS_NAVIGATION_UP - {0, -1}, // FX_FOCUS_NAVIGATION_DOWN - {0, -1}, // FX_FOCUS_NAVIGATION_LEFT - {0, -1}, // FX_FOCUS_NAVIGATION_RIGHT - {1, -1}, // FX_KEYPRESS_STANDARD - {2, -1}, // FX_KEYPRESS_SPACEBAR - {3, -1}, // FX_FOCUS_DELETE - {4, -1} // FX_FOCUS_RETURN - }; - - /** @hide Maximum volume index values for audio streams */ - private final int[] MAX_STREAM_VOLUME = new int[] { - 7, // STREAM_VOICE_CALL - 7, // STREAM_SYSTEM - 7, // STREAM_RING - 15, // STREAM_MUSIC - 7, // STREAM_ALARM - 7, // STREAM_NOTIFICATION - 15, // STREAM_BLUETOOTH_SCO - 7, // STREAM_SYSTEM_ENFORCED - 15, // STREAM_DTMF - 15 // STREAM_TTS - }; - /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings - * of another stream: This avoids multiplying the volume settings for hidden - * stream types that follow other stream behavior for volume settings - * NOTE: do not create loops in aliases! - * Some streams alias to different streams according to device category (phone or tablet) or - * use case (in call s off call...).See updateStreamVolumeAlias() for more details - * STREAM_VOLUME_ALIAS contains the default aliases for a voice capable device (phone) and - * STREAM_VOLUME_ALIAS_NON_VOICE for a non voice capable device (tablet).*/ - private final int[] STREAM_VOLUME_ALIAS = new int[] { - AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL - AudioSystem.STREAM_RING, // STREAM_SYSTEM - AudioSystem.STREAM_RING, // STREAM_RING - AudioSystem.STREAM_MUSIC, // STREAM_MUSIC - AudioSystem.STREAM_ALARM, // STREAM_ALARM - AudioSystem.STREAM_RING, // STREAM_NOTIFICATION - AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO - AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED - AudioSystem.STREAM_RING, // STREAM_DTMF - AudioSystem.STREAM_MUSIC // STREAM_TTS - }; - private final int[] STREAM_VOLUME_ALIAS_NON_VOICE = new int[] { - AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL - AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM - AudioSystem.STREAM_RING, // STREAM_RING - AudioSystem.STREAM_MUSIC, // STREAM_MUSIC - AudioSystem.STREAM_ALARM, // STREAM_ALARM - AudioSystem.STREAM_RING, // STREAM_NOTIFICATION - AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO - AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM_ENFORCED - AudioSystem.STREAM_MUSIC, // STREAM_DTMF - AudioSystem.STREAM_MUSIC // STREAM_TTS - }; - private int[] mStreamVolumeAlias; - - // stream names used by dumpStreamStates() - private final String[] STREAM_NAMES = new String[] { - "STREAM_VOICE_CALL", - "STREAM_SYSTEM", - "STREAM_RING", - "STREAM_MUSIC", - "STREAM_ALARM", - "STREAM_NOTIFICATION", - "STREAM_BLUETOOTH_SCO", - "STREAM_SYSTEM_ENFORCED", - "STREAM_DTMF", - "STREAM_TTS" - }; - - private boolean mLinkNotificationWithVolume; - - private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() { - public void onError(int error) { - switch (error) { - case AudioSystem.AUDIO_STATUS_SERVER_DIED: - if (mMediaServerOk) { - sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, - null, 1500); - mMediaServerOk = false; - } - break; - case AudioSystem.AUDIO_STATUS_OK: - if (!mMediaServerOk) { - sendMsg(mAudioHandler, MSG_MEDIA_SERVER_STARTED, SENDMSG_NOOP, 0, 0, - null, 0); - mMediaServerOk = true; - } - break; - default: - break; - } - } - }; - - /** - * Current ringer mode from one of {@link AudioManager#RINGER_MODE_NORMAL}, - * {@link AudioManager#RINGER_MODE_SILENT}, or - * {@link AudioManager#RINGER_MODE_VIBRATE}. - */ - // protected by mSettingsLock - private int mRingerMode; - // last non-normal ringer mode - private int mLastSilentRingerMode = -1; - - /** @see System#MODE_RINGER_STREAMS_AFFECTED */ - private int mRingerModeAffectedStreams; - - // Streams currently muted by ringer mode - private int mRingerModeMutedStreams; - - /** @see System#MUTE_STREAMS_AFFECTED */ - private int mMuteAffectedStreams; - - /** - * NOTE: setVibrateSetting(), getVibrateSetting(), shouldVibrate() are deprecated. - * mVibrateSetting is just maintained during deprecation period but vibration policy is - * now only controlled by mHasVibrator and mRingerMode - */ - private int mVibrateSetting; - - // Is there a vibrator - private final boolean mHasVibrator; - - // Broadcast receiver for device connections intent broadcasts - private final BroadcastReceiver mReceiver = new AudioServiceBroadcastReceiver(); - - // Used to alter media button redirection when the phone is ringing. - private boolean mIsRinging = false; - - // Devices currently connected - private final HashMap mConnectedDevices = new HashMap (); - - // Forced device usage for communications - private int mForcedUseForComm; - - // True if we have master volume support - private final boolean mUseMasterVolume; - - private final int[] mMasterVolumeRamp; - - // List of binder death handlers for setMode() client processes. - // The last process to have called setMode() is at the top of the list. - private final ArrayList mSetModeDeathHandlers = new ArrayList (); - - // List of clients having issued a SCO start request - private final ArrayList mScoClients = new ArrayList (); - - // BluetoothHeadset API to control SCO connection - private BluetoothHeadset mBluetoothHeadset; - - // Bluetooth headset device - private BluetoothDevice mBluetoothHeadsetDevice; - - // Indicate if SCO audio connection is currently active and if the initiator is - // audio service (internal) or bluetooth headset (external) - private int mScoAudioState; - // SCO audio state is not active - private static final int SCO_STATE_INACTIVE = 0; - // SCO audio activation request waiting for headset service to connect - private static final int SCO_STATE_ACTIVATE_REQ = 1; - // SCO audio state is active or starting due to a local request to start a virtual call - private static final int SCO_STATE_ACTIVE_INTERNAL = 3; - // SCO audio deactivation request waiting for headset service to connect - private static final int SCO_STATE_DEACTIVATE_REQ = 5; - - // SCO audio state is active due to an action in BT handsfree (either voice recognition or - // in call audio) - private static final int SCO_STATE_ACTIVE_EXTERNAL = 2; - // Deactivation request for all SCO connections (initiated by audio mode change) - // waiting for headset service to connect - private static final int SCO_STATE_DEACTIVATE_EXT_REQ = 4; - - // Current connection state indicated by bluetooth headset - private int mScoConnectionState; - - // true if boot sequence has been completed - private boolean mBootCompleted; - // listener for SoundPool sample load completion indication - private SoundPoolCallback mSoundPoolCallBack; - // thread for SoundPool listener - private SoundPoolListenerThread mSoundPoolListenerThread; - // message looper for SoundPool listener - private Looper mSoundPoolLooper = null; - // volume applied to sound played with playSoundEffect() - private static int sSoundEffectVolumeDb; - // getActiveStreamType() will return: - // - STREAM_NOTIFICATION on tablets during this period after a notification stopped - // - STREAM_MUSIC on phones during this period after music or talkback/voice search prompt - // stopped - private static final int DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS = 5000; - // previous volume adjustment direction received by checkForRingerModeChange() - private int mPrevVolDirection = AudioManager.ADJUST_SAME; - // Keyguard manager proxy - private KeyguardManager mKeyguardManager; - // mVolumeControlStream is set by VolumePanel to temporarily force the stream type which volume - // is controlled by Vol keys. - private int mVolumeControlStream = -1; - private final Object mForceControlStreamLock = new Object(); - // VolumePanel is currently the only client of forceVolumeControlStream() and runs in system - // server process so in theory it is not necessary to monitor the client death. - // However it is good to be ready for future evolutions. - private ForceControlStreamClient mForceControlStreamClient = null; - // Used to play ringtones outside system_server - private volatile IRingtonePlayer mRingtonePlayer; - - private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED; - - // Request to override default use of A2DP for media. - private boolean mBluetoothA2dpEnabled; - private final Object mBluetoothA2dpEnabledLock = new Object(); - - // Monitoring of audio routes. Protected by mCurAudioRoutes. - final AudioRoutesInfo mCurAudioRoutes = new AudioRoutesInfo(); - final RemoteCallbackList mRoutesObservers - = new RemoteCallbackList(); - - /** - * A fake stream type to match the notion of remote media playback - */ - public final static int STREAM_REMOTE_MUSIC = -200; - - // Devices for which the volume is fixed and VolumePanel slider should be disabled - final int mFixedVolumeDevices = AudioSystem.DEVICE_OUT_AUX_DIGITAL | - AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET | - AudioSystem.DEVICE_OUT_ALL_USB; - - private final boolean mMonitorOrientation; - - private boolean mDockAudioMediaEnabled = true; - - private boolean mForceAnalogDeskDock; - private boolean mForceAnalogCarDock; - - private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; - - private boolean mVolumeKeysControlRingStream; - - /////////////////////////////////////////////////////////////////////////// - // Construction - /////////////////////////////////////////////////////////////////////////// - - /** @hide */ - public AudioService(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mHandler = new Handler(); - mVoiceCapable = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_voice_capable); - - PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); - mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent"); - - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - mHasVibrator = vibrator == null ? false : vibrator.hasVibrator(); - - // Intialized volume - MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = SystemProperties.getInt( - "ro.config.vc_call_vol_steps", - MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]); - - sSoundEffectVolumeDb = context.getResources().getInteger( - com.android.internal.R.integer.config_soundEffectVolumeDb); - - mMode = AudioSystem.MODE_NORMAL; - mForcedUseForComm = AudioSystem.FORCE_NONE; - - createAudioSystemThread(); - - boolean cameraSoundForced = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_camera_sound_forced); - mCameraSoundForced = new Boolean(cameraSoundForced); - sendMsg(mAudioHandler, - MSG_SET_FORCE_USE, - SENDMSG_QUEUE, - AudioSystem.FOR_SYSTEM, - cameraSoundForced ? - AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE, - null, - 0); - - mSafeMediaVolumeState = new Integer(Settings.Global.getInt(mContentResolver, - Settings.Global.AUDIO_SAFE_VOLUME_STATE, - SAFE_MEDIA_VOLUME_NOT_CONFIGURED)); - // The default safe volume index read here will be replaced by the actual value when - // the mcc is read by onConfigureSafeVolume() - mSafeMediaVolumeIndex = mContext.getResources().getInteger( - com.android.internal.R.integer.config_safe_media_volume_index) * 10; - - readPersistedSettings(); - mSettingsObserver = new SettingsObserver(); - updateStreamVolumeAlias(false /*updateVolumes*/); - createStreamStates(); - - mMediaServerOk = true; - - // Call setRingerModeInt() to apply correct mute - // state on streams affected by ringer mode. - mRingerModeMutedStreams = 0; - setRingerModeInt(getRingerMode(), false); - - AudioSystem.setErrorCallback(mAudioSystemCallback); - - // Register for device connection intent broadcasts. - IntentFilter intentFilter = - new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); - if (noDelayInATwoDP) { - intentFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); - } - intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); - intentFilter.addAction(Intent.ACTION_DOCK_EVENT); - intentFilter.addAction(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG); - intentFilter.addAction(Intent.ACTION_USB_AUDIO_DEVICE_PLUG); - intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED); - intentFilter.addAction(Intent.ACTION_SCREEN_ON); - intentFilter.addAction(Intent.ACTION_SCREEN_OFF); - intentFilter.addAction(Intent.ACTION_USER_BACKGROUND); - intentFilter.addAction(Intent.ACTION_USER_SWITCHED); - intentFilter.addAction(Intent.ACTION_WIFI_DISPLAY_AUDIO); - intentFilter.addAction(Intent.ACTION_HEADSET_PLUG); - - intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - // Register a configuration change listener only if requested by system properties - // to monitor orientation changes (off by default) - mMonitorOrientation = SystemProperties.getBoolean("ro.audio.monitorOrientation", false); - if (mMonitorOrientation) { - Log.v(TAG, "monitoring device orientation"); - // initialize orientation in AudioSystem - setOrientationForAudioSystem(); - } - - context.registerReceiver(mReceiver, intentFilter); - - // Register for package removal intent broadcasts for media button receiver persistence - IntentFilter pkgFilter = new IntentFilter(); - pkgFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); - pkgFilter.addDataScheme("package"); - context.registerReceiver(mReceiver, pkgFilter); - - ThemeUtils.registerThemeChangeReceiver(context, new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - mUiContext = null; - } - }); - - // Register for phone state monitoring - TelephonyManager tmgr = (TelephonyManager) - context.getSystemService(Context.TELEPHONY_SERVICE); - tmgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); - - mUseMasterVolume = context.getResources().getBoolean( - com.android.internal.R.bool.config_useMasterVolume); - restoreMasterVolume(); - - mMasterVolumeRamp = context.getResources().getIntArray( - com.android.internal.R.array.config_masterVolumeRamp); - - mForceAnalogDeskDock = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_forceAnalogDeskDock); - - mForceAnalogCarDock = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_forceAnalogCarDock); - - mMainRemote = new RemotePlaybackState(-1, MAX_STREAM_VOLUME[AudioManager.STREAM_MUSIC], - MAX_STREAM_VOLUME[AudioManager.STREAM_MUSIC]); - mHasRemotePlayback = false; - mMainRemoteIsActive = false; - postReevaluateRemote(); - } - - private void createAudioSystemThread() { - mAudioSystemThread = new AudioSystemThread(); - mAudioSystemThread.start(); - waitForAudioHandlerCreation(); - } - - /** Waits for the volume handler to be created by the other thread. */ - private void waitForAudioHandlerCreation() { - synchronized(this) { - while (mAudioHandler == null) { - try { - // Wait for mAudioHandler to be set by the other thread - wait(); - } catch (InterruptedException e) { - Log.e(TAG, "Interrupted while waiting on volume handler."); - } - } - } - } - - private void checkAllAliasStreamVolumes() { - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = 0; streamType < numStreamTypes; streamType++) { - if (streamType != mStreamVolumeAlias[streamType]) { - mStreamStates[streamType]. - setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]], - false /*lastAudible*/); - mStreamStates[streamType]. - setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]], - true /*lastAudible*/); - } - // apply stream volume - if (mStreamStates[streamType].muteCount() == 0) { - mStreamStates[streamType].applyAllVolumes(); - } - } - } - - private void createStreamStates() { - int numStreamTypes = AudioSystem.getNumStreamTypes(); - VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes]; - - for (int i = 0; i < numStreamTypes; i++) { - streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); - } - - checkAllAliasStreamVolumes(); - } - - private void dumpStreamStates(PrintWriter pw) { - pw.println("\nStream volumes (device: index)"); - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int i = 0; i < numStreamTypes; i++) { - pw.println("- "+STREAM_NAMES[i]+":"); - mStreamStates[i].dump(pw); - pw.println(""); - } - pw.print("\n- mute affected streams = 0x"); - pw.println(Integer.toHexString(mMuteAffectedStreams)); - } - - - private void updateStreamVolumeAlias(boolean updateVolumes) { - int dtmfStreamAlias; - if (mVoiceCapable) { - mStreamVolumeAlias = STREAM_VOLUME_ALIAS; - dtmfStreamAlias = AudioSystem.STREAM_RING; - } else { - mStreamVolumeAlias = STREAM_VOLUME_ALIAS_NON_VOICE; - dtmfStreamAlias = AudioSystem.STREAM_MUSIC; - } - if (isInCommunication()) { - dtmfStreamAlias = AudioSystem.STREAM_VOICE_CALL; - } - mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias; - - if (mLinkNotificationWithVolume) { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; - } else { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; - } - - if (updateVolumes) { - mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias], - false /*lastAudible*/); - mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias], - true /*lastAudible*/); - sendMsg(mAudioHandler, - MSG_SET_ALL_VOLUMES, - SENDMSG_QUEUE, - 0, - 0, - mStreamStates[AudioSystem.STREAM_DTMF], 0); - } - } - - private void readDockAudioSettings(ContentResolver cr) - { - mDockAudioMediaEnabled = Settings.Global.getInt( - cr, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) == 1; - - if (mDockAudioMediaEnabled) { - mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; - } else { - mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET; - } - - sendMsg(mAudioHandler, - MSG_SET_FORCE_USE, - SENDMSG_QUEUE, - AudioSystem.FOR_DOCK, - mDockAudioMediaEnabled ? - AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE, - null, - 0); - } - - private boolean safeVolumeEnabled(ContentResolver cr) { - boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_safe_media_volume_enabled); - boolean safeHeadsetVolumeEnabled = Settings.System.getIntForUser(cr, - Settings.System.SAFE_HEADSET_VOLUME, safeMediaVolumeEnabled ? 1 : 0, - UserHandle.USER_CURRENT_OR_SELF) != 0; - return safeHeadsetVolumeEnabled; - } - - private void readPersistedSettings() { - final ContentResolver cr = mContentResolver; - - int ringerModeFromSettings = - Settings.Global.getInt( - cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); - int ringerMode = ringerModeFromSettings; - // sanity check in case the settings are restored from a device with incompatible - // ringer modes - if (!AudioManager.isValidRingerMode(ringerMode)) { - ringerMode = AudioManager.RINGER_MODE_NORMAL; - } - if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { - ringerMode = AudioManager.RINGER_MODE_SILENT; - } - if (ringerMode != ringerModeFromSettings) { - Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); - } - synchronized(mSettingsLock) { - mRingerMode = ringerMode; - - // System.VIBRATE_ON is not used any more but defaults for mVibrateSetting - // are still needed while setVibrateSetting() and getVibrateSetting() are being - // deprecated. - mVibrateSetting = getValueForVibrateSetting(0, - AudioManager.VIBRATE_TYPE_NOTIFICATION, - mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT - : AudioManager.VIBRATE_SETTING_OFF); - mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, - AudioManager.VIBRATE_TYPE_RINGER, - mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT - : AudioManager.VIBRATE_SETTING_OFF); - - // make sure settings for ringer mode are consistent with device type: non voice capable - // devices (tablets) include media stream in silent mode whereas phones don't. - mRingerModeAffectedStreams = Settings.System.getIntForUser(cr, - Settings.System.MODE_RINGER_STREAMS_AFFECTED, - ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| - (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), - UserHandle.USER_CURRENT); - - // ringtone and system streams are always affected by ringer mode - mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_RING)| - (1 << AudioSystem.STREAM_SYSTEM); - - if (mVoiceCapable) { - mRingerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); - } else { - mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); - } - synchronized (mCameraSoundForced) { - if (mCameraSoundForced) { - mRingerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } else { - mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } - } - - Settings.System.putIntForUser(cr, - Settings.System.MODE_RINGER_STREAMS_AFFECTED, - mRingerModeAffectedStreams, - UserHandle.USER_CURRENT); - - readDockAudioSettings(cr); - - mSafeVolumeEnabled = new Boolean(safeVolumeEnabled(cr)); - - mVolumeKeysControlRingStream = Settings.System.getIntForUser(cr, - Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM, 1, UserHandle.USER_CURRENT) == 1; - } - - mLinkNotificationWithVolume = Settings.System.getIntForUser(cr, - Settings.System.VOLUME_LINK_NOTIFICATION, 1, UserHandle.USER_CURRENT) == 1; - - mMuteAffectedStreams = System.getIntForUser(cr, - System.MUTE_STREAMS_AFFECTED, - ((1 << AudioSystem.STREAM_MUSIC)| - (1 << AudioSystem.STREAM_RING)| - (1 << AudioSystem.STREAM_SYSTEM)), - UserHandle.USER_CURRENT); - - boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE, - 0, UserHandle.USER_CURRENT) == 1; - AudioSystem.setMasterMute(masterMute); - broadcastMasterMuteStatus(masterMute); - - // Each stream will read its own persisted settings - - // Broadcast the sticky intent - broadcastRingerMode(ringerMode); - - // Broadcast vibrate settings - broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); - broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION); - - // Restore the default media button receiver from the system settings - restoreMediaButtonReceiver(); - } - - private int rescaleIndex(int index, int srcStream, int dstStream) { - return (index * mStreamStates[dstStream].getMaxIndex() + mStreamStates[srcStream].getMaxIndex() / 2) / mStreamStates[srcStream].getMaxIndex(); - } - - /////////////////////////////////////////////////////////////////////////// - // IPC methods - /////////////////////////////////////////////////////////////////////////// - - /** @see AudioManager#adjustVolume(int, int) */ - public void adjustVolume(int direction, int flags) { - adjustSuggestedStreamVolume(direction, AudioManager.USE_DEFAULT_STREAM_TYPE, flags); - } - - /** @see AudioManager#adjustLocalOrRemoteStreamVolume(int, int) with current assumption - * on streamType: fixed to STREAM_MUSIC */ - public void adjustLocalOrRemoteStreamVolume(int streamType, int direction) { - if (DEBUG_VOL) Log.d(TAG, "adjustLocalOrRemoteStreamVolume(dir="+direction+")"); - if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { - adjustRemoteVolume(AudioSystem.STREAM_MUSIC, direction, 0); - } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) { - adjustStreamVolume(AudioSystem.STREAM_MUSIC, direction, 0); - } - } - - /** @see AudioManager#adjustVolume(int, int, int) */ - public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) { - if (DEBUG_VOL) Log.d(TAG, "adjustSuggestedStreamVolume() stream="+suggestedStreamType); - int streamType; - if (mVolumeControlStream != -1) { - streamType = mVolumeControlStream; - } else { - streamType = getActiveStreamType(suggestedStreamType); - } - - // Play sounds on STREAM_RING only and if lock screen is not on. - if ((streamType != STREAM_REMOTE_MUSIC) && - (flags & AudioManager.FLAG_PLAY_SOUND) != 0 && - ((mStreamVolumeAlias[streamType] != AudioSystem.STREAM_RING) - || (mKeyguardManager != null && mKeyguardManager.isKeyguardLocked()))) { - flags &= ~AudioManager.FLAG_PLAY_SOUND; - } - - if (streamType == STREAM_REMOTE_MUSIC) { - // don't play sounds for remote - flags &= ~(AudioManager.FLAG_PLAY_SOUND|AudioManager.FLAG_FIXED_VOLUME); - //if (DEBUG_VOL) Log.i(TAG, "Need to adjust remote volume: calling adjustRemoteVolume()"); - adjustRemoteVolume(AudioSystem.STREAM_MUSIC, direction, flags); - } else { - adjustStreamVolume(streamType, direction, flags); - } - } - - /** @see AudioManager#adjustStreamVolume(int, int, int) */ - public void adjustStreamVolume(int streamType, int direction, int flags) { - if (DEBUG_VOL) Log.d(TAG, "adjustStreamVolume() stream="+streamType+", dir="+direction); - - ensureValidDirection(direction); - ensureValidStreamType(streamType); - - // use stream type alias here so that streams with same alias have the same behavior, - // including with regard to silent mode control (e.g the use of STREAM_RING below and in - // checkForRingerModeChange() in place of STREAM_RING or STREAM_NOTIFICATION) - int streamTypeAlias = mStreamVolumeAlias[streamType]; - VolumeStreamState streamState = mStreamStates[streamTypeAlias]; - - final int device = getDeviceForStream(streamTypeAlias); - // get last audible index if stream is muted, current index otherwise - final int aliasIndex = streamState.getIndex(device, - (streamState.muteCount() != 0) /* lastAudible */); - boolean adjustVolume = true; - - // convert one UI step (+/-1) into a number of internal units on the stream alias - int step = rescaleIndex(10, streamType, streamTypeAlias); - - int index; - int oldIndex; - - if ((direction == AudioManager.ADJUST_RAISE) && - !checkSafeMediaVolume(streamTypeAlias, aliasIndex + step, device)) { - index = mStreamStates[streamType].getIndex(device, - (streamState.muteCount() != 0) /* lastAudible */); - oldIndex = index; - } else { - flags &= ~AudioManager.FLAG_FIXED_VOLUME; - if ((streamTypeAlias == AudioSystem.STREAM_MUSIC) && - ((device & mFixedVolumeDevices) != 0)) { - flags |= AudioManager.FLAG_FIXED_VOLUME; - index = mStreamStates[streamType].getMaxIndex(); - oldIndex = index; - } else { - // If either the client forces allowing ringer modes for this adjustment, - // or the stream type is one that is affected by ringer modes - if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || - (streamTypeAlias == getMasterStreamType())) { - int ringerMode = getRingerMode(); - // do not vibrate if already in vibrate mode - if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { - flags &= ~AudioManager.FLAG_VIBRATE; - } - // Check if the ringer mode changes with this volume adjustment. If - // it does, it will handle adjusting the volume, so we won't below - adjustVolume = checkForRingerModeChange(aliasIndex, direction, step); - if ((streamTypeAlias == getMasterStreamType()) && - (mRingerMode == AudioManager.RINGER_MODE_SILENT)) { - streamState.setLastAudibleIndex(0, device); - } - } - - // If stream is muted, adjust last audible index only - oldIndex = mStreamStates[streamType].getIndex(device, - (mStreamStates[streamType].muteCount() != 0) /* lastAudible */); - - if (streamState.muteCount() != 0) { - if (adjustVolume) { - // Post a persist volume msg - // no need to persist volume on all streams sharing the same alias - streamState.adjustLastAudibleIndex(direction * step, device); - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_LAST_AUDIBLE, - device, - streamState, - PERSIST_DELAY); - } - index = mStreamStates[streamType].getIndex(device, true /* lastAudible */); - } else { - if (adjustVolume && streamState.adjustIndex(direction * step, device)) { - // Post message to set system volume (it in turn will post a message - // to persist). Do not change volume if stream is muted. - sendMsg(mAudioHandler, - MSG_SET_DEVICE_VOLUME, - SENDMSG_QUEUE, - device, - 0, - streamState, - 0); - } - index = mStreamStates[streamType].getIndex(device, false /* lastAudible */); - } - } - } - sendVolumeUpdate(streamType, oldIndex, index, flags); - } - - /** @see AudioManager#adjustMasterVolume(int) */ - public void adjustMasterVolume(int steps, int flags) { - ensureValidSteps(steps); - int volume = Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); - int delta = 0; - int numSteps = Math.abs(steps); - int direction = steps > 0 ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER; - for (int i = 0; i < numSteps; ++i) { - delta = findVolumeDelta(direction, volume); - volume += delta; - } - - //Log.d(TAG, "adjustMasterVolume volume: " + volume + " steps: " + steps); - setMasterVolume(volume, flags); - } - - /** @see AudioManager#setStreamVolume(int, int, int) */ - public void setStreamVolume(int streamType, int index, int flags) { - ensureValidStreamType(streamType); - VolumeStreamState streamState = mStreamStates[mStreamVolumeAlias[streamType]]; - - final int device = getDeviceForStream(streamType); - int oldIndex; - - flags &= ~AudioManager.FLAG_FIXED_VOLUME; - if ((mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && - ((device & mFixedVolumeDevices) != 0)) { - flags |= AudioManager.FLAG_FIXED_VOLUME; - index = mStreamStates[streamType].getMaxIndex(); - oldIndex = index; - } else { - // get last audible index if stream is muted, current index otherwise - oldIndex = streamState.getIndex(device, - (streamState.muteCount() != 0) /* lastAudible */); - - index = rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]); - - if (!checkSafeMediaVolume(mStreamVolumeAlias[streamType], index, device)) { - return; - } - - // setting volume on master stream type also controls silent mode - if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || - (mStreamVolumeAlias[streamType] == getMasterStreamType())) { - int newRingerMode; - if (index == 0) { - synchronized (mSettingsLock) { - if (mLastSilentRingerMode != -1) { - newRingerMode = mLastSilentRingerMode; - } else { - newRingerMode = mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE - : AudioManager.RINGER_MODE_SILENT; - } - } - setStreamVolumeInt(mStreamVolumeAlias[streamType], - index, - device, - false, - true); - } else { - newRingerMode = AudioManager.RINGER_MODE_NORMAL; - } - setRingerMode(newRingerMode); - } - - setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, false, true); - // get last audible index if stream is muted, current index otherwise - index = mStreamStates[streamType].getIndex(device, - (mStreamStates[streamType].muteCount() != 0) /* lastAudible */); - } - sendVolumeUpdate(streamType, oldIndex, index, flags); - } - - /** @see AudioManager#forceVolumeControlStream(int) */ - public void forceVolumeControlStream(int streamType, IBinder cb) { - synchronized(mForceControlStreamLock) { - mVolumeControlStream = streamType; - if (mVolumeControlStream == -1) { - if (mForceControlStreamClient != null) { - mForceControlStreamClient.release(); - mForceControlStreamClient = null; - } - } else { - mForceControlStreamClient = new ForceControlStreamClient(cb); - } - } - } - - private class ForceControlStreamClient implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - - ForceControlStreamClient(IBinder cb) { - if (cb != null) { - try { - cb.linkToDeath(this, 0); - } catch (RemoteException e) { - // Client has died! - Log.w(TAG, "ForceControlStreamClient() could not link to "+cb+" binder death"); - cb = null; - } - } - mCb = cb; - } - - public void binderDied() { - synchronized(mForceControlStreamLock) { - Log.w(TAG, "SCO client died"); - if (mForceControlStreamClient != this) { - Log.w(TAG, "unregistered control stream client died"); - } else { - mForceControlStreamClient = null; - mVolumeControlStream = -1; - } - } - } - - public void release() { - if (mCb != null) { - mCb.unlinkToDeath(this, 0); - mCb = null; - } - } - } - - private int findVolumeDelta(int direction, int volume) { - int delta = 0; - if (direction == AudioManager.ADJUST_RAISE) { - if (volume == MAX_MASTER_VOLUME) { - return 0; - } - // This is the default value if we make it to the end - delta = mMasterVolumeRamp[1]; - // If we're raising the volume move down the ramp array until we - // find the volume we're above and use that groups delta. - for (int i = mMasterVolumeRamp.length - 1; i > 1; i -= 2) { - if (volume >= mMasterVolumeRamp[i - 1]) { - delta = mMasterVolumeRamp[i]; - break; - } - } - } else if (direction == AudioManager.ADJUST_LOWER){ - if (volume == 0) { - return 0; - } - int length = mMasterVolumeRamp.length; - // This is the default value if we make it to the end - delta = -mMasterVolumeRamp[length - 1]; - // If we're lowering the volume move up the ramp array until we - // find the volume we're below and use the group below it's delta - for (int i = 2; i < length; i += 2) { - if (volume <= mMasterVolumeRamp[i]) { - delta = -mMasterVolumeRamp[i - 1]; - break; - } - } - } - return delta; - } - - private void sendBroadcastToAll(Intent intent) { - final long ident = Binder.clearCallingIdentity(); - try { - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - private void sendStickyBroadcastToAll(Intent intent) { - final long ident = Binder.clearCallingIdentity(); - try { - mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - // UI update and Broadcast Intent - private void sendVolumeUpdate(int streamType, int oldIndex, int index, int flags) { - if (!mVoiceCapable && (streamType == AudioSystem.STREAM_RING)) { - streamType = AudioSystem.STREAM_NOTIFICATION; - } - - showVolumeChangeUi(streamType, flags); - - if ((flags & AudioManager.FLAG_FIXED_VOLUME) == 0) { - oldIndex = (oldIndex + 5) / 10; - index = (index + 5) / 10; - Intent intent = new Intent(AudioManager.VOLUME_CHANGED_ACTION); - intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, streamType); - intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index); - intent.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex); - sendBroadcastToAll(intent); - } - } - - // UI update and Broadcast Intent - private void sendMasterVolumeUpdate(int flags, int oldVolume, int newVolume) { - masterVolumeChanged(flags); - - Intent intent = new Intent(AudioManager.MASTER_VOLUME_CHANGED_ACTION); - intent.putExtra(AudioManager.EXTRA_PREV_MASTER_VOLUME_VALUE, oldVolume); - intent.putExtra(AudioManager.EXTRA_MASTER_VOLUME_VALUE, newVolume); - sendBroadcastToAll(intent); - } - - // UI update and Broadcast Intent - private void sendMasterMuteUpdate(boolean muted, int flags) { - masterMuteChanged(flags); - broadcastMasterMuteStatus(muted); - } - - private void broadcastMasterMuteStatus(boolean muted) { - Intent intent = new Intent(AudioManager.MASTER_MUTE_CHANGED_ACTION); - intent.putExtra(AudioManager.EXTRA_MASTER_VOLUME_MUTED, muted); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT - | Intent.FLAG_RECEIVER_REPLACE_PENDING); - sendStickyBroadcastToAll(intent); - } - - /** - * Sets the stream state's index, and posts a message to set system volume. - * This will not call out to the UI. Assumes a valid stream type. - * - * @param streamType Type of the stream - * @param index Desired volume index of the stream - * @param device the device whose volume must be changed - * @param force If true, set the volume even if the desired volume is same - * as the current volume. - * @param lastAudible If true, stores new index as last audible one - */ - private void setStreamVolumeInt(int streamType, - int index, - int device, - boolean force, - boolean lastAudible) { - VolumeStreamState streamState = mStreamStates[streamType]; - - // If stream is muted, set last audible index only - if (streamState.muteCount() != 0) { - // Do not allow last audible index to be 0 - if (index != 0) { - streamState.setLastAudibleIndex(index, device); - // Post a persist volume msg - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_LAST_AUDIBLE, - device, - streamState, - PERSIST_DELAY); - } - } else { - if (streamState.setIndex(index, device, lastAudible) || force) { - // Post message to set system volume (it in turn will post a message - // to persist). - sendMsg(mAudioHandler, - MSG_SET_DEVICE_VOLUME, - SENDMSG_QUEUE, - device, - 0, - streamState, - 0); - } - } - } - - /** @see AudioManager#setStreamSolo(int, boolean) */ - public void setStreamSolo(int streamType, boolean state, IBinder cb) { - for (int stream = 0; stream < mStreamStates.length; stream++) { - if (!isStreamAffectedByMute(stream) || stream == streamType) continue; - // Bring back last audible volume - mStreamStates[stream].mute(cb, state); - } - } - - /** @see AudioManager#setStreamMute(int, boolean) */ - public void setStreamMute(int streamType, boolean state, IBinder cb) { - if (isStreamAffectedByMute(streamType)) { - mStreamStates[streamType].mute(cb, state); - } - } - - /** get stream mute state. */ - public boolean isStreamMute(int streamType) { - return (mStreamStates[streamType].muteCount() != 0); - } - - /** @see AudioManager#setMasterMute(boolean, IBinder) */ - public void setMasterMute(boolean state, int flags, IBinder cb) { - if (state != AudioSystem.getMasterMute()) { - AudioSystem.setMasterMute(state); - // Post a persist master volume msg - sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME_MUTE, SENDMSG_REPLACE, state ? 1 - : 0, 0, null, PERSIST_DELAY); - sendMasterMuteUpdate(state, flags); - } - } - - /** get master mute state. */ - public boolean isMasterMute() { - return AudioSystem.getMasterMute(); - } - - /** @see AudioManager#getStreamVolume(int) */ - public int getStreamVolume(int streamType) { - ensureValidStreamType(streamType); - int device = getDeviceForStream(streamType); - int index; - - if ((mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && - (device & mFixedVolumeDevices) != 0) { - index = mStreamStates[streamType].getMaxIndex(); - } else { - index = mStreamStates[streamType].getIndex(device, false /* lastAudible */); - } - return (index + 5) / 10; - } - - public int getMasterVolume() { - if (isMasterMute()) return 0; - return getLastAudibleMasterVolume(); - } - - public void setMasterVolume(int volume, int flags) { - if (volume < 0) { - volume = 0; - } else if (volume > MAX_MASTER_VOLUME) { - volume = MAX_MASTER_VOLUME; - } - doSetMasterVolume((float)volume / MAX_MASTER_VOLUME, flags); - } - - private void doSetMasterVolume(float volume, int flags) { - // don't allow changing master volume when muted - if (!AudioSystem.getMasterMute()) { - int oldVolume = getMasterVolume(); - AudioSystem.setMasterVolume(volume); - - int newVolume = getMasterVolume(); - if (newVolume != oldVolume) { - // Post a persist master volume msg - sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME, SENDMSG_REPLACE, - Math.round(volume * (float)1000.0), 0, null, PERSIST_DELAY); - } - // Send the volume update regardless whether there was a change. - sendMasterVolumeUpdate(flags, oldVolume, newVolume); - } - } - - /** @see AudioManager#getStreamMaxVolume(int) */ - public int getStreamMaxVolume(int streamType) { - ensureValidStreamType(streamType); - return (mStreamStates[streamType].getMaxIndex() + 5) / 10; - } - - public int getMasterMaxVolume() { - return MAX_MASTER_VOLUME; - } - - /** Get last audible volume before stream was muted. */ - public int getLastAudibleStreamVolume(int streamType) { - ensureValidStreamType(streamType); - int device = getDeviceForStream(streamType); - return (mStreamStates[streamType].getIndex(device, true /* lastAudible */) + 5) / 10; - } - - /** Get last audible master volume before it was muted. */ - public int getLastAudibleMasterVolume() { - return Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); - } - - /** @see AudioManager#getMasterStreamType(int) */ - public int getMasterStreamType() { - if (mVoiceCapable) { - return AudioSystem.STREAM_RING; - } else { - return AudioSystem.STREAM_MUSIC; - } - } - - /** @see AudioManager#getRingerMode() */ - public int getRingerMode() { - synchronized(mSettingsLock) { - return mRingerMode; - } - } - - private void ensureValidRingerMode(int ringerMode) { - if (!AudioManager.isValidRingerMode(ringerMode)) { - throw new IllegalArgumentException("Bad ringer mode " + ringerMode); - } - } - - /** @see AudioManager#setRingerMode(int) */ - public void setRingerMode(int ringerMode) { - if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { - ringerMode = AudioManager.RINGER_MODE_SILENT; - } - if (ringerMode != getRingerMode()) { - setRingerModeInt(ringerMode, true); - // Send sticky broadcast - broadcastRingerMode(ringerMode); - } - } - - private void setRingerModeInt(int ringerMode, boolean persist) { - synchronized(mSettingsLock) { - mRingerMode = ringerMode; - if (ringerMode != AudioManager.RINGER_MODE_NORMAL) { - mLastSilentRingerMode = ringerMode; - } - } - - // Mute stream if not previously muted by ringer mode and ringer mode - // is not RINGER_MODE_NORMAL and stream is affected by ringer mode. - // Unmute stream if previously muted by ringer mode and ringer mode - // is RINGER_MODE_NORMAL or stream is not affected by ringer mode. - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (isStreamMutedByRingerMode(streamType)) { - if (!isStreamAffectedByRingerMode(streamType) || - ringerMode == AudioManager.RINGER_MODE_NORMAL) { - // ring and notifications volume should never be 0 when not silenced - // on voice capable devices - if (mVoiceCapable && - mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { - synchronized (mStreamStates[streamType]) { - Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - if ((Integer)entry.getValue() == 0) { - entry.setValue(10); - } - } - } - } - mStreamStates[streamType].mute(null, false); - mRingerModeMutedStreams &= ~(1 << streamType); - } - } else { - if (isStreamAffectedByRingerMode(streamType) && - ringerMode != AudioManager.RINGER_MODE_NORMAL) { - mStreamStates[streamType].mute(null, true); - mRingerModeMutedStreams |= (1 << streamType); - } - } - } - - // Post a persist ringer mode msg - if (persist) { - sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, - SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY); - } - } - - private void restoreMasterVolume() { - if (mUseMasterVolume) { - float volume = Settings.System.getFloatForUser(mContentResolver, - Settings.System.VOLUME_MASTER, -1.0f, UserHandle.USER_CURRENT); - if (volume >= 0.0f) { - AudioSystem.setMasterVolume(volume); - } - } - } - - /** @see AudioManager#shouldVibrate(int) */ - public boolean shouldVibrate(int vibrateType) { - if (!mHasVibrator) return false; - - switch (getVibrateSetting(vibrateType)) { - - case AudioManager.VIBRATE_SETTING_ON: - return getRingerMode() != AudioManager.RINGER_MODE_SILENT; - - case AudioManager.VIBRATE_SETTING_ONLY_SILENT: - return getRingerMode() == AudioManager.RINGER_MODE_VIBRATE; - - case AudioManager.VIBRATE_SETTING_OFF: - // return false, even for incoming calls - return false; - - default: - return false; - } - } - - /** @see AudioManager#getVibrateSetting(int) */ - public int getVibrateSetting(int vibrateType) { - if (!mHasVibrator) return AudioManager.VIBRATE_SETTING_OFF; - return (mVibrateSetting >> (vibrateType * 2)) & 3; - } - - /** @see AudioManager#setVibrateSetting(int, int) */ - public void setVibrateSetting(int vibrateType, int vibrateSetting) { - - if (!mHasVibrator) return; - - mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting); - - // Broadcast change - broadcastVibrateSetting(vibrateType); - - } - - /** - * @see #setVibrateSetting(int, int) - */ - public static int getValueForVibrateSetting(int existingValue, int vibrateType, - int vibrateSetting) { - - // First clear the existing setting. Each vibrate type has two bits in - // the value. Note '3' is '11' in binary. - existingValue &= ~(3 << (vibrateType * 2)); - - // Set into the old value - existingValue |= (vibrateSetting & 3) << (vibrateType * 2); - - return existingValue; - } - - private class SetModeDeathHandler implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - private int mPid; - private int mMode = AudioSystem.MODE_NORMAL; // Current mode set by this client - - SetModeDeathHandler(IBinder cb, int pid) { - mCb = cb; - mPid = pid; - } - - public void binderDied() { - int newModeOwnerPid = 0; - synchronized(mSetModeDeathHandlers) { - Log.w(TAG, "setMode() client died"); - int index = mSetModeDeathHandlers.indexOf(this); - if (index < 0) { - Log.w(TAG, "unregistered setMode() client died"); - } else { - newModeOwnerPid = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid); - } - } - // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all - // SCO connections not started by the application changing the mode - if (newModeOwnerPid != 0) { - disconnectBluetoothSco(newModeOwnerPid); - } - } - - public int getPid() { - return mPid; - } - - public void setMode(int mode) { - mMode = mode; - } - - public int getMode() { - return mMode; - } - - public IBinder getBinder() { - return mCb; - } - } - - /** @see AudioManager#setMode(int) */ - public void setMode(int mode, IBinder cb) { - if (!checkAudioSettingsPermission("setMode()")) { - return; - } - - if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) { - return; - } - - int newModeOwnerPid = 0; - synchronized(mSetModeDeathHandlers) { - if (mode == AudioSystem.MODE_CURRENT) { - mode = mMode; - } - newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid()); - } - // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all - // SCO connections not started by the application changing the mode - if (newModeOwnerPid != 0) { - disconnectBluetoothSco(newModeOwnerPid); - } - } - - // must be called synchronized on mSetModeDeathHandlers - // setModeInt() returns a valid PID if the audio mode was successfully set to - // any mode other than NORMAL. - int setModeInt(int mode, IBinder cb, int pid) { - int newModeOwnerPid = 0; - if (cb == null) { - Log.e(TAG, "setModeInt() called with null binder"); - return newModeOwnerPid; - } - - SetModeDeathHandler hdlr = null; - Iterator iter = mSetModeDeathHandlers.iterator(); - while (iter.hasNext()) { - SetModeDeathHandler h = (SetModeDeathHandler)iter.next(); - if (h.getPid() == pid) { - hdlr = h; - // Remove from client list so that it is re-inserted at top of list - iter.remove(); - hdlr.getBinder().unlinkToDeath(hdlr, 0); - break; - } - } - int status = AudioSystem.AUDIO_STATUS_OK; - do { - if (mode == AudioSystem.MODE_NORMAL) { - // get new mode from client at top the list if any - if (!mSetModeDeathHandlers.isEmpty()) { - hdlr = mSetModeDeathHandlers.get(0); - cb = hdlr.getBinder(); - mode = hdlr.getMode(); - } - } else { - if (hdlr == null) { - hdlr = new SetModeDeathHandler(cb, pid); - } - // Register for client death notification - try { - cb.linkToDeath(hdlr, 0); - } catch (RemoteException e) { - // Client has died! - Log.w(TAG, "setMode() could not link to "+cb+" binder death"); - } - - // Last client to call setMode() is always at top of client list - // as required by SetModeDeathHandler.binderDied() - mSetModeDeathHandlers.add(0, hdlr); - hdlr.setMode(mode); - } - - if (mode != mMode) { - status = AudioSystem.setPhoneState(mode); - if (status == AudioSystem.AUDIO_STATUS_OK) { - mMode = mode; - } else { - if (hdlr != null) { - mSetModeDeathHandlers.remove(hdlr); - cb.unlinkToDeath(hdlr, 0); - } - // force reading new top of mSetModeDeathHandlers stack - mode = AudioSystem.MODE_NORMAL; - } - } else { - status = AudioSystem.AUDIO_STATUS_OK; - } - } while (status != AudioSystem.AUDIO_STATUS_OK && !mSetModeDeathHandlers.isEmpty()); - - if (status == AudioSystem.AUDIO_STATUS_OK) { - if (mode != AudioSystem.MODE_NORMAL) { - if (mSetModeDeathHandlers.isEmpty()) { - Log.e(TAG, "setMode() different from MODE_NORMAL with empty mode client stack"); - } else { - newModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); - } - } - int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE); - if (streamType == STREAM_REMOTE_MUSIC) { - // here handle remote media playback the same way as local playback - streamType = AudioManager.STREAM_MUSIC; - } - int device = getDeviceForStream(streamType); - int index = mStreamStates[mStreamVolumeAlias[streamType]].getIndex(device, false); - setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, true, false); - - updateStreamVolumeAlias(true /*updateVolumes*/); - } - return newModeOwnerPid; - } - - /** @see AudioManager#getMode() */ - public int getMode() { - return mMode; - } - - /** @see AudioManager#playSoundEffect(int) */ - public void playSoundEffect(int effectType) { - sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_NOOP, - effectType, -1, null, 0); - } - - /** @see AudioManager#playSoundEffect(int, float) */ - public void playSoundEffectVolume(int effectType, float volume) { - loadSoundEffects(); - sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_NOOP, - effectType, (int) (volume * 1000), null, 0); - } - - /** - * Loads samples into the soundpool. - * This method must be called at first when sound effects are enabled - */ - public boolean loadSoundEffects() { - int status; - - synchronized (mSoundEffectsLock) { - if (!mBootCompleted) { - Log.w(TAG, "loadSoundEffects() called before boot complete"); - return false; - } - - if (mSoundPool != null) { - return true; - } - mSoundPool = new SoundPool(NUM_SOUNDPOOL_CHANNELS, AudioSystem.STREAM_SYSTEM, 0); - - try { - mSoundPoolCallBack = null; - mSoundPoolListenerThread = new SoundPoolListenerThread(); - mSoundPoolListenerThread.start(); - // Wait for mSoundPoolCallBack to be set by the other thread - mSoundEffectsLock.wait(); - } catch (InterruptedException e) { - Log.w(TAG, "Interrupted while waiting sound pool listener thread."); - } - - if (mSoundPoolCallBack == null) { - Log.w(TAG, "loadSoundEffects() could not create SoundPool listener or thread"); - if (mSoundPoolLooper != null) { - mSoundPoolLooper.quit(); - mSoundPoolLooper = null; - } - mSoundPoolListenerThread = null; - mSoundPool.release(); - mSoundPool = null; - return false; - } - /* - * poolId table: The value -1 in this table indicates that corresponding - * file (same index in SOUND_EFFECT_FILES[] has not been loaded. - * Once loaded, the value in poolId is the sample ID and the same - * sample can be reused for another effect using the same file. - */ - int[] poolId = new int[SOUND_EFFECT_FILES.length]; - for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.length; fileIdx++) { - poolId[fileIdx] = -1; - } - /* - * Effects whose value in SOUND_EFFECT_FILES_MAP[effect][1] is -1 must be loaded. - * If load succeeds, value in SOUND_EFFECT_FILES_MAP[effect][1] is > 0: - * this indicates we have a valid sample loaded for this effect. - */ - - int lastSample = 0; - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - // Do not load sample if this effect uses the MediaPlayer - if (SOUND_EFFECT_FILES_MAP[effect][1] == 0) { - continue; - } - if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == -1) { - String filePath = Environment.getRootDirectory() - + SOUND_EFFECTS_PATH - + SOUND_EFFECT_FILES[SOUND_EFFECT_FILES_MAP[effect][0]]; - int sampleId = mSoundPool.load(filePath, 0); - if (sampleId <= 0) { - Log.w(TAG, "Soundpool could not load file: "+filePath); - } else { - SOUND_EFFECT_FILES_MAP[effect][1] = sampleId; - poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = sampleId; - lastSample = sampleId; - } - } else { - SOUND_EFFECT_FILES_MAP[effect][1] = poolId[SOUND_EFFECT_FILES_MAP[effect][0]]; - } - } - // wait for all samples to be loaded - if (lastSample != 0) { - mSoundPoolCallBack.setLastSample(lastSample); - - try { - mSoundEffectsLock.wait(); - status = mSoundPoolCallBack.status(); - } catch (java.lang.InterruptedException e) { - Log.w(TAG, "Interrupted while waiting sound pool callback."); - status = -1; - } - } else { - status = -1; - } - - if (mSoundPoolLooper != null) { - mSoundPoolLooper.quit(); - mSoundPoolLooper = null; - } - mSoundPoolListenerThread = null; - if (status != 0) { - Log.w(TAG, - "loadSoundEffects(), Error " - + ((lastSample != 0) ? mSoundPoolCallBack.status() : -1) - + " while loading samples"); - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - if (SOUND_EFFECT_FILES_MAP[effect][1] > 0) { - SOUND_EFFECT_FILES_MAP[effect][1] = -1; - } - } - - mSoundPool.release(); - mSoundPool = null; - } - } - return (status == 0); - } - - /** - * Unloads samples from the sound pool. - * This method can be called to free some memory when - * sound effects are disabled. - */ - public void unloadSoundEffects() { - synchronized (mSoundEffectsLock) { - if (mSoundPool == null) { - return; - } - - mAudioHandler.removeMessages(MSG_LOAD_SOUND_EFFECTS); - mAudioHandler.removeMessages(MSG_PLAY_SOUND_EFFECT); - - int[] poolId = new int[SOUND_EFFECT_FILES.length]; - for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.length; fileIdx++) { - poolId[fileIdx] = 0; - } - - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - if (SOUND_EFFECT_FILES_MAP[effect][1] <= 0) { - continue; - } - if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == 0) { - mSoundPool.unload(SOUND_EFFECT_FILES_MAP[effect][1]); - SOUND_EFFECT_FILES_MAP[effect][1] = -1; - poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = -1; - } - } - mSoundPool.release(); - mSoundPool = null; - } - } - - class SoundPoolListenerThread extends Thread { - public SoundPoolListenerThread() { - super("SoundPoolListenerThread"); - } - - @Override - public void run() { - - Looper.prepare(); - mSoundPoolLooper = Looper.myLooper(); - - synchronized (mSoundEffectsLock) { - if (mSoundPool != null) { - mSoundPoolCallBack = new SoundPoolCallback(); - mSoundPool.setOnLoadCompleteListener(mSoundPoolCallBack); - } - mSoundEffectsLock.notify(); - } - Looper.loop(); - } - } - - private final class SoundPoolCallback implements - android.media.SoundPool.OnLoadCompleteListener { - - int mStatus; - int mLastSample; - - public int status() { - return mStatus; - } - - public void setLastSample(int sample) { - mLastSample = sample; - } - - public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { - synchronized (mSoundEffectsLock) { - if (status != 0) { - mStatus = status; - } - if (sampleId == mLastSample) { - mSoundEffectsLock.notify(); - } - } - } - } - - /** @see AudioManager#reloadAudioSettings() */ - public void reloadAudioSettings() { - readAudioSettings(false /*userSwitch*/); - } - - private void readAudioSettings(boolean userSwitch) { - // restore ringer mode, ringer mode affected streams, mute affected streams and vibrate settings - readPersistedSettings(); - - // restore volume settings - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = 0; streamType < numStreamTypes; streamType++) { - VolumeStreamState streamState = mStreamStates[streamType]; - - if (userSwitch && mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) { - continue; - } - - synchronized (streamState) { - streamState.readSettings(); - - // unmute stream that was muted but is not affect by mute anymore - if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType) && - !isStreamMutedByRingerMode(streamType)) { - int size = streamState.mDeathHandlers.size(); - for (int i = 0; i < size; i++) { - streamState.mDeathHandlers.get(i).mMuteCount = 1; - streamState.mDeathHandlers.get(i).mute(false); - } - } - } - } - - // apply new ringer mode before checking volume for alias streams so that streams - // muted by ringer mode have the correct volume - setRingerModeInt(getRingerMode(), false); - - checkAllAliasStreamVolumes(); - - synchronized (mSafeMediaVolumeState) { - if (mSafeVolumeEnabled && - mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { - enforceSafeMediaVolume(); - } - } - } - - /** @see AudioManager#setSpeakerphoneOn() */ - public void setSpeakerphoneOn(boolean on){ - if (!checkAudioSettingsPermission("setSpeakerphoneOn()")) { - return; - } - mForcedUseForComm = on ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; - - sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, - AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, null, 0); - } - - /** @see AudioManager#isSpeakerphoneOn() */ - public boolean isSpeakerphoneOn() { - return (mForcedUseForComm == AudioSystem.FORCE_SPEAKER); - } - - /** @see AudioManager#setBluetoothScoOn() */ - public void setBluetoothScoOn(boolean on){ - if (!checkAudioSettingsPermission("setBluetoothScoOn()")) { - return; - } - mForcedUseForComm = on ? AudioSystem.FORCE_BT_SCO : AudioSystem.FORCE_NONE; - - sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, - AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, null, 0); - sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, - AudioSystem.FOR_RECORD, mForcedUseForComm, null, 0); - } - - /** @see AudioManager#isBluetoothScoOn() */ - public boolean isBluetoothScoOn() { - return (mForcedUseForComm == AudioSystem.FORCE_BT_SCO); - } - - /** @see AudioManager#setBluetoothA2dpOn() */ - public void setBluetoothA2dpOn(boolean on) { - if (!checkAudioSettingsPermission("setBluetoothA2dpOn()") && noDelayInATwoDP) { - return; - } - synchronized (mBluetoothA2dpEnabledLock) { - mBluetoothA2dpEnabled = on; - sendMsg(mAudioHandler, MSG_SET_FORCE_BT_A2DP_USE, SENDMSG_QUEUE, - AudioSystem.FOR_MEDIA, - mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP, - null, 0); - } - } - - /** @see AudioManager#isBluetoothA2dpOn() */ - public boolean isBluetoothA2dpOn() { - synchronized (mBluetoothA2dpEnabledLock) { - return mBluetoothA2dpEnabled; - } - } - - /** @see AudioManager#startBluetoothSco() */ - public void startBluetoothSco(IBinder cb){ - if (!checkAudioSettingsPermission("startBluetoothSco()") || - !mBootCompleted) { - return; - } - ScoClient client = getScoClient(cb, true); - client.incCount(); - } - - /** @see AudioManager#stopBluetoothSco() */ - public void stopBluetoothSco(IBinder cb){ - if (!checkAudioSettingsPermission("stopBluetoothSco()") || - !mBootCompleted) { - return; - } - ScoClient client = getScoClient(cb, false); - if (client != null) { - client.decCount(); - } - } - - - private class ScoClient implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - private int mCreatorPid; - private int mStartcount; // number of SCO connections started by this client - - ScoClient(IBinder cb) { - mCb = cb; - mCreatorPid = Binder.getCallingPid(); - mStartcount = 0; - } - - public void binderDied() { - synchronized(mScoClients) { - Log.w(TAG, "SCO client died"); - int index = mScoClients.indexOf(this); - if (index < 0) { - Log.w(TAG, "unregistered SCO client died"); - } else { - clearCount(true); - mScoClients.remove(this); - } - } - } - - public void incCount() { - synchronized(mScoClients) { - requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED); - if (mStartcount == 0) { - try { - mCb.linkToDeath(this, 0); - } catch (RemoteException e) { - // client has already died! - Log.w(TAG, "ScoClient incCount() could not link to "+mCb+" binder death"); - } - } - mStartcount++; - } - } - - public void decCount() { - synchronized(mScoClients) { - if (mStartcount == 0) { - Log.w(TAG, "ScoClient.decCount() already 0"); - } else { - mStartcount--; - if (mStartcount == 0) { - try { - mCb.unlinkToDeath(this, 0); - } catch (NoSuchElementException e) { - Log.w(TAG, "decCount() going to 0 but not registered to binder"); - } - } - requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); - } - } - } - - public void clearCount(boolean stopSco) { - synchronized(mScoClients) { - if (mStartcount != 0) { - try { - mCb.unlinkToDeath(this, 0); - } catch (NoSuchElementException e) { - Log.w(TAG, "clearCount() mStartcount: "+mStartcount+" != 0 but not registered to binder"); - } - } - mStartcount = 0; - if (stopSco) { - requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); - } - } - } - - public int getCount() { - return mStartcount; - } - - public IBinder getBinder() { - return mCb; - } - - public int getPid() { - return mCreatorPid; - } - - public int totalCount() { - synchronized(mScoClients) { - int count = 0; - int size = mScoClients.size(); - for (int i = 0; i < size; i++) { - count += mScoClients.get(i).getCount(); - } - return count; - } - } - - private void requestScoState(int state) { - checkScoAudioState(); - if (totalCount() == 0) { - if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) { - // Make sure that the state transitions to CONNECTING even if we cannot initiate - // the connection. - broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTING); - // Accept SCO audio activation only in NORMAL audio mode or if the mode is - // currently controlled by the same client process. - synchronized(mSetModeDeathHandlers) { - if ((mSetModeDeathHandlers.isEmpty() || - mSetModeDeathHandlers.get(0).getPid() == mCreatorPid) && - (mScoAudioState == SCO_STATE_INACTIVE || - mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) { - if (mScoAudioState == SCO_STATE_INACTIVE) { - if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) { - if (mBluetoothHeadset.startScoUsingVirtualVoiceCall( - mBluetoothHeadsetDevice)) { - mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; - } else { - broadcastScoConnectionState( - AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - } - } else if (getBluetoothHeadset()) { - mScoAudioState = SCO_STATE_ACTIVATE_REQ; - } - } else { - mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; - broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTED); - } - } else { - broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - } - } - } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED && - (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL || - mScoAudioState == SCO_STATE_ACTIVATE_REQ)) { - if (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL) { - if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null) { - if (!mBluetoothHeadset.stopScoUsingVirtualVoiceCall( - mBluetoothHeadsetDevice)) { - mScoAudioState = SCO_STATE_INACTIVE; - broadcastScoConnectionState( - AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - } - } else if (getBluetoothHeadset()) { - mScoAudioState = SCO_STATE_DEACTIVATE_REQ; - } - } else { - mScoAudioState = SCO_STATE_INACTIVE; - broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - } - } - } - } - } - - private void checkScoAudioState() { - if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null && - mScoAudioState == SCO_STATE_INACTIVE && - mBluetoothHeadset.getAudioState(mBluetoothHeadsetDevice) - != BluetoothHeadset.STATE_AUDIO_DISCONNECTED) { - mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; - } - } - - private ScoClient getScoClient(IBinder cb, boolean create) { - synchronized(mScoClients) { - ScoClient client = null; - int size = mScoClients.size(); - for (int i = 0; i < size; i++) { - client = mScoClients.get(i); - if (client.getBinder() == cb) - return client; - } - if (create) { - client = new ScoClient(cb); - mScoClients.add(client); - } - return client; - } - } - - public void clearAllScoClients(int exceptPid, boolean stopSco) { - synchronized(mScoClients) { - ScoClient savedClient = null; - int size = mScoClients.size(); - for (int i = 0; i < size; i++) { - ScoClient cl = mScoClients.get(i); - if (cl.getPid() != exceptPid) { - cl.clearCount(stopSco); - } else { - savedClient = cl; - } - } - mScoClients.clear(); - if (savedClient != null) { - mScoClients.add(savedClient); - } - } - } - - private boolean getBluetoothHeadset() { - boolean result = false; - BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - if (adapter != null) { - result = adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, - BluetoothProfile.HEADSET); - } - // If we could not get a bluetooth headset proxy, send a failure message - // without delay to reset the SCO audio state and clear SCO clients. - // If we could get a proxy, send a delayed failure message that will reset our state - // in case we don't receive onServiceConnected(). - sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, - SENDMSG_REPLACE, 0, 0, null, result ? BT_HEADSET_CNCT_TIMEOUT_MS : 0); - return result; - } - - private void disconnectBluetoothSco(int exceptPid) { - synchronized(mScoClients) { - checkScoAudioState(); - if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL || - mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) { - if (mBluetoothHeadsetDevice != null) { - if (mBluetoothHeadset != null) { - if (!mBluetoothHeadset.stopVoiceRecognition( - mBluetoothHeadsetDevice)) { - sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, - SENDMSG_REPLACE, 0, 0, null, 0); - } - } else if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL && - getBluetoothHeadset()) { - mScoAudioState = SCO_STATE_DEACTIVATE_EXT_REQ; - } - } - } else { - clearAllScoClients(exceptPid, true); - } - } - } - - private void resetBluetoothSco() { - synchronized(mScoClients) { - clearAllScoClients(0, false); - mScoAudioState = SCO_STATE_INACTIVE; - broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - } - } - - private void broadcastScoConnectionState(int state) { - if (state != mScoConnectionState) { - Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED); - newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, state); - newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, - mScoConnectionState); - sendStickyBroadcastToAll(newIntent); - mScoConnectionState = state; - } - } - - private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener = - new BluetoothProfile.ServiceListener() { - public void onServiceConnected(int profile, BluetoothProfile proxy) { - BluetoothDevice btDevice; - List deviceList; - switch(profile) { - case BluetoothProfile.A2DP: - BluetoothA2dp a2dp = (BluetoothA2dp) proxy; - deviceList = a2dp.getConnectedDevices(); - if (deviceList.size() > 0) { - btDevice = deviceList.get(0); - if (!noDelayInATwoDP) { - synchronized (mConnectedDevices) { - int state = a2dp.getConnectionState(btDevice); - int delay = checkSendBecomingNoisyIntent( - AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); - queueMsgUnderWakeLock(mAudioHandler, - MSG_SET_A2DP_CONNECTION_STATE, - state, - 0, - btDevice, - delay); - } - } else { - onSetA2dpConnectionState(btDevice, a2dp.getConnectionState(btDevice)); - } - } - break; - - case BluetoothProfile.HEADSET: - synchronized (mScoClients) { - // Discard timeout message - mAudioHandler.removeMessages(MSG_BT_HEADSET_CNCT_FAILED); - mBluetoothHeadset = (BluetoothHeadset) proxy; - deviceList = mBluetoothHeadset.getConnectedDevices(); - if (deviceList.size() > 0) { - mBluetoothHeadsetDevice = deviceList.get(0); - } else { - mBluetoothHeadsetDevice = null; - } - // Refresh SCO audio state - checkScoAudioState(); - // Continue pending action if any - if (mScoAudioState == SCO_STATE_ACTIVATE_REQ || - mScoAudioState == SCO_STATE_DEACTIVATE_REQ || - mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) { - boolean status = false; - if (mBluetoothHeadsetDevice != null) { - switch (mScoAudioState) { - case SCO_STATE_ACTIVATE_REQ: - mScoAudioState = SCO_STATE_ACTIVE_INTERNAL; - status = mBluetoothHeadset.startScoUsingVirtualVoiceCall( - mBluetoothHeadsetDevice); - break; - case SCO_STATE_DEACTIVATE_REQ: - status = mBluetoothHeadset.stopScoUsingVirtualVoiceCall( - mBluetoothHeadsetDevice); - break; - case SCO_STATE_DEACTIVATE_EXT_REQ: - status = mBluetoothHeadset.stopVoiceRecognition( - mBluetoothHeadsetDevice); - } - } - if (!status) { - sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, - SENDMSG_REPLACE, 0, 0, null, 0); - } - } - } - break; - - default: - break; - } - } - public void onServiceDisconnected(int profile) { - switch(profile) { - case BluetoothProfile.A2DP: - synchronized (mConnectedDevices) { - if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) { - makeA2dpDeviceUnavailableNow( - mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); - } - } - break; - - case BluetoothProfile.HEADSET: - synchronized (mScoClients) { - mBluetoothHeadset = null; - } - break; - - default: - break; - } - } - }; - - /** see AudioManager.setRemoteSubmixOn(boolean on) */ - public void setRemoteSubmixOn(boolean on, int address) { - sendMsg(mAudioHandler, MSG_SET_RSX_CONNECTION_STATE, - SENDMSG_REPLACE /* replace with QUEUE when multiple addresses are supported */, - on ? 1 : 0 /*arg1*/, - address /*arg2*/, - null/*obj*/, 0/*delay*/); - } - - private void onSetRsxConnectionState(int available, int address) { - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_REMOTE_SUBMIX, - available == 1 ? - AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, - String.valueOf(address) /*device_address*/); - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX, - available == 1 ? - AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, - String.valueOf(address) /*device_address*/); - } - - private void onCheckMusicActive() { - synchronized (mSafeMediaVolumeState) { - if (mSafeVolumeEnabled && - mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { - int device = getDeviceForStream(AudioSystem.STREAM_MUSIC); - - if ((device & mSafeMediaVolumeDevices) != 0) { - sendMsg(mAudioHandler, - MSG_CHECK_MUSIC_ACTIVE, - SENDMSG_REPLACE, - 0, - 0, - null, - MUSIC_ACTIVE_POLL_PERIOD_MS); - int index = mStreamStates[AudioSystem.STREAM_MUSIC].getIndex(device, - false /*lastAudible*/); - if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0) && - (index > mSafeMediaVolumeIndex)) { - // Approximate cumulative active music time - mMusicActiveMs += MUSIC_ACTIVE_POLL_PERIOD_MS; - if (mMusicActiveMs > UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX) { - setSafeMediaVolumeEnabled(true); - mMusicActiveMs = 0; - displaySafeVolumeWarning(); - } - } - } - } - } - } - - private void onConfigureSafeVolume(boolean force) { - synchronized (mSafeMediaVolumeState) { - int mcc = mContext.getResources().getConfiguration().mcc; - if ((mMcc != mcc) || ((mMcc == 0) && force)) { - mSafeMediaVolumeIndex = mContext.getResources().getInteger( - com.android.internal.R.integer.config_safe_media_volume_index) * 10; - boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_safe_media_volume_enabled); - - // The persisted state is either "disabled" or "active": this is the state applied - // next time we boot and cannot be "inactive" - int persistedState; - if (safeMediaVolumeEnabled) { - persistedState = SAFE_MEDIA_VOLUME_ACTIVE; - // The state can already be "inactive" here if the user has forced it before - // the 30 seconds timeout for forced configuration. In this case we don't reset - // it to "active". - if (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_INACTIVE) { - mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; - enforceSafeMediaVolume(); - } - } else { - persistedState = SAFE_MEDIA_VOLUME_DISABLED; - mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED; - } - mMcc = mcc; - sendMsg(mAudioHandler, - MSG_PERSIST_SAFE_VOLUME_STATE, - SENDMSG_QUEUE, - persistedState, - 0, - null, - 0); - } - } - } - - /////////////////////////////////////////////////////////////////////////// - // Internal methods - /////////////////////////////////////////////////////////////////////////// - - /** - * Checks if the adjustment should change ringer mode instead of just - * adjusting volume. If so, this will set the proper ringer mode and volume - * indices on the stream states. - */ - private boolean checkForRingerModeChange(int oldIndex, int direction, int step) { - boolean adjustVolumeIndex = true; - int ringerMode = getRingerMode(); - - switch (ringerMode) { - case RINGER_MODE_NORMAL: - if (direction == AudioManager.ADJUST_LOWER) { - if (mHasVibrator) { - // "step" is the delta in internal index units corresponding to a - // change of 1 in UI index units. - // Because of rounding when rescaling from one stream index range to its alias - // index range, we cannot simply test oldIndex == step: - // (step <= oldIndex < 2 * step) is equivalent to: (old UI index == 1) - if (step <= oldIndex && oldIndex < 2 * step) { - ringerMode = RINGER_MODE_VIBRATE; - if (mVoiceCapable) - adjustVolumeIndex = false; - } - } else { - // (oldIndex < step) is equivalent to (old UI index == 0) - if ((oldIndex < step) && mPrevVolDirection != AudioManager.ADJUST_LOWER) { - ringerMode = RINGER_MODE_SILENT; - if (mVoiceCapable) - adjustVolumeIndex = false; - } - } - } - break; - case RINGER_MODE_VIBRATE: - if (!mHasVibrator) { - Log.e(TAG, "checkForRingerModeChange() current ringer mode is vibrate" + - "but no vibrator is present"); - break; - } - if ((direction == AudioManager.ADJUST_LOWER)) { - if (mPrevVolDirection != AudioManager.ADJUST_LOWER) { - ringerMode = RINGER_MODE_SILENT; - } - } else if (direction == AudioManager.ADJUST_RAISE) { - ringerMode = RINGER_MODE_NORMAL; - } - adjustVolumeIndex = false; - break; - case RINGER_MODE_SILENT: - if (direction == AudioManager.ADJUST_RAISE) { - if (mHasVibrator) { - ringerMode = RINGER_MODE_VIBRATE; - } else { - ringerMode = RINGER_MODE_NORMAL; - } - } - adjustVolumeIndex = false; - break; - default: - Log.e(TAG, "checkForRingerModeChange() wrong ringer mode: "+ringerMode); - break; - } - - setRingerMode(ringerMode); - - mPrevVolDirection = direction; - - return adjustVolumeIndex; - } - - public boolean isStreamAffectedByRingerMode(int streamType) { - return (mRingerModeAffectedStreams & (1 << streamType)) != 0; - } - - private boolean isStreamMutedByRingerMode(int streamType) { - return (mRingerModeMutedStreams & (1 << streamType)) != 0; - } - - public boolean isStreamAffectedByMute(int streamType) { - return (mMuteAffectedStreams & (1 << streamType)) != 0; - } - - private void ensureValidDirection(int direction) { - if (direction < AudioManager.ADJUST_LOWER || direction > AudioManager.ADJUST_RAISE) { - throw new IllegalArgumentException("Bad direction " + direction); - } - } - - private void ensureValidSteps(int steps) { - if (Math.abs(steps) > MAX_BATCH_VOLUME_ADJUST_STEPS) { - throw new IllegalArgumentException("Bad volume adjust steps " + steps); - } - } - - private void ensureValidStreamType(int streamType) { - if (streamType < 0 || streamType >= mStreamStates.length) { - throw new IllegalArgumentException("Bad stream type " + streamType); - } - } - - private boolean isInCommunication() { - boolean isOffhook = false; - - if (mVoiceCapable) { - try { - ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); - if (phone != null) isOffhook = phone.isOffhook(); - } catch (RemoteException e) { - Log.w(TAG, "Couldn't connect to phone service", e); - } - } - return (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION); - } - - private int getActiveStreamType(int suggestedStreamType) { - if (mVoiceCapable) { - if (isInCommunication()) { - if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) - == AudioSystem.FORCE_BT_SCO) { - // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO..."); - return AudioSystem.STREAM_BLUETOOTH_SCO; - } else { - // Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL..."); - return AudioSystem.STREAM_VOICE_CALL; - } - } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) { - // Having the suggested stream be USE_DEFAULT_STREAM_TYPE is how remote control - // volume can have priority over STREAM_MUSIC - if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC"); - return STREAM_REMOTE_MUSIC; - } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, - DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active"); - return AudioSystem.STREAM_MUSIC; - } else { - if (mVolumeKeysControlRingStream) { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: Forcing STREAM_RING b/c default"); - return AudioSystem.STREAM_RING; - } else { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC b/c default setting"); - return AudioSystem.STREAM_MUSIC; - } - } - } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active"); - return AudioSystem.STREAM_MUSIC; - } else { - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type " - + suggestedStreamType); - return suggestedStreamType; - } - } else { - if (isInCommunication()) { - if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) - == AudioSystem.FORCE_BT_SCO) { - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO"); - return AudioSystem.STREAM_BLUETOOTH_SCO; - } else { - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL"); - return AudioSystem.STREAM_VOICE_CALL; - } - } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_NOTIFICATION, - DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS) || - AudioSystem.isStreamActive(AudioSystem.STREAM_RING, - DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) { - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION"); - return AudioSystem.STREAM_NOTIFICATION; - } else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) { - if (checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)) { - // Having the suggested stream be USE_DEFAULT_STREAM_TYPE is how remote control - // volume can have priority over STREAM_MUSIC - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC"); - return STREAM_REMOTE_MUSIC; - } else { - if (DEBUG_VOL) - Log.v(TAG, "getActiveStreamType: using STREAM_MUSIC as default"); - return AudioSystem.STREAM_MUSIC; - } - } else { - if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type " - + suggestedStreamType); - return suggestedStreamType; - } - } - } - - private void broadcastRingerMode(int ringerMode) { - // Send sticky broadcast - Intent broadcast = new Intent(AudioManager.RINGER_MODE_CHANGED_ACTION); - broadcast.putExtra(AudioManager.EXTRA_RINGER_MODE, ringerMode); - broadcast.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT - | Intent.FLAG_RECEIVER_REPLACE_PENDING); - sendStickyBroadcastToAll(broadcast); - } - - private void broadcastVibrateSetting(int vibrateType) { - // Send broadcast - if (ActivityManagerNative.isSystemReady()) { - Intent broadcast = new Intent(AudioManager.VIBRATE_SETTING_CHANGED_ACTION); - broadcast.putExtra(AudioManager.EXTRA_VIBRATE_TYPE, vibrateType); - broadcast.putExtra(AudioManager.EXTRA_VIBRATE_SETTING, getVibrateSetting(vibrateType)); - sendBroadcastToAll(broadcast); - } - } - - // Message helper methods - /** - * Queue a message on the given handler's message queue, after acquiring the service wake lock. - * Note that the wake lock needs to be released after the message has been handled. - */ - private void queueMsgUnderWakeLock(Handler handler, int msg, - int arg1, int arg2, Object obj, int delay) { - mMediaEventWakeLock.acquire(); - sendMsg(handler, msg, SENDMSG_QUEUE, arg1, arg2, obj, delay); - } - - private static void sendMsg(Handler handler, int msg, - int existingMsgPolicy, int arg1, int arg2, Object obj, int delay) { - - if (existingMsgPolicy == SENDMSG_REPLACE) { - handler.removeMessages(msg); - } else if (existingMsgPolicy == SENDMSG_NOOP && handler.hasMessages(msg)) { - return; - } - - handler.sendMessageDelayed(handler.obtainMessage(msg, arg1, arg2, obj), delay); - } - - boolean checkAudioSettingsPermission(String method) { - if (mContext.checkCallingOrSelfPermission("android.permission.MODIFY_AUDIO_SETTINGS") - == PackageManager.PERMISSION_GRANTED) { - return true; - } - String msg = "Audio Settings Permission Denial: " + method + " from pid=" - + Binder.getCallingPid() - + ", uid=" + Binder.getCallingUid(); - Log.w(TAG, msg); - return false; - } - - private int getDeviceForStream(int stream) { - int device = AudioSystem.getDevicesForStream(stream); - if ((device & (device - 1)) != 0) { - // Multiple device selection is either: - // - speaker + one other device: give priority to speaker in this case. - // - one A2DP device + another device: happens with duplicated output. In this case - // retain the device on the A2DP output as the other must not correspond to an active - // selection if not the speaker. - if ((device & AudioSystem.DEVICE_OUT_SPEAKER) != 0) { - device = AudioSystem.DEVICE_OUT_SPEAKER; - } else { - device &= AudioSystem.DEVICE_OUT_ALL_A2DP; - } - } - return device; - } - - public void setWiredDeviceConnectionState(int device, int state, String name) { - synchronized (mConnectedDevices) { - int delay = checkSendBecomingNoisyIntent(device, state); - queueMsgUnderWakeLock(mAudioHandler, - MSG_SET_WIRED_DEVICE_CONNECTION_STATE, - device, - state, - name, - delay); - } - } - - public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state) { - int delay; - if (!noDelayInATwoDP) { - synchronized (mConnectedDevices) { - delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); - queueMsgUnderWakeLock(mAudioHandler, - MSG_SET_A2DP_CONNECTION_STATE, - state, - 0, - device, - delay); - } - } else { - delay = 0; - } - return delay; - } - - /////////////////////////////////////////////////////////////////////////// - // Inner classes - /////////////////////////////////////////////////////////////////////////// - - public class VolumeStreamState { - private final int mStreamType; - - private String mVolumeIndexSettingName; - private String mLastAudibleVolumeIndexSettingName; - private int mIndexMax; - private final ConcurrentHashMap mIndex = - new ConcurrentHashMap(8, 0.75f, 4); - private final ConcurrentHashMap mLastAudibleIndex = - new ConcurrentHashMap(8, 0.75f, 4); - private ArrayList mDeathHandlers; //handles mute/solo clients death - - private VolumeStreamState(String settingName, int streamType) { - - mVolumeIndexSettingName = settingName; - mLastAudibleVolumeIndexSettingName = settingName + System.APPEND_FOR_LAST_AUDIBLE; - - mStreamType = streamType; - mIndexMax = MAX_STREAM_VOLUME[streamType]; - AudioSystem.initStreamVolume(streamType, 0, mIndexMax); - mIndexMax *= 10; - - // mDeathHandlers must be created before calling readSettings() - mDeathHandlers = new ArrayList(); - - readSettings(); - } - - public String getSettingNameForDevice(boolean lastAudible, int device) { - String name = lastAudible ? - mLastAudibleVolumeIndexSettingName : - mVolumeIndexSettingName; - String suffix = AudioSystem.getDeviceName(device); - if (suffix.isEmpty()) { - return name; - } - return name + "_" + suffix; - } - - public synchronized void readSettings() { - int remainingDevices = AudioSystem.DEVICE_OUT_ALL; - - // do not read system stream volume from settings: this stream is always aliased - // to another stream type and its volume is never persisted. Values in settings can - // only be stale values - // on first call to readSettings() at init time, muteCount() is always 0 so we will - // always create entries for default device - if ((mStreamType == AudioSystem.STREAM_SYSTEM) || - (mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED)) { - int index = 10 * AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; - synchronized (mCameraSoundForced) { - if (mCameraSoundForced) { - index = mIndexMax; - } - } - if (muteCount() == 0) { - mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); - } - mLastAudibleIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); - return; - } - - for (int i = 0; remainingDevices != 0; i++) { - int device = (1 << i); - if ((device & remainingDevices) == 0) { - continue; - } - remainingDevices &= ~device; - - // ignore settings for fixed volume devices: volume should always be at max - if ((mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_MUSIC) && - ((device & mFixedVolumeDevices) != 0)) { - if (muteCount() == 0) { - mIndex.put(device, mIndexMax); - } - mLastAudibleIndex.put(device, mIndexMax); - continue; - } - // retrieve current volume for device - String name = getSettingNameForDevice(false /* lastAudible */, device); - // if no volume stored for current stream and device, use default volume if default - // device, continue otherwise - int defaultIndex = (device == AudioSystem.DEVICE_OUT_DEFAULT) ? - AudioManager.DEFAULT_STREAM_VOLUME[mStreamType] : -1; - int index = Settings.System.getIntForUser( - mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); - if (index == -1) { - continue; - } - - // retrieve last audible volume for device - name = getSettingNameForDevice(true /* lastAudible */, device); - // use stored last audible index if present, otherwise use current index if not 0 - // or default index - defaultIndex = (index > 0) ? - index : AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; - int lastAudibleIndex = Settings.System.getIntForUser( - mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); - - // a last audible index of 0 should never be stored for ring and notification - // streams on phones (voice capable devices). - if ((lastAudibleIndex == 0) && mVoiceCapable && - (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) { - lastAudibleIndex = AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; - // Correct the data base - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_LAST_AUDIBLE, - device, - this, - PERSIST_DELAY); - } - mLastAudibleIndex.put(device, getValidIndex(10 * lastAudibleIndex)); - // the initial index should never be 0 for ring and notification streams on phones - // (voice capable devices) if not in silent or vibrate mode. - if ((index == 0) && (mRingerMode == AudioManager.RINGER_MODE_NORMAL) && - mVoiceCapable && - (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) { - index = lastAudibleIndex; - // Correct the data base - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_CURRENT, - device, - this, - PERSIST_DELAY); - } - if (muteCount() == 0) { - mIndex.put(device, getValidIndex(10 * index)); - } - } - } - - public void applyDeviceVolume(int device) { - AudioSystem.setStreamVolumeIndex(mStreamType, - (getIndex(device, false /* lastAudible */) + 5)/10, - device); - } - - public synchronized void applyAllVolumes() { - // apply default volume first: by convention this will reset all - // devices volumes in audio policy manager to the supplied value - AudioSystem.setStreamVolumeIndex(mStreamType, - (getIndex(AudioSystem.DEVICE_OUT_DEFAULT, false /* lastAudible */) + 5)/10, - AudioSystem.DEVICE_OUT_DEFAULT); - // then apply device specific volumes - Set set = mIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - int device = ((Integer)entry.getKey()).intValue(); - if (device != AudioSystem.DEVICE_OUT_DEFAULT) { - AudioSystem.setStreamVolumeIndex(mStreamType, - ((Integer)entry.getValue() + 5)/10, - device); - } - } - } - - public boolean adjustIndex(int deltaIndex, int device) { - return setIndex(getIndex(device, - false /* lastAudible */) + deltaIndex, - device, - true /* lastAudible */); - } - - public synchronized boolean setIndex(int index, int device, boolean lastAudible) { - int oldIndex = getIndex(device, false /* lastAudible */); - index = getValidIndex(index); - synchronized (mCameraSoundForced) { - if ((mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED) && mCameraSoundForced) { - index = mIndexMax; - } - } - mIndex.put(device, getValidIndex(index)); - - if (oldIndex != index) { - if (lastAudible) { - mLastAudibleIndex.put(device, index); - } - // Apply change to all streams using this one as alias - // if changing volume of current device, also change volume of current - // device on aliased stream - boolean currentDevice = (device == getDeviceForStream(mStreamType)); - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != mStreamType && - mStreamVolumeAlias[streamType] == mStreamType) { - int scaledIndex = rescaleIndex(index, mStreamType, streamType); - mStreamStates[streamType].setIndex(scaledIndex, - device, - lastAudible); - if (currentDevice) { - mStreamStates[streamType].setIndex(scaledIndex, - getDeviceForStream(streamType), - lastAudible); - } - } - } - return true; - } else { - return false; - } - } - - public synchronized int getIndex(int device, boolean lastAudible) { - ConcurrentHashMap indexes; - if (lastAudible) { - indexes = mLastAudibleIndex; - } else { - indexes = mIndex; - } - Integer index = indexes.get(device); - if (index == null) { - // there is always an entry for AudioSystem.DEVICE_OUT_DEFAULT - index = indexes.get(AudioSystem.DEVICE_OUT_DEFAULT); - } - return index.intValue(); - } - - public synchronized void setLastAudibleIndex(int index, int device) { - // Apply change to all streams using this one as alias - // if changing volume of current device, also change volume of current - // device on aliased stream - boolean currentDevice = (device == getDeviceForStream(mStreamType)); - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != mStreamType && - mStreamVolumeAlias[streamType] == mStreamType) { - int scaledIndex = rescaleIndex(index, mStreamType, streamType); - mStreamStates[streamType].setLastAudibleIndex(scaledIndex, device); - if (currentDevice) { - mStreamStates[streamType].setLastAudibleIndex(scaledIndex, - getDeviceForStream(streamType)); - } - } - } - mLastAudibleIndex.put(device, getValidIndex(index)); - } - - public synchronized void adjustLastAudibleIndex(int deltaIndex, int device) { - setLastAudibleIndex(getIndex(device, - true /* lastAudible */) + deltaIndex, - device); - } - - public int getMaxIndex() { - return mIndexMax; - } - - // only called by setAllIndexes() which is already synchronized - public ConcurrentHashMap getAllIndexes(boolean lastAudible) { - if (lastAudible) { - return mLastAudibleIndex; - } else { - return mIndex; - } - } - - public synchronized void setAllIndexes(VolumeStreamState srcStream, boolean lastAudible) { - ConcurrentHashMap indexes = srcStream.getAllIndexes(lastAudible); - Set set = indexes.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - int device = ((Integer)entry.getKey()).intValue(); - int index = ((Integer)entry.getValue()).intValue(); - index = rescaleIndex(index, srcStream.getStreamType(), mStreamType); - - if (lastAudible) { - setLastAudibleIndex(index, device); - } else { - setIndex(index, device, false /* lastAudible */); - } - } - } - - public synchronized void setAllIndexesToMax() { - Set set = mIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - entry.setValue(mIndexMax); - } - set = mLastAudibleIndex.entrySet(); - i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - entry.setValue(mIndexMax); - } - } - - public synchronized void mute(IBinder cb, boolean state) { - VolumeDeathHandler handler = getDeathHandler(cb, state); - if (handler == null) { - Log.e(TAG, "Could not get client death handler for stream: "+mStreamType); - return; - } - handler.mute(state); - } - - public int getStreamType() { - return mStreamType; - } - - private int getValidIndex(int index) { - if (index < 0) { - return 0; - } else if (index > mIndexMax) { - return mIndexMax; - } - - return index; - } - - private class VolumeDeathHandler implements IBinder.DeathRecipient { - private IBinder mICallback; // To be notified of client's death - private int mMuteCount; // Number of active mutes for this client - - VolumeDeathHandler(IBinder cb) { - mICallback = cb; - } - - // must be called while synchronized on parent VolumeStreamState - public void mute(boolean state) { - if (state) { - if (mMuteCount == 0) { - // Register for client death notification - try { - // mICallback can be 0 if muted by AudioService - if (mICallback != null) { - mICallback.linkToDeath(this, 0); - } - mDeathHandlers.add(this); - // If the stream is not yet muted by any client, set level to 0 - if (muteCount() == 0) { - Set set = mIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - int device = ((Integer)entry.getKey()).intValue(); - setIndex(0, device, false /* lastAudible */); - } - sendMsg(mAudioHandler, - MSG_SET_ALL_VOLUMES, - SENDMSG_QUEUE, - 0, - 0, - VolumeStreamState.this, 0); - } - } catch (RemoteException e) { - // Client has died! - binderDied(); - return; - } - } else { - Log.w(TAG, "stream: "+mStreamType+" was already muted by this client"); - } - mMuteCount++; - } else { - if (mMuteCount == 0) { - Log.e(TAG, "unexpected unmute for stream: "+mStreamType); - } else { - mMuteCount--; - if (mMuteCount == 0) { - // Unregister from client death notification - mDeathHandlers.remove(this); - // mICallback can be 0 if muted by AudioService - if (mICallback != null) { - mICallback.unlinkToDeath(this, 0); - } - if (muteCount() == 0) { - // If the stream is not muted any more, restore its volume if - // ringer mode allows it - if (!isStreamAffectedByRingerMode(mStreamType) || - mRingerMode == AudioManager.RINGER_MODE_NORMAL) { - Set set = mIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - int device = ((Integer)entry.getKey()).intValue(); - setIndex(getIndex(device, - true /* lastAudible */), - device, - false /* lastAudible */); - } - sendMsg(mAudioHandler, - MSG_SET_ALL_VOLUMES, - SENDMSG_QUEUE, - 0, - 0, - VolumeStreamState.this, 0); - } - } - } - } - } - } - - public void binderDied() { - Log.w(TAG, "Volume service client died for stream: "+mStreamType); - if (mMuteCount != 0) { - // Reset all active mute requests from this client. - mMuteCount = 1; - mute(false); - } - } - } - - private synchronized int muteCount() { - int count = 0; - int size = mDeathHandlers.size(); - for (int i = 0; i < size; i++) { - count += mDeathHandlers.get(i).mMuteCount; - } - return count; - } - - // only called by mute() which is already synchronized - private VolumeDeathHandler getDeathHandler(IBinder cb, boolean state) { - VolumeDeathHandler handler; - int size = mDeathHandlers.size(); - for (int i = 0; i < size; i++) { - handler = mDeathHandlers.get(i); - if (cb == handler.mICallback) { - return handler; - } - } - // If this is the first mute request for this client, create a new - // client death handler. Otherwise, it is an out of sequence unmute request. - if (state) { - handler = new VolumeDeathHandler(cb); - } else { - Log.w(TAG, "stream was not muted by this client"); - handler = null; - } - return handler; - } - - private void dump(PrintWriter pw) { - pw.print(" Mute count: "); - pw.println(muteCount()); - pw.print(" Current: "); - Set set = mIndex.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) - + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); - } - pw.print("\n Last audible: "); - set = mLastAudibleIndex.entrySet(); - i = set.iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) - + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); - } - } - } - - /** Thread that handles native AudioSystem control. */ - private class AudioSystemThread extends Thread { - AudioSystemThread() { - super("AudioService"); - } - - @Override - public void run() { - // Set this thread up so the handler will work on it - Looper.prepare(); - - synchronized(AudioService.this) { - mAudioHandler = new AudioHandler(); - - // Notify that the handler has been created - AudioService.this.notify(); - } - - // Listen for volume change requests that are set by VolumePanel - Looper.loop(); - } - } - - /** Handles internal volume messages in separate volume thread. */ - private class AudioHandler extends Handler { - - private void setDeviceVolume(VolumeStreamState streamState, int device) { - - // Apply volume - streamState.applyDeviceVolume(device); - - // Apply change to all streams using this one as alias - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != streamState.mStreamType && - mStreamVolumeAlias[streamType] == streamState.mStreamType) { - mStreamStates[streamType].applyDeviceVolume(getDeviceForStream(streamType)); - } - } - - // Post a persist volume msg - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_CURRENT|PERSIST_LAST_AUDIBLE, - device, - streamState, - PERSIST_DELAY); - - } - - private void setAllVolumes(VolumeStreamState streamState) { - - // Apply volume - streamState.applyAllVolumes(); - - // Apply change to all streams using this one as alias - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != streamState.mStreamType && - mStreamVolumeAlias[streamType] == streamState.mStreamType) { - mStreamStates[streamType].applyAllVolumes(); - } - } - } - - private void persistVolume(VolumeStreamState streamState, - int persistType, - int device) { - if ((persistType & PERSIST_CURRENT) != 0) { - System.putIntForUser(mContentResolver, - streamState.getSettingNameForDevice(false /* lastAudible */, device), - (streamState.getIndex(device, false /* lastAudible */) + 5)/ 10, - UserHandle.USER_CURRENT); - } - if ((persistType & PERSIST_LAST_AUDIBLE) != 0) { - System.putIntForUser(mContentResolver, - streamState.getSettingNameForDevice(true /* lastAudible */, device), - (streamState.getIndex(device, true /* lastAudible */) + 5) / 10, - UserHandle.USER_CURRENT); - } - } - - private void persistRingerMode(int ringerMode) { - Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); - } - - private void playSoundEffect(int effectType, int volume) { - synchronized (mSoundEffectsLock) { - if (mSoundPool == null) { - return; - } - float volFloat; - // use default if volume is not specified by caller - if (volume < 0) { - volFloat = (float)Math.pow(10, (float)sSoundEffectVolumeDb/20); - } else { - volFloat = (float) volume / 1000.0f; - } - - if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) { - mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], volFloat, volFloat, 0, 0, 1.0f); - } else { - MediaPlayer mediaPlayer = new MediaPlayer(); - try { - String filePath = Environment.getRootDirectory() + SOUND_EFFECTS_PATH + SOUND_EFFECT_FILES[SOUND_EFFECT_FILES_MAP[effectType][0]]; - mediaPlayer.setDataSource(filePath); - mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); - mediaPlayer.prepare(); - mediaPlayer.setVolume(volFloat, volFloat); - mediaPlayer.setOnCompletionListener(new OnCompletionListener() { - public void onCompletion(MediaPlayer mp) { - cleanupPlayer(mp); - } - }); - mediaPlayer.setOnErrorListener(new OnErrorListener() { - public boolean onError(MediaPlayer mp, int what, int extra) { - cleanupPlayer(mp); - return true; - } - }); - mediaPlayer.start(); - } catch (IOException ex) { - Log.w(TAG, "MediaPlayer IOException: "+ex); - } catch (IllegalArgumentException ex) { - Log.w(TAG, "MediaPlayer IllegalArgumentException: "+ex); - } catch (IllegalStateException ex) { - Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); - } - } - } - } - - private void onHandlePersistMediaButtonReceiver(ComponentName receiver) { - Settings.System.putStringForUser(mContentResolver, - Settings.System.MEDIA_BUTTON_RECEIVER, - receiver == null ? "" : receiver.flattenToString(), - UserHandle.USER_CURRENT); - } - - private void cleanupPlayer(MediaPlayer mp) { - if (mp != null) { - try { - mp.stop(); - mp.release(); - } catch (IllegalStateException ex) { - Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); - } - } - } - - private void setForceUse(int usage, int config) { - AudioSystem.setForceUse(usage, config); - } - - private void onPersistSafeVolumeState(int state) { - Settings.Global.putInt(mContentResolver, - Settings.Global.AUDIO_SAFE_VOLUME_STATE, - state); - } - - @Override - public void handleMessage(Message msg) { - - switch (msg.what) { - - case MSG_SET_DEVICE_VOLUME: - setDeviceVolume((VolumeStreamState) msg.obj, msg.arg1); - break; - - case MSG_SET_ALL_VOLUMES: - setAllVolumes((VolumeStreamState) msg.obj); - break; - - case MSG_PERSIST_VOLUME: - persistVolume((VolumeStreamState) msg.obj, msg.arg1, msg.arg2); - break; - - case MSG_PERSIST_MASTER_VOLUME: - Settings.System.putFloatForUser(mContentResolver, - Settings.System.VOLUME_MASTER, - (float)msg.arg1 / (float)1000.0, - UserHandle.USER_CURRENT); - break; - - case MSG_PERSIST_MASTER_VOLUME_MUTE: - Settings.System.putIntForUser(mContentResolver, - Settings.System.VOLUME_MASTER_MUTE, - msg.arg1, - UserHandle.USER_CURRENT); - break; - - case MSG_PERSIST_RINGER_MODE: - // note that the value persisted is the current ringer mode, not the - // value of ringer mode as of the time the request was made to persist - persistRingerMode(getRingerMode()); - break; - - case MSG_MEDIA_SERVER_DIED: - if (!mMediaServerOk) { - Log.e(TAG, "Media server died."); - // Force creation of new IAudioFlinger interface so that we are notified - // when new media_server process is back to life. - AudioSystem.setErrorCallback(mAudioSystemCallback); - sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, - null, 500); - } - break; - - case MSG_MEDIA_SERVER_STARTED: - Log.e(TAG, "Media server started."); - // indicate to audio HAL that we start the reconfiguration phase after a media - // server crash - // Note that MSG_MEDIA_SERVER_STARTED message is only received when the media server - // process restarts after a crash, not the first time it is started. - AudioSystem.setParameters("restarting=true"); - - // Restore device connection states - synchronized (mConnectedDevices) { - Set set = mConnectedDevices.entrySet(); - Iterator i = set.iterator(); - while (i.hasNext()) { - Map.Entry device = (Map.Entry)i.next(); - AudioSystem.setDeviceConnectionState( - ((Integer)device.getKey()).intValue(), - AudioSystem.DEVICE_STATE_AVAILABLE, - (String)device.getValue()); - } - } - // Restore call state - AudioSystem.setPhoneState(mMode); - - // Restore forced usage for communcations and record - AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm); - AudioSystem.setForceUse(AudioSystem.FOR_RECORD, mForcedUseForComm); - AudioSystem.setForceUse(AudioSystem.FOR_SYSTEM, mCameraSoundForced ? - AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE); - - // Restore stream volumes - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - VolumeStreamState streamState = mStreamStates[streamType]; - AudioSystem.initStreamVolume(streamType, 0, (streamState.mIndexMax + 5) / 10); - - streamState.applyAllVolumes(); - } - - // Restore ringer mode - setRingerModeInt(getRingerMode(), false); - - // Restore master volume - restoreMasterVolume(); - - // Reset device orientation (if monitored for this device) - if (mMonitorOrientation) { - setOrientationForAudioSystem(); - } - - synchronized (mBluetoothA2dpEnabledLock) { - AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, - mBluetoothA2dpEnabled ? - AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); - } - - synchronized (mSettingsLock) { - AudioSystem.setForceUse(AudioSystem.FOR_DOCK, - mDockAudioMediaEnabled ? - AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE); - } - - // indicate the end of reconfiguration phase to audio HAL - AudioSystem.setParameters("restarting=false"); - break; - - case MSG_LOAD_SOUND_EFFECTS: - loadSoundEffects(); - break; - - case MSG_PLAY_SOUND_EFFECT: - playSoundEffect(msg.arg1, msg.arg2); - break; - - case MSG_BTA2DP_DOCK_TIMEOUT: - // msg.obj == address of BTA2DP device - synchronized (mConnectedDevices) { - makeA2dpDeviceUnavailableNow( (String) msg.obj ); - } - break; - - case MSG_SET_FORCE_USE: - case MSG_SET_FORCE_BT_A2DP_USE: - setForceUse(msg.arg1, msg.arg2); - break; - - case MSG_PERSIST_MEDIABUTTONRECEIVER: - onHandlePersistMediaButtonReceiver( (ComponentName) msg.obj ); - break; - - case MSG_RCDISPLAY_CLEAR: - onRcDisplayClear(); - break; - - case MSG_RCDISPLAY_UPDATE: - // msg.obj is guaranteed to be non null - onRcDisplayUpdate( (RemoteControlStackEntry) msg.obj, msg.arg1); - break; - - case MSG_BT_HEADSET_CNCT_FAILED: - resetBluetoothSco(); - break; - - case MSG_SET_WIRED_DEVICE_CONNECTION_STATE: - onSetWiredDeviceConnectionState(msg.arg1, msg.arg2, (String)msg.obj); - mMediaEventWakeLock.release(); - break; - - case MSG_SET_A2DP_CONNECTION_STATE: - onSetA2dpConnectionState((BluetoothDevice)msg.obj, msg.arg1); - mMediaEventWakeLock.release(); - break; - - case MSG_REPORT_NEW_ROUTES: { - int N = mRoutesObservers.beginBroadcast(); - if (N > 0) { - AudioRoutesInfo routes; - synchronized (mCurAudioRoutes) { - routes = new AudioRoutesInfo(mCurAudioRoutes); - } - while (N > 0) { - N--; - IAudioRoutesObserver obs = mRoutesObservers.getBroadcastItem(N); - try { - obs.dispatchAudioRoutesChanged(routes); - } catch (RemoteException e) { - } - } - } - mRoutesObservers.finishBroadcast(); - break; - } - - case MSG_REEVALUATE_REMOTE: - onReevaluateRemote(); - break; - - case MSG_RCC_NEW_PLAYBACK_INFO: - onNewPlaybackInfoForRcc(msg.arg1 /* rccId */, msg.arg2 /* key */, - ((Integer)msg.obj).intValue() /* value */); - break; - case MSG_RCC_NEW_VOLUME_OBS: - onRegisterVolumeObserverForRcc(msg.arg1 /* rccId */, - (IRemoteVolumeObserver)msg.obj /* rvo */); - break; - - case MSG_SET_RSX_CONNECTION_STATE: - onSetRsxConnectionState(msg.arg1/*available*/, msg.arg2/*address*/); - break; - - case MSG_CHECK_MUSIC_ACTIVE: - onCheckMusicActive(); - break; - - case MSG_BROADCAST_AUDIO_BECOMING_NOISY: - onSendBecomingNoisyIntent(); - break; - - case MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED: - case MSG_CONFIGURE_SAFE_MEDIA_VOLUME: - onConfigureSafeVolume((msg.what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED)); - break; - case MSG_PERSIST_SAFE_VOLUME_STATE: - onPersistSafeVolumeState(msg.arg1); - break; - } - } - } - - private class SettingsObserver extends ContentObserver { - - SettingsObserver() { - super(new Handler()); - mContentResolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this); - mContentResolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this); - mContentResolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.VOLUME_LINK_NOTIFICATION), false, this); - mContentResolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SAFE_HEADSET_VOLUME), false, this); - mContentResolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM), false, this); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - super.onChange(selfChange, uri); - // FIXME This synchronized is not necessary if mSettingsLock only protects mRingerMode. - // However there appear to be some missing locks around mRingerModeMutedStreams - // and mRingerModeAffectedStreams, so will leave this synchronized for now. - // mRingerModeMutedStreams and mMuteAffectedStreams are safe (only accessed once). - synchronized (mSettingsLock) { - if (uri.equals(Settings.System.getUriFor(Settings.System.MODE_RINGER_STREAMS_AFFECTED))) { - int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, - Settings.System.MODE_RINGER_STREAMS_AFFECTED, - ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| - (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), - UserHandle.USER_CURRENT); - if (mVoiceCapable) { - ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); - } else { - ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); - } - synchronized (mCameraSoundForced) { - if (mCameraSoundForced) { - ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } else { - ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } - } - if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { - /* - * Ensure all stream types that should be affected by ringer mode - * are in the proper state. - */ - mRingerModeAffectedStreams = ringerModeAffectedStreams; - setRingerModeInt(getRingerMode(), false); - } - - } else if (uri.equals(Settings.Global.getUriFor(Settings.Global.DOCK_AUDIO_MEDIA_ENABLED))) { - readDockAudioSettings(mContentResolver); - - } else if (uri.equals(Settings.System.getUriFor(Settings.System.VOLUME_LINK_NOTIFICATION))) { - mLinkNotificationWithVolume = Settings.System.getInt(mContentResolver, - Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; - if (mLinkNotificationWithVolume) { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; - } else { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; - } - - } else if (uri.equals(Settings.System.getUriFor(Settings.System.SAFE_HEADSET_VOLUME))) { - mSafeVolumeEnabled = safeVolumeEnabled(mContentResolver); - } else if (uri.equals(Settings.System.getUriFor(Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM))) { - mVolumeKeysControlRingStream = Settings.System.getIntForUser(mContentResolver, - Settings.System.VOLUME_KEYS_CONTROL_RING_STREAM, 1, UserHandle.USER_CURRENT) == 1; - } - } - } - } - - // must be called synchronized on mConnectedDevices - private void makeA2dpDeviceAvailable(String address) { - // enable A2DP before notifying A2DP connection to avoid unecessary processing in - // audio policy manager - setBluetoothA2dpOnInt(true); - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - AudioSystem.DEVICE_STATE_AVAILABLE, - address); - // Reset A2DP suspend state each time a new sink is connected - AudioSystem.setParameters("A2dpSuspended=false"); - mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP), - address); - } - - private void onSendBecomingNoisyIntent() { - sendBroadcastToAll(new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); - } - - // must be called synchronized on mConnectedDevices - private void makeA2dpDeviceUnavailableNow(String address) { - if (noDelayInATwoDP) { - onSendBecomingNoisyIntent(); - } - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - AudioSystem.DEVICE_STATE_UNAVAILABLE, - address); - mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); - } - - // must be called synchronized on mConnectedDevices - private void makeA2dpDeviceUnavailableLater(String address) { - // prevent any activity on the A2DP audio output to avoid unwanted - // reconnection of the sink. - AudioSystem.setParameters("A2dpSuspended=true"); - // the device will be made unavailable later, so consider it disconnected right away - mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); - // send the delayed message to make the device unavailable later - Message msg = mAudioHandler.obtainMessage(MSG_BTA2DP_DOCK_TIMEOUT, address); - mAudioHandler.sendMessageDelayed(msg, BTA2DP_DOCK_TIMEOUT_MILLIS); - - } - - // must be called synchronized on mConnectedDevices - private void cancelA2dpDeviceTimeout() { - mAudioHandler.removeMessages(MSG_BTA2DP_DOCK_TIMEOUT); - } - - // must be called synchronized on mConnectedDevices - private boolean hasScheduledA2dpDockTimeout() { - return mAudioHandler.hasMessages(MSG_BTA2DP_DOCK_TIMEOUT); - } - - private void onSetA2dpConnectionState(BluetoothDevice btDevice, int state) - { - if (btDevice == null) { - return; - } - String address = btDevice.getAddress(); - if (!BluetoothAdapter.checkBluetoothAddress(address)) { - address = ""; - } - synchronized (mConnectedDevices) { - boolean isConnected = - (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) && - mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP).equals(address)); - - if (isConnected && state != BluetoothProfile.STATE_CONNECTED) { - if (btDevice.isBluetoothDock()) { - if (state == BluetoothProfile.STATE_DISCONNECTED) { - // introduction of a delay for transient disconnections of docks when - // power is rapidly turned off/on, this message will be canceled if - // we reconnect the dock under a preset delay - makeA2dpDeviceUnavailableLater(address); - // the next time isConnected is evaluated, it will be false for the dock - } - } else { - makeA2dpDeviceUnavailableNow(address); - } - synchronized (mCurAudioRoutes) { - if (mCurAudioRoutes.mBluetoothName != null) { - mCurAudioRoutes.mBluetoothName = null; - sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, - SENDMSG_NOOP, 0, 0, null, 0); - } - } - } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { - if (btDevice.isBluetoothDock()) { - // this could be a reconnection after a transient disconnection - cancelA2dpDeviceTimeout(); - mDockAddress = address; - } else { - // this could be a connection of another A2DP device before the timeout of - // a dock: cancel the dock timeout, and make the dock unavailable now - if(hasScheduledA2dpDockTimeout()) { - cancelA2dpDeviceTimeout(); - makeA2dpDeviceUnavailableNow(mDockAddress); - } - } - makeA2dpDeviceAvailable(address); - synchronized (mCurAudioRoutes) { - String name = btDevice.getAliasName(); - if (!TextUtils.equals(mCurAudioRoutes.mBluetoothName, name)) { - mCurAudioRoutes.mBluetoothName = name; - sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, - SENDMSG_NOOP, 0, 0, null, 0); - } - } - } - } - } - - private boolean handleDeviceConnection(boolean connected, int device, String params) { - synchronized (mConnectedDevices) { - boolean isConnected = (mConnectedDevices.containsKey(device) && - (params.isEmpty() || mConnectedDevices.get(device).equals(params))); - - if (isConnected && !connected) { - AudioSystem.setDeviceConnectionState(device, - AudioSystem.DEVICE_STATE_UNAVAILABLE, - mConnectedDevices.get(device)); - mConnectedDevices.remove(device); - return true; - } else if (!isConnected && connected) { - AudioSystem.setDeviceConnectionState(device, - AudioSystem.DEVICE_STATE_AVAILABLE, - params); - mConnectedDevices.put(new Integer(device), params); - return true; - } - } - return false; - } - - // Devices which removal triggers intent ACTION_AUDIO_BECOMING_NOISY. The intent is only - // sent if none of these devices is connected. - int mBecomingNoisyIntentDevices = - AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE | - AudioSystem.DEVICE_OUT_ALL_A2DP | AudioSystem.DEVICE_OUT_AUX_DIGITAL | - AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET | AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET | - AudioSystem.DEVICE_OUT_ALL_USB; - - // must be called before removing the device from mConnectedDevices - private int checkSendBecomingNoisyIntent(int device, int state) { - int delay = 0; - if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) { - int devices = 0; - for (int dev : mConnectedDevices.keySet()) { - if ((dev & mBecomingNoisyIntentDevices) != 0) { - devices |= dev; - } - } - if (devices == device) { - sendMsg(mAudioHandler, - MSG_BROADCAST_AUDIO_BECOMING_NOISY, - SENDMSG_REPLACE, - 0, - 0, - null, - 0); - delay = 1000; - } - } - - if (mAudioHandler.hasMessages(MSG_SET_A2DP_CONNECTION_STATE) || - mAudioHandler.hasMessages(MSG_SET_WIRED_DEVICE_CONNECTION_STATE)) { - delay = 1000; - } - return delay; - } - - private void sendDeviceConnectionIntent(int device, int state, String name) - { - Intent intent = new Intent(); - - intent.putExtra("state", state); - intent.putExtra("name", name); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - - int connType = 0; - - if (device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) { - connType = AudioRoutesInfo.MAIN_HEADSET; - intent.setAction(Intent.ACTION_HEADSET_PLUG); - intent.putExtra("microphone", 1); - } else if (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) { - connType = AudioRoutesInfo.MAIN_HEADPHONES; - intent.setAction(Intent.ACTION_HEADSET_PLUG); - intent.putExtra("microphone", 0); - } else if (device == AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET) { - connType = AudioRoutesInfo.MAIN_DOCK_SPEAKERS; - intent.setAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG); - } else if (device == AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET) { - connType = AudioRoutesInfo.MAIN_DOCK_SPEAKERS; - intent.setAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG); - } else if (device == AudioSystem.DEVICE_OUT_AUX_DIGITAL) { - connType = AudioRoutesInfo.MAIN_HDMI; - intent.setAction(Intent.ACTION_HDMI_AUDIO_PLUG); - } - - synchronized (mCurAudioRoutes) { - if (connType != 0) { - int newConn = mCurAudioRoutes.mMainType; - if (state != 0) { - newConn |= connType; - } else { - newConn &= ~connType; - } - if (newConn != mCurAudioRoutes.mMainType) { - mCurAudioRoutes.mMainType = newConn; - sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, - SENDMSG_NOOP, 0, 0, null, 0); - } - } - } - - final long ident = Binder.clearCallingIdentity(); - try { - ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - private void onSetWiredDeviceConnectionState(int device, int state, String name) - { - synchronized (mConnectedDevices) { - if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || - (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE))) { - setBluetoothA2dpOnInt(true); - } - boolean isUsb = ((device & AudioSystem.DEVICE_OUT_ALL_USB) != 0); - handleDeviceConnection((state == 1), device, (isUsb ? name : "")); - if (state != 0) { - if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || - (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)) { - setBluetoothA2dpOnInt(false); - } - if ((device & mSafeMediaVolumeDevices) != 0) { - sendMsg(mAudioHandler, - MSG_CHECK_MUSIC_ACTIVE, - SENDMSG_REPLACE, - 0, - 0, - null, - MUSIC_ACTIVE_POLL_PERIOD_MS); - } - } - if (!isUsb) { - sendDeviceConnectionIntent(device, state, name); - } - } - } - - /* cache of the address of the last dock the device was connected to */ - private String mDockAddress; - - /** - * Receiver for misc intent broadcasts the Phone app cares about. - */ - private class AudioServiceBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - int device; - int state; - - if (action.equals(Intent.ACTION_DOCK_EVENT)) { - int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, - Intent.EXTRA_DOCK_STATE_UNDOCKED); - int config; - switch (dockState) { - case Intent.EXTRA_DOCK_STATE_DESK: - config = mForceAnalogDeskDock ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_BT_DESK_DOCK; - break; - case Intent.EXTRA_DOCK_STATE_CAR: - config = mForceAnalogCarDock ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_BT_CAR_DOCK; - break; - case Intent.EXTRA_DOCK_STATE_LE_DESK: - config = AudioSystem.FORCE_ANALOG_DOCK; - break; - case Intent.EXTRA_DOCK_STATE_HE_DESK: - config = AudioSystem.FORCE_DIGITAL_DOCK; - break; - case Intent.EXTRA_DOCK_STATE_UNDOCKED: - default: - config = AudioSystem.FORCE_NONE; - } - - // Low end docks have a menu to enable or disable audio - // (see mDockAudioMediaEnabled) - if (!((dockState == Intent.EXTRA_DOCK_STATE_LE_DESK) || - ((dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) && - (mDockState == Intent.EXTRA_DOCK_STATE_LE_DESK)))) { - AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config); - } - mDockState = dockState; - } else if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED) && noDelayInATwoDP) { - state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, - BluetoothProfile.STATE_DISCONNECTED); - BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - - onSetA2dpConnectionState(btDevice, state); - } else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) { - state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, - BluetoothProfile.STATE_DISCONNECTED); - device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO; - String address = null; - - BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - if (btDevice == null) { - return; - } - - address = btDevice.getAddress(); - BluetoothClass btClass = btDevice.getBluetoothClass(); - if (btClass != null) { - switch (btClass.getDeviceClass()) { - case BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET: - case BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE: - device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET; - break; - case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO: - device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT; - break; - } - } - - if (!BluetoothAdapter.checkBluetoothAddress(address)) { - address = ""; - } - - boolean connected = (state == BluetoothProfile.STATE_CONNECTED); - if (handleDeviceConnection(connected, device, address)) { - synchronized (mScoClients) { - if (connected) { - mBluetoothHeadsetDevice = btDevice; - } else { - mBluetoothHeadsetDevice = null; - resetBluetoothSco(); - } - } - } - } else if (action.equals(Intent.ACTION_HEADSET_PLUG)) { - state = intent.getIntExtra("state", 0); - if (state == 1) { - // Headset plugged in - adjustCurrentStreamVolume(); - // TODO: Cap volume at safe levels - } else { - // Headset disconnected - adjustCurrentStreamVolume(); - } - } else if (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) || - action.equals(Intent.ACTION_USB_AUDIO_DEVICE_PLUG)) { - state = intent.getIntExtra("state", 0); - int alsaCard = intent.getIntExtra("card", -1); - int alsaDevice = intent.getIntExtra("device", -1); - String params = (alsaCard == -1 && alsaDevice == -1 ? "" - : "card=" + alsaCard + ";device=" + alsaDevice); - device = action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ? - AudioSystem.DEVICE_OUT_USB_ACCESSORY : AudioSystem.DEVICE_OUT_USB_DEVICE; - Log.v(TAG, "Broadcast Receiver: Got " - + (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ? - "ACTION_USB_AUDIO_ACCESSORY_PLUG" : "ACTION_USB_AUDIO_DEVICE_PLUG") - + ", state = " + state + ", card: " + alsaCard + ", device: " + alsaDevice); - setWiredDeviceConnectionState(device, state, params); - } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) { - boolean broadcast = false; - int scoAudioState = AudioManager.SCO_AUDIO_STATE_ERROR; - synchronized (mScoClients) { - int btState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); - // broadcast intent if the connection was initated by AudioService - if (!mScoClients.isEmpty() && - (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL || - mScoAudioState == SCO_STATE_ACTIVATE_REQ || - mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) { - broadcast = true; - } - switch (btState) { - case BluetoothHeadset.STATE_AUDIO_CONNECTED: - scoAudioState = AudioManager.SCO_AUDIO_STATE_CONNECTED; - if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL && - mScoAudioState != SCO_STATE_DEACTIVATE_REQ && - mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) { - mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; - } - break; - case BluetoothHeadset.STATE_AUDIO_DISCONNECTED: - scoAudioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED; - mScoAudioState = SCO_STATE_INACTIVE; - clearAllScoClients(0, false); - break; - case BluetoothHeadset.STATE_AUDIO_CONNECTING: - if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL && - mScoAudioState != SCO_STATE_DEACTIVATE_REQ && - mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) { - mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL; - } - default: - // do not broadcast CONNECTING or invalid state - broadcast = false; - break; - } - } - if (broadcast) { - broadcastScoConnectionState(scoAudioState); - //FIXME: this is to maintain compatibility with deprecated intent - // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate. - Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); - newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, scoAudioState); - sendStickyBroadcastToAll(newIntent); - } - } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { - mBootCompleted = true; - sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SENDMSG_NOOP, - 0, 0, null, 0); - - mKeyguardManager = - (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); - mScoConnectionState = AudioManager.SCO_AUDIO_STATE_ERROR; - resetBluetoothSco(); - getBluetoothHeadset(); - //FIXME: this is to maintain compatibility with deprecated intent - // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate. - Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); - newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, - AudioManager.SCO_AUDIO_STATE_DISCONNECTED); - sendStickyBroadcastToAll(newIntent); - - BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - if (adapter != null) { - adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, - BluetoothProfile.A2DP); - } - - sendMsg(mAudioHandler, - MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED, - SENDMSG_REPLACE, - 0, - 0, - null, - SAFE_VOLUME_CONFIGURE_TIMEOUT_MS); - - adjustCurrentStreamVolume(); - } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) { - if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { - // a package is being removed, not replaced - String packageName = intent.getData().getSchemeSpecificPart(); - if (packageName != null) { - removeMediaButtonReceiverForPackage(packageName); - } - } - } else if (action.equals(Intent.ACTION_SCREEN_ON)) { - AudioSystem.setParameters("screen_state=on"); - } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { - AudioSystem.setParameters("screen_state=off"); - } else if (action.equalsIgnoreCase(Intent.ACTION_CONFIGURATION_CHANGED)) { - handleConfigurationChanged(context); - } else if (action.equals(Intent.ACTION_USER_BACKGROUND)) { - // attempt to stop music playback for background user - sendMsg(mAudioHandler, - MSG_BROADCAST_AUDIO_BECOMING_NOISY, - SENDMSG_REPLACE, - 0, - 0, - null, - 0); - } else if (action.equals(Intent.ACTION_USER_SWITCHED)) { - // the current audio focus owner is no longer valid - discardAudioFocusOwner(); - - // load volume settings for new user - readAudioSettings(true /*userSwitch*/); - // preserve STREAM_MUSIC volume from one user to the next. - sendMsg(mAudioHandler, - MSG_SET_ALL_VOLUMES, - SENDMSG_QUEUE, - 0, - 0, - mStreamStates[AudioSystem.STREAM_MUSIC], 0); - } else if (action.equals(Intent.ACTION_WIFI_DISPLAY_AUDIO)) { - state = intent.getIntExtra("state", 0); - Log.v(TAG, "WiFi Display device state "+state); - boolean isConnected = mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_PROXY); - if(state == 1 && !isConnected){ - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_PROXY, - AudioSystem.DEVICE_STATE_AVAILABLE, - ""); - mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_PROXY), ""); - }else if(state == 0 && isConnected){ - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_PROXY, - AudioSystem.DEVICE_STATE_UNAVAILABLE, - ""); - mConnectedDevices.remove(AudioSystem.DEVICE_OUT_PROXY); - } - } - } - - private void adjustCurrentStreamVolume() { - VolumeStreamState streamState; - int device; - - for (int stream = 0; stream < AudioSystem.getNumStreamTypes(); stream++) { - if (stream == mStreamVolumeAlias[stream]) { - streamState = mStreamStates[mStreamVolumeAlias[stream]]; - device = getDeviceForStream(stream); - // apply stored value for device - streamState.applyDeviceVolume(device); - } - } - } - } - - private void masterVolumeChanged(final int flags) { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postMasterVolumeChanged(flags); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postMasterVolumeChanged(flags); - } - }); - } - } - - private void masterMuteChanged(final int flags) { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postMasterMuteChanged(flags); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postMasterMuteChanged(flags); - } - }); - } - } - - private void remoteSliderVisibility(final boolean hasRemotePlayback) { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postRemoteSliderVisibility(hasRemotePlayback); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postRemoteSliderVisibility(hasRemotePlayback); - } - }); - } - } - - private void showVolumeChangeUi(final int streamType, final int flags) { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postVolumeChanged(streamType, flags); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postVolumeChanged(streamType, flags); - } - }); - } - } - - private void remoteVolumeChanged(final int streamType, final int flags) { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postRemoteVolumeChanged(streamType, flags); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postRemoteVolumeChanged(streamType, flags); - } - }); - } - } - - private void displaySafeVolumeWarning() { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postDisplaySafeVolumeWarning(); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postDisplaySafeVolumeWarning(); - } - }); - } - } - - private void hasNewRemotePlaybackInfo() { - if (mUiContext != null && mVolumePanel != null) { - mVolumePanel.postHasNewRemotePlaybackInfo(); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mUiContext == null) { - mUiContext = ThemeUtils.createUiContext(mContext); - } - - final Context context = mUiContext != null ? mUiContext : mContext; - mVolumePanel = new VolumePanel(context, AudioService.this); - mVolumePanel.postHasNewRemotePlaybackInfo(); - } - }); - } - } - - //========================================================================================== - // AudioFocus - //========================================================================================== - - /* constant to identify focus stack entry that is used to hold the focus while the phone - * is ringing or during a call. Used by com.android.internal.telephony.CallManager when - * entering and exiting calls. - */ - public final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls"; - - private final static Object mAudioFocusLock = new Object(); - - private final static Object mRingingLock = new Object(); - - private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { - @Override - public void onCallStateChanged(int state, String incomingNumber) { - if (state == TelephonyManager.CALL_STATE_RINGING) { - //Log.v(TAG, " CALL_STATE_RINGING"); - synchronized(mRingingLock) { - mIsRinging = true; - } - } else if ((state == TelephonyManager.CALL_STATE_OFFHOOK) - || (state == TelephonyManager.CALL_STATE_IDLE)) { - synchronized(mRingingLock) { - mIsRinging = false; - } - } - } - }; - - /** - * Discard the current audio focus owner. - * Notify top of audio focus stack that it lost focus (regardless of possibility to reassign - * focus), remove it from the stack, and clear the remote control display. - */ - private void discardAudioFocusOwner() { - synchronized(mAudioFocusLock) { - if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { - // notify the current focus owner it lost focus after removing it from stack - FocusStackEntry focusOwner = mFocusStack.pop(); - try { - focusOwner.mFocusDispatcher.dispatchAudioFocusChange( - AudioManager.AUDIOFOCUS_LOSS, focusOwner.mClientId); - } catch (RemoteException e) { - Log.e(TAG, "Failure to signal loss of audio focus due to "+ e); - e.printStackTrace(); - } - focusOwner.unlinkToDeath(); - // clear RCD - synchronized(mRCStack) { - clearRemoteControlDisplay_syncAfRcs(); - } - } - } - } - - private void notifyTopOfAudioFocusStack() { - // notify the top of the stack it gained focus - if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { - String clientId = mFocusStack.peek().mClientId; - if (canReassignAudioFocusTo(clientId)) { - try { - mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange( - AudioManager.AUDIOFOCUS_GAIN, clientId); - } catch (RemoteException e) { - Log.e(TAG, "Failure to signal gain of audio control focus due to "+ e); - e.printStackTrace(); - } - } - } - } - - private static class FocusStackEntry { - public int mStreamType = -1;// no stream type - public IAudioFocusDispatcher mFocusDispatcher = null; - public IBinder mSourceRef = null; - public String mClientId; - public int mFocusChangeType; - public AudioFocusDeathHandler mHandler; - public String mPackageName; - public int mCallingUid; - - public FocusStackEntry() { - } - - public FocusStackEntry(int streamType, int duration, - IAudioFocusDispatcher afl, IBinder source, String id, AudioFocusDeathHandler hdlr, - String pn, int uid) { - mStreamType = streamType; - mFocusDispatcher = afl; - mSourceRef = source; - mClientId = id; - mFocusChangeType = duration; - mHandler = hdlr; - mPackageName = pn; - mCallingUid = uid; - } - - public void unlinkToDeath() { - try { - if (mSourceRef != null && mHandler != null) { - mSourceRef.unlinkToDeath(mHandler, 0); - mHandler = null; - } - } catch (java.util.NoSuchElementException e) { - Log.e(TAG, "Encountered " + e + " in FocusStackEntry.unlinkToDeath()"); - } - } - - @Override - protected void finalize() throws Throwable { - unlinkToDeath(); // unlink exception handled inside method - super.finalize(); - } - } - - private final Stack mFocusStack = new Stack(); - - /** - * Helper function: - * Display in the log the current entries in the audio focus stack - */ - private void dumpFocusStack(PrintWriter pw) { - pw.println("\nAudio Focus stack entries:"); - synchronized(mAudioFocusLock) { - Iterator stackIterator = mFocusStack.iterator(); - while(stackIterator.hasNext()) { - FocusStackEntry fse = stackIterator.next(); - pw.println(" source:" + fse.mSourceRef - + " -- pack: " + fse.mPackageName - + " -- client: " + fse.mClientId - + " -- duration: " + fse.mFocusChangeType - + " -- uid: " + fse.mCallingUid - + " -- stream: " + fse.mStreamType); - } - } - } - - /** - * Helper function: - * Called synchronized on mAudioFocusLock - * Remove a focus listener from the focus stack. - * @param focusListenerToRemove the focus listener - * @param signal if true and the listener was at the top of the focus stack, i.e. it was holding - * focus, notify the next item in the stack it gained focus. - */ - private void removeFocusStackEntry(String clientToRemove, boolean signal) { - // is the current top of the focus stack abandoning focus? (because of request, not death) - if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientToRemove)) - { - //Log.i(TAG, " removeFocusStackEntry() removing top of stack"); - FocusStackEntry fse = mFocusStack.pop(); - fse.unlinkToDeath(); - if (signal) { - // notify the new top of the stack it gained focus - notifyTopOfAudioFocusStack(); - // there's a new top of the stack, let the remote control know - synchronized(mRCStack) { - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } else { - // focus is abandoned by a client that's not at the top of the stack, - // no need to update focus. - Iterator stackIterator = mFocusStack.iterator(); - while(stackIterator.hasNext()) { - FocusStackEntry fse = (FocusStackEntry)stackIterator.next(); - if(fse.mClientId.equals(clientToRemove)) { - Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for " - + fse.mClientId); - stackIterator.remove(); - fse.unlinkToDeath(); - } - } - } - } - - /** - * Helper function: - * Called synchronized on mAudioFocusLock - * Remove focus listeners from the focus stack for a particular client when it has died. - */ - private void removeFocusStackEntryForClient(IBinder cb) { - // is the owner of the audio focus part of the client to remove? - boolean isTopOfStackForClientToRemove = !mFocusStack.isEmpty() && - mFocusStack.peek().mSourceRef.equals(cb); - Iterator stackIterator = mFocusStack.iterator(); - while(stackIterator.hasNext()) { - FocusStackEntry fse = (FocusStackEntry)stackIterator.next(); - if(fse.mSourceRef.equals(cb)) { - Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for " - + fse.mClientId); - stackIterator.remove(); - // the client just died, no need to unlink to its death - } - } - if (isTopOfStackForClientToRemove) { - // we removed an entry at the top of the stack: - // notify the new top of the stack it gained focus. - notifyTopOfAudioFocusStack(); - // there's a new top of the stack, let the remote control know - synchronized(mRCStack) { - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } - - /** - * Helper function: - * Returns true if the system is in a state where the focus can be reevaluated, false otherwise. - */ - private boolean canReassignAudioFocusTo(String clientId) { - // focus requests are rejected during a phone call or when the phone is ringing - // this is equivalent to IN_VOICE_COMM_FOCUS_ID having the focus - if (IN_VOICE_COMM_FOCUS_ID.equals(clientId)) { - return true; - } - if (!mFocusStack.isEmpty() && IN_VOICE_COMM_FOCUS_ID.equals(mFocusStack.peek().mClientId)) { - return false; - } - return true; - } - - /** - * Inner class to monitor audio focus client deaths, and remove them from the audio focus - * stack if necessary. - */ - private class AudioFocusDeathHandler implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - - AudioFocusDeathHandler(IBinder cb) { - mCb = cb; - } - - public void binderDied() { - synchronized(mAudioFocusLock) { - Log.w(TAG, " AudioFocus audio focus client died"); - removeFocusStackEntryForClient(mCb); - } - } - - public IBinder getBinder() { - return mCb; - } - } - - - /** @see AudioManager#requestAudioFocus(IAudioFocusDispatcher, int, int) */ - public int requestAudioFocus(int mainStreamType, int focusChangeHint, IBinder cb, - IAudioFocusDispatcher fd, String clientId, String callingPackageName) { - Log.i(TAG, " AudioFocus requestAudioFocus() from " + clientId); - // the main stream type for the audio focus request is currently not used. It may - // potentially be used to handle multiple stream type-dependent audio focuses. - - // we need a valid binder callback for clients - if (!cb.pingBinder()) { - Log.e(TAG, " AudioFocus DOA client for requestAudioFocus(), aborting."); - return AudioManager.AUDIOFOCUS_REQUEST_FAILED; - } - - synchronized(mAudioFocusLock) { - if (!canReassignAudioFocusTo(clientId)) { - return AudioManager.AUDIOFOCUS_REQUEST_FAILED; - } - - // handle the potential premature death of the new holder of the focus - // (premature death == death before abandoning focus) - // Register for client death notification - AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb); - try { - cb.linkToDeath(afdh, 0); - } catch (RemoteException e) { - // client has already died! - Log.w(TAG, "AudioFocus requestAudioFocus() could not link to "+cb+" binder death"); - return AudioManager.AUDIOFOCUS_REQUEST_FAILED; - } - - if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientId)) { - // if focus is already owned by this client and the reason for acquiring the focus - // hasn't changed, don't do anything - if (mFocusStack.peek().mFocusChangeType == focusChangeHint) { - // unlink death handler so it can be gc'ed. - // linkToDeath() creates a JNI global reference preventing collection. - cb.unlinkToDeath(afdh, 0); - return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; - } - // the reason for the audio focus request has changed: remove the current top of - // stack and respond as if we had a new focus owner - FocusStackEntry fse = mFocusStack.pop(); - fse.unlinkToDeath(); - } - - // notify current top of stack it is losing focus - if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) { - try { - mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange( - -1 * focusChangeHint, // loss and gain codes are inverse of each other - mFocusStack.peek().mClientId); - } catch (RemoteException e) { - Log.e(TAG, " Failure to signal loss of focus due to "+ e); - e.printStackTrace(); - } - } - - // focus requester might already be somewhere below in the stack, remove it - removeFocusStackEntry(clientId, false /* signal */); - - // push focus requester at the top of the audio focus stack - mFocusStack.push(new FocusStackEntry(mainStreamType, focusChangeHint, fd, cb, - clientId, afdh, callingPackageName, Binder.getCallingUid())); - - // there's a new top of the stack, let the remote control know - synchronized(mRCStack) { - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - }//synchronized(mAudioFocusLock) - - return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; - } - - /** @see AudioManager#abandonAudioFocus(IAudioFocusDispatcher) */ - public int abandonAudioFocus(IAudioFocusDispatcher fl, String clientId) { - Log.i(TAG, " AudioFocus abandonAudioFocus() from " + clientId); - try { - // this will take care of notifying the new focus owner if needed - synchronized(mAudioFocusLock) { - removeFocusStackEntry(clientId, true); - } - } catch (java.util.ConcurrentModificationException cme) { - // Catching this exception here is temporary. It is here just to prevent - // a crash seen when the "Silent" notification is played. This is believed to be fixed - // but this try catch block is left just to be safe. - Log.e(TAG, "FATAL EXCEPTION AudioFocus abandonAudioFocus() caused " + cme); - cme.printStackTrace(); - } - - return AudioManager.AUDIOFOCUS_REQUEST_GRANTED; - } - - - public void unregisterAudioFocusClient(String clientId) { - synchronized(mAudioFocusLock) { - removeFocusStackEntry(clientId, false); - } - } - - - //========================================================================================== - // RemoteControl - //========================================================================================== - public void dispatchMediaKeyEvent(KeyEvent keyEvent) { - filterMediaKeyEvent(keyEvent, false /*needWakeLock*/); - } - - public void dispatchMediaKeyEventUnderWakelock(KeyEvent keyEvent) { - filterMediaKeyEvent(keyEvent, true /*needWakeLock*/); - } - - private void filterMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { - // sanity check on the incoming key event - if (!isValidMediaKeyEvent(keyEvent)) { - Log.e(TAG, "not dispatching invalid media key event " + keyEvent); - return; - } - // event filtering for telephony - synchronized(mRingingLock) { - synchronized(mRCStack) { - if ((mMediaReceiverForCalls != null) && - (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL))) { - dispatchMediaKeyEventForCalls(keyEvent, needWakeLock); - return; - } - } - } - // event filtering based on voice-based interactions - if (isValidVoiceInputKeyCode(keyEvent.getKeyCode())) { - filterVoiceInputKeyEvent(keyEvent, needWakeLock); - } else { - dispatchMediaKeyEvent(keyEvent, needWakeLock); - } - } - - /** - * Handles the dispatching of the media button events to the telephony package. - * Precondition: mMediaReceiverForCalls != null - * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons - * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event - * is dispatched. - */ - private void dispatchMediaKeyEventForCalls(KeyEvent keyEvent, boolean needWakeLock) { - Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); - keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); - keyIntent.setPackage(mMediaReceiverForCalls.getPackageName()); - if (needWakeLock) { - mMediaEventWakeLock.acquire(); - keyIntent.putExtra(EXTRA_WAKELOCK_ACQUIRED, WAKELOCK_RELEASE_ON_FINISHED); - } - final long ident = Binder.clearCallingIdentity(); - try { - mContext.sendOrderedBroadcastAsUser(keyIntent, UserHandle.ALL, - null, mKeyEventDone, mAudioHandler, Activity.RESULT_OK, null, null); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - /** - * Handles the dispatching of the media button events to one of the registered listeners, - * or if there was none, broadcast an ACTION_MEDIA_BUTTON intent to the rest of the system. - * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons - * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event - * is dispatched. - */ - private void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { - if (needWakeLock) { - mMediaEventWakeLock.acquire(); - } - Intent keyIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); - keyIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); - synchronized(mRCStack) { - if (!mRCStack.empty()) { - // send the intent that was registered by the client - try { - mRCStack.peek().mMediaIntent.send(mContext, - needWakeLock ? WAKELOCK_RELEASE_ON_FINISHED : 0 /*code*/, - keyIntent, AudioService.this, mAudioHandler); - } catch (CanceledException e) { - Log.e(TAG, "Error sending pending intent " + mRCStack.peek()); - e.printStackTrace(); - } - } else { - // legacy behavior when nobody registered their media button event receiver - // through AudioManager - if (needWakeLock) { - keyIntent.putExtra(EXTRA_WAKELOCK_ACQUIRED, WAKELOCK_RELEASE_ON_FINISHED); - } - final long ident = Binder.clearCallingIdentity(); - try { - mContext.sendOrderedBroadcastAsUser(keyIntent, UserHandle.ALL, - null, mKeyEventDone, - mAudioHandler, Activity.RESULT_OK, null, null); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - } - } - - /** - * The different actions performed in response to a voice button key event. - */ - private final static int VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS = 1; - private final static int VOICEBUTTON_ACTION_START_VOICE_INPUT = 2; - private final static int VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS = 3; - - private final Object mVoiceEventLock = new Object(); - private boolean mVoiceButtonDown; - private boolean mVoiceButtonHandled; - - /** - * Filter key events that may be used for voice-based interactions - * @param keyEvent a non-null KeyEvent whose key code is that of one of the supported - * media buttons that can be used to trigger voice-based interactions. - * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event - * is dispatched. - */ - private void filterVoiceInputKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { - if (DEBUG_RC) { - Log.v(TAG, "voice input key event: " + keyEvent + ", needWakeLock=" + needWakeLock); - } - - int voiceButtonAction = VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS; - int keyAction = keyEvent.getAction(); - synchronized (mVoiceEventLock) { - if (keyAction == KeyEvent.ACTION_DOWN) { - if (keyEvent.getRepeatCount() == 0) { - // initial down - mVoiceButtonDown = true; - mVoiceButtonHandled = false; - } else if (mVoiceButtonDown && !mVoiceButtonHandled - && (keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) { - // long-press, start voice-based interactions - mVoiceButtonHandled = true; - voiceButtonAction = VOICEBUTTON_ACTION_START_VOICE_INPUT; - } - } else if (keyAction == KeyEvent.ACTION_UP) { - if (mVoiceButtonDown) { - // voice button up - mVoiceButtonDown = false; - if (!mVoiceButtonHandled && !keyEvent.isCanceled()) { - voiceButtonAction = VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS; - } - } - } - }//synchronized (mVoiceEventLock) - - // take action after media button event filtering for voice-based interactions - switch (voiceButtonAction) { - case VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS: - if (DEBUG_RC) Log.v(TAG, " ignore key event"); - break; - case VOICEBUTTON_ACTION_START_VOICE_INPUT: - if (DEBUG_RC) Log.v(TAG, " start voice-based interactions"); - // then start the voice-based interactions - startVoiceBasedInteractions(needWakeLock); - break; - case VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS: - if (DEBUG_RC) Log.v(TAG, " send simulated key event, wakelock=" + needWakeLock); - sendSimulatedMediaButtonEvent(keyEvent, needWakeLock); - break; - } - } - - private void sendSimulatedMediaButtonEvent(KeyEvent originalKeyEvent, boolean needWakeLock) { - // send DOWN event - KeyEvent keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_DOWN); - dispatchMediaKeyEvent(keyEvent, needWakeLock); - // send UP event - keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_UP); - dispatchMediaKeyEvent(keyEvent, needWakeLock); - - } - - - private static boolean isValidMediaKeyEvent(KeyEvent keyEvent) { - if (keyEvent == null) { - return false; - } - final int keyCode = keyEvent.getKeyCode(); - switch (keyCode) { - case KeyEvent.KEYCODE_MUTE: - case KeyEvent.KEYCODE_HEADSETHOOK: - case KeyEvent.KEYCODE_MEDIA_PLAY: - case KeyEvent.KEYCODE_MEDIA_PAUSE: - case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: - case KeyEvent.KEYCODE_MEDIA_STOP: - case KeyEvent.KEYCODE_MEDIA_NEXT: - case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - case KeyEvent.KEYCODE_MEDIA_REWIND: - case KeyEvent.KEYCODE_MEDIA_RECORD: - case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: - case KeyEvent.KEYCODE_MEDIA_CLOSE: - case KeyEvent.KEYCODE_MEDIA_EJECT: - break; - default: - return false; - } - return true; - } - - /** - * Checks whether the given key code is one that can trigger the launch of voice-based - * interactions. - * @param keyCode the key code associated with the key event - * @return true if the key is one of the supported voice-based interaction triggers - */ - private static boolean isValidVoiceInputKeyCode(int keyCode) { - if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { - return true; - } else { - return false; - } - } - - /** - * Tell the system to start voice-based interactions / voice commands - */ - private void startVoiceBasedInteractions(boolean needWakeLock) { - Intent voiceIntent = null; - // select which type of search to launch: - // - screen on and device unlocked: action is ACTION_WEB_SEARCH - // - device locked or screen off: action is ACTION_VOICE_SEARCH_HANDS_FREE - // with EXTRA_SECURE set to true if the device is securely locked - PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); - boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked(); - if (!isLocked && pm.isScreenOn()) { - voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH); - } else { - voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE); - voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE, - isLocked && mKeyguardManager.isKeyguardSecure()); - } - // start the search activity - if (needWakeLock) { - mMediaEventWakeLock.acquire(); - } - try { - if (voiceIntent != null) { - voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - mContext.startActivity(voiceIntent); - } - } catch (ActivityNotFoundException e) { - Log.w(TAG, "No activity for search: " + e); - } finally { - if (needWakeLock) { - mMediaEventWakeLock.release(); - } - } - } - - private PowerManager.WakeLock mMediaEventWakeLock; - - private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; //magic number - - // only set when wakelock was acquired, no need to check value when received - private static final String EXTRA_WAKELOCK_ACQUIRED = - "android.media.AudioService.WAKELOCK_ACQUIRED"; - - public void onSendFinished(PendingIntent pendingIntent, Intent intent, - int resultCode, String resultData, Bundle resultExtras) { - if (resultCode == WAKELOCK_RELEASE_ON_FINISHED) { - mMediaEventWakeLock.release(); - } - } - - BroadcastReceiver mKeyEventDone = new BroadcastReceiver() { - public void onReceive(Context context, Intent intent) { - if (intent == null) { - return; - } - Bundle extras = intent.getExtras(); - if (extras == null) { - return; - } - if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)) { - mMediaEventWakeLock.release(); - } - } - }; - - private final Object mCurrentRcLock = new Object(); - /** - * The one remote control client which will receive a request for display information. - * This object may be null. - * Access protected by mCurrentRcLock. - */ - private IRemoteControlClient mCurrentRcClient = null; - - private final static int RC_INFO_NONE = 0; - private final static int RC_INFO_ALL = - RemoteControlClient.FLAG_INFORMATION_REQUEST_ALBUM_ART | - RemoteControlClient.FLAG_INFORMATION_REQUEST_KEY_MEDIA | - RemoteControlClient.FLAG_INFORMATION_REQUEST_METADATA | - RemoteControlClient.FLAG_INFORMATION_REQUEST_PLAYSTATE; - - /** - * A monotonically increasing generation counter for mCurrentRcClient. - * Only accessed with a lock on mCurrentRcLock. - * No value wrap-around issues as we only act on equal values. - */ - private int mCurrentRcClientGen = 0; - - /** - * Inner class to monitor remote control client deaths, and remove the client for the - * remote control stack if necessary. - */ - private class RcClientDeathHandler implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - private PendingIntent mMediaIntent; - - RcClientDeathHandler(IBinder cb, PendingIntent pi) { - mCb = cb; - mMediaIntent = pi; - } - - public void binderDied() { - Log.w(TAG, " RemoteControlClient died"); - // remote control client died, make sure the displays don't use it anymore - // by setting its remote control client to null - registerRemoteControlClient(mMediaIntent, null/*rcClient*/, null/*ignored*/); - // the dead client was maybe handling remote playback, reevaluate - postReevaluateRemote(); - } - - public IBinder getBinder() { - return mCb; - } - } - - /** - * A global counter for RemoteControlClient identifiers - */ - private static int sLastRccId = 0; - - private class RemotePlaybackState { - int mRccId; - int mVolume; - int mVolumeMax; - int mVolumeHandling; - - private RemotePlaybackState(int id, int vol, int volMax) { - mRccId = id; - mVolume = vol; - mVolumeMax = volMax; - mVolumeHandling = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME_HANDLING; - } - } - - /** - * Internal cache for the playback information of the RemoteControlClient whose volume gets to - * be controlled by the volume keys ("main"), so we don't have to iterate over the RC stack - * every time we need this info. - */ - private RemotePlaybackState mMainRemote; - /** - * Indicates whether the "main" RemoteControlClient is considered active. - * Use synchronized on mMainRemote. - */ - private boolean mMainRemoteIsActive; - /** - * Indicates whether there is remote playback going on. True even if there is no "active" - * remote playback (mMainRemoteIsActive is false), but a RemoteControlClient has declared it - * handles remote playback. - * Use synchronized on mMainRemote. - */ - private boolean mHasRemotePlayback; - - private static class RemoteControlStackEntry { - public int mRccId = RemoteControlClient.RCSE_ID_UNREGISTERED; - /** - * The target for the ACTION_MEDIA_BUTTON events. - * Always non null. - */ - public PendingIntent mMediaIntent; - /** - * The registered media button event receiver. - * Always non null. - */ - public ComponentName mReceiverComponent; - public String mCallingPackageName; - public int mCallingUid; - /** - * Provides access to the information to display on the remote control. - * May be null (when a media button event receiver is registered, - * but no remote control client has been registered) */ - public IRemoteControlClient mRcClient; - public RcClientDeathHandler mRcClientDeathHandler; - /** - * Information only used for non-local playback - */ - public int mPlaybackType; - public int mPlaybackVolume; - public int mPlaybackVolumeMax; - public int mPlaybackVolumeHandling; - public int mPlaybackStream; - public int mPlaybackState; - public IRemoteVolumeObserver mRemoteVolumeObs; - - public void resetPlaybackInfo() { - mPlaybackType = RemoteControlClient.PLAYBACK_TYPE_LOCAL; - mPlaybackVolume = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME; - mPlaybackVolumeMax = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME; - mPlaybackVolumeHandling = RemoteControlClient.DEFAULT_PLAYBACK_VOLUME_HANDLING; - mPlaybackStream = AudioManager.STREAM_MUSIC; - mPlaybackState = RemoteControlClient.PLAYSTATE_STOPPED; - mRemoteVolumeObs = null; - } - - /** precondition: mediaIntent != null, eventReceiver != null */ - public RemoteControlStackEntry(PendingIntent mediaIntent, ComponentName eventReceiver) { - mMediaIntent = mediaIntent; - mReceiverComponent = eventReceiver; - mCallingUid = -1; - mRcClient = null; - mRccId = ++sLastRccId; - - resetPlaybackInfo(); - } - - public void unlinkToRcClientDeath() { - if ((mRcClientDeathHandler != null) && (mRcClientDeathHandler.mCb != null)) { - try { - mRcClientDeathHandler.mCb.unlinkToDeath(mRcClientDeathHandler, 0); - mRcClientDeathHandler = null; - } catch (java.util.NoSuchElementException e) { - // not much we can do here - Log.e(TAG, "Encountered " + e + " in unlinkToRcClientDeath()"); - e.printStackTrace(); - } - } - } - - @Override - protected void finalize() throws Throwable { - unlinkToRcClientDeath();// unlink exception handled inside method - super.finalize(); - } - } - - /** - * The stack of remote control event receivers. - * Code sections and methods that modify the remote control event receiver stack are - * synchronized on mRCStack, but also BEFORE on mFocusLock as any change in either - * stack, audio focus or RC, can lead to a change in the remote control display - */ - private final Stack mRCStack = new Stack(); - - /** - * The component the telephony package can register so telephony calls have priority to - * handle media button events - */ - private ComponentName mMediaReceiverForCalls = null; - - /** - * Helper function: - * Display in the log the current entries in the remote control focus stack - */ - private void dumpRCStack(PrintWriter pw) { - pw.println("\nRemote Control stack entries:"); - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - pw.println(" pi: " + rcse.mMediaIntent + - " -- pack: " + rcse.mCallingPackageName + - " -- ercvr: " + rcse.mReceiverComponent + - " -- client: " + rcse.mRcClient + - " -- uid: " + rcse.mCallingUid + - " -- type: " + rcse.mPlaybackType + - " state: " + rcse.mPlaybackState); - } - } - } - - /** - * Helper function: - * Display in the log the current entries in the remote control stack, focusing - * on RemoteControlClient data - */ - private void dumpRCCStack(PrintWriter pw) { - pw.println("\nRemote Control Client stack entries:"); - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - pw.println(" uid: " + rcse.mCallingUid + - " -- id: " + rcse.mRccId + - " -- type: " + rcse.mPlaybackType + - " -- state: " + rcse.mPlaybackState + - " -- vol handling: " + rcse.mPlaybackVolumeHandling + - " -- vol: " + rcse.mPlaybackVolume + - " -- volMax: " + rcse.mPlaybackVolumeMax + - " -- volObs: " + rcse.mRemoteVolumeObs); - - } - } - synchronized (mMainRemote) { - pw.println("\nRemote Volume State:"); - pw.println(" has remote: " + mHasRemotePlayback); - pw.println(" is remote active: " + mMainRemoteIsActive); - pw.println(" rccId: " + mMainRemote.mRccId); - pw.println(" volume handling: " - + ((mMainRemote.mVolumeHandling == RemoteControlClient.PLAYBACK_VOLUME_FIXED) ? - "PLAYBACK_VOLUME_FIXED(0)" : "PLAYBACK_VOLUME_VARIABLE(1)")); - pw.println(" volume: " + mMainRemote.mVolume); - pw.println(" volume steps: " + mMainRemote.mVolumeMax); - } - } - - /** - * Helper function: - * Remove any entry in the remote control stack that has the same package name as packageName - * Pre-condition: packageName != null - */ - private void removeMediaButtonReceiverForPackage(String packageName) { - synchronized(mRCStack) { - if (mRCStack.empty()) { - return; - } else { - RemoteControlStackEntry oldTop = mRCStack.peek(); - Iterator stackIterator = mRCStack.iterator(); - // iterate over the stack entries - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = (RemoteControlStackEntry)stackIterator.next(); - if (packageName.equalsIgnoreCase(rcse.mReceiverComponent.getPackageName())) { - // a stack entry is from the package being removed, remove it from the stack - stackIterator.remove(); - rcse.unlinkToRcClientDeath(); - } - } - if (mRCStack.empty()) { - // no saved media button receiver - mAudioHandler.sendMessage( - mAudioHandler.obtainMessage(MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, - null)); - } else if (oldTop != mRCStack.peek()) { - // the top of the stack has changed, save it in the system settings - // by posting a message to persist it - mAudioHandler.sendMessage( - mAudioHandler.obtainMessage(MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, - mRCStack.peek().mReceiverComponent)); - } - } - } - } - - /** - * Helper function: - * Restore remote control receiver from the system settings. - */ - private void restoreMediaButtonReceiver() { - String receiverName = Settings.System.getStringForUser(mContentResolver, - Settings.System.MEDIA_BUTTON_RECEIVER, UserHandle.USER_CURRENT); - if ((null != receiverName) && !receiverName.isEmpty()) { - ComponentName eventReceiver = ComponentName.unflattenFromString(receiverName); - // construct a PendingIntent targeted to the restored component name - // for the media button and register it - Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); - // the associated intent will be handled by the component being registered - mediaButtonIntent.setComponent(eventReceiver); - PendingIntent pi = PendingIntent.getBroadcast(mContext, - 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/); - registerMediaButtonIntent(pi, eventReceiver); - } - } - - /** - * Helper function: - * Set the new remote control receiver at the top of the RC focus stack. - * precondition: mediaIntent != null, target != null - */ - private void pushMediaButtonReceiver(PendingIntent mediaIntent, ComponentName target) { - // already at top of stack? - if (!mRCStack.empty() && mRCStack.peek().mMediaIntent.equals(mediaIntent)) { - return; - } - Iterator stackIterator = mRCStack.iterator(); - RemoteControlStackEntry rcse = null; - boolean wasInsideStack = false; - while(stackIterator.hasNext()) { - rcse = (RemoteControlStackEntry)stackIterator.next(); - if(rcse.mMediaIntent.equals(mediaIntent)) { - wasInsideStack = true; - stackIterator.remove(); - break; - } - } - if (!wasInsideStack) { - rcse = new RemoteControlStackEntry(mediaIntent, target); - } - mRCStack.push(rcse); - - // post message to persist the default media button receiver - mAudioHandler.sendMessage( mAudioHandler.obtainMessage( - MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, target/*obj*/) ); - } - - /** - * Helper function: - * Remove the remote control receiver from the RC focus stack. - * precondition: pi != null - */ - private void removeMediaButtonReceiver(PendingIntent pi) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = (RemoteControlStackEntry)stackIterator.next(); - if(rcse.mMediaIntent.equals(pi)) { - stackIterator.remove(); - rcse.unlinkToRcClientDeath(); - break; - } - } - } - - /** - * Helper function: - * Called synchronized on mRCStack - */ - private boolean isCurrentRcController(PendingIntent pi) { - if (!mRCStack.empty() && mRCStack.peek().mMediaIntent.equals(pi)) { - return true; - } - return false; - } - - //========================================================================================== - // Remote control display / client - //========================================================================================== - /** - * Update the remote control displays with the new "focused" client generation - */ - private void setNewRcClientOnDisplays_syncRcsCurrc(int newClientGeneration, - PendingIntent newMediaIntent, boolean clearing) { - // NOTE: Only one IRemoteControlDisplay supported in this implementation - if (mRcDisplay != null) { - try { - mRcDisplay.setCurrentClientId( - newClientGeneration, newMediaIntent, clearing); - } catch (RemoteException e) { - Log.e(TAG, "Dead display in setNewRcClientOnDisplays_syncRcsCurrc() "+e); - // if we had a display before, stop monitoring its death - rcDisplay_stopDeathMonitor_syncRcStack(); - mRcDisplay = null; - } - } - } - - /** - * Update the remote control clients with the new "focused" client generation - */ - private void setNewRcClientGenerationOnClients_syncRcsCurrc(int newClientGeneration) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry se = stackIterator.next(); - if ((se != null) && (se.mRcClient != null)) { - try { - se.mRcClient.setCurrentClientGenerationId(newClientGeneration); - } catch (RemoteException e) { - Log.w(TAG, "Dead client in setNewRcClientGenerationOnClients_syncRcsCurrc()"+e); - stackIterator.remove(); - se.unlinkToRcClientDeath(); - } - } - } - } - - /** - * Update the displays and clients with the new "focused" client generation and name - * @param newClientGeneration the new generation value matching a client update - * @param newClientEventReceiver the media button event receiver associated with the client. - * May be null, which implies there is no registered media button event receiver. - * @param clearing true if the new client generation value maps to a remote control update - * where the display should be cleared. - */ - private void setNewRcClient_syncRcsCurrc(int newClientGeneration, - PendingIntent newMediaIntent, boolean clearing) { - // send the new valid client generation ID to all displays - setNewRcClientOnDisplays_syncRcsCurrc(newClientGeneration, newMediaIntent, clearing); - // send the new valid client generation ID to all clients - setNewRcClientGenerationOnClients_syncRcsCurrc(newClientGeneration); - } - - /** - * Called when processing MSG_RCDISPLAY_CLEAR event - */ - private void onRcDisplayClear() { - if (DEBUG_RC) Log.i(TAG, "Clear remote control display"); - - synchronized(mRCStack) { - synchronized(mCurrentRcLock) { - mCurrentRcClientGen++; - // synchronously update the displays and clients with the new client generation - setNewRcClient_syncRcsCurrc(mCurrentRcClientGen, - null /*newMediaIntent*/, true /*clearing*/); - } - } - } - - /** - * Called when processing MSG_RCDISPLAY_UPDATE event - */ - private void onRcDisplayUpdate(RemoteControlStackEntry rcse, int flags /* USED ?*/) { - synchronized(mRCStack) { - synchronized(mCurrentRcLock) { - if ((mCurrentRcClient != null) && (mCurrentRcClient.equals(rcse.mRcClient))) { - if (DEBUG_RC) Log.i(TAG, "Display/update remote control "); - - mCurrentRcClientGen++; - // synchronously update the displays and clients with - // the new client generation - setNewRcClient_syncRcsCurrc(mCurrentRcClientGen, - rcse.mMediaIntent /*newMediaIntent*/, - false /*clearing*/); - - // tell the current client that it needs to send info - try { - mCurrentRcClient.onInformationRequested(mCurrentRcClientGen, - flags, mArtworkExpectedWidth, mArtworkExpectedHeight); - } catch (RemoteException e) { - Log.e(TAG, "Current valid remote client is dead: "+e); - mCurrentRcClient = null; - } - } else { - // the remote control display owner has changed between the - // the message to update the display was sent, and the time it - // gets to be processed (now) - } - } - } - } - - - /** - * Helper function: - * Called synchronized on mRCStack - */ - private void clearRemoteControlDisplay_syncAfRcs() { - synchronized(mCurrentRcLock) { - mCurrentRcClient = null; - } - // will cause onRcDisplayClear() to be called in AudioService's handler thread - mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_CLEAR) ); - } - - /** - * Helper function for code readability: only to be called from - * checkUpdateRemoteControlDisplay_syncAfRcs() which checks the preconditions for - * this method. - * Preconditions: - * - called synchronized mAudioFocusLock then on mRCStack - * - mRCStack.isEmpty() is false - */ - private void updateRemoteControlDisplay_syncAfRcs(int infoChangedFlags) { - RemoteControlStackEntry rcse = mRCStack.peek(); - int infoFlagsAboutToBeUsed = infoChangedFlags; - // this is where we enforce opt-in for information display on the remote controls - // with the new AudioManager.registerRemoteControlClient() API - if (rcse.mRcClient == null) { - //Log.w(TAG, "Can't update remote control display with null remote control client"); - clearRemoteControlDisplay_syncAfRcs(); - return; - } - synchronized(mCurrentRcLock) { - if (!rcse.mRcClient.equals(mCurrentRcClient)) { - // new RC client, assume every type of information shall be queried - infoFlagsAboutToBeUsed = RC_INFO_ALL; - } - mCurrentRcClient = rcse.mRcClient; - } - // will cause onRcDisplayUpdate() to be called in AudioService's handler thread - mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_UPDATE, - infoFlagsAboutToBeUsed /* arg1 */, 0, rcse /* obj, != null */) ); - } - - /** - * Helper function: - * Called synchronized on mAudioFocusLock, then mRCStack - * Check whether the remote control display should be updated, triggers the update if required - * @param infoChangedFlags the flags corresponding to the remote control client information - * that has changed, if applicable (checking for the update conditions might trigger a - * clear, rather than an update event). - */ - private void checkUpdateRemoteControlDisplay_syncAfRcs(int infoChangedFlags) { - // determine whether the remote control display should be refreshed - // if either stack is empty, there is a mismatch, so clear the RC display - if (mRCStack.isEmpty() || mFocusStack.isEmpty()) { - clearRemoteControlDisplay_syncAfRcs(); - return; - } - - // determine which entry in the AudioFocus stack to consider, and compare against the - // top of the stack for the media button event receivers : simply using the top of the - // stack would make the entry disappear from the RemoteControlDisplay in conditions such as - // notifications playing during music playback. - // Crawl the AudioFocus stack from the top until an entry is found with the following - // characteristics: - // - focus gain on STREAM_MUSIC stream - // - non-transient focus gain on a stream other than music - FocusStackEntry af = null; - try { - for (int index = mFocusStack.size()-1; index >= 0; index--) { - FocusStackEntry fse = mFocusStack.elementAt(index); - if ((fse.mStreamType == AudioManager.STREAM_MUSIC) - || (fse.mFocusChangeType == AudioManager.AUDIOFOCUS_GAIN)) { - af = fse; - break; - } - } - } catch (ArrayIndexOutOfBoundsException e) { - Log.e(TAG, "Wrong index accessing audio focus stack when updating RCD: " + e); - af = null; - } - if (af == null) { - clearRemoteControlDisplay_syncAfRcs(); - return; - } - - // if the audio focus and RC owners belong to different packages, there is a mismatch, clear - if ((mRCStack.peek().mCallingPackageName != null) - && (af.mPackageName != null) - && !(mRCStack.peek().mCallingPackageName.compareTo( - af.mPackageName) == 0)) { - clearRemoteControlDisplay_syncAfRcs(); - return; - } - // if the audio focus didn't originate from the same Uid as the one in which the remote - // control information will be retrieved, clear - if (mRCStack.peek().mCallingUid != af.mCallingUid) { - clearRemoteControlDisplay_syncAfRcs(); - return; - } - - // refresh conditions were verified: update the remote controls - // ok to call: synchronized mAudioFocusLock then on mRCStack, mRCStack is not empty - updateRemoteControlDisplay_syncAfRcs(infoChangedFlags); - } - - /** - * see AudioManager.registerMediaButtonIntent(PendingIntent pi, ComponentName c) - * precondition: mediaIntent != null, target != null - */ - public void registerMediaButtonIntent(PendingIntent mediaIntent, ComponentName eventReceiver) { - Log.i(TAG, " Remote Control registerMediaButtonIntent() for " + mediaIntent); - - synchronized(mAudioFocusLock) { - synchronized(mRCStack) { - pushMediaButtonReceiver(mediaIntent, eventReceiver); - // new RC client, assume every type of information shall be queried - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } - - /** - * see AudioManager.unregisterMediaButtonIntent(PendingIntent mediaIntent) - * precondition: mediaIntent != null, eventReceiver != null - */ - public void unregisterMediaButtonIntent(PendingIntent mediaIntent, ComponentName eventReceiver) - { - Log.i(TAG, " Remote Control unregisterMediaButtonIntent() for " + mediaIntent); - - synchronized(mAudioFocusLock) { - synchronized(mRCStack) { - boolean topOfStackWillChange = isCurrentRcController(mediaIntent); - removeMediaButtonReceiver(mediaIntent); - if (topOfStackWillChange) { - // current RC client will change, assume every type of info needs to be queried - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } - } - - /** - * see AudioManager.registerMediaButtonEventReceiverForCalls(ComponentName c) - * precondition: c != null - */ - public void registerMediaButtonEventReceiverForCalls(ComponentName c) { - if (mContext.checkCallingPermission("android.permission.MODIFY_PHONE_STATE") - != PackageManager.PERMISSION_GRANTED) { - Log.e(TAG, "Invalid permissions to register media button receiver for calls"); - return; - } - synchronized(mRCStack) { - mMediaReceiverForCalls = c; - } - } - - /** - * see AudioManager.unregisterMediaButtonEventReceiverForCalls() - */ - public void unregisterMediaButtonEventReceiverForCalls() { - if (mContext.checkCallingPermission("android.permission.MODIFY_PHONE_STATE") - != PackageManager.PERMISSION_GRANTED) { - Log.e(TAG, "Invalid permissions to unregister media button receiver for calls"); - return; - } - synchronized(mRCStack) { - mMediaReceiverForCalls = null; - } - } - - /** - * see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...) - * @return the unique ID of the RemoteControlStackEntry associated with the RemoteControlClient - * Note: using this method with rcClient == null is a way to "disable" the IRemoteControlClient - * without modifying the RC stack, but while still causing the display to refresh (will - * become blank as a result of this) - */ - public int registerRemoteControlClient(PendingIntent mediaIntent, - IRemoteControlClient rcClient, String callingPackageName) { - if (DEBUG_RC) Log.i(TAG, "Register remote control client rcClient="+rcClient); - int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; - synchronized(mAudioFocusLock) { - synchronized(mRCStack) { - // store the new display information - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if(rcse.mMediaIntent.equals(mediaIntent)) { - // already had a remote control client? - if (rcse.mRcClientDeathHandler != null) { - // stop monitoring the old client's death - rcse.unlinkToRcClientDeath(); - } - // save the new remote control client - rcse.mRcClient = rcClient; - rcse.mCallingPackageName = callingPackageName; - rcse.mCallingUid = Binder.getCallingUid(); - if (rcClient == null) { - // here rcse.mRcClientDeathHandler is null; - rcse.resetPlaybackInfo(); - break; - } - rccId = rcse.mRccId; - - // there is a new (non-null) client: - // 1/ give the new client the current display (if any) - if (mRcDisplay != null) { - try { - rcse.mRcClient.plugRemoteControlDisplay(mRcDisplay); - } catch (RemoteException e) { - Log.e(TAG, "Error connecting remote control display to client: "+e); - e.printStackTrace(); - } - } - // 2/ monitor the new client's death - IBinder b = rcse.mRcClient.asBinder(); - RcClientDeathHandler rcdh = - new RcClientDeathHandler(b, rcse.mMediaIntent); - try { - b.linkToDeath(rcdh, 0); - } catch (RemoteException e) { - // remote control client is DOA, disqualify it - Log.w(TAG, "registerRemoteControlClient() has a dead client " + b); - rcse.mRcClient = null; - } - rcse.mRcClientDeathHandler = rcdh; - break; - } - } - // if the eventReceiver is at the top of the stack - // then check for potential refresh of the remote controls - if (isCurrentRcController(mediaIntent)) { - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } - return rccId; - } - - /** - * see AudioManager.unregisterRemoteControlClient(PendingIntent pi, ...) - * rcClient is guaranteed non-null - */ - public void unregisterRemoteControlClient(PendingIntent mediaIntent, - IRemoteControlClient rcClient) { - synchronized(mAudioFocusLock) { - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if ((rcse.mMediaIntent.equals(mediaIntent)) - && rcClient.equals(rcse.mRcClient)) { - // we found the IRemoteControlClient to unregister - // stop monitoring its death - rcse.unlinkToRcClientDeath(); - // reset the client-related fields - rcse.mRcClient = null; - rcse.mCallingPackageName = null; - } - } - } - } - } - - /** - * The remote control displays. - * Access synchronized on mRCStack - * NOTE: Only one IRemoteControlDisplay supported in this implementation - */ - private IRemoteControlDisplay mRcDisplay; - private RcDisplayDeathHandler mRcDisplayDeathHandler; - private int mArtworkExpectedWidth = -1; - private int mArtworkExpectedHeight = -1; - /** - * Inner class to monitor remote control display deaths, and unregister them from the list - * of displays if necessary. - */ - private class RcDisplayDeathHandler implements IBinder.DeathRecipient { - private IBinder mCb; // To be notified of client's death - - public RcDisplayDeathHandler(IBinder b) { - if (DEBUG_RC) Log.i(TAG, "new RcDisplayDeathHandler for "+b); - mCb = b; - } - - public void binderDied() { - synchronized(mRCStack) { - Log.w(TAG, "RemoteControl: display died"); - mRcDisplay = null; - } - } - - public void unlinkToRcDisplayDeath() { - if (DEBUG_RC) Log.i(TAG, "unlinkToRcDisplayDeath for "+mCb); - try { - mCb.unlinkToDeath(this, 0); - } catch (java.util.NoSuchElementException e) { - // not much we can do here, the display was being unregistered anyway - Log.e(TAG, "Encountered " + e + " in unlinkToRcDisplayDeath()"); - e.printStackTrace(); - } - } - - } - - private void rcDisplay_stopDeathMonitor_syncRcStack() { - if (mRcDisplay != null) { // implies (mRcDisplayDeathHandler != null) - // we had a display before, stop monitoring its death - mRcDisplayDeathHandler.unlinkToRcDisplayDeath(); - } - } - - private void rcDisplay_startDeathMonitor_syncRcStack() { - if (mRcDisplay != null) { - // new non-null display, monitor its death - IBinder b = mRcDisplay.asBinder(); - mRcDisplayDeathHandler = new RcDisplayDeathHandler(b); - try { - b.linkToDeath(mRcDisplayDeathHandler, 0); - } catch (RemoteException e) { - // remote control display is DOA, disqualify it - Log.w(TAG, "registerRemoteControlDisplay() has a dead client " + b); - mRcDisplay = null; - } - } - } - - /** - * Register an IRemoteControlDisplay. - * Notify all IRemoteControlClient of the new display and cause the RemoteControlClient - * at the top of the stack to update the new display with its information. - * Since only one IRemoteControlDisplay is supported, this will unregister the previous display. - * @param rcd the IRemoteControlDisplay to register. No effect if null. - */ - public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { - if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")"); - synchronized(mAudioFocusLock) { - synchronized(mRCStack) { - if ((mRcDisplay == rcd) || (rcd == null)) { - return; - } - // if we had a display before, stop monitoring its death - rcDisplay_stopDeathMonitor_syncRcStack(); - mRcDisplay = rcd; - // new display, start monitoring its death - rcDisplay_startDeathMonitor_syncRcStack(); - - // let all the remote control clients there is a new display - // no need to unplug the previous because we only support one display - // and the clients don't track the death of the display - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if(rcse.mRcClient != null) { - try { - rcse.mRcClient.plugRemoteControlDisplay(mRcDisplay); - } catch (RemoteException e) { - Log.e(TAG, "Error connecting remote control display to client: " + e); - e.printStackTrace(); - } - } - } - - // we have a new display, of which all the clients are now aware: have it be updated - checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); - } - } - } - - /** - * Unregister an IRemoteControlDisplay. - * Since only one IRemoteControlDisplay is supported, this has no effect if the one to - * unregister is not the current one. - * @param rcd the IRemoteControlDisplay to unregister. No effect if null. - */ - public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) { - if (DEBUG_RC) Log.d(TAG, "<<< unregisterRemoteControlDisplay("+rcd+")"); - synchronized(mRCStack) { - // only one display here, so you can only unregister the current display - if ((rcd == null) || (rcd != mRcDisplay)) { - if (DEBUG_RC) Log.w(TAG, " trying to unregister unregistered RCD"); - return; - } - // if we had a display before, stop monitoring its death - rcDisplay_stopDeathMonitor_syncRcStack(); - mRcDisplay = null; - - // disconnect this remote control display from all the clients - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if(rcse.mRcClient != null) { - try { - rcse.mRcClient.unplugRemoteControlDisplay(rcd); - } catch (RemoteException e) { - Log.e(TAG, "Error disconnecting remote control display to client: " + e); - e.printStackTrace(); - } - } - } - } - } - - public void remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay rcd, int w, int h) { - synchronized(mRCStack) { - // NOTE: Only one IRemoteControlDisplay supported in this implementation - mArtworkExpectedWidth = w; - mArtworkExpectedHeight = h; - } - } - - public void setPlaybackInfoForRcc(int rccId, int what, int value) { - sendMsg(mAudioHandler, MSG_RCC_NEW_PLAYBACK_INFO, SENDMSG_QUEUE, - rccId /* arg1 */, what /* arg2 */, Integer.valueOf(value) /* obj */, 0 /* delay */); - } - - // handler for MSG_RCC_NEW_PLAYBACK_INFO - private void onNewPlaybackInfoForRcc(int rccId, int key, int value) { - if(DEBUG_RC) Log.d(TAG, "onNewPlaybackInfoForRcc(id=" + rccId + - ", what=" + key + ",val=" + value + ")"); - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if (rcse.mRccId == rccId) { - switch (key) { - case RemoteControlClient.PLAYBACKINFO_PLAYBACK_TYPE: - rcse.mPlaybackType = value; - postReevaluateRemote(); - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME: - rcse.mPlaybackVolume = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolume = value; - hasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_MAX: - rcse.mPlaybackVolumeMax = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeMax = value; - hasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_HANDLING: - rcse.mPlaybackVolumeHandling = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeHandling = value; - hasNewRemotePlaybackInfo(); - } - } - break; - case RemoteControlClient.PLAYBACKINFO_USES_STREAM: - rcse.mPlaybackStream = value; - break; - case RemoteControlClient.PLAYBACKINFO_PLAYSTATE: - rcse.mPlaybackState = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemoteIsActive = isPlaystateActive(value); - postReevaluateRemote(); - } - } - break; - default: - Log.e(TAG, "unhandled key " + key + " for RCC " + rccId); - break; - } - return; - } - } - } - } - - public void registerRemoteVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { - sendMsg(mAudioHandler, MSG_RCC_NEW_VOLUME_OBS, SENDMSG_QUEUE, - rccId /* arg1 */, 0, rvo /* obj */, 0 /* delay */); - } - - // handler for MSG_RCC_NEW_VOLUME_OBS - private void onRegisterVolumeObserverForRcc(int rccId, IRemoteVolumeObserver rvo) { - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if (rcse.mRccId == rccId) { - rcse.mRemoteVolumeObs = rvo; - break; - } - } - } - } - - /** - * Checks if a remote client is active on the supplied stream type. Update the remote stream - * volume state if found and playing - * @param streamType - * @return false if no remote playing is currently playing - */ - private boolean checkUpdateRemoteStateIfActive(int streamType) { - synchronized(mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if ((rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) - && isPlaystateActive(rcse.mPlaybackState) - && (rcse.mPlaybackStream == streamType)) { - if (DEBUG_RC) Log.d(TAG, "remote playback active on stream " + streamType - + ", vol =" + rcse.mPlaybackVolume); - synchronized (mMainRemote) { - mMainRemote.mRccId = rcse.mRccId; - mMainRemote.mVolume = rcse.mPlaybackVolume; - mMainRemote.mVolumeMax = rcse.mPlaybackVolumeMax; - mMainRemote.mVolumeHandling = rcse.mPlaybackVolumeHandling; - mMainRemoteIsActive = true; - } - return true; - } - } - } - synchronized (mMainRemote) { - mMainRemoteIsActive = false; - } - return false; - } - - /** - * Returns true if the given playback state is considered "active", i.e. it describes a state - * where playback is happening, or about to - * @param playState the playback state to evaluate - * @return true if active, false otherwise (inactive or unknown) - */ - private static boolean isPlaystateActive(int playState) { - switch (playState) { - case RemoteControlClient.PLAYSTATE_PLAYING: - case RemoteControlClient.PLAYSTATE_BUFFERING: - case RemoteControlClient.PLAYSTATE_FAST_FORWARDING: - case RemoteControlClient.PLAYSTATE_REWINDING: - case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS: - case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS: - return true; - default: - return false; - } - } - - private void adjustRemoteVolume(int streamType, int direction, int flags) { - int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; - boolean volFixed = false; - synchronized (mMainRemote) { - if (!mMainRemoteIsActive) { - if (DEBUG_VOL) Log.w(TAG, "adjustRemoteVolume didn't find an active client"); - return; - } - rccId = mMainRemote.mRccId; - volFixed = (mMainRemote.mVolumeHandling == - RemoteControlClient.PLAYBACK_VOLUME_FIXED); - } - // unlike "local" stream volumes, we can't compute the new volume based on the direction, - // we can only notify the remote that volume needs to be updated, and we'll get an async' - // update through setPlaybackInfoForRcc() - if (!volFixed) { - sendVolumeUpdateToRemote(rccId, direction); - } - - // fire up the UI - remoteVolumeChanged(streamType, flags); - } - - private void sendVolumeUpdateToRemote(int rccId, int direction) { - if (DEBUG_VOL) { Log.d(TAG, "sendVolumeUpdateToRemote(rccId="+rccId+" , dir="+direction); } - if (direction == 0) { - // only handling discrete events - return; - } - IRemoteVolumeObserver rvo = null; - synchronized (mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate? - if (rcse.mRccId == rccId) { - rvo = rcse.mRemoteVolumeObs; - break; - } - } - } - if (rvo != null) { - try { - rvo.dispatchRemoteVolumeUpdate(direction, -1); - } catch (RemoteException e) { - Log.e(TAG, "Error dispatching relative volume update", e); - } - } - } - - public int getRemoteStreamMaxVolume() { - synchronized (mMainRemote) { - if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { - return 0; - } - return mMainRemote.mVolumeMax; - } - } - - public int getRemoteStreamVolume() { - synchronized (mMainRemote) { - if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { - return 0; - } - return mMainRemote.mVolume; - } - } - - public void setRemoteStreamVolume(int vol) { - if (DEBUG_VOL) { Log.d(TAG, "setRemoteStreamVolume(vol="+vol+")"); } - int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED; - synchronized (mMainRemote) { - if (mMainRemote.mRccId == RemoteControlClient.RCSE_ID_UNREGISTERED) { - return; - } - rccId = mMainRemote.mRccId; - } - IRemoteVolumeObserver rvo = null; - synchronized (mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if (rcse.mRccId == rccId) { - //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate? - rvo = rcse.mRemoteVolumeObs; - break; - } - } - } - if (rvo != null) { - try { - rvo.dispatchRemoteVolumeUpdate(0, vol); - } catch (RemoteException e) { - Log.e(TAG, "Error dispatching absolute volume update", e); - } - } - } - - /** - * Call to make AudioService reevaluate whether it's in a mode where remote players should - * have their volume controlled. In this implementation this is only to reset whether - * VolumePanel should display remote volumes - */ - private void postReevaluateRemote() { - sendMsg(mAudioHandler, MSG_REEVALUATE_REMOTE, SENDMSG_QUEUE, 0, 0, null, 0); - } - - private void onReevaluateRemote() { - if (DEBUG_VOL) { Log.w(TAG, "onReevaluateRemote()"); } - // is there a registered RemoteControlClient that is handling remote playback - boolean hasRemotePlayback = false; - synchronized (mRCStack) { - Iterator stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if (rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) { - hasRemotePlayback = true; - break; - } - } - } - synchronized (mMainRemote) { - if (mHasRemotePlayback != hasRemotePlayback) { - mHasRemotePlayback = hasRemotePlayback; - remoteSliderVisibility(hasRemotePlayback); - } - } - } - - //========================================================================================== - // Device orientation - //========================================================================================== - /** - * Handles device configuration changes that may map to a change in the orientation. - * This feature is optional, and is defined by the definition and value of the - * "ro.audio.monitorOrientation" system property. - */ - private void handleConfigurationChanged(Context context) { - try { - // reading new orientation "safely" (i.e. under try catch) in case anything - // goes wrong when obtaining resources and configuration - Configuration config = context.getResources().getConfiguration(); - if (mMonitorOrientation) { - int newOrientation = config.orientation; - if (newOrientation != mDeviceOrientation) { - mDeviceOrientation = newOrientation; - setOrientationForAudioSystem(); - } - } - sendMsg(mAudioHandler, - MSG_CONFIGURE_SAFE_MEDIA_VOLUME, - SENDMSG_REPLACE, - 0, - 0, - null, - 0); - - boolean cameraSoundForced = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_camera_sound_forced); - synchronized (mSettingsLock) { - synchronized (mCameraSoundForced) { - if (cameraSoundForced != mCameraSoundForced) { - mCameraSoundForced = cameraSoundForced; - - VolumeStreamState s = mStreamStates[AudioSystem.STREAM_SYSTEM_ENFORCED]; - if (cameraSoundForced) { - s.setAllIndexesToMax(); - mRingerModeAffectedStreams &= - ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } else { - s.setAllIndexes(mStreamStates[AudioSystem.STREAM_SYSTEM], - false /*lastAudible*/); - s.setAllIndexes(mStreamStates[AudioSystem.STREAM_SYSTEM], - true /*lastAudible*/); - mRingerModeAffectedStreams |= - (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); - } - // take new state into account for streams muted by ringer mode - setRingerModeInt(getRingerMode(), false); - - sendMsg(mAudioHandler, - MSG_SET_FORCE_USE, - SENDMSG_QUEUE, - AudioSystem.FOR_SYSTEM, - cameraSoundForced ? - AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE, - null, - 0); - - sendMsg(mAudioHandler, - MSG_SET_ALL_VOLUMES, - SENDMSG_QUEUE, - 0, - 0, - mStreamStates[AudioSystem.STREAM_SYSTEM_ENFORCED], 0); - } - } - } - } catch (Exception e) { - Log.e(TAG, "Error retrieving device orientation: " + e); - } - } - - private void setOrientationForAudioSystem() { - switch (mDeviceOrientation) { - case Configuration.ORIENTATION_LANDSCAPE: - //Log.i(TAG, "orientation is landscape"); - AudioSystem.setParameters("orientation=landscape"); - break; - case Configuration.ORIENTATION_PORTRAIT: - //Log.i(TAG, "orientation is portrait"); - AudioSystem.setParameters("orientation=portrait"); - break; - case Configuration.ORIENTATION_SQUARE: - //Log.i(TAG, "orientation is square"); - AudioSystem.setParameters("orientation=square"); - break; - case Configuration.ORIENTATION_UNDEFINED: - //Log.i(TAG, "orientation is undefined"); - AudioSystem.setParameters("orientation=undefined"); - break; - default: - Log.e(TAG, "Unknown orientation"); - } - } - - - // Handles request to override default use of A2DP for media. - public void setBluetoothA2dpOnInt(boolean on) { - synchronized (mBluetoothA2dpEnabledLock) { - mBluetoothA2dpEnabled = on; - mAudioHandler.removeMessages(MSG_SET_FORCE_BT_A2DP_USE); - AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, - mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); - } - } - - @Override - public void setRingtonePlayer(IRingtonePlayer player) { - mContext.enforceCallingOrSelfPermission(REMOTE_AUDIO_PLAYBACK, null); - mRingtonePlayer = player; - } - - @Override - public IRingtonePlayer getRingtonePlayer() { - return mRingtonePlayer; - } - - @Override - public AudioRoutesInfo startWatchingRoutes(IAudioRoutesObserver observer) { - synchronized (mCurAudioRoutes) { - AudioRoutesInfo routes = new AudioRoutesInfo(mCurAudioRoutes); - mRoutesObservers.register(observer); - return routes; - } - } - - - //========================================================================================== - // Safe media volume management. - // MUSIC stream volume level is limited when headphones are connected according to safety - // regulation. When the user attempts to raise the volume above the limit, a warning is - // displayed and the user has to acknowlegde before the volume is actually changed. - // The volume index corresponding to the limit is stored in config_safe_media_volume_index - // property. Platforms with a different limit must set this property accordingly in their - // overlay. - //========================================================================================== - - // mSafeMediaVolumeState indicates whether the media volume is limited over headphones. - // It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected - // or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or - // SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it - // can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume() - // (when user opts out). - private final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0; - private final int SAFE_MEDIA_VOLUME_DISABLED = 1; - private final int SAFE_MEDIA_VOLUME_INACTIVE = 2; - private final int SAFE_MEDIA_VOLUME_ACTIVE = 3; - private Integer mSafeMediaVolumeState; - - private int mMcc = 0; - // mSafeVolumeEnabled indicates whether to check the volume of media play via headset - private boolean mSafeVolumeEnabled; - // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property - private int mSafeMediaVolumeIndex; - // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced, - private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET | - AudioSystem.DEVICE_OUT_WIRED_HEADPHONE; - // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled. - // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled - // automatically. mMusicActiveMs is rounded to a multiple of MUSIC_ACTIVE_POLL_PERIOD_MS. - private int mMusicActiveMs; - private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours - private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000; // 1 minute polling interval - private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; // 30s after boot completed - - private void setSafeMediaVolumeEnabled(boolean on) { - synchronized (mSafeMediaVolumeState) { - if (mSafeVolumeEnabled && - (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) && - (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_DISABLED)) { - if (on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE)) { - mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; - enforceSafeMediaVolume(); - } else if (!on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE)) { - mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_INACTIVE; - mMusicActiveMs = 0; - sendMsg(mAudioHandler, - MSG_CHECK_MUSIC_ACTIVE, - SENDMSG_REPLACE, - 0, - 0, - null, - MUSIC_ACTIVE_POLL_PERIOD_MS); - } - } - } - } - - private void enforceSafeMediaVolume() { - VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC]; - boolean lastAudible = (streamState.muteCount() != 0); - int devices = mSafeMediaVolumeDevices; - int i = 0; - - while (devices != 0) { - int device = 1 << i++; - if ((device & devices) == 0) { - continue; - } - int index = streamState.getIndex(device, lastAudible); - if (index > mSafeMediaVolumeIndex) { - if (lastAudible) { - streamState.setLastAudibleIndex(mSafeMediaVolumeIndex, device); - sendMsg(mAudioHandler, - MSG_PERSIST_VOLUME, - SENDMSG_QUEUE, - PERSIST_LAST_AUDIBLE, - device, - streamState, - PERSIST_DELAY); - } else { - streamState.setIndex(mSafeMediaVolumeIndex, device, true); - sendMsg(mAudioHandler, - MSG_SET_DEVICE_VOLUME, - SENDMSG_QUEUE, - device, - 0, - streamState, - 0); - } - } - devices &= ~device; - } - } - - private boolean checkSafeMediaVolume(int streamType, int index, int device) { - synchronized (mSafeMediaVolumeState) { - if (mSafeVolumeEnabled && - (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && - (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && - ((device & mSafeMediaVolumeDevices) != 0) && - (index > mSafeMediaVolumeIndex)) { - displaySafeVolumeWarning(); - return false; - } - return true; - } - } - - public void disableSafeMediaVolume() { - synchronized (mSafeMediaVolumeState) { - setSafeMediaVolumeEnabled(false); - } - } - - - //========================================================================================== - // Camera shutter sound policy. - // config_camera_sound_forced configuration option in config.xml defines if the camera shutter - // sound is forced (sound even if the device is in silent mode) or not. This option is false by - // default and can be overridden by country specific overlay in values-mccXXX/config.xml. - //========================================================================================== - - // cached value of com.android.internal.R.bool.config_camera_sound_forced - private Boolean mCameraSoundForced; - - // called by android.hardware.Camera to populate CameraInfo.canDisableShutterSound - public boolean isCameraSoundForced() { - synchronized (mCameraSoundForced) { - return mCameraSoundForced; - } - } - - private static final String[] RINGER_MODE_NAMES = new String[] { - "SILENT", - "VIBRATE", - "NORMAL" - }; - - private void dumpRingerMode(PrintWriter pw) { - pw.println("\nRinger mode: "); - pw.println("- mode: "+RINGER_MODE_NAMES[mRingerMode]); - pw.print("- ringer mode affected streams = 0x"); - pw.println(Integer.toHexString(mRingerModeAffectedStreams)); - pw.print("- ringer mode muted streams = 0x"); - pw.println(Integer.toHexString(mRingerModeMutedStreams)); - } - - @Override - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); - - dumpFocusStack(pw); - dumpRCStack(pw); - dumpRCCStack(pw); - dumpStreamStates(pw); - dumpRingerMode(pw); - pw.println("\nAudio routes:"); - pw.print(" mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mMainType)); - pw.print(" mBluetoothName="); pw.println(mCurAudioRoutes.mBluetoothName); - } -} From 54cf5a1dee5f90e484d92004eacb35b4bc4413c8 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 15 Sep 2013 18:07:28 -0300 Subject: [PATCH 113/248] revert ro.config.vc_call_vol_steps workaround --- janice.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/janice.mk b/janice.mk index ab6cf14..cdec2f4 100644 --- a/janice.mk +++ b/janice.mk @@ -32,8 +32,8 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.telephony.sends_barcount=1 # Low in-call volume workaround test -PRODUCT_PROPERTY_OVERRIDES += \ - ro.config.vc_call_vol_steps=8 +# PRODUCT_PROPERTY_OVERRIDES += \ +# ro.config.vc_call_vol_steps=8 # Packages PRODUCT_PACKAGES += \ From 6ddfdf9303e0bed1ff55e5e2325f1ff3032c7008 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 15 Sep 2013 21:45:23 -0300 Subject: [PATCH 114/248] testing some device specific flags --- BoardConfig.mk | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index df9d181..76cca06 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -56,13 +56,11 @@ WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.b WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" WIFI_BAND := 802_11_ABG BOARD_LEGACY_NL80211_STA_EVENTS := true -# BOARD_HAVE_SAMSUNG_WIFI := true - -# WIFI TETHERING FIX BOARD_NO_APSME_ATTR := true # RIL BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ +BOARD_MOBILEDATA_INTERFACE_NAME := "pdp0" # Vibrator BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c @@ -76,3 +74,23 @@ BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/janice/recovery/graphics.c TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc + +# HWComposer +BOARD_USES_HWCOMPOSER := true +BOARD_USE_SYSFS_VSYNC_NOTIFICATION := true + +# Camera +BOARD_CAMERA_HAVE_ISO := true +COMMON_GLOBAL_CFLAGS += -DHAVE_ISO +COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARE +BOARD_USES_PROPRIETARY_LIBCAMERA := true +BOARD_USES_PROPRIETARY_LIBFIMC := true + +# OMX +BOARD_USE_SAMSUNG_COLORFORMAT := true +BOARD_NONBLOCK_MODE_PROCESS := true +BOARD_USE_STOREMETADATA := true +BOARD_USE_METADATABUFFERTYPE := true +BOARD_USES_MFC_FPS := true +BOARD_USE_S3D_SUPPORT := true +BOARD_USE_CSC_FIMC := false From db4297a7a0542a6e29ad9dcb7bba987e932a3234 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 15 Sep 2013 22:54:23 -0300 Subject: [PATCH 115/248] Update BoardConfig.mk --- BoardConfig.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 76cca06..0863e99 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -87,10 +87,7 @@ BOARD_USES_PROPRIETARY_LIBCAMERA := true BOARD_USES_PROPRIETARY_LIBFIMC := true # OMX -BOARD_USE_SAMSUNG_COLORFORMAT := true BOARD_NONBLOCK_MODE_PROCESS := true BOARD_USE_STOREMETADATA := true BOARD_USE_METADATABUFFERTYPE := true BOARD_USES_MFC_FPS := true -BOARD_USE_S3D_SUPPORT := true -BOARD_USE_CSC_FIMC := false From 95c8a0f7ff3722d1e21075c3230ba6c92580b0aa Mon Sep 17 00:00:00 2001 From: Rox-Ace2 Date: Thu, 19 Sep 2013 22:04:21 +0200 Subject: [PATCH 116/248] Move from common to device specific --- BoardConfig.mk | 1 + configs/adm.sqlite-u8500 | Bin 0 -> 15030272 bytes configs/audio_policy.conf | 52 +++++++++++++++ configs/egl.cfg | 1 + configs/spn-conf.xml | 132 ++++++++++++++++++++++++++++++++++++++ configs/ste_modem.sh | 106 ++++++++++++++++++++++++++++++ janice.mk | 9 +++ 7 files changed, 301 insertions(+) create mode 100644 configs/adm.sqlite-u8500 create mode 100644 configs/audio_policy.conf create mode 100644 configs/egl.cfg create mode 100644 configs/spn-conf.xml create mode 100644 configs/ste_modem.sh diff --git a/BoardConfig.mk b/BoardConfig.mk index 0863e99..1692da3 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -31,6 +31,7 @@ BOARD_KERNEL_BASE := 0x40000000 BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" # Graphics +BOARD_EGL_CFG := device/samsung/janice/configs/egl.cfg BOARD_EGL_NEEDS_LEGACY_FB := true TARGET_DISABLE_TRIPLE_BUFFERING := true COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 diff --git a/configs/adm.sqlite-u8500 b/configs/adm.sqlite-u8500 new file mode 100644 index 0000000000000000000000000000000000000000..91dd26d909c7f21e835edeb4059a69a609cff9d4 GIT binary patch literal 15030272 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�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
IIWV&X61dZW86uFt9S+R&fCP>mn6Uu~9Ptq2 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�voj8arwp3$cD|CO2lR4bKs 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%0D4s`4BWVLai+rK2MgTv7|kE|{ZNB0qA^>8?P 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
  • =evSKHODX7{p}+Gib~jx+yh`&ykAy#@j(vi3*v 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

    fAI%>rv!hT ztj(IzJpZxqc?XrB8GSml)wA#;VQDZt)+!84Jut$&U>?~Qj)cI#CS&O0^R4aX**^zN()FiDQwHm^d}7-mNMK;ea5e>i z)h*>a!k3+=MOG1K0tT0Jh88a!3`0ZC)<2MEa+xkI^)AbvRPd%>{w`DLWi|$GVslqOF6GO4)Lr zVB{eFf2)-HuQPm?bXU8}{grI%j9+x)UEK5(447cRY(SG(u2V8t0JQ)u-mbRifp(ErhD{Xb0u zC&7RT2CSP42JCWTz(D^W-o1K%RTCf>Fu{OL7Dtc$I$nX>(fb<}fsR>@H^f7~%^-_c`|vXseK1n*fw^Pdw$ zW4L~5T2$1)s9fsc@TNiORSgg@0?9d0kNjIyl~R^96Uu5vF1fTVyKjGs<40C7U_ty9 zGlw}34*EZ?1xCer@pVR4Fknqbb`b68eLErs(7ry!9A4B-) zSyjaC4N@+~GH%bGwCD)Tk;;9Nf&p_GICubZ8!?LUZ_(jwIf}VAIUXGfCiA&=IyrtsQt-kCSO4QgbGD+L8ml?g zTEnuF2C$8RDA`Ix7K#+AV6%Yr-&VhiR#5#xWnGq|gZ}GcE?O?VQ~4s~6%3eQz?2tq z6B+)X6In1|m8g|Sbqz3Jp#KxQX-qI+88k`36s(KYULQ?nzT#UTOMx+lCu{jRto|T# zco<#%tr}Sxg_3YB2{$XRIi3@fx$G)4F17cuRN*YxoO3C z!?4Jd07+{W@kV3Uq|d>HRJ@kLV03hUoQ(q~p#L+b zrQL0p6%3eQz#!@NFTsEX`UK4vXfsqE6TX5^LJ`B-kn#t^nnw5|1ukDL2qXNaF+$As zfkCyeBhdf3?Q9YZ7^Fcq2oemKV8DVn8x_X<8z?rIfEO17M)+T766`Z$1OtX+ZtW<~ zCL^}g+0mh(s}2EcG#$Z%rJrVk0b2w7*FFYp>q{?Xe-~ykwee0(n$_}#F%0^^Mg-1a z+2$k^OKsT^@K>-H*YXm`x+AtOII87kkcQ$x{D0bU*}j0kMrtv{-%C<@YPs?x;4cAx zZ4&%tp**t5b85Mz+aa51Ny%> z(GLJmx29;<6RC&?vv^ z4Z7RR5ok>A^mn>_?vT0zTiqddNZ*1z?ufnzyW9~0e_c-Smu>h1{XcgZY>f#J@E5a6 zs`|m;8D%b&$30prA-waHn{k<5TA#$Y@m*;--gLw@6)I(xL^q|{{uaLqU#PkeX*qXm zTLFDBsbZ*L2Zuj}c2BT1-n~Pz!93+EenLUj=*370`v0!qu)<23vcr*))HEKJ%4iSf z6L{zm-)n0}Qv-{t2NHi6htd8`2C<*A{X30lYW&uhE1Cxq*J6TqwxEM`Lxy$FXvkE{ zabN>cUJme=UFin>e=mAWQkF6qwIQ~=FvFaEVjIZ>{AHf#UAf%vM^zwYEHoz4GH6cJGiW44YKbt!E|_ z)HD{YC@Rqtl-0jQg^hOfkvob7`~`;Ur38Oj=oje!)5)x~F;c)^DU70ra24GhVMcN3 zs)eCgFjRGlLr#Ep!oNlBM9NwNV-yAaWt-+~g~bd)<$g*`hAtBPW${Iz|33tSY(kO% z7Kkd)b92);GPUv0KX5m@o?Wm3WZ3O7Dza_(>PZH z{r_RBJ^W9=UzI~9;ICOG;IHx7SuKA*uG|v>kX-zM1;(|(Ul#fW`v1d^C-clcnSt08 z0e@j#vE|bV0p|>yWW9;{~ z$h{=|FC2dXf8i~&_f)`N!QMx_JLX@i@da3wfWOwTo`riEqw()6rC#~9^&?>*>vbQG zZZJ2*T*mKZbe%GVodINX3#ncihwQ*uaKS3<6=)A62>+qwZoAWj= z+WzUgWVd(R$fevf$1FHD9XW{qf0W?Af}K^oL5Xg-i<_Q;{}TMy1>nCrp#MLb_b0EH*A;WN^v;5l7* zhpWfXwR}>BRsr5;z{0$M?gLLoWxk={KI}JS3avhc)O=|=gVx@20{Z`B1phULg)h_% z!G8(`9f?ZB>=~<`~Subw_{r|C;-V6S#=qT%V*6AKkk`Pvp z-P!2jbbK7NYzqEsSv867!_vl?vbk{1TB}Xc-*9;%She)Uq>7<>Ly%o6OvF zr}m`=9+F~@d;m$MjLxy$FXw+28b=(G`=zWdzW75G` z^wrFWv|P7sAcozv2>SoyV}(gs%4Cc@vE>CT@9Y!1cR~$}%B2ntZyJPNRe?4Jh}AMU zqp7TB^pZ=PvdEcuWCi~f6scq8aGeJS{r?H@l%{oCUz^TjrL!wCvApu5=X386-zWI5 z+C3;$JI3jXQUFh>+NgGYIyyVsC#c!lJ^tBlkoydxy?W~F{?ucb^YvVUY%9FxlrEgH zjh@?7OhV0($}NL78g9sn0{#Dqg8$O-F5mZrAxML4wegS&{_E(S?C$*BxFuumq2Ja- zxwxkay+HUjbpO{!6XlouBw6Jczhz zL1rx{-RneHjbK^PK00o3vZ*{K^Jyeebfvs1>Y(nMXbnq<8uS@L)W9HjxKgDCz!Pi| zRw~Q0ahsxq)E~t5ZLON4gZ}?ywfd#q+eOH0eI2DIRf|j|E(jc*sHYG%3W()uU}SV% ziGmqkHOtV+3I5AGq-up2ZR6u=D`~5ZYV{1h5d2pT`u|fH1GTH)ml!qKAkObI=NeWF4!W$fB8G9-Q=~~x8FFpdW+m(zjDsaA%%Nb z%rnx_PJ;o$Aj^bDSPL#7V6^;TQN_Cf!@VuH)lZo=3+#ueCD)e!ub;J*a_^OO19(0O3BLwCDer5+Wl9s0<%s!Fl>UIvY^`L&hMX6hWo1nxw8&$vXiV+*Kv zCyyR4IPvzC1pO-UfY>JZFTsBuCFc2rRn4Mf?xezh9fSV=G{JvucJu`QMVe>AGJm1S zPu##>+mUd?DA;8G+CAuE4ZnMA?~+!BAAtV<^vT21Q6~7Wb$cK>hx3^ODV8kuJpkd4 z{b4RoL>|_?`S~e4`_!e0p^8AUAv_b-2!nU2=0ul9;{vFrm3$P}1zvUf)ACy0x-uYg zt4@UI2N}c-LkBB!cr8Hy4?Gv$A2)tm$GC3#f&Tvt!GD3a*cVb#@_|V^@O|?y-cr5{ z&40GAvciAJ6p&QKKYZZ{NwLqYGVvb^Yn+vz@x{RKBW_mc84(@}8tLm-Yr-!Y^VG{= zNvill%hlg@N6I4s>t}>lV?T)ZC3+wNopNW@|AD{hi+TKUOo-8DsLU{Y;V)r=Z0l&{ z4=%squ4w4@E;zs7%ZK6VjS=dUuaCL8p#ML!mtW2s%yV~8*5Xa}Pa|t`pG_ENFiWaQ zz5E;YuJRYf+}U3La^BU~XU8CHS-#@^6#SQ3Z3$n&J%Tvwg6?Gu389&V*g!6ED{O-t1%O+W&ge2xF%+u)p>C6|GzMS7jG(W1pkYi z0$sX)i+FV*fC&NYHQ0|`m5Ew%nGnE~(^Jp?_(hPvA7yHNSU&-kWxw^fC&K%`UpH?jH+gxKWBY;6;1+XEa?9)b_G4sWe$L%Dg$a_PqhQl zH{fNrd>cyv9|1L$T5eW!5?&)s3Q6uXmZash+ebT2Ok4e`&lOaR)rgnXa_-$!9y9+M zNfhnWBInwRM*su;|0SlYwy;kH(^0=O1>Yf7B8j|00DCwBZ&x;(+iKwwa~<^uaROV> zmG%@=E4(>ezqD2U zm)hEeb2ua_3;(NMi4X(t0Q!@~bMy!j^C#cCFtacQWagc&?}iCWTObU6Kz@xOjq z!v=lfe+mDq(t_1ggQyX+>-rt7vD81=%%-E^OPb@zt?L7PX}F9j<$i%gPdm}Rwt+kW zlrfN}lI0Kb43^2GZk76JDo*oE4gCKv7yj4y<}7m<3Jj5gArt=B=*i;zbX>slXGl-8 z&pR^^<*<;BeHt9k?_Be#UE!b8rM?6|Nlzie`P72WE$|dT%iS{2;qN? zvoK2+{@2-AZL3C{324m!`c z-Qpx|XzZM9D1%!zgNwH>+^a44FT5l6-!}1ITdF8-UgePx{MTd*?c%=txr3={m9syT$OAPavf@L!()g|hKmZTb69 z-gwJ@&TlN_kLws2?x*0tc=ii_*H*o&n}XB{{wtmJEZoZ&;9n&E>&n)zoh?r1Q)mWG zx6_3w*J3yVa~VyIO^sa`&hB)!1p5CQS`Bms1D18R z`W$Nv?Cb6@XCP$T3Ldx9J1OJIcCyZ(yTu*Z%{trN-JJQ(9{k#%yUiSd#}s$^JKa8a z2sA`6V6OlM4D|miSMB}Sp9lu*?GY@-gzMP4AyY75BuNqsSd+eJX8*X$K#RFN$?~hZ z8-2kHH$wOYL$e`A!OlScf8)rMVB9txcUC&2Df=B6NgIHe1OqmQ%8ePyJhL~D3|YVB zif)4;!(y&rz|=wyzto1+@$%vt9`Or5_>NsbYcL|9|6gS{FbW1tFkpHmsGqXP$=G`0 zyn+c#P@C*hklIk37>yOZySS#Dn^01tk%?txJviw9Z|avR;taT|A zm|(!>hJ>TjLup@mJkdWOXjHsnzfvE z`)H?VOkCZDwIzZ9!_6IA(H%xrQAdT=B*9{-vNDAVVHK|sQ2}0Wn?i-uA0!Nhr>@tw z^@0BXR{gMR%)|r(w&=z)&!WIst_rpq97`}@)2?8^s#Ekx;}l}RK>vT+!xPBZUISN8 zdUJsfHu`i1&q{;$xD^JR!~2s*lf`J7)nKnDj88yAo5q!b0TT>Zlkzb&Vz>cJQ+d>eRg6aM77@XKmAFf~>!iRW zYOvP@^#6Cnv^i-~TYi-rBYj2J)DbRV&_}Okz!k`^t-@Q<=OBs9PRkFzN061HMzK>+ zFkpfKqv`byyQtQ1L5;JBW=X$23>fJD?^G4W;5O+t*lT%WsVa3T{6i8EA6clc5M0r{@f030?#0l*NF_)aNYDbX z3t|;7smfvt2CUdVjf3j~ue#ZnvNI`({&+5uLS9Z#oFu{O1`+(j;Fks5ZhA*_C81QWh zuw?LbcjnU(Jmv3c76S!B0k8$4-`i4c0qXgGSFY&)u>Xg$Mf~Fwwa}LzFdYGx+#rs9|QJb(Erc6@?}>(^c5e%Gbaf z8+tu^{?4;6`p8E==VPDyVe|U(ul(Yx*LH`!-ra*6Z+-r~@#5wT{|hoK^`G~ij7RT` zPv61_=&iex*`u??Xff`7Qho7gbb73sp3v60BHxuO!%sYW{>9I}P@V5%vFBUm3@5?D zKAi8{K6^fX_5(li(a*m6ad*CZUOre9VI?{|KQl)#5nJixaK5ki?D>OdUjXO(*b3)U zr;a*7Al-NbvEzSz_WZ49Z+_&XuYKI#&rrU%-k8sysH!YI8xeXX$;^r2eE;~_^OI+v zQs?vYCGLC?(+1A>)z6;Ko;^_KyIL`R%jEOtyE+}8F6zXE^ZmYO&(EKIQl0Pi+UL79 zUrgSf9E}!}`HVd+obT7b|9*dchhVuoFmUx~j=giocdR?d1O#k&aAetTFYGX?O?ga` z<4-~Ad@UC${W+V7CEz~+|0U)BH=B^4|9>Fspclvl{3qbQqsM;n#PJA;VQssB&GLvc zxRN0QD(VB>sK?Tc20$<}UkD4DrlN-4<;LiEoIykh3{s3IGhb1&H8gWYc2T+ z8|eQZEP7@E{|Wdn2-QH9wtBsj2g)u42e#mVup`U&B?lGCyS<)1!kHgR#Z!@BQ*@-u zZNtp7db2<=b_f0cL;AbP<990J!R+1fbpB+V?T;6*I1dSlcQHP0AqF;YIePE(x4RsZ zPhsx{-97{5(~gGw3MfZEA28og$|2xCxCsLmKB(}AJJ#1PQ<3ugfthqPdYavzoX|!u zH>z|hrR?`$7Tgn2@$&5cQ&14xtx$|X!n08EqBk=JCIIyR52H!1F#!Vp6Y$?;K{Es1 zY^UtcVS20l4riRRcAe5+4cmNfQE|SMRH0_jpx{q|eF^Rzs&y%opoD^|F8e4cLI3}V zW5}_Rrp$F1NlhbZA+F4`2lEMlHu;7>0sjg3FVT*p2D4A~&qebKTaG~*h+(0Bp#OhV zz<&b%6YyX2Vm#y3NIX)ARGg1x1C`Bz|Lh(m(EmRM-9%A~dy$?3JCbm^^puxI&nsa8dKtIJbYs^U5rnwDhM#C$O&*#bwL0BxPboz z{6|as%gEEr+`TtB9xvuIm9Z84U11L-SLwsGIP;8ozYZ5}<5Uwk+;!+Caqu>^jw#C# zOzDr%8;eqFoyyf+t&`ZQZ1u{c{+R*%43#Q6Bd@agFp!}Cf5HtJ*yawX~ z8aDxLHE)#|`P%8^_|dq^SP+^G(HsH)mB<93|9{d@Zwour(4d(`0c!Gzl}G|Qw2<5S z-DJkr_cFDk4edVsHyzyV*gnP@v*>2zGGPV$r-y`da=K8q8se~KRHF;+8y{6$Nn2M^ zV9M5#I?E|~q@*GE&qDt||NoSL|Dd~NNu;)nZwSxQ^M*G+V7O0|oro7WmIU|M$){S4#3d*C%NiSX^VZ#EGUA!2bkRk)Na=!_ zrb|b0+#1_+;}mYa zYNWP9x-P|69`~ZxX*YEBp#Ohv^6+$&X(v!8LCe)(RV^wl9w|$%xN5xXRbL^1G6DY) z@F20|d(nl_&CER10{(LMt6R;@^SR3F!E1AN4>HkF8qJ3LJlPcgp0sjg3Pi5ongZ~`gZ|g5cwjBft zk7mP1P56$DlQ2vIBNH4E{8x5o{vPyeGx1za78%`2u-VaCksswJ1*ucCycFWk*=!;z z(e_W@&6v1pg)YuP{gQ=_W}H@|0N;-EwAYNiH!fW=Z~P*zLBqA<(a(3H}Q^ z{z3o$nl3kWNkNVdY05rFW=I>5i|lCX%(Z$T@rO}3`!^A-pECYVBbxFA>&w-0uNmIi zpde9CY{MP?_0;;YTG~zyJ>L_`v2E~fL>XIW`s#u$Yj)p z*z&>*^X5NnoG`5tYG71t_TcbleN`(0uhUQ2I+svZGkVFTZP|UVGqN{s-p#H(eKG<{ zSJhmN8P}9W%;e*mSk_t(4*LH$Ai7ei32NK2e)oj(DxDSlmv7`U!Ag(xkUQ9cR~{0= z2>y%iX(e5fOR;62dJMBZtKHR|Z3VlyUrPMfJ<$KZIhh@0L$CmJVx?S+Wef&Ek)hc! zl~W5TQ^+GWl~WONBhVQOIcqtTX)L8hqNEeF zQu}}Yj=CuHrN<9XMxV}hm-4XoCyyqJ(X>8;f{M&Gas6RFHH`Kzk=8g@ISmzTGRs~Y z^cmWj;J?%YbcLhI28D^5%!^j!?n!87{Yr6in3BX%4r|L}Txsmu?b~l0T)jo+mR~vN z3eyVru$X7A^U|4zLft2Odo(=*f-<={aO#oKacsLc=>Ojp{8tw8BWZL&`pp z?W=fg8!QbSwv^>%swFz$hmB|IoI1NivyH_QcQtJB1b9B%%UCz=7pOeZIubVx1^;E1 zuwZ-!%f<(Xo(#`Uv?uk$1N#5>SW6bnESz#zsYk^*r?2RmI>K2$ee|m0bmZ4ol1-h1 z3fJ=5DH5_Ag(46fo(HNGLi1fX@dW=h8{eE|g8v#fe|`{W;mx}HozX%+7N$5Sli|N6 zp#Ohg@Lxxp96iB*k$#gRDlwS%#0?1ktBof82TK3{f#AR1OYjJ^j^-p)S?qi8Xr{3< zv}~k=EUEg;Lp=s3I1@HF2JceMNxAmNxT>agd=%FOURn^+`aoq!*_qUW3@j3os zAKrz~y?`4M{Fg4gz>OgBM7e+?qIac4OhFy`hu})2rxW+07xl|wj1qu@M==>!K#;NJWv)dfjd22%yjG7sABaq|#`HZ;W8O z>%AxA@v(38E;izH41hzJ`D8K&Dp{8DsXejOd}@-pBK)3DTF zM3DFu(!N0d|5a$`ndz0XkjYqtrX^@0em#9SI(jE7TYGXx(Q5d&NLj0&vdEcuWD`@c zTK3=m_7)wu_q<$L(r9I3StC3+=>Na&E;B%hM^=bm%{5ktU(_3t#z-N4l_wS9PoW#| zZy7fL`u}fqf-{KT)?Kq&$rucO;-Y~xM}+vLQaK@h>E25-TVbbz2}W^Kg`32|+a#VD zq>N{%p~0?SO_9@66@zzdpVCKO1mYK7xUrp}|Npkr%U;X!o)EvXGO(qVUDk5i-880D zc~K)i)+Ozr65a?w zDsTm}{ZM;nvQ9}9VY}rBxlG}5rVaBll~wnV)1`@kTu36sFKD!-0~b+3URpk;Mhp{a zJuIc>Uc@a`kJElOTt<=7z@`Gvey3%S-V!2PWpV2Qh+oA0L-Y&!{~u-xpg;PcfDTbE z#IJD?4!95Y#`BhL^D#TO3MR|uKNIAIk;niNF; zB2oIi=rlZXNi*PZ6+NvGzlxC)4lag8cG&zf2OYbXSMvNxi^jS>2Syn%zN$%n_fobT zaiJdeSmL!5XQ0vtJjNxxYNssd|9_s0kH%E5^t3h{zJAu(a zxS@rMw=dVkj;JQtK1q7u=%80})ts{$880Pzn~l z@SK_DWL0oDQ>I{Cq+$hX{ZdH@I zd5st1ms{-V2=QyV)4w2kT8zd=6Td<_*w%kL&Z7C(Oge($5iu{;RlBg8?*0@%Zy`FrD2U$k6FtdzBj7Dh|3UoSNF%OSrY{{QdQGt+4< z$@ZhW?t%;fBMBcN;5#QV81%}{qfQ0X?A~d;x`6@P}^N| z!%4UT7pF?wIJ5aeHXbb(vhYYvV48%9m1p;#f`GW;rJM`WvrzHcX&eLn|6g|I3-$}9 z4>v8mrP%DQ=w9>&NG|EUEb-`*=7eMJLE>nHb1Td#45nB zQYJwO1y!S$L`u;A|7`$gDLcLyNlk;Cx6gJ!AIvAve8B6S9Zijps?a%zTkwZ{4#D~d`^ zg0lLzsIbwFK5{?tQh1h+HEZ`pXS=~J!uY<>)Ytu~#}Kq+_1C-=UUSMa0;55VIaoFt zPDhB+1qIOm|L2VKdNq@j!m9W6>4nzGiw4ClSc@pv(xseG*v#S}nY zTquL7!SctOn^07sUy3UZm$Q;W)q zcGr!hSzVGljU|cp#hdAWP!X0uzfR}V?pAcAJaVojfnezh(CBOdjbS=G!2(xVuhK)m z2=EK^{{z7PCoGI;*y@Pn+^#BgnY z@@TRcP3v>z6^+Q`aj4qG8#Mm!~`~v;|5P3Kdry7F&g4O>|WSX3_4Yrk- zw(V%I6_*Sw!AhyCVXYZ(e72Wyd{}v+b)x@fnN@!1#2`Jbv zqIJ9JT|vaK)dS5Gb0(`V^B11%K?K{2PLJc}qhDYxu3@-kW;O&d*}t|!x>&<+M%}xl z)nRk>9{c649`yg~1R*H>2UU73l|39np0mb3@ zP~7s~DgJY--r&tcfFP3)?3dd037Y`dg#ej*DcG+T?qv)F2vyLV)2#}P54ByffJlow z{*3we<c@$H!{Yhf4q^7}1?}7mNb~{r^Vu zbN&gS`;#Oh_M3{>a${Lj3ulJSr%SkVs~A7}-zOnteo6Bs($HOZqlymEb42!vf18b$m-e5%RCdN6G zKXd^a^#2==j@~IwIGk>DdZl#7j71=}yfDL@ePWHgZg)xz$V%y@6Uu5vPkCvJnA1DKmjd={ylt~`1nD}Vg$1yZH9NC z!VjGA*Z>SgKiE54Rqn%N$WG+S{ttfwDphnoUIk;I;ppiI^#7a99>D@}FMAE(7QL#A zHxY{9z%oTSBjd8wa?-s{ge5pI!GVp>&T1n=(Eo3~nx$}7LU3SFfGjloD}tjG0nF`~ z5geG=l)OUNonjJ4jjOGs5rm)f=mioH1ThLbg^^3>K)|0wE_p{vT8{$*{r?uKHc60R zY?TdXvEaah;8bv6>8cKb19K@VAU`9GLQNvh=VrXe`6s(Ogvz-Hr{f&)7`T9#nPIp(mc zS#->u^f)lk|8Grg%5KY%M>+uo2S!|h;J{Q8yKMc92|;`$TvWFDDA;8GFFpTzJ8|KEn}4pm4n!GS@s zmcHOX1NxvklU6HTU@*nbz68v$($~TKH{KxDw9_$kjDnA2{d>EMLK!hI&x2A;0 z%tjU4YeH8ru#?`Gy2CG;Vz=PH%UWC^zBN4jRei^^SR5GW|7ZK( zX*|<|EXV(z`Y-&=RnaSg1LH&4_3rAXfHr~yO9xsi+{;#QU!( zc)@|Co2BMnCISF%t7Wh7h5jQt`by}NHf22v_cBJ~-#0X``2Qb%yG9SWXHt=-wG_-? zYJ(jU-uP3H;#bSi0Dn#w%S4gP{H9tahBIQhS`(4#lBMi2Z($m)NsLO_U7k=n zmr{hRFNpuYedV^kN3KJ!v|_v5gi+LkLTUIS3aNs zB;Ec_`M^LO81Cu=VMbX%N?(Tx=6sgb@4@ZhWs#9ixmk`G>5k!RmF`2YJ3Kin-5?EO z>25Pe;6~UlaJK=Six9uU8*Ncdp#R^YJhz1S)tvaXXBlclk)TVk)poAV1%TrO8m9s3 zphkJOXY4j-ekcx01%j&(zqlFH);1H+|7^|8yi~+G;ujYR3h*nm$~#$S(B0}WUT!z* zYq}pbp#b`MOX&{E(rRaEH zMb;PS|Hss$3z#uUS;%D6#uwj;#?RR(b|<3nzMeiTj-o*Xk~@ml(7#2sEoF%_@yI4- zV72VO{q2pL!$vC;%i73;gZ_V~gS%JnAMBHgbfp(>DzEUqN`%D-YTY2((fh_j3`%@2 z2EId@3x)Ru>icT&zPzBOpaA;+ahwr+hXo!jcm3dzN^{YegeAN$wf==E4!Mo!*Zo_> zuMbkz8W_KRZ*n|d%x7cbDRim;r9=}x-We?(S8bTY)ZpIy{Pf7eXH^&z?sFC17uum{ zZ(e2d=|BcHU$eeI|GzU=VK5Pj@V_jg zI|vIwem@0TfBn>SwEOB0V)5Z&>yZn~MOi`rJNQ`C3QLhhUdy(u-$H^SSJRTVqFr23 z;3mRGaiP%BQBhroRe5+{A>P-(#WZ=g4S&#y9G$3dd|YiMjp%I6s8-M53+81eJRtAMhgC$4DB$wwi`LL`H(h?g`43pMKO4@t)3c}I&ohgO=g}(Ue?x^ znfC>cCJM$anIENL0f|6c=6&VEP@L$1`r7T=Zya2`MdBY{MB(O;0%I-anQOFl=Ap1? zmAyThob`$j*5^$^W3(~NM|QtW4g z?A~}fK3cey?XV8g8t<#f`U3s`ZYL@zu#3J%q^s1UqD(4f$*)z_cl6P#82|+GYb(j7 zeu5JGPy`VJFxj(?FMsA?q&_t8fM?T(mE(>8_ye6i3aTx{3jzr(-3U9$04i zin7@gP|>1O&`8nL#9|qNh1<=>b^6O{QoeEX*4-6l#2G?`j1C?mg$(Pb#i^Md`{gtb z^#8j<`;TD1@SZoQaTTiH_)FGqs`!adI@GGDo@`ltQM^!IC-YLUUpy-ThrkEy_>MK0 z>y;&6eC(G)eu4gf59BzJi6z)C!F~z$Yn&b4eDmNgm~YQPx_!RLFwD{gFVd?^6)3u( z85uEPfex=FFmOw;Uk>>N`v2Nk2S_hF_RE`m7$*C|u8-V4<_+IB|Kcs>`y%+y>hQrA zF!>Mph6(;SDU!XY+%KqT6<=5$hUXOHt2`3@Uhi@uKydn~{5O2zG{HRCmea}~4D-tH zM+$qkYf%{CH;oaB<$mFBfc|&=R`lqZ9vChBP4h3_79WH0$1#N!?iU}+@^@|3ySgcI zO@UQ)t33PdJS|=jX95P7(*zVR9Y+RdIvRinlNl@)mhZrF{Woijg?kx80rHn*+8O)3 zt@?YZctPbygyGMae^I`2YRrFb)w#KOjTi2haKDt5U3G?TO5-nr`-P;iVNcipdDma9 z`gp|ON_=O{5(_3awINVV<`vy;5X3MjL~CLR4NUF2C7E)|OCuP!gR8=^wSKyO*&C{fAd0#!z6U|pzV2@MQx z!oV`6!dU`Hv;lbUGQJClXwd4$9N2;b;Wt44`+{u5LB2+WW`i4epUs$C9Rw8wwv#iN0N{twvRChrXk(r5K?lhD9ANT&*K9L$Z~ zVXm=N;Q@dx=G`5R`6V>4@pS%Vob8Vn&?+|pi0S_LX!JC@KRNMFVFs5bG_b~xAq4&3 zs#@q38ra(-*s2lWtqA^-6mv9@1qFObh#b~*sy@42Z459Nw&-juCXBe#`E=skBPv5)-mo_TNn< zHRGCC))hTC=>Lvh|0^%<e$VF~B48d)8$nEkbWzilCgUO6xuwCvN@8`u>^B`3ik z)W1byGogXenkQ+MTuL$f)MLmfvf3@)*;cSNY1=|k6V_WJXEexToWhb2)GO~zW=C1& z4ni9Z-i`ny#!AEAN4^V9(V=0H0MXkeiK z-}C;#>w1$@y``{LLTF$@1Iwx~O1ez88X-#oz}!R@8raFIO}MK%cB`&?%B7=XTQ(Lr zdiN&i|MyyS4IT?xB;b9{|6}kXG%&yJ4Alvtft^-AJGyG3(y)MJ??M9uH8q=dHc0~m z{r}!!9#bEQ2@OnWU_t|9JLX1Z)Ot*_X@zQXCqJT9up7c|`icR>HYuX$<%8AYLip&e{c;}RNJ zv1L+K1r(;HG3IP9<@zpTRn{v@zR)x<(ErcP^rA)0mRg~K2@R~ONgUyEuE=DU!|KyW zwSKKgTFBaTJUaY2;*IuFHYg?3ev|O+g zx|!QEt8l481A|g%@WNZlH-Q8nb-JL#2VV%|Kjar?`QxNWCNwa(MU4j{Xn5xDwZ}g2 z$1x4Th(YO7_`<70&9io}{K2r!9{$MYXkeiKSHp8(jvKsrHjtq%sV498SQ*pa;V%kY zm3?6Wx8Lj6Qi-U}uiSeO1W*|0_>c+Tu|X2XNZ=fUBRSb_83sWn?7>{dZ)tQz%tC`R zk6vzh_t?5(`CYb^V!7OzWWga#dDq zWV?+u?AU+-LpS>l2Fzggec!On&$?uy{S4L(= zoVfR__uM}^UJz+39VYt_|LIJR^<@0n<#H{9%RG6*iPFym2w$Q%JaTt48w0(iJ#K4QM17>gE273Mtx08?V0%M-l*-MSZ!AS9_rUADIgPEbGmPr6$ivYVZ>^KZ; zF+_T2BjIK>VrF$*vuz=HAe|^7^FewX}jM{k5Qnd2k{B!Z5?rchp#7bGzOem`W zz$WFn8iP7Z*@l;VT%QR54D|m;oAtj{t?misRXW>{ishAGR}G*b?A{@Z5CQ)6^eC$2O8J#8lN_aYIbeWV$ejwU{cxYK6;+_R%%P5oQ6VZI)*;pH>n@ zJGH8)gL*U)EhPbB=?V}5Ct;6r8g}g}fv;qJI`hOGpe*^$_{o|T}7`7nSrndqBJ4sn}5C9m2cxMg( z1O2~+MIpOou|BdC0GI&41OWDq0f2%2-(Cs;th7a`x2sYzjdtNy9R&b3pI#RLSVueO z>Jd^s#oPRv*d6)wt?MPsLAs=c}sOX&z2%PS$qE)w^{h695>7**ri7 zkFHvVPh3<5{l7C20N7GPKbnpKtppa$gCwT*6MqA;VDg1f0&CXkhpYrae537 z9d^Z}klU!1|AI5&x0Lva9!yHlzPEDsDGYqW(V4(kZGXa3X z-PZ$PcURcwzL|IN|8aPD`;DJ6|Keu_0Cspf1)~K>`{D~N*HBGo^8&kNUswqn4hH9w z1%eBiN^ip#4!y0W^=vt<{K3!*ggeKV3@d5x#H%kl9Dgl74f&44n%NUK11%SN|^#8q=zUI<9Kk5 z`ut=$Sx);ORUg}*93Q9_3XB+Q8uB34`7=-7dgbZ9I^X9sJs+$Cv^(8nIN$Gl`qu5I z_g{GNbKd^}cfMO*KKN}V(&gdqZ6amM(;dV4e$~^rUVS=w;lDK_mR8P<@I^0 zQ^NUv_S3iSKK)XV?*n!6sndo7*-At>-&Z|->*VRHAm0aWx%>GEPQLOfU&WHjt2YoUQy@!#G2>3d^kN`Hn_uZzANy* zk9D+)fhiIRFKoD8-(ev9KX-pfA+O`Tr0Wh=LxdbBS#*PLkY!@z>hnr`$7Yf#Bx?we z3?(Yusv3ugR;|JTQgkA(sS>I=Ko2K}+21qBB* zm#M$W904$s{X$sy2|GKlO%A3RM3vJ6ztmEs%l6C_k;$+V+pHUBs(M2nfY&Ym?~8>0 zXW|k-Q#FRS3IC6ss>1(kK84N;|L@18-FhbcKjHrYp02ks;=Hr){~#SUp@?cQ&9i$? z9!)dc?pKUJc4rj9M*@+Q{J$SB{J(G`w@c&Lt+i&@JjK6y>~QNY9k+AZj-!Mc62yI+ zP$_dHrnkzEN00&t|BqS{&t$0>JLtmjHxipK6#wswh5y&O{g;`oEvRft`_zNSs{8;9 z9sVi~oc)`a7U-ji+({ajoZ=M}bnunM4B8d>j%KXnYT2;-o)w)OBTC18%q>Jw&Dqgn zbX>D-A%@+x>_LX0|DPx`)o{Ae>6NmO$*4`+LZ%uR<&5`kT(2J>P$F^;)Fb~El{KZ8 zPAIDxz2wq%?7saic5Nn&)`8T>CT8LZ|F4L-1^xdL;s33Aym#9vY!tR3>X4kI);f)% z9eoutg04pp=!x+ETsMhr1jm?%Z;!*HtG4bip1_0Kinh@l8L75mZXLt2&9BW4VQWcE z+(=G2xdQGBHy?=;=-+RTVFIExaTL z6ymDprp;+_oV|Sg=AG>Bw26%PgH*___W_ud{VJMNV*cM$_ z-e9k}Uo{QCXnIbB|2I8Q+7rIQfFeA0mi)hm;i=&-bYFbCQ}}WGY}se>pYxms{!vGD)Wk<|+KGKL0*Du#|t_s1J=68Zo2s8yhQkkOi^4vvucNEWd%cQY=@!A^BCuTgv>MbjB-cuml5k zI`!LZ$+&gAEYfz|)c)VsC&!OwQ>f5196Wz6B45g0bEc;5&lxu_UD~f?Ye;eP=OXf@ z+#|=xCm1lnfZ2=zp73&p7%&=W`U{Jo|3|9OF8|fPwzcR~Z1xAS)QUOl^8>B;v3w>Fk_lPO6nG zZ%xcPr|FXEkMpGoT;3}pd)O2yPnjbz8>?M8q&Nrt)v%t(E?fFKQiW7JAd7=zb&L^d zE2tX1SSdmOVc*BJPuw{TFj6);GDF&eV1$d%YvZy~wv?q2O^u&mz*H=4pH?LpFp^nR zM(8b+$Si-Uxd!_G$Zvix+Ijoa#3Bq+x?@Idh%JvwHv|Lrt0mZ&4a5)z=js9Q6Oo*X?~J*AlI>I$kl|W0hv8abPy;*r&G@)R^0b zqLP!;j;vt7=sF5vHmt;#ee5CBxwDrhv$>ygzJbv+eryDVws$TD4D|na999(t111=- z8+&&y-`m?Qg`Z5sCK#}bi~$4vKT-Anz zuHWSBiA7%4?78BFkpfKyYLt=(En54yKlbR;= z2Ng8BW4B7sigY&#H!F9fk76P$7%(@9^k%Fpw{E?>cljonTfQ*Qxj4mpSS~Wxh+5h0 z{o3U41RkV9rp{Slz(D`sxPJ&wLG`-QsNq{MV1fY?4A{lTfPwx$b_UK{vLGvij%3~K za+!KmYbDH)D^&#p^F0L=$giy8E$PpyUm_-OE82U;(F97=s6cRd`t+{4Dh+sHjr%S< zHLpEJDjKQTPPi&2gqE$6SATgIEL=0$1Oui@X#6fuoKWSR+<2r~>uNz#y(Abg(Em?X zVwbj~3v`haG?{>~NBVGLR=|s>y5Jndv}~{6JYCy39o|)EW3Am3447cR_NPf1K&^_Z zp#M*%nJr^zUtrch{f`lq*@;ft z)j_MZ3X~KtsS4b97oOEL^@q8L0;M&`r7EiiHHYv_SY!#_rE*7CNaIG%PnV*h^UbVv z;v!_z4x9fuDnrT!C0b0eW9LuWP6iCK>J%tt=P)Be5zJK-q>KRr{r`#rn$49eh+YW> z3`~l7Vc5opd-$pFvpV?mbv^z=CJt0aC4Aut$-<^teBnP9mO3jx;}>SakAzwp9uo{0 zjs==~v>D3dgs?3a&g!n z4)XJfui^PSUIg>(QX5qFd{;u7`)pR14Q?qB6li!p@9J4WfePrV^`Jl_xtBMx+l#}= z@of1di-7`pb+H>O1{-)UFTo2B`_Mbuw*}Fn|2_3zXb63ogFlWY_3Sm?;Fc0;ykNkf zJIu|}^)!AHXQ`htIGdj33_UCBc{UiZ@taw6zblh^V5C7b-g@Qw3{Ws%?*5QmH)WZk zgTZP@isB^ec+F$oX&AwY;-pKtJ1*h4xeTH-a1j50HM?^RdVEeMrZa%d%X3;r3gi>a z7i62rbh`@8>5IA9R?H-gHccG#cg6*_OxKmF;n9i8(a@h`1~=%BnFGVDmk;`z%#l&n zvtJ1FXj7^{=W=awFwO2hnnIsT^-VBWL?-)+t#eV^<``u@OUzf{Mtj5;=>JbB9NdIk z%2J)SvfieJ5QXEm4F}k7>}0(y_8ZV7*V|&h0!*VGG$3l!QFxXdX2CZ99he1(M=E@0 z1CH?DiD5M9!b@97Q`d{AXGn`H%oIP33I}8gO^#qyjWV#FE#|9or5g1AYmQ(!$$R^P z0tx18IX&uwff?qb)3VC~`?4|IWDbCCY>#v10O&^E-x@H!4D9Quzrh_*2DZPQGv5IV zn~zw}s7&l|tIzsbu(9I}*3&8@n-6xFGv)doY;#A{O&D?BIahaK%U%NKps9xJ&EJ?F zE*=4gcDjUT56&QL*`4lBo@DoC^tr_DeiKg(*QQDZ7)7^6OYDO=)v>m%|e~XLe-gzGuEultMFkf9^zA9^#p#MLqA?RhD zk!{Gn@>2vg*1ba%Rxn>#?-+JsSFGFmK0`FEzV!m%A-#kvaaq3WtacxCwjJ!;ihmAl z>gyKFm%{ogK=*!DiTDEj|H+#FyG@ z>;jawoLDYM_HR*J(QzQ-PZ}wuMW3V-wBsm7FkcrL^HquX0{#CfrH8Yd$Wt(1nqEeX z$wtRX_c{?)D=1dSnRi=x%=~L5QFNueD(avfjYLaHuvf~%HDg}Y;`5?i8zU>||4&_< z&X=%{-LIddmRB%en$2B6>p+QOJR(It^#?UJ(TO@UywO7&1vS%UvdM{x)M`_MRgy;c z8lAbMwvyINR!V~^z@VagK_VsHp*>Z0Cz!$SVdhsre1ZP|w37eFO0HnO`~%ov4!@Hz zUr>?mLXl9ceH*z>D7L>kw~PQl%5yoy8Qeu2bKThYF@g*=*=!OBxv-U6=D zXq7zbR;iz+;&hX%f&Tvt|KMSL-m}1bsdG@_I$k>!%$H!kR-nw#I?-7f9W_K+5VP)H zMT<$o_X;UgL^#X#0{#D5v|sBj0nk7XO@1-~h3`d&t{Ye2-9YWI)sxE<1ShM97iE=m za;IaLy*0V{LJ8Y>J&neVlV?FIV(Gf$V$O9$9GW42WV(O9`6O^n#O zJifgnPSTd9+UZ_~WS zU!Np3!AOKy4jUS|7JfEE#Ehmk_Nl45bX*HtS1h%C=l0?;bjUCvU5!{BFNmxwR*54O z!H|k>EeOI*bW7gd;5#;?Od;Aj2&w3;thfWadx1pyY$ zE6Z*I{r|b;xh4Fj62D2uCruDwh~uKw(vH`)&IL)XV7Funm8MWr1Q<7ix>{QV{r`Du z22S-1C*{y;;#}ZObxLmP4LAE7o=Xw1M*Shf=h6Ty?kmCo>z^A2m>X4UWjoKAk`S`a z7X%FS{~O@hh0X*d5m6vubXuO%gh@BN2?Pw?6Ks`tg(^CF(R-6>(m}e%&T5=HXBeI5 zq{WCWo2k+BC9|uON6XV=Kpa0V0z~}pYbRWi67>J)o8}*ZfSG3rmDfA4z*N~4Wcf+O zA*|z@sqxcbrs|=?U&Vp5f0M~65U@L!Id~0IR>GT!V`+;nbwl)AK)^u%e}M_lndz0X zl*!n>wxvFSfU(tf=)WO%6s?ATiyDrUMb5+{D-f`v5BEdpSU3JHI;t)9D}esL_0b!9 zyd6zEvN~QdJ2fj;!(bAx3Rz6JA`mcvfPE0QWUKlTxBPMSaB_08n+XK09s&mX|F*B( zhP^@97lbiWi^#Y&9!tf?>DX8u2Qsat6bRV<>)D;fsp&s6Aq(sjHlZl)i^E7Je4F^a zQOanB$sNq_>J7c93O0Q(M=JMLVsDF`$d&8t{sdI2Xm1|L3IQ%iF9ZGmg}ebZ9i9RK z69^b-Nm%6q813<)YOy}z13k`xoB1aYutB!5MT(T_4`L-YqFq~PB|!gwk$*T44fqMH zB?(aEVl=JMDw1io!tue+gOnWJ@Um0TT$A zK){wT34Eo@F5hdYna=;w`(R~2BgxJ`1Pt{5mr}5~<+SBz0Rg)LwObMNVa`$RTNo}l9vor2c1$W-Z=hVK-0%wCd%i*RwBX>(c}XD?sBd8eU__=8l) z=xSV~kYUZUC~0RbFwp;Bwme=O_AL(#PrTkr05^)s1QZq+nU~wqxmC(}DJ(E}TJh{; zVhFlqSS}0;4D|n(^AdDCu~ZXJA)LxH#6|HH3H23a$Y=BEEnpTIprhYkpns8$LCSc7 zRz_Xyr=Ur=N`;0K<8V-5fr0-2 zO7)r6Gd(a`cslbh{-#GY@W;`g3JXjv*Oiyp`McKiuD&!sfQ2hRDe%{DbTD8M7MRLf z!&h*RpfvW3?qv)a2nFyOzfp%)R1Bg0>B&j4nG}D<{EPP?_1rvrjTaV}u)us%#QD+q zXU75?|7!36$~{yoIUeyY2j8)-8$%EBE7q;l_juu=du^~&lVf#UqgYq02JkO;e@FtK zvTngtV%L=_1V}N_sTnX%vgn3_AiBg!*V!~wk~Ks}ang0X4$^kqTuQ+W9K`>>270i4 zYEh$Y=d`XA$k%ZA{JkW4*Ky5B$X|$==naofsK>z+WY8Zo2Q-kSzsVc{B8&Y(m{^vB#Z?q+U8R{44|F5O%|AK8QVViVt(uDlAGZ-AHyGl$7bPIOc)+OYxQpgEp zr)@hB;k*abRBwB1hNy4^3<(Zi;m8IY;lBfFl=laQ*vOe5ip6S5{=$o(GpH-_mkHfL z|9>4>zbHsg_TsJ*ac};{^lHc!Im@5lk9SREgE4lwlB^oCn~*3T;R*#_%rm4@Vl9p+5u2K==#G-x)eA)V(-NuXHgi~EJl zFVO#AuecFOL=^59otEb`T`~=EzBEw*ARu_zCw*6`Rezmtn^xT%06WJG7;Sy4k1t$n+3ZmNuE0)^QBdLJYfGQRz^P zAfW%h;b681lGb6$LMEd&zW7!&3f}y4>4q8@<+t{3T(2J>Fb?D#XdnDr)I_B8(g|fX zqnBLTj@`Gv#qlF6+^@6bej)P<^#3=K5{g+`NjQ&{&gytYxL;TfiLg$i=;DuWJVcLI zUM(Zdg)8}4KGv+=7@chg9wh$hu&J+GxL@_$FI?^i{r^qNKHuMpGpOA4gGVaOMQb9K zijRf+WkMFH;oY6h_cKj5z$nJQMWUEd$5G7P*}-(Vm`{nPz%@G)nc^-8E^NbfIP-XE zAB>i_IfTFEBo5xDQm2e&m_`YYGwnSa9l8t4h=z))j=*$~^eF82$2AVL3s^D?6WKZy>7`xQmP zLbKnH5H+SWEcFK+-e}iW6+p)fZIraSOg1@zZH`%OY5?g@t)$U~_A{5%R??cudO^5f z#Q%Rf^#3@En{vOD>BmqF{+mo<;eJ(8bE@Vr^`pcPCjn*UZY`xitIL3;9*kRbo9?p^ zXV_SrXmrPwTen``yL^+xKfZ{T@%{Es-Zrm?Wd7^csg*+_7M_*0#IPGTRM)Ig%Ao6UbT=}I&*>ug>$x%5z=b!t9 zJ-?v;-@Ke2L6BzV`&n?m)H&!_b-Z>e+^@<)m2kf%ho@6B^_6v^v$AW87*sV&1;);R zUj^6~=>Km$QpJGvmH;>tnM^5H3kE^U(*aMP;k+Ix*S5j$L$`OIl0F zuv{46m%k1A>Oud1o9V>b>9`Y1)r)Y|(d|J;o)VvcsIL$(kpRC4aE#8ql&gOUH3tV* zfM40;*k@@m!;l8}Re*hg{{MCXet}^!FZ3dOG=!fDKdaZqdkCS4b0KecC zwH}C|F2UbxU(Dl=V~&rmQlax4WXD@3dlSZs9jg9MTT> zrG5!7A7(k||L=H?@IR1BeC&p99xjiSy{kNv2;8lGxz6>$unw&B?4U}|2vT*k@{SfS zh`W~~xtBMx+l#{q1PV{G4uM~Vd8zncn*M{++x&|bqTKhvf3B%X<&_J66VHlfb@vqR z#nmVKhs+hOwyZXBOR4eW=X;hGAXV#W{HEN?mKy)2Qrcv%@$X8In_#E}np{xg`r-;U z8`K6rHD#BMYZmK@<#*XKFKwI%#mQfr!i2r~0b;d8c?=Eh73Ij|SV7B9x+b)f&hSGWJPjVvhUtd0TZf1j#G z$MJh_xY;+nsL(Dd1lFiOJS|fwH35tJ3fS0TK4QM1Y^;S+g(m?UyFJdCZ-9Nx`&%69 zOCVqch8)o3_9suWd$S{50z|hb)GXNL1djb3K;1B@57KxC}3~^U@OY!*{;lZ*{r~;y@t=9hc1LDNO*5cZ1UsO0944WF z0hY;at+F?ec)VeEQK60qTMQYNbEEND9mjz!MA6$DSHQDM;H-{gkQQRty^EECfd2mh z)dI~-uau=s#v%|~Ua<1sYK4n@reQ)2OmZ$(N-v#IRx^6ZrR~^#uQRej0Xtg?80h~W z+`Du6-rg>WQcbj(a2_k26$)6}krfIUT?r$dk}K(DLIGPv0R#R2L+F0jOHLVc;aOEK z0k&~JK`U`SUMOHRizBxY(>VVYNeF}j*2z9L&0y0zdQnk=NnE+P5|g2GO#uV_|HGUH zn#fZqU_t>Sap4)(C(Zm53YdM4I@*1}g<$1QRqfWNfPw!1k!8Oe@RKM@C}2@sEHwKK zDPWr_ZgRs5e-MYh5uK>}ZAj>=;)ga$T3se1&kOJp@0bmjO?l)eSNI=GPMis0CcIz_o{;a z|4AAG3I)uPQOk8Rv}hWaRAtca0uO(>$nY>1N+1@iovRcFocSU% zb5eznM#SRT$b8G=AMzF_Y0JTKTY*sq|2uH?_Jt6id}LZS@qP0zMk#zW#D7*OV9-Vi zMhljtiZ5K<7^xz$d6h?EI2fEyAP7z$r4-={rwJA@Y#puq!O#nYKk|$zV4(khy0U8` zyiydmyb8>J&UjGeNx~QY4*JuxX95WY%mG+?ugvBU9k!XXHmKBmB}cAWj|n6cFrd@9 zdwCWVFoh91@OV;QQ!l>88*-J}mQtSSHqznE5a+0b0!C-)dKxbjFnTXzG(HstZ2V_a zz=<(R0s|8G_f?e%>@yGmSg;b;@kX+BN2^GYiXljKycCi`v~>VdDR<2!tirggxG;1O z|NptenBhC8Ri;3`b;hsb3X}lAkT%g99+mMc0A?BV$IJoEW$AA+M*z%XzYwO`Cb35U za&2-j&F(&$P7kV^S?m>&8dul-5Xkx|`pmNffPw!1c@+`|PFnzA0sspp#A=S5Od)pR zjnc8yHtu^5kEbUO7l#MgHT7T{cn6-vx|}=+=th=lM(hv(%{rpUfc}4rdH!G9z=?_| z05E*6qPnL70E3&5tGlpeeLd%)>*tREz!v85TzNNn6X^e6a6nQ4fU!ngb*%~jj4pEL zDYGPIrPf+|-Ts>z9O`S!BCL+Wuz#CxKx$Bs1m~IOItdnQzwipq+ zZLtaf2KxUOb@wwfy;7Dk8Qa%3;Sc~A`@9D5Y2=Qg)$nhTbaL3S`}QXd>q@H@gVe|h z0IV%0YS^Y)3HtwSHv|AyD1Zj4RB(SjHs!KeV{RL=&WN7W>Z<_2=t>ybLM#BV!b5vh z*SO{tja5+}CzXGTIDwHaD1iR|C1<4hepj6TEh1xoVs{Q~mh@C5PK{K2Y`IC*5i=D}Bo>-|0f3#7r}jW(DgZFGq%a=DuH{Ff&UR=&&%ynp z**yDTK2St5G{ErYa)+vJbC}8~4D|o6lE(ybxwrtpVDZ!^DI=>9Y6Y_0$HLURlqR-|kT9Nw&V!;Fe7Pm#+km#tt#lnxi zyBZqKs?=^aS~Wg6^kjHC0Dyu1|1|;<5dfGP%!(ls0N6aU1PnSUQ&v~2Y~Ya7u>x<6 z9X6#!!%X$sUcY&#iOQ)nQR&(&s#Pthanc1=-t z%1C%c6m06@+79Uz3DRsqhGnPYmaO%zo&kV?{{M}@;0XXs0ATYaWIVoHv?_;Op*aEo zJ2}aE$J0s-e4GI*BDspTxrZjWDw1_uWmQxJ`u{g)0sw>APG1@%w_{KsrncLdO^@B{D{Ub`vsj!fk@{8X6VgvZRbSsPl@B@FDt@KwX` zi)Ni(0ASMtrFh|M^$mAQ>AU(}IPZIW!e2FUNDpHIe_9Ag>Y{EDJfC&Ih&HAP@ z^riU$OdPLZRdX{jOf3cn^_-3{5>z;ar(-cU$pX?AUPV+|43|tCXF?32O&|Xbp#s6R+zQ;X!|A{ECVX3iGm;_wzyd zfT9`ohg;TQfT@S>2N?m)n2;xgT=mEC*t zXzIFa%L&tKufel{=F8dSFj#Tzi0mX(Czl9Rb_NO63H1LT(0(T&JJD(=hD+u8Cm!(& zdiaiA)$o%qIIt37r7VeG1HwhOf-!-O2>$oY!W&_0kZez=PC|7G=HDPQja^u&0R8`m zt}-lSC;Qkldyj}B4Wsw=#FaL~QE4cr!3EPRH`(cNzraoP0wi8?SGL9^U>qLnMAt7KR z+F4im0BU0b|20s{nA}P@E643h?*%iwMviDd9GBd!lM}TfAT{3{2KxU`m;F`st%MyN zX53my746g_XIm1^k@9f$ZS$sHS34i09ow^z)OxwKg^g}KN+E2QL?__Dct%XYVn#P2 zbu29C|391TPqQ1>KfZUzEoZ4>3?0|1oS@#S7Fvx~w;6RTYgtZXjMkR)d?B4!cj;On zXAfpeSb(fe^nGeiQXAcui_Ep5 zIzw1kkjq}19G(Cdm*~l6bZ~q&L8aiF1n1<}xIzE_g;$0ad4NVBv3M4ZK+?9H)vVoY zyo$%-eu1dfR>x{}@sUoX?d>daPFEmPr{k2e)=IsN?XTz+=|5=D?T!#bNYfLuV)_Zr z32;uJ|NjzjErqd*&OhT^SGCP34k|ZvD#I3})9Jx%0joC4hvCox(n)Ym8f4VQm#qOk zx&y0d?WsrG(MeUL##KoM`v0#~|8FKpr|CNc=@htO!8r-esSf7^`v0$|2P7Z1;gfGK zBt_s|n^)!C-`PTTtyD!dS|-7I6j!o zAE*QPCWaob-Z(v(?W-eqA5AB(Pmf;>kDM$g%ju;{o8Ry0+wXn)0M7T}53hH=JN80K zr&9;?+4>)a^Sw*S_gVt^E+0;hm#lpHh?Q^r9Z$bu_v!S77eDU{-jDKqWA5+gm3xp- zsb9ghM)luU?p>eTD^~Y?e{y`F%6k~@p3}B9Tzsz$Lu)d|j%#5Ui$fq>2)`y@w;f@zX{5hM71+o9%hX4JW{zqkUrJ^&(k3vXaYcRRoEIrS2 zE0k&tFj;idXI$xJ-SJYAt-&Shc%f~zbfEv=$v0S|AIcgIoEx zm9OL4W)A^wMU#H+xpJ$UJ>y2YCrr6cm~x>1|2Bw%6z)fWU}fx?q8;V^fq^-OwOHfp zu0EU`KbU5>PmdlMfXBUu$J3LCi^GHLntIX#M2)bcayfb6pC_92b}V9zm`rF%Rp~4a z3jYWKJX$XJ;Spb%#&@t5Eoef2cTLqDc6-6Ya2eKJ4%{$^jkzNL%)-HQV`Y8~G-!wa zPRtZ)%9O*4pfe~UF9iMncTCwB=S<}+^4_o@Jpt3K(vrRT8`HxDAhUL-%jy1dwwU{+ zL@vmM(dbw+Hv1g$4W`F<)E_dCIKj#(4ao;P960X0AmtF_M>VALT%5AriW;J}mOeO~ zf~FjphlOy8qPpDj?ul}s|Nov_H)>!2l888LE8;WHocOHC44cp5D*#@6t5JSV(<=>LC! zXw%5mSkmZyH#Nx~BWVj5mK{w^!>S%g{9znM`#13n!<5l?8qw7FtuI$ZOxPwK#5;?A z!-T?+@yuXzDQ_xqnIM{A)^QlvLKMAUc5wjNU)AF>n3>jb4AM*t(EtA!Z2h%cVq=9# z>5dt-A-23Q!@Ovy_Kvro}8wX~v zYdBrqAfcef)HW2ASU`+k{97b|8AUt#$SvNhnR3FDqup@muU3_6nTgdJKxU)i2BbC6 z|NlIj?`L|SE>0|eUOKT-uEeGkR>j8+ByA{V$AOH$wZ(MR92uz+C>P0GAf}w~cEmdgE88hWJwuoM-Kd4@Dt_}46 zzh-R!KwZi!WV!p3{nu5y!0D0i7Jz(bQ{8op($pVxc%$p=DW-B1M=t^^w@Dd#>JKVu zbfNvsCAC$w$;lGhgjYexs4om%VfSD;(EtBNqZNx=17}Y{7~&6;*y(cNR-3EvCinSfaQ)ChyAT)xf(73Fe;gk#4@AHAGGTWo%16$H@z5(yKwI$k>!xLjqS3e+oK zHDtE@Y{@Eg+_)69HvLRxGwdZfU=0_>s+rapELZqJDr9u<5GkZt*|+SsV&$i&%5X1D z=hNfKa&cUxfF?hIjl-b-{}X!_?krB1KHbcE!Fh;)!kEL_?y5B%&SnO8wK#h96t)Y> zm=nHSEnMoE7KuUs|JR`gfN>Vlm@QdyW2CXHnY9c8FRk=0dbFgIqJs9WFPpx`4?{~-$uoM zR)-J1uE&4KFUs=ANzKnJHt`<|pQBOv8L0D)Oz}7TNa!8HV`l%O4T$N(RIm}-7Z1ZP zni?=HYpB9<_`>q=P=!$DRUV1qKyZK1UhSLvnf7D6d*)wbgb3;nKscB1Bis$nRp(sz zYCY2fqs9NG-*3ntx8=#6;Qj>nw^U`W;XrVIknrDL98QjB%O_b3{7b2r!hNZK(YXx= zg8Kuw-TmVUl!8<#MeR;e;am8!c9b_moE;sXPdj>6P|50f=Q|8IVmCxGCJ^Gx0whC@uiDC`;nW#kF{i`ZSzjqP#H5XL|^ z^8VI<;cJ0%jQShg5v3jd?VR}zs7F5PZ!$-eehjzzte;iHI- zb^YU@|L@(q1F4!R`Id zOgi&B6hQyKd-bzBF{Ww}n6;Hx>8y@dg#HCq*-Y61jb>|SvCzM0K2BOAS5nJ9_7F0P z`mOreMzBfPwt=FK@Qt5%w1oz>Mn&1&rV$eh^#3!3{)NlUqmBca)b)*gz$NJ;m76NDQ^Kk&)5dEX&fE#8RNk96 z^yI$fd>{1xdsOaT3GAoPzZf8o(7)=~QD?KLWFlmte+{x|`d8Ki{r{fF)$MP@QZ%s= zNoZ$6{}TF_(7#}BL-+Krp6dU5pYPKU`q#2=U}qaEVP~tTZm^<``FozJKS;wC z8RCj`SLk0iN~7FNiiPqaX|hLQluaLY2_JCWoif3~wSge$myqxGG6l+$>p>IQrM&1oZ!V zn?>TVx>{XC75W!i##L)NoEr#A)5Xyf`WJbEUeo!wld@-v8M3y)u-&Y?3jOm;>0gIa z(EramfT)Dq185`=`j_7S-&Es7wICLp2|ERXcS)$Rb58eXqPXZ?YtdO9FX^?_ev|>jEVF*+e~k`9%FZLkfc0>7 z5w8WOvdZ>B|G!Tk)+dGjrJqyF3=PXM9|DVHUpUo=1EGIe7Eqp&1vGrV zSwQAqI)2T1EFhtOtwaAp{+HKyp??Yet5}wRJ2Hn{u#K0pNwBt_i8Oxm`L><~l3EP! zkE4Hq|Ns8|j|u^-x&xg2fr7+{W%;i+*fp#MLBul@y;te00$OMfmhFVAU( zDUhw<@UilBTzwJ(m=M60{uc23BH+NV$Rl90jM#6CvL3Xz84wfb{|^itl@P#$02WM$ zM$;(xhD@OZQ%HH-whXz5HAT?>&+fNa$oAeaF3uGKSZ`yv$$-9u0H*qn)Lq!J5Hc=J zs-HgD?sR|hB)c~wPfZ73XYV%&OY_e2rHeuU1O0z-+0FnY5m5+WbXuO%bV)UO4l|zv zRYOiTa+ z{r|x(%rv9gD8o?38{Cu&=cGKZcI*K8(=+t7LtHXb=NUnSAUTB4B&5(%9&zlqoh?ids9h; z0Cpw>Fwp-@h5l&Mg#ac5Fw>E&=`I;AiWwTaOA<49SP?Zo zLXztNws7xe$ z1)n?z1TfJ5ABI;5M%BJB7#0E;bX=I#Wg&psjp#6G*X02T0j#ro8N&lo%6R+$% zLI4v2STWLFTjLAVs`Z$ELI7*a{No5vx0l_FA^f#F!K*F+L2s7!Z%l3loEQ$sO`u~3%^(hf7xTk`0N`P|Gn;F}(oKo@#7@OHkGmT^l^>z@c z7bs8;8kArPDUaKB2GuTTgZ}@YP_?8sQ)pli55Z#`hMRp3)CCrHJn9b_gqQX++*iQ7 z4)YQ74P{=11_n1_#Cd0-fkC8Bo3Zabc?2=pV!4`1@cII<91Hd zB{NWMg-W?v&vaV&OfPi9ly}0-KHDGo+|j^5|3AnZ6mWt5X5yYR_YR$>DKi~rNSlF- z0*H|vO`(Blijlp6WXOiKG2!~|pv913$upWfHLUS&2|Qa1QS>&)1=I{Gs|C!6bX>Eo z5(D(VznJOH7tSmS4Gf|cG=9FmNL4ANmu9S=KWQJJiMZ$vMEbu7v4){=CbbgvU(wPI&=oO!pE z$IQQ064h18*;+#6TuVa7QuS9#QNp5fS+4*I<@HMaLG{YGHqieex}F9+w`U=*^>xie zrk12&NTL(<6v9UFv0M#IXkg?CKHwlWg$C9U4Gi>uwCoedzC&99ga#%wFuDL;;cA2i z<^g&-n7(rB*2{aBZ-Vzl-|DyLb7gjgeON9s*LPXDaPZpX@MIeJ@y+P?IA~!9{og2G zBfbMGL8=v|Z6qc%Frk474eVUgz(D`UDTgS(OydV_KcHbw_rYAL>-@NxudKo@ zxnClw%vQ&1rzLn)U>-rdUELB>C7#g0ga+o~fCf2s;Gc1-`S=0fvA(&UC$*9W2Kv7_ zIdZ$)VV|bZz=&xP8rabk;8HrMO*t>?IcEx)ligjM9z$PB^n4T=SPTse^nVLJZyj}$ zmXcigIbEzLc>z(GosP@Gsv*GVRrbOWw#2sDoFzpXT(I180dAi0dI zSh!LJ(JMWzjoJ3fRb-D5J2@+80iBp@F$P zNoZg$W?Y*MBs8$j?&WG481lcAs&g7IG%%roIfrMHt+h2?Xkh6yzHl#BYdm`OH#0>8 zdmsGoy_dfF(tE!CJ=wdz`Q2amu5W$Umt6V|c;if7Pv8Emr;lEE@y6xL?=!DYefkrZ zuWXM8gFAcIUWKaqt2S48^%b>A>CSY2@nAkvs4{gNk71ni>W$Nr*}gggu$IZ|)8kj^ z5r}kt^V7Fqc)Eb|efYyk&UXj4HM6Hv2jG0aNXa)(C*S46>G6_1Asm78{nV##zyImc z3ol;3b!(-3vxDhE-Ou9#D@5sT-drpl8ICFaR51|zuoe6{0uqH^P#O1>{kC136M9jo*G-%sEE?5DFAUi|Rt5nOZdV07VpJ^0^` z6zt#r^yH-WDX4K37EGqV)D|+l`U0yf%mD4>_Tn)-5EKnqaU+}Gnoa5{Da)30+lynH>AihioO|`*EQynX1miRtja@buP)5=7r1Dd1QU73YledT8*cSkye=rnc!LG(!k7SIcZUJ& zDh(Ot+uRZ5V+8xRnu(WZ_tInkTpI!C{}%$}xn+}A$Q&#h0m1&+EFQPb_;uKt{;B+& zrc1iVITP%k-%-oDr;f2f?wmzsBfgkRPAeIwv!3igla zk+-bG`VCWhX{JZmpR{P`y>;g7ykP$X`$y&uI&l9Mox|Y4LI1CkWvcZIP{Mhv`i}+s zSB%X3Fgje4e~XN)VE^d)CFzM4>|Y@V1^wTJ9sUGFhbF_nMJHA?A*p69k1-eiq(!%9 zj*L`skn?*gzqvL$T*8{UPi~6pLw>zpO2PgeWRG2qs9}AG8P2=VgR@-Bfml%*P7|5p zCMa%5F*T^)2&g7+_*-shgSY7eB?lr?R2fNEyW4N0sr!LsP!_xu`PdQq2a+~l6 zaRM;(k$Xo|3~dzTP}vq(e<&a^YIl^^kWapUmtQUrtJ8 zfpeEp6{HjFpTCp3Hh*!je>efuo{EnwPUkG6tZgJF*gwJkrDVztOZ}FKguI%{Lh|X|Ma7fnPGw?NxhJTCfGl7KivPD{o>exO&(x`?HImz=)R->16Qr!K^Daq zE^@%*%JBust$pE00K!l$d4w-CG<@96f3}?a@}GMrVE-KQ5A^@W;q*YI2Q3M7J$EzF^;t?MP;ybo9+csB3vHTX>O0ith z3BC{qE4r89Y%*Y!sv$s%lPqP=Ig=Q#J6;j^C{DVRz2@=KLHvJvdH@qX4BLeM#cU(v ztx3m~r{18yGiJ~;K-}o(gYp4|;^+^z$_IeNk@v^j`atbqUxj}E#aw4OzOkujSlwk2 z3)FQ1i=~oea3y1gFQSno{Y~Zw+z9&x?lz#kdM@Z+uPFZKk0tI-yD*`D3H>XGX+W1o zEC35s2|6ShGL}rC1XD-_g7+RCPfs2$4iBPb8B4%AVXlLxv0WeX&TAS0$2XlAM+ zf}_ZnLDf;v|2wVWKe&+T&SPtBF3e%03ZZ}XHinz0C#v9u1Eg;pkny(1IdcHWczJ(o z!1yviu=}GcL0u;k66#B=y*c^YO(c^jk{laZF&rpw-Z>DG7XYsfIRt%wi-boF2O0EbyE!!DwCDc&pU!cjjDCwLW z9lew(5Ys~9&KWw6oMfhzQ_@$<=!69QzqhZSLuuq1klI_Vq|v*LYsyWGq^7;G;2?7d ze&8`6FbG`chHKBTI_Gw*6m$+Yi{lTYaQ1I9h{KdU;Auot+NTLwbm+oiYamzCn6PC$ zh*uEAH1$J<$+pnHo(=tLqW1rMwAi_B*1Ds|BxNC!Q5)|ri^k7eMb0efmL|xX_HJCS zuW5mCAm>2);NPMqBBhs3D61Jc6?!COLdu`iAzX4vO@nV;)}@askKf*|DuTx*$yrAuTne=`u{PZ ze+8Q+M;!+;ghEybl|9#qO>jP9h$!hWXB|f|LjSVlG+P!o!+W0SUoR>C*T?UW`lQgm zOsu8)e0|4o293stlPC98Q-JSdH%@qv3H_^g3^bH@Vjy+XT1SEmtY94Lvph3ut$1e9 z?L}1(78(GPsADrA0Rs05AS@qbX)`N8ER>prg`o0mjG=$+tNj0qRz3XkS;%XBT{Dp> zVkac*Y(%@b6v9UFuv`s{?3t-CHVXLVYS2ReGP^MwB(7&ZuErwK30yO()iW5JOS6@H zm!d~W3i|)!g#J}wkA?mv^e-F2H?S}lkp8te1^xf=LjTeXqha=;%rT+Z1YF@O>S@%O zp&{WfZ9=M{7*bv3+PyV>R{x|F^%MR`�$0f+^sioL^sg)f{r_TD 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 J3&5GQKLhK786p4x literal 0 HcmV?d00001 diff --git a/configs/audio_policy.conf b/configs/audio_policy.conf new file mode 100644 index 0000000..8c04af4 --- /dev/null +++ b/configs/audio_policy.conf @@ -0,0 +1,52 @@ +# Global configuration section: lists input and output devices always present on the device +# as well as the output device selected by default. +# Devices are designated by a string that corresponds to the enum in audio.h + +global_configuration { + attached_output_devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER + default_output_device AUDIO_DEVICE_OUT_SPEAKER + attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_VOICE_CALL +} + +# audio hardware module section: contains descriptors for all audio hw modules present on the +# device. Each hw module node is named after the corresponding hw module library base name. +# For instance, "primary" corresponds to audio.primary..so. +# The "primary" module is mandatory and must include at least one output with +# AUDIO_OUTPUT_FLAG_PRIMARY flag. +# Each module descriptor contains one or more output profile descriptors and zero or more +# input profile descriptors. Each profile lists all the parameters supported by a given output +# or input stream category. +# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding +# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n". + +audio_hw_modules { + primary { + outputs { + primary { + sampling_rates 44100 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET + flags AUDIO_OUTPUT_FLAG_PRIMARY + } + } + inputs { + primary { + sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_FM|AUDIO_DEVICE_IN_VOICE_CALL + } + } + } + a2dp { + outputs { + a2dp { + sampling_rates 44100 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_ALL_A2DP + } + } + } +} diff --git a/configs/egl.cfg b/configs/egl.cfg new file mode 100644 index 0000000..4515dfd --- /dev/null +++ b/configs/egl.cfg @@ -0,0 +1 @@ +0 1 mali diff --git a/configs/spn-conf.xml b/configs/spn-conf.xml new file mode 100644 index 0000000..191bc05 --- /dev/null +++ b/configs/spn-conf.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configs/ste_modem.sh b/configs/ste_modem.sh new file mode 100644 index 0000000..decafb2 --- /dev/null +++ b/configs/ste_modem.sh @@ -0,0 +1,106 @@ +#!/system/bin/sh + +MCE_CFG=/modemfs/CONF/MCE/MCE.CFG +PMST_CFG=/modemfs/PERM/PLAIN/PMST.CFG +TRACE_AUTO_CONF=/modemfs/trace_auto.conf +JIG_SMD=/sys/class/usb_switch/FSA_SWITCH/jig_smd + +if cat /sys/class/usb_switch/FSA_SWITCH/jig_smd ; then + echo "[JIG USB] detected"; + echo "[Boot Mode] SMD"; + echo "[MODEM] local mode"; + echo -en "\x01" > $MCE_CFG + echo "[MODEM] non sleep mode"; + echo -en "\xff\xff\x60\x60" > $PMST_CFG +else + echo "[JIG USB] Not detected"; + if ls /linuxrc > /dev/null ; then + echo "[Boot Mode] HATS"; + echo "[modem] local mode"; + echo -en "\x01" > /mnt$MCE_CFG + echo "[MODEM] non sleep mode"; + echo -en "\xff\xff\x60\x60" > /mnt$PMST_CFG +# rm /mnt/modemfs/RFHAL/* +# cp -r /mnt/modemfs/RFHAL_const/* /mnt/modemfs/RFHAL/ + else + echo "[Boot Mode] Normal"; + echo "[modem] normal mode."; + echo -en "\x00" > $MCE_CFG + echo "[modem] sleep mode"; + echo -en "\xff\xff\xff\xff" > $PMST_CFG + fi +fi + +# chown for test application +if ls $MCE_CFG > /dev/null ; then + chown radio.radio $MCE_CFG +fi +if ls $PMST_CFG > /dev/null ; then + chown radio.radio $PMST_CFG +fi +if ls $TRACE_AUTO_CONF > /dev/null ; then +chown radio.radio $TRACE_AUTO_CONF +fi +if ls $JIG_SMD > /dev/null ; then + chown radio.radio $JIG_SMD +fi + +# Start CSPSA2NWM which uses CSPSA server to copy radio parameters +# from CSPSA and store them as files in the file system in the way expected +# by NWM. Note that this process does not background itself, but rather +# blocks until the copying has completed. + +#echo "Synchronizing modem parameters from CSPSA to file system" +#mv /modemfs/guardfile /modemfs/GUARDFIL +#/system/bin/cspsa2nwm -r / -u 0xfffffffd:0 -g /modemfs/GUARDFIL -p /modemfs/RFHAL CSPSA0 + +# This is a initial script for copying a default calibration data. +# After device downloading, phone calibration data is erased. +# so it is necessary to copy a backup data. + +echo "Synchronizing modem parameter & CAL data"; + +MODEMFS_GUARD=/modemfs/GUARDFIL +MODEMFS_RFHAL=/modemfs/RFHAL +EFS_GUARD=/efs/GUARDFIL +EFS_RFHAL=/efs/RFHAL + +if ! ls $MODEMFS_GUARD > /dev/null ; then + if ! ls $EFS_GUARD > /dev/null ; then + echo "There is no CAL data. Copy the default modem CAL data to modemfs partition."; + if ! ls $MODEMFS_RFHAL > /dev/null ; then + cp -r /efs/RFHAL.DEF /modemfs/RFHAL +# else +# cp -r /efs/RFHAL.DEF/* /modemfs/RFHAL/ + fi + else + echo "modemfs partition is erased. Copy the previous CAL data to modemfs partition."; + if ! ls $MODEMFS_RFHAL > /dev/null ; then + cp -r /efs/RFHAL /modemfs/RFHAL + else + cp -r /efs/RFHAL/* /modemfs/RFHAL/ + fi + echo 0 > /modemfs/GUARDFIL + fi +else + if ! ls $EFS_GUARD > /dev/null ; then + if ! ls $EFS_RFHAL > /dev/null ; then + cp -r /modemfs/RFHAL /efs/RFHAL + else + cp -r /modemfs/RFHAL/* /efs/RFHAL/ + fi + echo 0 > /efs/GUARDFIL + fi +fi + +# Flushing MCE.CFG and PMST.CFG before executing MSA +echo "Sync for MCE.CFG and PMST.CFG"; +sync + +# Finally start Modem Storage Agent, serving files system requests from the +# modem. It is important that this process does not background itself since +# Androids init will restart this script once this command returns. The +# necessary device nodes were created by /system/etc/ste_audio_mknods.sh +# prior to executing this command. +echo "Starting Modem Storage Agent" +exec /system/bin/logwrapper /system/bin/msa -l stdout diff --git a/janice.mk b/janice.mk index cdec2f4..a44ef2a 100644 --- a/janice.mk +++ b/janice.mk @@ -16,6 +16,10 @@ DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay PRODUCT_AAPT_CONFIG := normal hdpi PRODUCT_AAPT_PREF_CONFIG := hdpi +# STE +PRODUCT_COPY_FILES += \ + $(COMMON_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh + # TEE PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/tee/cops_ta.ssw:system/lib/tee/cops_ta.ssw \ @@ -47,6 +51,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/prerecovery.rc:root/prerecovery.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc +# Audio +PRODUCT_COPY_FILES += \ + $(COMMON_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ + $(COMMON_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ + $(COMMON_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ # RIL PRODUCT_COPY_FILES += \ From 91a03e589e6e73b4e4c719e0ae62d5903809f7be Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Thu, 19 Sep 2013 18:00:00 -0300 Subject: [PATCH 117/248] fix path to config files --- janice.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/janice.mk b/janice.mk index a44ef2a..ecf7b6d 100644 --- a/janice.mk +++ b/janice.mk @@ -18,7 +18,7 @@ PRODUCT_AAPT_PREF_CONFIG := hdpi # STE PRODUCT_COPY_FILES += \ - $(COMMON_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh + $(LOCAL_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh # TEE PRODUCT_COPY_FILES += \ @@ -53,9 +53,9 @@ PRODUCT_COPY_FILES += \ # Audio PRODUCT_COPY_FILES += \ - $(COMMON_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ - $(COMMON_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ - $(COMMON_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ + $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ + $(LOCAL_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ + $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ # RIL PRODUCT_COPY_FILES += \ From 3b8926b43c04867e739afcd38c1a12b428329f33 Mon Sep 17 00:00:00 2001 From: Rox-Ace2 Date: Fri, 20 Sep 2013 20:46:09 +0200 Subject: [PATCH 118/248] Use common files --- overlay/include/hardware/copybit.h | 257 ----------- overlay/include/hardware/gps.h | 693 ----------------------------- overlay/include/system/graphics.h | 195 -------- 3 files changed, 1145 deletions(-) delete mode 100644 overlay/include/hardware/copybit.h delete mode 100644 overlay/include/hardware/gps.h delete mode 100644 overlay/include/system/graphics.h diff --git a/overlay/include/hardware/copybit.h b/overlay/include/hardware/copybit.h deleted file mode 100644 index 29deb54..0000000 --- a/overlay/include/hardware/copybit.h +++ /dev/null @@ -1,257 +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. - */ - -#ifndef ANDROID_COPYBIT_INTERFACE_H -#define ANDROID_COPYBIT_INTERFACE_H - -#include - -#include -#include -#include - -__BEGIN_DECLS - -/** - * The id of this module - */ -#define COPYBIT_HARDWARE_MODULE_ID "copybit" - -/** - * Name of the graphics device to open - */ -#define COPYBIT_HARDWARE_COPYBIT0 "copybit0" - -/* supported pixel-formats. these must be compatible with - * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h - */ -enum { - COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, - COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, - COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, - COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, - COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, - COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, - COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, - COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP, - COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP, - COPYBIT_FORMAT_YCbCr_422_P = HAL_PIXEL_FORMAT_YCbCr_422_P, - COPYBIT_FORMAT_YCbCr_420_P = HAL_PIXEL_FORMAT_YCbCr_420_P, - COPYBIT_FORMAT_YCrCb_422_SP = HAL_PIXEL_FORMAT_YCrCb_422_SP, - COPYBIT_FORMAT_YCrCb_420_SP = HAL_PIXEL_FORMAT_YCrCb_420_SP, - COPYBIT_FORMAT_YCrCb_422_P = HAL_PIXEL_FORMAT_YCrCb_422_P, - COPYBIT_FORMAT_YCrCb_420_P = HAL_PIXEL_FORMAT_YCrCb_420_P, - /* STE: Added Support for YUV42XMBN, required for Copybit CC acceleration */ - COPYBIT_FORMAT_YCBCR42XMBN = HAL_PIXEL_FORMAT_YCBCR42XMBN, - /* STE: Added for YCbCr422R -> RGB888 use-case */ - COPYBIT_FORMAT_YCbCr_422_I = HAL_PIXEL_FORMAT_YCbCr_422_I, -}; - -/* name for copybit_set_parameter */ -enum { - /* rotation of the source image in degrees (0 to 359) */ - COPYBIT_ROTATION_DEG = 1, - /* plane alpha value */ - COPYBIT_PLANE_ALPHA = 2, - /* enable or disable dithering */ - COPYBIT_DITHER = 3, - /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */ - COPYBIT_TRANSFORM = 4, - /* blurs the copied bitmap. The amount of blurring cannot be changed - * at this time. */ - COPYBIT_BLUR = 5 -}; - -/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */ -enum { - /* flip source image horizontally */ - COPYBIT_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H, - /* flip source image vertically */ - COPYBIT_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V, - /* rotate source image 90 degres */ - COPYBIT_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90, - /* rotate source image 180 degres */ - COPYBIT_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180, - /* rotate source image 270 degres */ - COPYBIT_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, -}; - -/* enable/disable value copybit_set_parameter */ -enum { - COPYBIT_DISABLE = 0, - COPYBIT_ENABLE = 1 -}; - -/* use get_static_info() to query static informations about the hardware */ -enum { - /* Maximum amount of minification supported by the hardware*/ - COPYBIT_MINIFICATION_LIMIT = 1, - /* Maximum amount of magnification supported by the hardware */ - COPYBIT_MAGNIFICATION_LIMIT = 2, - /* Number of fractional bits support by the scaling engine */ - COPYBIT_SCALING_FRAC_BITS = 3, - /* Supported rotation step in degres. */ - COPYBIT_ROTATION_STEP_DEG = 4, -}; - -/* Image structure */ -struct copybit_image_t { - /* width */ - uint32_t w; - /* height */ - uint32_t h; - /* format COPYBIT_FORMAT_xxx */ - int32_t format; - /* base of buffer with image */ - void *base; - /* handle to the image */ - native_handle_t* handle; -}; - -/* Rectangle */ -struct copybit_rect_t { - /* left */ - int l; - /* top */ - int t; - /* right */ - int r; - /* bottom */ - int b; -}; - -/* Color (components in range 0-255) */ -struct copybit_color_t { - /* Red */ - uint8_t r; - /* Green */ - uint8_t g; - /* Blue */ - uint8_t b; - /* Alpha */ - uint8_t a; -}; - -/* Region */ -struct copybit_region_t { - int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect); -}; - -/** - * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM - * and the fields of this data structure must begin with hw_module_t - * followed by module specific information. - */ -struct copybit_module_t { - struct hw_module_t common; -}; - -/** - * Every device data structure must begin with hw_device_t - * followed by module specific public methods and attributes. - */ -struct copybit_device_t { - struct hw_device_t common; - - /** - * Set a copybit parameter. - * - * @param dev from open - * @param name one for the COPYBIT_NAME_xxx - * @param value one of the COPYBIT_VALUE_xxx - * - * @return 0 if successful - */ - int (*set_parameter)(struct copybit_device_t *dev, int name, int value); - - /** - * Get a static copybit information. - * - * @param dev from open - * @param name one of the COPYBIT_STATIC_xxx - * - * @return value or -EINVAL if error - */ - int (*get)(struct copybit_device_t *dev, int name); - - /** - * Execute the bit blit copy operation - * - * @param dev from open - * @param dst is the destination image - * @param src is the source image - * @param region the clip region - * - * @return 0 if successful - */ - int (*blit)(struct copybit_device_t *dev, - struct copybit_image_t const *dst, - struct copybit_image_t const *src, - struct copybit_region_t const *region); - - /** - * Execute the stretch bit blit copy operation - * - * @param dev from open - * @param dst is the destination image - * @param src is the source image - * @param dst_rect is the destination rectangle - * @param src_rect is the source rectangle - * @param region the clip region - * - * @return 0 if successful - */ - int (*stretch)(struct copybit_device_t *dev, - struct copybit_image_t const *dst, - struct copybit_image_t const *src, - struct copybit_rect_t const *dst_rect, - struct copybit_rect_t const *src_rect, - struct copybit_region_t const *region); - - /** - * Execute the fill bit blit operation - * - * @param dev from open - * @param dst is the destination image - * @param rect is the destination rectangle - * @param color is the fill color - * @param region the clip region - */ - int (*fill)(struct copybit_device_t *dev, - struct copybit_image_t *dst, - struct copybit_rect_t *rect, - struct copybit_color_t *color, - struct copybit_region_t *region); -}; - - -/** convenience API for opening and closing a device */ - -static inline int copybit_open(const struct hw_module_t* module, - struct copybit_device_t** device) { - return module->methods->open(module, - COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device); -} - -static inline int copybit_close(struct copybit_device_t* device) { - return device->common.close(&device->common); -} - - -__END_DECLS - -#endif // ANDROID_COPYBIT_INTERFACE_H - diff --git a/overlay/include/hardware/gps.h b/overlay/include/hardware/gps.h deleted file mode 100644 index 1176b72..0000000 --- a/overlay/include/hardware/gps.h +++ /dev/null @@ -1,693 +0,0 @@ -/* - * Copyright (C) 2010 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. - */ - -#ifndef ANDROID_INCLUDE_HARDWARE_GPS_H -#define ANDROID_INCLUDE_HARDWARE_GPS_H - -#include -#include -#include -#include - -#include - -__BEGIN_DECLS - -/** - * The id of this module - */ -#define GPS_HARDWARE_MODULE_ID "gps" - - -/** Milliseconds since January 1, 1970 */ -typedef int64_t GpsUtcTime; - -/** Maximum number of SVs for gps_sv_status_callback(). */ -#define GPS_MAX_SVS 32 - -/** Requested operational mode for GPS operation. */ -typedef uint32_t GpsPositionMode; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** Mode for running GPS standalone (no assistance). */ -#define GPS_POSITION_MODE_STANDALONE 0 -/** AGPS MS-Based mode. */ -#define GPS_POSITION_MODE_MS_BASED 1 -/** AGPS MS-Assisted mode. */ -#define GPS_POSITION_MODE_MS_ASSISTED 2 - -/** Requested recurrence mode for GPS operation. */ -typedef uint32_t GpsPositionRecurrence; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** Receive GPS fixes on a recurring basis at a specified period. */ -#define GPS_POSITION_RECURRENCE_PERIODIC 0 -/** Request a single shot GPS fix. */ -#define GPS_POSITION_RECURRENCE_SINGLE 1 - -/** GPS status event values. */ -typedef uint16_t GpsStatusValue; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** GPS status unknown. */ -#define GPS_STATUS_NONE 0 -/** GPS has begun navigating. */ -#define GPS_STATUS_SESSION_BEGIN 1 -/** GPS has stopped navigating. */ -#define GPS_STATUS_SESSION_END 2 -/** GPS has powered on but is not navigating. */ -#define GPS_STATUS_ENGINE_ON 3 -/** GPS is powered off. */ -#define GPS_STATUS_ENGINE_OFF 4 - -/** Flags to indicate which values are valid in a GpsLocation. */ -typedef uint16_t GpsLocationFlags; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** GpsLocation has valid latitude and longitude. */ -#define GPS_LOCATION_HAS_LAT_LONG 0x0001 -/** GpsLocation has valid altitude. */ -#define GPS_LOCATION_HAS_ALTITUDE 0x0002 -/** GpsLocation has valid speed. */ -#define GPS_LOCATION_HAS_SPEED 0x0004 -/** GpsLocation has valid bearing. */ -#define GPS_LOCATION_HAS_BEARING 0x0008 -/** GpsLocation has valid accuracy. */ -#define GPS_LOCATION_HAS_ACCURACY 0x0010 - -/** Flags for the gps_set_capabilities callback. */ - -/** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. - If this is not set, then the framework will use 1000ms for min_interval - and will start and call start() and stop() to schedule the GPS. - */ -#define GPS_CAPABILITY_SCHEDULING 0x0000001 -/** GPS supports MS-Based AGPS mode */ -#define GPS_CAPABILITY_MSB 0x0000002 -/** GPS supports MS-Assisted AGPS mode */ -#define GPS_CAPABILITY_MSA 0x0000004 -/** GPS supports single-shot fixes */ -#define GPS_CAPABILITY_SINGLE_SHOT 0x0000008 -/** GPS supports on demand time injection */ -#define GPS_CAPABILITY_ON_DEMAND_TIME 0x0000010 - -/** Flags used to specify which aiding data to delete - when calling delete_aiding_data(). */ -typedef uint16_t GpsAidingData; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -#define GPS_DELETE_EPHEMERIS 0x0001 -#define GPS_DELETE_ALMANAC 0x0002 -#define GPS_DELETE_POSITION 0x0004 -#define GPS_DELETE_TIME 0x0008 -#define GPS_DELETE_IONO 0x0010 -#define GPS_DELETE_UTC 0x0020 -#define GPS_DELETE_HEALTH 0x0040 -#define GPS_DELETE_SVDIR 0x0080 -#define GPS_DELETE_SVSTEER 0x0100 -#define GPS_DELETE_SADATA 0x0200 -#define GPS_DELETE_RTI 0x0400 -#define GPS_DELETE_CELLDB_INFO 0x8000 -#define GPS_DELETE_ALL 0xFFFF - -/** AGPS type */ -typedef uint16_t AGpsType; -#define AGPS_TYPE_SUPL 1 -#define AGPS_TYPE_C2K 2 - -typedef uint16_t AGpsSetIDType; -#define AGPS_SETID_TYPE_NONE 0 -#define AGPS_SETID_TYPE_IMSI 1 -#define AGPS_SETID_TYPE_MSISDN 2 - -/** - * String length constants - */ -#define GPS_NI_SHORT_STRING_MAXLEN 256 -#define GPS_NI_LONG_STRING_MAXLEN 2048 - -/** - * GpsNiType constants - */ -typedef uint32_t GpsNiType; -#define GPS_NI_TYPE_VOICE 1 -#define GPS_NI_TYPE_UMTS_SUPL 2 -#define GPS_NI_TYPE_UMTS_CTRL_PLANE 3 - -/** - * GpsNiNotifyFlags constants - */ -typedef uint32_t GpsNiNotifyFlags; -/** NI requires notification */ -#define GPS_NI_NEED_NOTIFY 0x0001 -/** NI requires verification */ -#define GPS_NI_NEED_VERIFY 0x0002 -/** NI requires privacy override, no notification/minimal trace */ -#define GPS_NI_PRIVACY_OVERRIDE 0x0004 - -/** - * GPS NI responses, used to define the response in - * NI structures - */ -typedef int GpsUserResponseType; -#define GPS_NI_RESPONSE_ACCEPT 1 -#define GPS_NI_RESPONSE_DENY 2 -#define GPS_NI_RESPONSE_NORESP 3 - -/** - * NI data encoding scheme - */ -typedef int GpsNiEncodingType; -#define GPS_ENC_NONE 0 -#define GPS_ENC_SUPL_GSM_DEFAULT 1 -#define GPS_ENC_SUPL_UTF8 2 -#define GPS_ENC_SUPL_UCS2 3 -#define GPS_ENC_UNKNOWN -1 - -/** AGPS status event values. */ -typedef uint16_t AGpsStatusValue; -/** GPS requests data connection for AGPS. */ -#define GPS_REQUEST_AGPS_DATA_CONN 1 -/** GPS releases the AGPS data connection. */ -#define GPS_RELEASE_AGPS_DATA_CONN 2 -/** AGPS data connection initiated */ -#define GPS_AGPS_DATA_CONNECTED 3 -/** AGPS data connection completed */ -#define GPS_AGPS_DATA_CONN_DONE 4 -/** AGPS data connection failed */ -#define GPS_AGPS_DATA_CONN_FAILED 5 - -#define AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 -#define AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 -#define AGPS_REG_LOCATION_TYPE_MAC 3 - -/** Network types for update_network_state "type" parameter */ -#define AGPS_RIL_NETWORK_TYPE_MOBILE 0 -#define AGPS_RIL_NETWORK_TYPE_WIFI 1 -#define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 -#define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 -#define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 -#define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 -#define AGPS_RIL_NETWORK_TTYPE_WIMAX 6 - -/** - * Name for the GPS XTRA interface. - */ -#define GPS_XTRA_INTERFACE "gps-xtra" - -/** - * Name for the GPS DEBUG interface. - */ -#define GPS_DEBUG_INTERFACE "gps-debug" - -/** - * Name for the AGPS interface. - */ -#define AGPS_INTERFACE "agps" - -/** - * Name for NI interface - */ -#define GPS_NI_INTERFACE "gps-ni" - -/** - * Name for the AGPS-RIL interface. - */ -#define AGPS_RIL_INTERFACE "agps_ril" - -/** - * The GPS chipset can use Psc for AGPS. - */ -#define AGPS_USE_PSC - -/** Represents a location. */ -typedef struct { - /** set to sizeof(GpsLocation) */ - size_t size; - /** Contains GpsLocationFlags bits. */ - uint16_t flags; - /** Represents latitude in degrees. */ - double latitude; - /** Represents longitude in degrees. */ - double longitude; - /** Represents altitude in meters above the WGS 84 reference - * ellipsoid. */ - double altitude; - /** Represents speed in meters per second. */ - float speed; - /** Represents heading in degrees. */ - float bearing; - /** Represents expected accuracy in meters. */ - float accuracy; - /** Timestamp for the location fix. */ - GpsUtcTime timestamp; -} GpsLocation; - -/** Represents the status. */ -typedef struct { - /** set to sizeof(GpsStatus) */ - size_t size; - GpsStatusValue status; -} GpsStatus; - -/** Represents SV information. */ -typedef struct { - /** set to sizeof(GpsSvInfo) */ - size_t size; - /** Pseudo-random number for the SV. */ - int prn; - /** Signal to noise ratio. */ - float snr; - /** Elevation of SV in degrees. */ - float elevation; - /** Azimuth of SV in degrees. */ - float azimuth; - /** Unknown field in Samsung I9100 libgps - May be an indicator for constellation type - (GPS, GLONASS, Galileo)? - Used on GT-I9100, likely also present on GT-N7000, - SGH-I717, SGH-I727 but this needs confirmation. - */ - int unknown_samsung_field; -} GpsSvInfo; - -/** Represents SV status. */ -typedef struct { - /** set to sizeof(GpsSvStatus) */ - size_t size; - - /** Number of SVs currently visible. */ - int num_svs; - - /** Contains an array of SV information. */ - GpsSvInfo sv_list[GPS_MAX_SVS]; - - /** Represents a bit mask indicating which SVs - * have ephemeris data. - */ - uint32_t ephemeris_mask; - - /** Represents a bit mask indicating which SVs - * have almanac data. - */ - uint32_t almanac_mask; - - /** - * Represents a bit mask indicating which SVs - * were used for computing the most recent position fix. - */ - uint32_t used_in_fix_mask; -} GpsSvStatus; - -/* 2G and 3G */ -/* In 3G lac is discarded */ -typedef struct { - uint16_t type; - uint16_t mcc; - uint16_t mnc; - uint16_t lac; -#ifdef AGPS_USE_PSC - uint16_t psc; -#endif - uint32_t cid; -} AGpsRefLocationCellID; - -typedef struct { - uint8_t mac[6]; -} AGpsRefLocationMac; - -/** Represents ref locations */ -typedef struct { - uint16_t type; - union { - AGpsRefLocationCellID cellID; - AGpsRefLocationMac mac; - } u; -} AGpsRefLocation; - -/** Callback with location information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_location_callback)(GpsLocation* location); - -/** Callback with status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_status_callback)(GpsStatus* status); - -/** Callback with SV status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); - -/** Callback for reporting NMEA sentences. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); - -/** Callback to inform framework of the GPS engine's capabilities. - * Capability parameter is a bit field of GPS_CAPABILITY_* flags. - */ -typedef void (* gps_set_capabilities)(uint32_t capabilities); - -/** Callback utility for acquiring the GPS wakelock. - * This can be used to prevent the CPU from suspending while handling GPS events. - */ -typedef void (* gps_acquire_wakelock)(); - -/** Callback utility for releasing the GPS wakelock. */ -typedef void (* gps_release_wakelock)(); - -/** Callback for requesting NTP time */ -typedef void (* gps_request_utc_time)(); - -/** Callback for creating a thread that can call into the Java framework code. - * This must be used to create any threads that report events up to the framework. - */ -typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); - -/** GPS callback structure. */ -typedef struct { - /** set to sizeof(GpsCallbacks) */ - size_t size; - gps_location_callback location_cb; - gps_status_callback status_cb; - gps_sv_status_callback sv_status_cb; - gps_nmea_callback nmea_cb; - gps_set_capabilities set_capabilities_cb; - gps_acquire_wakelock acquire_wakelock_cb; - gps_release_wakelock release_wakelock_cb; - gps_create_thread create_thread_cb; - gps_request_utc_time request_utc_time_cb; -} GpsCallbacks; - - -/** Represents the standard GPS interface. */ -typedef struct { - /** set to sizeof(GpsInterface) */ - size_t size; - /** - * Opens the interface and provides the callback routines - * to the implemenation of this interface. - */ - int (*init)( GpsCallbacks* callbacks ); - - /** Starts navigating. */ - int (*start)( void ); - - /** Stops navigating. */ - int (*stop)( void ); - - /** Closes the interface. */ - void (*cleanup)( void ); - - /** Injects the current time. */ - int (*inject_time)(GpsUtcTime time, int64_t timeReference, - int uncertainty); - - /** Injects current location from another location provider - * (typically cell ID). - * latitude and longitude are measured in degrees - * expected accuracy is measured in meters - */ - int (*inject_location)(double latitude, double longitude, float accuracy); - - /** - * Specifies that the next call to start will not use the - * information defined in the flags. GPS_DELETE_ALL is passed for - * a cold start. - */ - void (*delete_aiding_data)(GpsAidingData flags); - - /** - * min_interval represents the time between fixes in milliseconds. - * preferred_accuracy represents the requested fix accuracy in meters. - * preferred_time represents the requested time to first fix in milliseconds. - */ - int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, - uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); - - /** Get a pointer to extension information. */ - const void* (*get_extension)(const char* name); -} GpsInterface; - -/** Callback to request the client to download XTRA data. - * The client should download XTRA data and inject it by calling inject_xtra_data(). - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_xtra_download_request)(); - -/** Callback structure for the XTRA interface. */ -typedef struct { - gps_xtra_download_request download_request_cb; - gps_create_thread create_thread_cb; -} GpsXtraCallbacks; - -/** Extended interface for XTRA support. */ -typedef struct { - /** set to sizeof(GpsXtraInterface) */ - size_t size; - /** - * Opens the XTRA interface and provides the callback routines - * to the implemenation of this interface. - */ - int (*init)( GpsXtraCallbacks* callbacks ); - /** Injects XTRA data into the GPS. */ - int (*inject_xtra_data)( char* data, int length ); -} GpsXtraInterface; - -/** Extended interface for DEBUG support. */ -typedef struct { - /** set to sizeof(GpsDebugInterface) */ - size_t size; - - /** - * This function should return any information that the native - * implementation wishes to include in a bugreport. - */ - size_t (*get_internal_state)(char* buffer, size_t bufferSize); -} GpsDebugInterface; - -/** Represents the status of AGPS. */ -typedef struct { - /** set to sizeof(AGpsStatus) */ - size_t size; - - AGpsType type; - AGpsStatusValue status; - uint32_t ipaddr; -} AGpsStatus; - -/** Callback with AGPS status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* agps_status_callback)(AGpsStatus* status); - -/** Callback structure for the AGPS interface. */ -typedef struct { - agps_status_callback status_cb; - gps_create_thread create_thread_cb; -} AGpsCallbacks; - - -/** Extended interface for AGPS support. */ -typedef struct { - /** set to sizeof(AGpsInterface) */ - size_t size; - - /** - * Opens the AGPS interface and provides the callback routines - * to the implemenation of this interface. - */ - void (*init)( AGpsCallbacks* callbacks ); - /** - * Notifies that a data connection is available and sets - * the name of the APN to be used for SUPL. - */ - int (*data_conn_open)( const char* apn ); - /** - * Notifies that the AGPS data connection has been closed. - */ - int (*data_conn_closed)(); - /** - * Notifies that a data connection is not available for AGPS. - */ - int (*data_conn_failed)(); - /** - * Sets the hostname and port for the AGPS server. - */ - int (*set_server)( AGpsType type, const char* hostname, int port ); -} AGpsInterface; - - -/** Represents an NI request */ -typedef struct { - /** set to sizeof(GpsNiNotification) */ - size_t size; - - /** - * An ID generated by HAL to associate NI notifications and UI - * responses - */ - int notification_id; - - /** - * An NI type used to distinguish different categories of NI - * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ... - */ - GpsNiType ni_type; - - /** - * Notification/verification options, combinations of GpsNiNotifyFlags constants - */ - GpsNiNotifyFlags notify_flags; - - /** - * Timeout period to wait for user response. - * Set to 0 for no time out limit. - */ - int timeout; - - /** - * Default response when time out. - */ - GpsUserResponseType default_response; - - /** - * Requestor ID - */ - char requestor_id[GPS_NI_SHORT_STRING_MAXLEN]; - - /** - * Notification message. It can also be used to store client_id in some cases - */ - char text[GPS_NI_LONG_STRING_MAXLEN]; - - /** - * Client name decoding scheme - */ - GpsNiEncodingType requestor_id_encoding; - - /** - * Client name decoding scheme - */ - GpsNiEncodingType text_encoding; - - /** - * A pointer to extra data. Format: - * key_1 = value_1 - * key_2 = value_2 - */ - char extras[GPS_NI_LONG_STRING_MAXLEN]; - -} GpsNiNotification; - -/** Callback with NI notification. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification); - -/** GPS NI callback structure. */ -typedef struct -{ - /** - * Sends the notification request from HAL to GPSLocationProvider. - */ - gps_ni_notify_callback notify_cb; - gps_create_thread create_thread_cb; -} GpsNiCallbacks; - -/** - * Extended interface for Network-initiated (NI) support. - */ -typedef struct -{ - /** set to sizeof(GpsNiInterface) */ - size_t size; - - /** Registers the callbacks for HAL to use. */ - void (*init) (GpsNiCallbacks *callbacks); - - /** Sends a response to HAL. */ - void (*respond) (int notif_id, GpsUserResponseType user_response); -} GpsNiInterface; - -struct gps_device_t { - struct hw_device_t common; - - /** - * Set the provided lights to the provided values. - * - * Returns: 0 on succes, error code on failure. - */ - const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev); -}; - -#define AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) -#define AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) - -#define AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) -#define AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) - -typedef void (*agps_ril_request_set_id)(uint32_t flags); -typedef void (*agps_ril_request_ref_loc)(uint32_t flags); - -typedef struct { - agps_ril_request_set_id request_setid; - agps_ril_request_ref_loc request_refloc; - gps_create_thread create_thread_cb; -} AGpsRilCallbacks; - -/** Extended interface for AGPS_RIL support. */ -typedef struct { - /** set to sizeof(AGpsRilInterface) */ - size_t size; - /** - * Opens the AGPS interface and provides the callback routines - * to the implemenation of this interface. - */ - void (*init)( AGpsRilCallbacks* callbacks ); - - /** - * Sets the reference location. - */ - void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct); - /** - * Sets the set ID. - */ - void (*set_set_id) (AGpsSetIDType type, const char* setid); - - /** - * Send network initiated message. - */ - void (*ni_message) (uint8_t *msg, size_t len); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_availability) (int avaiable, const char* apn); -} AGpsRilInterface; - -__END_DECLS - -#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ diff --git a/overlay/include/system/graphics.h b/overlay/include/system/graphics.h deleted file mode 100644 index b60d3a5..0000000 --- a/overlay/include/system/graphics.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2011 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. - */ - -#ifndef SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H -#define SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * If the HAL needs to create service threads to handle graphics related - * tasks, these threads need to run at HAL_PRIORITY_URGENT_DISPLAY priority - * if they can block the main rendering thread in any way. - * - * the priority of the current thread can be set with: - * - * #include - * setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY); - * - */ - -#define HAL_PRIORITY_URGENT_DISPLAY (-8) - -/** - * pixel format definitions - */ - -enum { - HAL_PIXEL_FORMAT_RGBA_8888 = 1, - HAL_PIXEL_FORMAT_RGBX_8888 = 2, - HAL_PIXEL_FORMAT_RGB_888 = 3, - HAL_PIXEL_FORMAT_RGB_565 = 4, - HAL_PIXEL_FORMAT_BGRA_8888 = 5, - HAL_PIXEL_FORMAT_RGBA_5551 = 6, - HAL_PIXEL_FORMAT_RGBA_4444 = 7, - - /* 0x8 - 0xFF range unavailable */ - - /* - * 0x100 - 0x1FF - * - * This range is reserved for pixel formats that are specific to the HAL - * implementation. Implementations can use any value in this range to - * communicate video pixel formats between their HAL modules. These formats - * must not have an alpha channel. Additionally, an EGLimage created from a - * gralloc buffer of one of these formats must be supported for use with the - * GL_OES_EGL_image_external OpenGL ES extension. - */ - - /* - * Android YUV format: - * - * This format is exposed outside of the HAL to software decoders and - * applications. EGLImageKHR must support it in conjunction with the - * OES_EGL_image_external extension. - * - * YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed - * by (W/2) x (H/2) Cr and Cb planes. - * - * This format assumes - * - an even width - * - an even height - * - a horizontal stride multiple of 16 pixels - * - a vertical stride equal to the height - * - * y_size = stride * height - * c_stride = ALIGN(stride/2, 16) - * c_size = c_stride * height/2 - * size = y_size + c_size * 2 - * cr_offset = y_size - * cb_offset = y_size + c_size - * - */ - HAL_PIXEL_FORMAT_YV12 = 0x32315659, // YCrCb 4:2:0 Planar - - /* - * Android RAW sensor format: - * - * This format is exposed outside of the HAL to applications. - * - * RAW_SENSOR is a single-channel 16-bit format, typically representing raw - * Bayer-pattern images from an image sensor, with minimal processing. - * - * The exact pixel layout of the data in the buffer is sensor-dependent, and - * needs to be queried from the camera device. - * - * Generally, not all 16 bits are used; more common values are 10 or 12 - * bits. All parameters to interpret the raw data (black and white points, - * color space, etc) must be queried from the camera device. - * - * This format assumes - * - an even width - * - an even height - * - a horizontal stride multiple of 16 pixels (32 bytes). - */ - HAL_PIXEL_FORMAT_RAW_SENSOR = 0x20, - - /* - * Android binary blob graphics buffer format: - * - * This format is used to carry task-specific data which does not have a - * standard image structure. The details of the format are left to the two - * endpoints. - * - * A typical use case is for transporting JPEG-compressed images from the - * Camera HAL to the framework or to applications. - * - * Buffers of this format must have a height of 1, and width equal to their - * size in bytes. - */ - HAL_PIXEL_FORMAT_BLOB = 0x21, - - /* - * Android format indicating that the choice of format is entirely up to the - * device-specific Gralloc implementation. - * - * The Gralloc implementation should examine the usage bits passed in when - * allocating a buffer with this format, and it should derive the pixel - * format from those usage flags. This format will never be used with any - * of the GRALLOC_USAGE_SW_* usage flags. - * - * If a buffer of this format is to be used as an OpenGL ES texture, the - * framework will assume that sampling the texture will always return an - * alpha value of 1.0 (i.e. the buffer contains only opaque pixel values). - * - */ - HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22, - -#ifdef STE_HARDWARE - /* STE: Added Support of YUV42XMBN, required for Copybit CC acceleration */ - HAL_PIXEL_FORMAT_YCBCR42XMBN = 0xE, -#endif - - /* Legacy formats (deprecated), used by ImageFormat.java */ - HAL_PIXEL_FORMAT_YCbCr_422_SP = 0x10, // NV16 - HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11, // NV21 -#ifdef STE_HARDWARE - HAL_PIXEL_FORMAT_YCbCr_422_P = 0x12, - HAL_PIXEL_FORMAT_YCbCr_420_P = 0x13, -#endif - HAL_PIXEL_FORMAT_YCbCr_422_I = 0x14, // YUY2 -#ifdef STE_HARDWARE - HAL_PIXEL_FORMAT_YCbCr_420_I = 0x15, - HAL_PIXEL_FORMAT_CbYCrY_422_I = 0x16, - HAL_PIXEL_FORMAT_CbYCrY_420_I = 0x17, - HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x20, - HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x21, - HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED = 0x22, - HAL_PIXEL_FORMAT_YCrCb_422_SP = 0x23, - HAL_PIXEL_FORMAT_YCrCb_422_P = 0x24, - HAL_PIXEL_FORMAT_YCrCb_420_P = 0x25, -#endif -}; - - -/** - * Transformation definitions - * - * IMPORTANT NOTE: - * HAL_TRANSFORM_ROT_90 is applied CLOCKWISE and AFTER HAL_TRANSFORM_FLIP_{H|V}. - * - */ - -enum { - /* flip source image horizontally (around the vertical axis) */ - HAL_TRANSFORM_FLIP_H = 0x01, - /* flip source image vertically (around the horizontal axis)*/ - HAL_TRANSFORM_FLIP_V = 0x02, - /* rotate source image 90 degrees clockwise */ - HAL_TRANSFORM_ROT_90 = 0x04, - /* rotate source image 180 degrees */ - HAL_TRANSFORM_ROT_180 = 0x03, - /* rotate source image 270 degrees clockwise */ - HAL_TRANSFORM_ROT_270 = 0x07, -}; - -#ifdef __cplusplus -} -#endif - -#endif /* SYSTEM_CORE_INCLUDE_ANDROID_GRAPHICS_H */ From f7f02d9f18cdd78ba46d82bbfefe474032b05504 Mon Sep 17 00:00:00 2001 From: Rox-Ace2 Date: Fri, 20 Sep 2013 21:12:26 +0200 Subject: [PATCH 119/248] Use common files --- BoardConfig.mk | 1 - janice.mk | 6 - ril/SamsungU8500RIL.java | 958 ---------------------- usr/keylayout/Vendor_04e8_Product_7021.kl | 374 --------- usr/keylayout/gpio-keys.kl | 4 - usr/keylayout/janice-kp.kl | 87 -- 6 files changed, 1430 deletions(-) delete mode 100644 ril/SamsungU8500RIL.java delete mode 100644 usr/keylayout/Vendor_04e8_Product_7021.kl delete mode 100644 usr/keylayout/gpio-keys.kl delete mode 100644 usr/keylayout/janice-kp.kl diff --git a/BoardConfig.mk b/BoardConfig.mk index 1692da3..ee7c986 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -60,7 +60,6 @@ BOARD_LEGACY_NL80211_STA_EVENTS := true BOARD_NO_APSME_ATTR := true # RIL -BOARD_RIL_CLASS := ../../../device/samsung/janice/ril/ BOARD_MOBILEDATA_INTERFACE_NAME := "pdp0" # Vibrator diff --git a/janice.mk b/janice.mk index ecf7b6d..093010b 100644 --- a/janice.mk +++ b/janice.mk @@ -64,11 +64,5 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg \ $(LOCAL_PATH)/configs/compass_calibration:system/etc/init.d/compass_calibration -# Keylayout -PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/usr/keylayout/gpio-keys.kl:system/usr/keylayout/gpio-keys.kl \ - $(LOCAL_PATH)/usr/keylayout/janice-kp.kl:system/usr/keylayout/janice-kp.kl \ - $(LOCAL_PATH)/usr/keylayout/Vendor_04e8_Product_7021.kl:system/usr/keylayout/Vendor_04e8_Product_7021.kl - # Use non-open-source parts if present $(call inherit-product-if-exists, vendor/samsung/u8500-common/janice/janice-vendor-blobs.mk) diff --git a/ril/SamsungU8500RIL.java b/ril/SamsungU8500RIL.java deleted file mode 100644 index dfc0ba4..0000000 --- a/ril/SamsungU8500RIL.java +++ /dev/null @@ -1,958 +0,0 @@ -/* - * Copyright (C) 2011 The CyanogenMod 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.internal.telephony; - -import static com.android.internal.telephony.RILConstants.*; -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; -import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA; -import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA; -import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.ConnectivityManager; -import android.os.Handler; -import android.os.Message; -import android.os.AsyncResult; -import android.os.Parcel; -import android.os.SystemProperties; -import android.telephony.PhoneNumberUtils; -import android.telephony.SignalStrength; -import static com.android.internal.telephony.RILConstants.*; - -import com.android.internal.telephony.CommandException; -import com.android.internal.telephony.DataCallState; -import com.android.internal.telephony.DataConnection.FailCause; -import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; -import com.android.internal.telephony.gsm.SuppServiceNotification; -import com.android.internal.telephony.RILConstants; -import com.android.internal.telephony.cdma.CdmaCallWaitingNotification; -import com.android.internal.telephony.cdma.CdmaInformationRecords; -import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec; -import com.android.internal.telephony.cdma.SignalToneUtil; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.res.Resources; -import android.media.AudioManager; -import android.net.ConnectivityManager; -import android.net.LocalSocket; -import android.net.LocalSocketAddress; -import android.net.NetworkInfo; -import android.os.AsyncResult; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Looper; -import android.os.Message; -import android.os.Parcel; -import android.os.PowerManager; -import android.os.SystemProperties; -import android.os.PowerManager.WakeLock; -import android.telephony.NeighboringCellInfo; -import android.telephony.PhoneNumberUtils; -import android.telephony.SignalStrength; -import android.telephony.SmsManager; -import android.telephony.SmsMessage; -import android.text.TextUtils; -import android.util.Log; - -import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; -import com.android.internal.telephony.gsm.SuppServiceNotification; -import com.android.internal.telephony.cdma.CdmaCallWaitingNotification; -import com.android.internal.telephony.cdma.CdmaInformationRecords; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.Runtime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; - -public class SamsungU8500RIL extends RIL implements CommandsInterface { - - - //SAMSUNG STATES - static final int RIL_REQUEST_GET_CELL_BROADCAST_CONFIG = 10002; - - static final int RIL_REQUEST_SEND_ENCODED_USSD = 10005; - static final int RIL_REQUEST_SET_PDA_MEMORY_STATUS = 10006; - static final int RIL_REQUEST_GET_PHONEBOOK_STORAGE_INFO = 10007; - static final int RIL_REQUEST_GET_PHONEBOOK_ENTRY = 10008; - static final int RIL_REQUEST_ACCESS_PHONEBOOK_ENTRY = 10009; - static final int RIL_REQUEST_DIAL_VIDEO_CALL = 10010; - static final int RIL_REQUEST_CALL_DEFLECTION = 10011; - static final int RIL_REQUEST_READ_SMS_FROM_SIM = 10012; - static final int RIL_REQUEST_USIM_PB_CAPA = 10013; - static final int RIL_REQUEST_LOCK_INFO = 10014; - - static final int RIL_REQUEST_DIAL_EMERGENCY = 10016; - static final int RIL_REQUEST_GET_STOREAD_MSG_COUNT = 10017; - static final int RIL_REQUEST_STK_SIM_INIT_EVENT = 10018; - static final int RIL_REQUEST_GET_LINE_ID = 10019; - static final int RIL_REQUEST_SET_LINE_ID = 10020; - static final int RIL_REQUEST_GET_SERIAL_NUMBER = 10021; - static final int RIL_REQUEST_GET_MANUFACTURE_DATE_NUMBER = 10022; - static final int RIL_REQUEST_GET_BARCODE_NUMBER = 10023; - static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_BOOTSTRAP = 10024; - static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_NAF = 10025; - static final int RIL_REQUEST_SIM_TRANSMIT_BASIC = 10026; - static final int RIL_REQUEST_SIM_OPEN_CHANNEL = 10027; - static final int RIL_REQUEST_SIM_CLOSE_CHANNEL = 10028; - static final int RIL_REQUEST_SIM_TRANSMIT_CHANNEL = 10029; - static final int RIL_REQUEST_SIM_AUTH = 10030; - static final int RIL_REQUEST_PS_ATTACH = 10031; - static final int RIL_REQUEST_PS_DETACH = 10032; - static final int RIL_REQUEST_ACTIVATE_DATA_CALL = 10033; - static final int RIL_REQUEST_CHANGE_SIM_PERSO = 10034; - static final int RIL_REQUEST_ENTER_SIM_PERSO = 10035; - static final int RIL_REQUEST_GET_TIME_INFO = 10036; - static final int RIL_REQUEST_OMADM_SETUP_SESSION = 10037; - static final int RIL_REQUEST_OMADM_SERVER_START_SESSION = 10038; - static final int RIL_REQUEST_OMADM_CLIENT_START_SESSION = 10039; - static final int RIL_REQUEST_OMADM_SEND_DATA = 10040; - static final int RIL_REQUEST_CDMA_GET_DATAPROFILE = 10041; - static final int RIL_REQUEST_CDMA_SET_DATAPROFILE = 10042; - static final int RIL_REQUEST_CDMA_GET_SYSTEMPROPERTIES = 10043; - static final int RIL_REQUEST_CDMA_SET_SYSTEMPROPERTIES = 10044; - static final int RIL_REQUEST_SEND_SMS_COUNT = 10045; - static final int RIL_REQUEST_SEND_SMS_MSG = 10046; - static final int RIL_REQUEST_SEND_SMS_MSG_READ_STATUS = 10047; - static final int RIL_REQUEST_MODEM_HANGUP = 10048; - static final int RIL_REQUEST_SET_SIM_POWER = 10049; - static final int RIL_REQUEST_SET_PREFERRED_NETWORK_LIST = 10050; - static final int RIL_REQUEST_GET_PREFERRED_NETWORK_LIST = 10051; - static final int RIL_REQUEST_HANGUP_VT = 10052; - - static final int RIL_UNSOL_RELEASE_COMPLETE_MESSAGE = 11001; - static final int RIL_UNSOL_STK_SEND_SMS_RESULT = 11002; - static final int RIL_UNSOL_STK_CALL_CONTROL_RESULT = 11003; - static final int RIL_UNSOL_DUN_CALL_STATUS = 11004; - - static final int RIL_UNSOL_O2_HOME_ZONE_INFO = 11007; - static final int RIL_UNSOL_DEVICE_READY_NOTI = 11008; - static final int RIL_UNSOL_GPS_NOTI = 11009; - static final int RIL_UNSOL_AM = 11010; - static final int RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL = 11011; - static final int RIL_UNSOL_DATA_SUSPEND_RESUME = 11012; - static final int RIL_UNSOL_SAP = 11013; - - static final int RIL_UNSOL_SIM_SMS_STORAGE_AVAILALE = 11015; - static final int RIL_UNSOL_HSDPA_STATE_CHANGED = 11016; - static final int RIL_UNSOL_WB_AMR_STATE = 11017; - static final int RIL_UNSOL_TWO_MIC_STATE = 11018; - static final int RIL_UNSOL_DHA_STATE = 11019; - static final int RIL_UNSOL_UART = 11020; - static final int RIL_UNSOL_RESPONSE_HANDOVER = 11021; - static final int RIL_UNSOL_IPV6_ADDR = 11022; - static final int RIL_UNSOL_NWK_INIT_DISC_REQUEST = 11023; - static final int RIL_UNSOL_RTS_INDICATION = 11024; - static final int RIL_UNSOL_OMADM_SEND_DATA = 11025; - static final int RIL_UNSOL_DUN = 11026; - static final int RIL_UNSOL_SYSTEM_REBOOT = 11027; - static final int RIL_UNSOL_VOICE_PRIVACY_CHANGED = 11028; - static final int RIL_UNSOL_UTS_GETSMSCOUNT = 11029; - static final int RIL_UNSOL_UTS_GETSMSMSG = 11030; - static final int RIL_UNSOL_UTS_GET_UNREAD_SMS_STATUS = 11031; - static final int RIL_UNSOL_MIP_CONNECT_STATUS = 11032; - - protected HandlerThread mSamsungu8500RILThread; - protected ConnectivityHandler mSamsungu8500RILHandler; - private AudioManager audioManager; - private boolean mSignalbarCount = SystemProperties.getInt("ro.telephony.sends_barcount", 0) == 1 ? true : false; - private boolean mIsSamsungCdma = SystemProperties.getBoolean("ro.ril.samsung_cdma", false); - - public SamsungU8500RIL(Context context, int networkMode, int cdmaSubscription) { - super(context, networkMode, cdmaSubscription); - audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); - mQANElements = 5; - } - - static String - requestToString(int request) { - switch (request) { - case RIL_REQUEST_DIAL_EMERGENCY: return "DIAL_EMERGENCY"; - default: return RIL.requestToString(request); - } - } - - @Override - public void setCurrentPreferredNetworkType() { - if (RILJ_LOGD) riljLog("setCurrentPreferredNetworkType IGNORED"); - /* Google added this as a fix for crespo loosing network type after - * taking an OTA. This messes up the data connection state for us - * due to the way we handle network type change (disable data - * then change then re-enable). - */ - } - - private boolean NeedReconnect() - { - ConnectivityManager cm = - (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo ni_active = cm.getActiveNetworkInfo(); - - return ni_active != null && ni_active.getTypeName().equalsIgnoreCase( "mobile" ) && - ni_active.isConnected() && cm.getMobileDataEnabled(); - } - - @Override - public void setPreferredNetworkType(int networkType , Message response) { - /* Samsung modem implementation does bad things when a datacall is running - * while switching the preferred networktype. - */ - HandlerThread handlerThread; - Looper looper; - - if(NeedReconnect()) - { - if (mSamsungu8500RILHandler == null) { - - handlerThread = new HandlerThread("mSamsungu8500RILThread"); - mSamsungu8500RILThread = handlerThread; - - mSamsungu8500RILThread.start(); - - looper = mSamsungu8500RILThread.getLooper(); - mSamsungu8500RILHandler = new ConnectivityHandler(mContext, looper); - } - mSamsungu8500RILHandler.setPreferedNetworkType(networkType, response); - } else { - if (mSamsungu8500RILHandler != null) { - mSamsungu8500RILThread = null; - mSamsungu8500RILHandler = null; - } - sendPreferedNetworktype(networkType, response); - } - - } - - //Sends the real RIL request to the modem. - private void sendPreferedNetworktype(int networkType, Message response) { - RILRequest rr = RILRequest.obtain( - RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response); - - rr.mp.writeInt(1); - rr.mp.writeInt(networkType); - - if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) - + " : " + networkType); - - send(rr); - } - - /* private class that does the handling for the dataconnection - * dataconnection is done async, so we send the request for disabling it, - * wait for the response, set the prefered networktype and notify the - * real sender with its result. - */ - private class ConnectivityHandler extends Handler{ - - private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 30; - private Context mContext; - private int mDesiredNetworkType; - //the original message, we need it for calling back the original caller when done - private Message mNetworktypeResponse; - private ConnectivityBroadcastReceiver mConnectivityReceiver = new ConnectivityBroadcastReceiver(); - - public ConnectivityHandler(Context context, Looper looper) - { - super (looper); - mContext = context; - } - - private void startListening() { - IntentFilter filter = new IntentFilter(); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - mContext.registerReceiver(mConnectivityReceiver, filter); - } - - private synchronized void stopListening() { - mContext.unregisterReceiver(mConnectivityReceiver); - } - - public void setPreferedNetworkType(int networkType, Message response) - { - Log.d(LOG_TAG, "Mobile Dataconnection is online setting it down"); - mDesiredNetworkType = networkType; - mNetworktypeResponse = response; - ConnectivityManager cm = - (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - //start listening for the connectivity change broadcast - startListening(); - cm.setMobileDataEnabled(false); - } - - @Override - public void handleMessage(Message msg) { - switch(msg.what) { - //networktype was set, now we can enable the dataconnection again - case MESSAGE_SET_PREFERRED_NETWORK_TYPE: - ConnectivityManager cm = - (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - - Log.d(LOG_TAG, "preferred NetworkType set upping Mobile Dataconnection"); - cm.setMobileDataEnabled(true); - //everything done now call back that we have set the networktype - AsyncResult.forMessage(mNetworktypeResponse, null, null); - mNetworktypeResponse.sendToTarget(); - mNetworktypeResponse = null; - break; - default: - throw new RuntimeException("unexpected event not handled"); - } - } - - private class ConnectivityBroadcastReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { - Log.w(LOG_TAG, "onReceived() called with " + intent); - return; - } - boolean noConnectivity = - intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); - - if (noConnectivity) { - //Ok dataconnection is down, now set the networktype - Log.w(LOG_TAG, "Mobile Dataconnection is now down setting preferred NetworkType"); - stopListening(); - sendPreferedNetworktype(mDesiredNetworkType, obtainMessage(MESSAGE_SET_PREFERRED_NETWORK_TYPE)); - mDesiredNetworkType = -1; - } - } - } - } - - @Override - protected RILRequest findAndRemoveRequestFromList(int serial) { - long removalTime = System.currentTimeMillis(); - long timeDiff = 0; - - synchronized (mRequestsList) { - Iterator itr = mRequestsList.iterator(); - - while ( itr.hasNext() ) { - RILRequest rr = itr.next(); - - if (rr.mSerial == serial) { - itr.remove(); - if (mRequestMessagesWaiting > 0) - mRequestMessagesWaiting--; - return rr; - } - else - { - // We need some special code here for the Samsung RIL, - // which isn't responding to some requests. - // We will print a list of such stale requests which - // haven't yet received a response. If the timeout fires - // first, then the wakelock is released without debugging. - timeDiff = removalTime - rr.creationTime; - if ( timeDiff > mWakeLockTimeout ) { - Log.d(LOG_TAG, "No response for [" + rr.mSerial + "] " + - requestToString(rr.mRequest) + " after " + timeDiff + " milliseconds."); - - /* Don't actually remove anything for now. Consider uncommenting this to - purge stale requests */ - - /* - itr.remove(); - if (mRequestMessagesWaiting > 0) { - mRequestMessagesWaiting--; - } - - // We don't handle the callback (ie. rr.mResult) for - // RIL_REQUEST_SET_TTY_MODE, which is - // RIL_REQUEST_QUERY_TTY_MODE. The reason for not doing - // so is because it will also not get a response from the - // Samsung RIL - rr.release(); - */ - } - } - } - } - return null; - } - - @Override - protected void processSolicited (Parcel p) { - int serial, error; - boolean found = false; - - serial = p.readInt(); - error = p.readInt(); - - RILRequest rr; - - rr = findAndRemoveRequestFromList(serial); - - if (rr == null) { - Log.w(LOG_TAG, "Unexpected solicited response! sn: " - + serial + " error: " + error); - return; - } - - Object ret = null; - - if (error == 0 || p.dataAvail() > 0) { - // either command succeeds or command fails but with data payload - try {switch (rr.mRequest) { - - case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break; - case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break; - case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break; - case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break; - case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break; - case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break; - case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break; - case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: ret = responseInts(p); break; - case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break; - case RIL_REQUEST_DIAL: ret = responseVoid(p); break; - case RIL_REQUEST_GET_IMSI: ret = responseString(p); break; - case RIL_REQUEST_HANGUP: ret = responseVoid(p); break; - case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break; - case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: ret = responseVoid(p); break; - case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break; - case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break; - case RIL_REQUEST_UDUB: ret = responseVoid(p); break; - case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break; - case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break; - case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break; - case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break; - case RIL_REQUEST_OPERATOR: ret = responseStrings(p); break; - case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break; - case RIL_REQUEST_DTMF: ret = responseVoid(p); break; - case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break; - case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break; - case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break; - case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break; - case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break; - case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break; - case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break; - case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break; - case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break; - case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break; - case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; - case RIL_REQUEST_GET_IMEI: ret = responseString(p); break; - case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break; - case RIL_REQUEST_ANSWER: ret = responseVoid(p); break; - case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break; - case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break; - case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break; - case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break; - case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break; - case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break; - case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break; - case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break; - case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break; - case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break; - case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break; - case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break; - case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break; - case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break; - case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break; - case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break; - case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break; - case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break; - case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break; - case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break; - case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break; - case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break; - case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break; - case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break; - case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break; - case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break; - case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break; - case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break; - case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break; - case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break; - case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break; - case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break; - case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break; - case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break; - case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break; - case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break; - case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; - case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break; - case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; - case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break; - case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break; - case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break; - case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break; - case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break; - case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break; - case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break; - case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; - case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break; - case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break; - case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; - case RIL_REQUEST_ISIM_AUTHENTICATION: ret = responseString(p); break; - case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break; - case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break; - case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break; - case RIL_REQUEST_DIAL_EMERGENCY: ret = responseVoid(p); break; - default: - throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest); - //break; - }} catch (Throwable tr) { - // Exceptions here usually mean invalid RIL responses - - Log.w(LOG_TAG, rr.serialString() + "< " - + requestToString(rr.mRequest) - + " exception, possible invalid RIL response", tr); - - if (rr.mResult != null) { - AsyncResult.forMessage(rr.mResult, null, tr); - rr.mResult.sendToTarget(); - } - rr.release(); - return; - } - } - - if (error != 0) { - //ugly fix for Samsung messing up SMS_SEND request fail in binary RIL - if(!(error == -1 && rr.mRequest == RIL_REQUEST_SEND_SMS)) - { - rr.onError(error, ret); - rr.release(); - return; - } else { - try - { - ret = responseSMS(p); - } catch (Throwable tr) { - Log.w(LOG_TAG, rr.serialString() + "< " - + requestToString(rr.mRequest) - + " exception, Processing Samsung SMS fix ", tr); - rr.onError(error, ret); - rr.release(); - return; - } - } - } - - if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) - + " " + retToString(rr.mRequest, ret)); - - if (rr.mResult != null) { - AsyncResult.forMessage(rr.mResult, ret, null); - rr.mResult.sendToTarget(); - } - - rr.release(); - } - - @Override - public void - dial(String address, int clirMode, UUSInfo uusInfo, Message result) { - RILRequest rr; - if (PhoneNumberUtils.isEmergencyNumber(address)) { - dialEmergencyCall(address, clirMode, result); - return; - } - - rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); - rr.mp.writeString(address); - rr.mp.writeInt(clirMode); - rr.mp.writeInt(0); // UUS information is absent - - if (uusInfo == null) { - rr.mp.writeInt(0); // UUS information is absent - } else { - rr.mp.writeInt(1); // UUS information is present - rr.mp.writeInt(uusInfo.getType()); - rr.mp.writeInt(uusInfo.getDcs()); - rr.mp.writeByteArray(uusInfo.getUserData()); - } - - if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); - - send(rr); - } - - public void - dialEmergencyCall(String address, int clirMode, Message result) { - RILRequest rr; - Log.v(LOG_TAG, "Emergency dial: " + address); - - rr = RILRequest.obtain(RIL_REQUEST_DIAL_EMERGENCY, result); - rr.mp.writeString(address + "/"); - rr.mp.writeInt(clirMode); - rr.mp.writeInt(0); - rr.mp.writeInt(0); - - if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); - - send(rr); - } - - @Override - protected void - processUnsolicited (Parcel p) { - Object ret; - int dataPosition = p.dataPosition(); - int response = p.readInt(); - - switch (response) { - case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: ret = responseVoid(p); break; - case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: ret = responseString(p); break; - case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break; - // SAMSUNG STATES - case RIL_UNSOL_AM: ret = responseString(p); break; - case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: ret = responseVoid(p); break; - case RIL_UNSOL_DATA_SUSPEND_RESUME: ret = responseInts(p); break; - case RIL_UNSOL_STK_CALL_CONTROL_RESULT: ret = responseVoid(p); break; - case RIL_UNSOL_TWO_MIC_STATE: ret = responseInts(p); break; - case RIL_UNSOL_WB_AMR_STATE: ret = responseInts(p); break; - - default: - // Rewind the Parcel - p.setDataPosition(dataPosition); - - // Forward responses that we are not overriding to the super class - super.processUnsolicited(p); - return; - } - - switch (response) { - case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: - /* has bonus radio state int */ - int state = p.readInt(); - Log.d(LOG_TAG, "Radio state: " + state); - - switch (state) { - case 2: - // RADIO_UNAVAILABLE - state = 1; - break; - case 3: - // RADIO_ON - state = 10; - break; - case 4: - // RADIO_ON - state = 10; - // When SIM is PIN-unlocked, RIL doesn't respond with RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED. - // We notify the system here. - Log.d(LOG_TAG, "SIM is PIN-unlocked now"); - if (mIccStatusChangedRegistrants != null) { - mIccStatusChangedRegistrants.notifyRegistrants(); - } - break; - } - RadioState newState = getRadioStateFromInt(state); - Log.d(LOG_TAG, "New Radio state: " + state + " (" + newState.toString() + ")"); - switchToRadioState(newState); - break; - case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: - if (RILJ_LOGD) unsljLogRet(response, ret); - - if (mGsmBroadcastSmsRegistrant != null) { - mGsmBroadcastSmsRegistrant - .notifyRegistrant(new AsyncResult(null, ret, null)); - } - break; - case RIL_UNSOL_RIL_CONNECTED: - if (RILJ_LOGD) unsljLogRet(response, ret); - - // Initial conditions - setRadioPower(false, null); - sendPreferedNetworktype(mPreferredNetworkType, null); - setCdmaSubscriptionSource(mCdmaSubscription, null); - notifyRegistrantsRilConnectionChanged(((int[])ret)[0]); - break; - // SAMSUNG STATES - case RIL_UNSOL_AM: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - String amString = (String) ret; - Log.d(LOG_TAG, "Executing AM: " + amString); - - try { - Runtime.getRuntime().exec("am " + amString); - } catch (IOException e) { - e.printStackTrace(); - Log.e(LOG_TAG, "am " + amString + " could not be executed."); - } - break; - case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - break; - case RIL_UNSOL_DATA_SUSPEND_RESUME: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - break; - case RIL_UNSOL_STK_CALL_CONTROL_RESULT: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - break; - case RIL_UNSOL_TWO_MIC_STATE: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - break; - case RIL_UNSOL_WB_AMR_STATE: - if (RILJ_LOGD) samsungUnsljLogRet(response, ret); - setWbAmr(((int[])ret)[0]); - break; - } - } - - static String - samsungResponseToString(int request) - { - switch(request) { - // SAMSUNG STATES - case RIL_UNSOL_AM: return "RIL_UNSOL_AM"; - case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: return "RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL"; - case RIL_UNSOL_DATA_SUSPEND_RESUME: return "RIL_UNSOL_DATA_SUSPEND_RESUME"; - case RIL_UNSOL_STK_CALL_CONTROL_RESULT: return "RIL_UNSOL_STK_CALL_CONTROL_RESULT"; - case RIL_UNSOL_TWO_MIC_STATE: return "RIL_UNSOL_TWO_MIC_STATE"; - case RIL_UNSOL_WB_AMR_STATE: return "RIL_UNSOL_WB_AMR_STATE"; - default: return ""; - } - } - - protected void samsungUnsljLog(int response) { - riljLog("[UNSL]< " + samsungResponseToString(response)); - } - - protected void samsungUnsljLogMore(int response, String more) { - riljLog("[UNSL]< " + samsungResponseToString(response) + " " + more); - } - - protected void samsungUnsljLogRet(int response, Object ret) { - riljLog("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); - } - - protected void samsungUnsljLogvRet(int response, Object ret) { - riljLogv("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); - } - - /** - * Set audio parameter "wb_amr" for HD-Voice (Wideband AMR). - * - * @param state: 0 = unsupported, 1 = supported. - */ - private void setWbAmr(int state) { - if (state == 1) { - Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=on"); - audioManager.setParameters("wb_amr=on"); - } else { - Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=off"); - audioManager.setParameters("wb_amr=off"); - } - } - - @Override - protected Object - responseCallList(Parcel p) { - int num; - boolean isVideo; - ArrayList response; - DriverCall dc; - int dataAvail = p.dataAvail(); - int pos = p.dataPosition(); - int size = p.dataSize(); - - Log.d(LOG_TAG, "Parcel size = " + size); - Log.d(LOG_TAG, "Parcel pos = " + pos); - Log.d(LOG_TAG, "Parcel dataAvail = " + dataAvail); - - //Samsung changes - num = p.readInt(); - - Log.d(LOG_TAG, "num = " + num); - response = new ArrayList(num); - - for (int i = 0 ; i < num ; i++) { - - dc = new DriverCall(); - dc.state = DriverCall.stateFromCLCC(p.readInt()); - dc.index = p.readInt(); - dc.TOA = p.readInt(); - dc.isMpty = (0 != p.readInt()); - dc.isMT = (0 != p.readInt()); - dc.als = p.readInt(); - dc.isVoice = (0 != p.readInt()); - isVideo = (0 != p.readInt()); - dc.isVoicePrivacy = (0 != p.readInt()); - dc.number = p.readString(); - int np = p.readInt(); - dc.numberPresentation = DriverCall.presentationFromCLIP(np); - dc.name = p.readString(); - dc.namePresentation = p.readInt(); - int uusInfoPresent = p.readInt(); - - Log.d(LOG_TAG, "state = " + dc.state); - Log.d(LOG_TAG, "index = " + dc.index); - Log.d(LOG_TAG, "state = " + dc.TOA); - Log.d(LOG_TAG, "isMpty = " + dc.isMpty); - Log.d(LOG_TAG, "isMT = " + dc.isMT); - Log.d(LOG_TAG, "als = " + dc.als); - Log.d(LOG_TAG, "isVoice = " + dc.isVoice); - Log.d(LOG_TAG, "isVideo = " + isVideo); - Log.d(LOG_TAG, "number = " + dc.number); - Log.d(LOG_TAG, "np = " + np); - Log.d(LOG_TAG, "name = " + dc.name); - Log.d(LOG_TAG, "namePresentation = " + dc.namePresentation); - Log.d(LOG_TAG, "uusInfoPresent = " + uusInfoPresent); - - if (uusInfoPresent == 1) { - dc.uusInfo = new UUSInfo(); - dc.uusInfo.setType(p.readInt()); - dc.uusInfo.setDcs(p.readInt()); - byte[] userData = p.createByteArray(); - dc.uusInfo.setUserData(userData); - Log - .v(LOG_TAG, String.format("Incoming UUS : type=%d, dcs=%d, length=%d", - dc.uusInfo.getType(), dc.uusInfo.getDcs(), - dc.uusInfo.getUserData().length)); - Log.v(LOG_TAG, "Incoming UUS : data (string)=" - + new String(dc.uusInfo.getUserData())); - Log.v(LOG_TAG, "Incoming UUS : data (hex): " - + IccUtils.bytesToHexString(dc.uusInfo.getUserData())); - } else { - Log.v(LOG_TAG, "Incoming UUS : NOT present!"); - } - - // Make sure there's a leading + on addresses with a TOA of 145 - dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); - - response.add(dc); - - if (dc.isVoicePrivacy) { - mVoicePrivacyOnRegistrants.notifyRegistrants(); - Log.d(LOG_TAG, "InCall VoicePrivacy is enabled"); - } else { - mVoicePrivacyOffRegistrants.notifyRegistrants(); - Log.d(LOG_TAG, "InCall VoicePrivacy is disabled"); - } - } - - Collections.sort(response); - - return response; - } - - @Override - protected Object responseGetPreferredNetworkType(Parcel p) { - int [] response = (int[]) responseInts(p); - - if (response.length >= 1) { - // Since this is the response for getPreferredNetworkType - // we'll assume that it should be the value we want the - // vendor ril to take if we reestablish a connection to it. - mPreferredNetworkType = response[0]; - } - - // When the modem responds Phone.NT_MODE_GLOBAL, it means Phone.NT_MODE_WCDMA_PREF - if (response[0] == Phone.NT_MODE_GLOBAL) { - Log.d(LOG_TAG, "Overriding network type response from GLOBAL to WCDMA preferred"); - response[0] = Phone.NT_MODE_WCDMA_PREF; - } - - return response; - } - - @Override - protected Object - responseSignalStrength(Parcel p) { - int numInts = 12; - int response[]; - - /* TODO: Add SignalStrength class to match RIL_SignalStrength */ - response = new int[numInts]; - for (int i = 0 ; i < numInts ; i++) { - response[i] = p.readInt(); - } - - if (mIsSamsungCdma) - // Framework takes care of the rest for us. - return response; - - /* Matching Samsung signal strength to asu. - Method taken from Samsungs cdma/gsmSignalStateTracker */ - if(mSignalbarCount) - { - //Samsung sends the count of bars that should be displayed instead of - //a real signal strength - response[0] = ((response[0] & 0xFF00) >> 8) * 3; //gsmDbm - } else { - response[0] = response[0] & 0xFF; //gsmDbm - } - response[1] = -1; //gsmEcio - response[2] = (response[2] < 0)?-120:-response[2]; //cdmaDbm - response[3] = (response[3] < 0)?-160:-response[3]; //cdmaEcio - response[4] = (response[4] < 0)?-120:-response[4]; //evdoRssi - response[5] = (response[5] < 0)?-1:-response[5]; //evdoEcio - if(response[6] < 0 || response[6] > 8) - response[6] = -1; - - SignalStrength signalStrength = new SignalStrength( - response[0], response[1], response[2], response[3], response[4], - response[5], response[6], !mIsSamsungCdma); - return signalStrength; - } - - @Override public void - getVoiceRadioTechnology(Message result) { - RILRequest rr = RILRequest.obtain(RIL_REQUEST_VOICE_RADIO_TECH, result); - - if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); - - // RIL versions below 7 do not support this request - if (mRilVersion >= 7) - send(rr); - else - Log.d(LOG_TAG, "RIL_REQUEST_VOICE_RADIO_TECH blocked!!!"); - } - - @Override - public void getCdmaSubscriptionSource(Message response) { - RILRequest rr = RILRequest.obtain( - RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, response); - - if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); - Log.d(LOG_TAG, "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE blocked!!!"); - //send(rr); - } -} diff --git a/usr/keylayout/Vendor_04e8_Product_7021.kl b/usr/keylayout/Vendor_04e8_Product_7021.kl deleted file mode 100644 index 3bb638c..0000000 --- a/usr/keylayout/Vendor_04e8_Product_7021.kl +++ /dev/null @@ -1,374 +0,0 @@ -# Copyright (C) 2010 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. -# -# Samsung Mobile Keyboard for Android -# -key 1 BACK -key 2 1 -key 3 2 -key 4 3 -key 5 4 -key 6 5 -key 7 6 -key 8 7 -key 9 8 -key 10 9 -key 11 0 -key 12 MINUS -key 13 EQUALS -key 14 DEL -key 15 TAB -key 16 Q -key 17 W -key 18 E -key 19 R -key 20 T -key 21 Y -key 22 U -key 23 I -key 24 O -key 25 P -key 26 LEFT_BRACKET -key 27 RIGHT_BRACKET -key 28 ENTER -key 29 CTRL_LEFT -key 30 A -key 31 S -key 32 D -key 33 F -key 34 G -key 35 H -key 36 J -key 37 K -key 38 L -key 39 SEMICOLON -key 40 APOSTROPHE -key 41 GRAVE -key 42 SHIFT_LEFT -key 43 BACKSLASH -key 44 Z -key 45 X -key 46 C -key 47 V -key 48 B -key 49 N -key 50 M -key 51 COMMA -key 52 PERIOD -key 53 SLASH -key 54 SHIFT_RIGHT -key 55 NUMPAD_MULTIPLY -key 56 ALT_LEFT -key 57 SPACE -key 58 CAPS_LOCK -key 59 F1 -key 60 F2 -key 61 F3 -key 62 F4 -key 63 F5 -key 64 F6 -key 65 F7 -key 66 F8 -key 67 F9 -key 68 F10 -key 69 NUM_LOCK -key 70 SCROLL_LOCK -key 71 NUMPAD_7 -key 72 NUMPAD_8 -key 73 NUMPAD_9 -key 74 NUMPAD_SUBTRACT -key 75 NUMPAD_4 -key 76 NUMPAD_5 -key 77 NUMPAD_6 -key 78 NUMPAD_ADD -key 79 NUMPAD_1 -key 80 NUMPAD_2 -key 81 NUMPAD_3 -key 82 NUMPAD_0 -key 83 NUMPAD_DOT -# key 84 (undefined) -# key 85 "KEY_ZENKAKUHANKAKU" -key 86 BACKSLASH -key 87 F11 -key 88 F12 -# key 89 "KEY_RO" -# key 90 "KEY_KATAKANA" -# key 91 "KEY_HIRAGANA" -# key 92 "KEY_HENKAN" -# key 93 "KEY_KATAKANAHIRAGANA" -# key 94 "KEY_MUHENKAN" -key 95 NUMPAD_COMMA -key 96 NUMPAD_ENTER -key 97 CTRL_RIGHT -key 98 NUMPAD_DIVIDE -key 99 SYSRQ -key 100 ALT_GR -# key 101 "KEY_LINEFEED" -key 102 MOVE_HOME -key 103 DPAD_UP -key 104 PAGE_UP -key 105 DPAD_LEFT -key 106 DPAD_RIGHT -key 107 MOVE_END -key 108 DPAD_DOWN -key 109 PAGE_DOWN -key 110 INSERT -key 111 FORWARD_DEL -# key 112 "KEY_MACRO" -key 113 VOLUME_MUTE -key 114 VOLUME_DOWN -key 115 VOLUME_UP -key 116 POWER WAKE -key 117 NUMPAD_EQUALS -# key 118 "KEY_KPPLUSMINUS" -key 119 BREAK -# key 120 (undefined) -key 121 NUMPAD_COMMA -# key 122 "KEY_HANGEUL" -# key 123 "KEY_HANJA" -# key 124 "KEY_YEN" -key 125 META_LEFT -key 126 META_RIGHT -key 127 MENU WAKE_DROPPED -key 128 MEDIA_STOP -# key 129 "KEY_AGAIN" -# key 130 "KEY_PROPS" -# key 131 "KEY_UNDO" -# key 132 "KEY_FRONT" -# key 133 "KEY_COPY" -# key 134 "KEY_OPEN" -# key 135 "KEY_PASTE" -# key 136 "KEY_FIND" -# key 137 "KEY_CUT" -# key 138 "KEY_HELP" -key 139 MENU WAKE_DROPPED -# key 140 "KEY_CALC" -# key 141 "KEY_SETUP" -# key 142 "KEY_SLEEP" -# key 143 "KEY_WAKEUP" -# key 144 "KEY_FILE" -# key 145 "KEY_SENDFILE" -# key 146 "KEY_DELETEFILE" -# key 147 "KEY_XFER" -# key 148 "KEY_PROG1" -# key 149 "KEY_PROG2" -key 150 EXPLORER -# key 151 "KEY_MSDOS" -key 152 POWER WAKE -# key 153 "KEY_DIRECTION" -# key 154 "KEY_CYCLEWINDOWS" -key 155 EMAIL -key 156 BOOKMARK -# key 157 "KEY_COMPUTER" -key 158 BACK WAKE_DROPPED -key 159 FORWARD -key 160 MEDIA_CLOSE -key 161 MEDIA_EJECT -key 162 MEDIA_EJECT -key 163 MEDIA_NEXT -key 164 MEDIA_PLAY_PAUSE -key 165 MEDIA_PREVIOUS -key 166 MEDIA_STOP -key 167 MEDIA_RECORD -key 168 MEDIA_REWIND -key 169 CALL -# key 170 "KEY_ISO" -# key 171 "KEY_CONFIG" -key 172 HOME -# key 173 "KEY_REFRESH" -# key 174 "KEY_EXIT" -# key 175 "KEY_MOVE" -# key 176 "KEY_EDIT" -key 177 PAGE_UP -key 178 PAGE_DOWN -key 179 NUMPAD_LEFT_PAREN -key 180 NUMPAD_RIGHT_PAREN -# key 181 "KEY_NEW" -# key 182 "KEY_REDO" -# key 183 F13 -# key 184 F14 -# key 185 F15 -# key 186 F16 -# key 187 F17 -# key 188 F18 -# key 189 F19 -# key 190 F20 -# key 191 F21 -# key 192 F22 -# key 193 F23 -# key 194 F24 -# key 195 (undefined) -# key 196 (undefined) -# key 197 (undefined) -# key 198 (undefined) -# key 199 (undefined) -key 200 MEDIA_PLAY -key 201 MEDIA_PAUSE -# key 202 "KEY_PROG3" -# key 203 "KEY_PROG4" -# key 204 (undefined) -# key 205 "KEY_SUSPEND" -# key 206 "KEY_CLOSE" -key 207 MEDIA_PLAY -key 208 MEDIA_FAST_FORWARD -# key 209 "KEY_BASSBOOST" -# key 210 "KEY_PRINT" -# key 211 "KEY_HP" -key 212 CAMERA -# key 213 "KEY_SOUND" -# key 214 "KEY_QUESTION" -key 215 ENVELOPE -# key 216 "KEY_CHAT" -key 217 SEARCH -# key 218 "KEY_CONNECT" -# key 219 "KEY_FINANCE" -# key 220 "KEY_SPORT" -# key 221 "KEY_SHOP" -# key 222 "KEY_ALTERASE" -# key 223 "KEY_CANCEL" -key 224 BRIGHTNESS_DOWN -key 225 BRIGHTNESS_UP -key 226 HEADSETHOOK -key 227 STAR -key 228 POUND -key 229 SOFT_LEFT -key 230 SOFT_RIGHT -key 231 CALL -key 232 DPAD_CENTER -key 233 HEADSETHOOK -# key 234 "KEY_0_5" or "KEY_SAVE" -# key 235 "KEY_2_5" or "KEY_DOCUMENTS" -# key 236 "KEY_SWITCHVIDEOMODE" or "KEY_BATTERY" -# key 237 "KEY_KBDILLUMTOGGLE" -# key 238 "KEY_KBDILLUMDOWN" -# key 239 "KEY_KBDILLUMUP" -# key 240 "KEY_UNKNOWN" -key 304 BUTTON_A -key 305 BUTTON_B -key 306 BUTTON_C -key 307 BUTTON_X -key 308 BUTTON_Y -key 309 BUTTON_Z -key 310 BUTTON_L1 -key 311 BUTTON_R1 -key 312 BUTTON_L2 -key 313 BUTTON_R2 -key 314 BUTTON_SELECT -key 315 BUTTON_START -key 316 BUTTON_MODE -key 317 BUTTON_THUMBL -key 318 BUTTON_THUMBR -# key 352 "KEY_OK" -# key 353 "KEY_SELECT" -# key 354 "KEY_GOTO" -# key 355 "KEY_CLEAR" -# key 356 "KEY_POWER2" -# key 357 "KEY_OPTION" -# key 358 "KEY_INFO" -# key 359 "KEY_TIME" -# key 360 "KEY_VENDOR" -# key 361 "KEY_ARCHIVE" -key 362 GUIDE -# key 363 "KEY_CHANNEL" -# key 364 "KEY_FAVORITES" -# key 365 "KEY_EPG" -key 366 DVR -# key 367 "KEY_MHP" -# key 368 "KEY_LANGUAGE" -key 368 LANG -# key 369 "KEY_TITLE" -# key 370 "KEY_SUBTITLE" -# key 371 "KEY_ANGLE" -# key 372 "KEY_ZOOM" -# key 373 "KEY_MODE" -# key 374 "KEY_KEYBOARD" -# key 375 "KEY_SCREEN" -# key 376 "KEY_PC" -key 377 TV -# key 378 "KEY_TV2" -# key 379 "KEY_VCR" -# key 380 "KEY_VCR2" -# key 381 "KEY_SAT" -# key 382 "KEY_SAT2" -# key 383 "KEY_CD" -# key 384 "KEY_TAPE" -# key 385 "KEY_RADIO" -# key 386 "KEY_TUNER" -# key 387 "KEY_PLAYER" -# key 388 "KEY_TEXT" -# key 389 "KEY_DVD" -# key 390 "KEY_AUX" -# key 391 "KEY_MP3" -# key 392 "KEY_AUDIO" -# key 393 "KEY_VIDEO" -# key 394 "KEY_DIRECTORY" -# key 395 "KEY_LIST" -# key 396 "KEY_MEMO" -# key 397 "KEY_CALENDAR" -# key 398 "KEY_RED" -# key 399 "KEY_GREEN" -# key 400 "KEY_YELLOW" -# key 401 "KEY_BLUE" -key 402 CHANNEL_UP -key 403 CHANNEL_DOWN -# key 404 "KEY_FIRST" -# key 405 "KEY_LAST" -# key 406 "KEY_AB" -# key 407 "KEY_NEXT" -# key 408 "KEY_RESTART" -# key 409 "KEY_SLOW" -# key 410 "KEY_SHUFFLE" -# key 411 "KEY_BREAK" -# key 412 "KEY_PREVIOUS" -# key 413 "KEY_DIGITS" -# key 414 "KEY_TEEN" -# key 415 "KEY_TWEN" -# key 448 "KEY_DEL_EOL" -# key 449 "KEY_DEL_EOS" -# key 450 "KEY_INS_LINE" -# key 451 "KEY_DEL_LINE" -key 464 FUNCTION -key 465 ESCAPE FUNCTION -key 466 F1 FUNCTION -key 467 F2 FUNCTION -key 468 F3 FUNCTION -key 469 F4 FUNCTION -key 470 F5 FUNCTION -key 471 F6 FUNCTION -key 472 F7 FUNCTION -key 473 F8 FUNCTION -key 474 F9 FUNCTION -key 475 F10 FUNCTION -key 476 F11 FUNCTION -key 477 F12 FUNCTION -key 478 1 FUNCTION -key 479 2 FUNCTION -key 480 D FUNCTION -key 481 E FUNCTION -key 482 F FUNCTION -key 483 S FUNCTION -key 484 B FUNCTION -# key 497 KEY_BRL_DOT1 -# key 498 KEY_BRL_DOT2 -# key 499 KEY_BRL_DOT3 -# key 500 KEY_BRL_DOT4 -# key 501 KEY_BRL_DOT5 -# key 502 KEY_BRL_DOT6 -# key 503 KEY_BRL_DOT7 -# key 504 KEY_BRL_DOT8 -key 704 RECENTAPPS -key 705 APPLICATION -key 706 SIP_ON_OFF -key 707 VOICESEARCH -key 708 QPANEL_ON_OFF diff --git a/usr/keylayout/gpio-keys.kl b/usr/keylayout/gpio-keys.kl deleted file mode 100644 index 7014d5c..0000000 --- a/usr/keylayout/gpio-keys.kl +++ /dev/null @@ -1,4 +0,0 @@ -key 115 VOLUME_UP WAKE -key 114 VOLUME_DOWN WAKE -key 116 POWER WAKE -key 172 HOME WAKE diff --git a/usr/keylayout/janice-kp.kl b/usr/keylayout/janice-kp.kl deleted file mode 100644 index fb97e54..0000000 --- a/usr/keylayout/janice-kp.kl +++ /dev/null @@ -1,87 +0,0 @@ -key 399 GRAVE -key 2 1 -key 3 2 -key 4 3 -key 5 4 -key 6 5 -key 7 6 -key 8 7 -key 9 8 -key 10 9 -key 11 0 -key 158 BACK -key 230 SOFT_RIGHT WAKE -key 60 SOFT_RIGHT WAKE -key 107 ENDCALL -key 62 ENDCALL -key 229 MENU -key 59 MENU -key 139 MENU -key 127 SEARCH -key 228 POUND -key 227 STAR -key 231 CALL -key 61 CALL -key 232 DPAD_CENTER -key 108 DPAD_DOWN -key 103 DPAD_UP -key 102 HOME WAKE -key 105 DPAD_LEFT -key 106 DPAD_RIGHT -key 115 VOLUME_UP WAKE -key 114 VOLUME_DOWN WAKE -key 116 POWER WAKE -key 211 FOCUS -key 212 CAMERA - -key 16 Q -key 17 W -key 18 E -key 19 R -key 20 T -key 21 Y -key 22 U -key 23 I -key 24 O -key 25 P -key 26 LEFT_BRACKET -key 27 RIGHT_BRACKET -key 43 BACKSLASH - -key 30 A -key 31 S -key 32 D -key 33 F -key 34 G -key 35 H -key 36 J -key 37 K -key 38 L -key 39 SEMICOLON -key 40 APOSTROPHE -key 14 DEL - -key 44 Z -key 45 X -key 46 C -key 47 V -key 48 B -key 49 N -key 50 M -key 51 COMMA -key 52 PERIOD -key 53 SLASH -key 28 DPAD_CENTER - -key 56 ALT_LEFT WAKE -key 100 ALT_RIGHT WAKE -key 42 SHIFT_LEFT WAKE -key 54 SHIFT_RIGHT WAKE -key 15 TAB -key 57 SPACE -key 150 EXPLORER -key 155 ENVELOPE - -key 12 MINUS -key 13 EQUALS -key 215 AT From 6623a15b1d5d3febcc42d9dafd7989ce1878cbe7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 14:31:13 -0300 Subject: [PATCH 120/248] Update BoardConfig.mk --- BoardConfig.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index ee7c986..e267dd2 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -33,7 +33,6 @@ BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" # Graphics BOARD_EGL_CFG := device/samsung/janice/configs/egl.cfg BOARD_EGL_NEEDS_LEGACY_FB := true -TARGET_DISABLE_TRIPLE_BUFFERING := true COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 # Bluetooth From df230fdf86cd3ff1f5d011fe10b4f9a8f72a9fef Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 16:51:29 -0300 Subject: [PATCH 121/248] trying to fix wifi direct --- rootdir/init.samsungjanice.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5668a9f..c85a2ef 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -683,7 +683,7 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 # we will start as root and wpa_supplicant will switch to user wifi From 635bbdc145aa1eeda2249e13daba1051cefd9741 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 18:16:07 -0300 Subject: [PATCH 122/248] switch from wpa to p2p supplicant for wifi direct --- rootdir/init.samsungjanice.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index c85a2ef..44c56f3 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -682,7 +682,7 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service p2p_supplicant /system/bin/wpa_supplicant \ +service p2p_supplicant /system/bin/p2p_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 From 95ad70df5dbb092cd91418d8134983d3755cedc5 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 18:20:02 -0300 Subject: [PATCH 123/248] yes a big TYPO, sorry, I'm sleepy ^_^ --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 44c56f3..d2ff471 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -682,8 +682,8 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service p2p_supplicant /system/bin/p2p_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 \ +service p2p_supplicant /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N -ip2p0 \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 # we will start as root and wpa_supplicant will switch to user wifi From b35385a38afa7e84638eabf4ad0c000af55f99e9 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 18:55:19 -0300 Subject: [PATCH 124/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index d2ff471..737e086 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -709,13 +709,14 @@ service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL disabled oneshot -service dhcpcd_rmnet0 /system/bin/dhcpcd -aABKL +service dhcpcd_p2p /system/bin/dhcpcd -aABKL class main disabled oneshot service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG # This properly enables bluetooth tethering, it asigns a IP to any conected device + class main disabled oneshot @@ -728,7 +729,7 @@ service iprenew_wlan0 /system/bin/dhcpcd -n disabled oneshot -service iprenew_rmnet0 /system/bin/dhcpcd -n +service iprenew_p2p /system/bin/dhcpcd -n class main disabled oneshot From fc26093c185eab57e299b4bf4955c677d7810dfa Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:13:34 -0300 Subject: [PATCH 125/248] fix compass service permissions --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 737e086..3c08929 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -618,8 +618,8 @@ service stedump /system/bin/stedump user root service geomagneticd /system/bin/geomagneticd6x - user root - group root + user compass + group system input service orientationd /system/bin/orientationd6x user compass From 74a9df58a07aa6953b754e2f01c1ce0ec8aec997 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:20:53 -0300 Subject: [PATCH 126/248] fix gps --- rootdir/init.samsungjanice.rc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 3c08929..a4393f6 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -738,6 +738,12 @@ service iprenew_bnep0 /system/bin/dhcpcd -n class main disabled oneshot + +service gpsd /system/bin/gpsd -c /system/etc/gps.xml + class main + user gps + group system net_raw + ioprio be 0 #for WiFi MFG(TestMode) service mfgloader /system/bin/mfgloader From 8c52b19c10cc7c0d6245c4ee1f5864337ce344bf Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:25:46 -0300 Subject: [PATCH 127/248] reduced haptic feedback for soft keyboard taps --- overlay/frameworks/base/core/res/res/values/config.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 2da50fb..09989a1 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -206,4 +206,9 @@ true + + + 10 + + From 08a747b27e824d76795f1618557365838340095c Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:33:38 -0300 Subject: [PATCH 128/248] removed compass workaround --- janice.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/janice.mk b/janice.mk index 093010b..7691100 100644 --- a/janice.mk +++ b/janice.mk @@ -61,8 +61,7 @@ PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ $(LOCAL_PATH)/configs/model_id.cfg:system/etc/AT/model_id.cfg \ - $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg \ - $(LOCAL_PATH)/configs/compass_calibration:system/etc/init.d/compass_calibration + $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg # Use non-open-source parts if present $(call inherit-product-if-exists, vendor/samsung/u8500-common/janice/janice-vendor-blobs.mk) From d0900dd35ed4d880c86a885122cf5a43b16fc497 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:35:37 -0300 Subject: [PATCH 129/248] Delete compass_calibration --- configs/compass_calibration | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 configs/compass_calibration diff --git a/configs/compass_calibration b/configs/compass_calibration deleted file mode 100644 index 193d0ef..0000000 --- a/configs/compass_calibration +++ /dev/null @@ -1,14 +0,0 @@ -#!/system/bin/sh - -# Default values for compass calibration, -# this is a workaround only, to make it -# work from the first boot without calibrating -# it manually. - -cfg_path="/data/system/yas.cfg" - -if [ -f $cfg_path ] -then -echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path -chmod 0644 $cfg_path -fi From 08397c48b1820416444a5aa87390cce0fbaf788c Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 19:37:08 -0300 Subject: [PATCH 130/248] Update egl.cfg --- configs/egl.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/egl.cfg b/configs/egl.cfg index 4515dfd..9438b87 100644 --- a/configs/egl.cfg +++ b/configs/egl.cfg @@ -1 +1,2 @@ +0 0 android 0 1 mali From 73bbe6cfc3867027c3a6557aeba393bf98a0ceae Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 22:50:23 -0300 Subject: [PATCH 131/248] fix typo sorry --- rootdir/init.samsungjanice.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index a4393f6..14a6e47 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -228,6 +228,7 @@ on post-fs-data mkdir /data/misc/wifi 0770 wifi system chmod 0770 /data/misc/wifi chmod 0660 /data/misc/wifi/wpa_supplicant.conf + chmod 0660 /data/misc/wifi/p2p_supplicant.conf mkdir /data/misc/wifi/hostapd.sockets 0770 wifi wifi @@ -683,8 +684,8 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N -ip2p0 \ - -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N -ip2p0 \ + -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT From c035749214822a30c19b05b604a9a5cc08c77573 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 22 Sep 2013 23:37:36 -0300 Subject: [PATCH 132/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 14a6e47..21d4265 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -682,23 +682,15 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 - -service p2p_supplicant /system/bin/wpa_supplicant \ - -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N -ip2p0 \ - -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 - -# we will start as root and wpa_supplicant will switch to user wifi -# after setting up the capabilities required for WEXT -# user wifi -# group wifi inet keystore + + +service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot -service wpa_supplicant /system/bin/wpa_supplicant \ - -Dnl80211 -iwlan0 -e/data/misc/wifi/entropy.bin \ - -c/data/misc/wifi/wpa_supplicant.conf +service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi disabled From 6dc22ab2c6d7d3d988db250793c16bf90612cfe3 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 26 Sep 2013 11:30:19 -0300 Subject: [PATCH 133/248] testing... --- rootdir/init.samsungjanice.rc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 21d4265..ff1dfd8 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -684,11 +684,11 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin - class main - socket wpa_wlan0 dgram 660 wifi wifi - disabled - oneshot +# service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin +# class main +# socket wpa_wlan0 dgram 660 wifi wifi +# disabled +# oneshot service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main @@ -732,11 +732,11 @@ service iprenew_bnep0 /system/bin/dhcpcd -n disabled oneshot -service gpsd /system/bin/gpsd -c /system/etc/gps.xml - class main - user gps - group system net_raw - ioprio be 0 +# service gpsd /system/bin/gpsd -c /system/etc/gps.xml +# class main +# user gps +# group system net_raw +# ioprio be 0 #for WiFi MFG(TestMode) service mfgloader /system/bin/mfgloader From 0e8dc42aa34e3f01a0f4c2a9b5d10be7e512272d Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 26 Sep 2013 12:00:31 -0300 Subject: [PATCH 134/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index ff1dfd8..e22d794 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -684,13 +684,13 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -# service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin -# class main -# socket wpa_wlan0 dgram 660 wifi wifi -# disabled -# oneshot +service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -d -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot -service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 +service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -d -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi disabled From 58b4680eb1d1f91d626dc78ab428c6879a75010d Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 27 Sep 2013 00:45:36 -0300 Subject: [PATCH 135/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index e22d794..c846746 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -684,13 +684,13 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -d -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin +service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -dd -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot -service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -d -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 +service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -dd -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi disabled From 9ba07bc79df8eca14953facf206ddb19f6a9e4bc Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 28 Sep 2013 00:16:53 -0300 Subject: [PATCH 136/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index c846746..f70fcbc 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -684,13 +684,20 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service wpa_supplicant /system/bin/wpa_supplicant -Dnl80211 -iwlan0 -dd -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin +service p2p_supplicant /system/bin/wpa_supplicant \ + -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot -service p2p_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N -ip2p0 -dd -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 +service wpa_supplicant /system/bin/wpa_supplicant \ + -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin class main socket wpa_wlan0 dgram 660 wifi wifi disabled From d81f8216dca83b4931300078529875803ace179e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 2 Oct 2013 11:39:18 -0300 Subject: [PATCH 137/248] trying to fix battery draining and wifi direct --- rootdir/init.samsungjanice.rc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index f70fcbc..414f2b7 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -683,10 +683,13 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 +on property:init.svc.wpa_supplicant=stopped + stop dhcpcd -service p2p_supplicant /system/bin/wpa_supplicant \ - -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + +service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -e/data/misc/wifi/entropy.bin # we will start as root and wpa_supplicant will switch to user wifi # after setting up the capabilities required for WEXT # user wifi @@ -695,15 +698,23 @@ service p2p_supplicant /system/bin/wpa_supplicant \ socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot - -service wpa_supplicant /system/bin/wpa_supplicant \ - -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin + + +service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ + -dd -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot + service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL class main disabled From 9afa6f3160c12aface16b6f9613519f715be89ed Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 2 Oct 2013 11:44:40 -0300 Subject: [PATCH 138/248] fix device encryption --- rootdir/fstab.samsungjanice | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index e3433ae..80de7aa 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -8,6 +8,6 @@ /dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata /dev/block/mmcblk0p9 /preload ext4 ro,noatime,errors=panic wait +/dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata From cdf7f9867795095ff1034836bda21db89933f5a6 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 5 Oct 2013 20:17:52 -0300 Subject: [PATCH 139/248] Add CM account --- janice.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index 7691100..4d0d88c 100644 --- a/janice.mk +++ b/janice.mk @@ -41,7 +41,8 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ - GalaxySAdvanceSettings + GalaxySAdvanceSettings \ + CMAccount # Init files PRODUCT_COPY_FILES += \ From 368a493bd0c736d6ade1c1d10a1a15f59a9fd23f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 7 Oct 2013 22:29:35 -0300 Subject: [PATCH 140/248] Debian multi-arch compatibility --- BoardConfig.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index e267dd2..479d078 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,6 +14,9 @@ BOARD_USES_STE_HARDWARE := true TARGET_SOC := u8500 COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE -DSTE_SAMSUNG_HARDWARE +# Debian multi-arch compatibility +COMMON_GLOBAL_CFLAGS += -B/usr/lib/x86_64-linux-gnu + # Partitions BOARD_NAND_PAGE_SIZE := 4096 BOARD_NAND_SPARE_SIZE := 128 From 13592e84ea6bce33521bf97596bcd868c70f3bfb Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 8 Oct 2013 23:42:57 -0300 Subject: [PATCH 141/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 414f2b7..be5184b 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -683,31 +683,20 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -on property:init.svc.wpa_supplicant=stopped - stop dhcpcd - -service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ +service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ + -dd -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -e/data/misc/wifi/entropy.bin - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot -service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ - -dd -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N \ +service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -e/data/misc/wifi/entropy.bin class main socket wpa_wlan0 dgram 660 wifi wifi disabled From 1cddf137a922291cbef5b76de84b2797aba9c022 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 9 Oct 2013 21:21:07 -0300 Subject: [PATCH 142/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index be5184b..869b98a 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -685,8 +685,8 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ - -dd -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -N \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -d -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi @@ -702,7 +702,12 @@ service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ disabled oneshot - +# bugreport is triggered by holding down volume down, volume up and power +service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport + class main + disabled + oneshot + keycodes 114 115 116 service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL class main From eac91321d49cf9cf8641cf9e478b302f792b37a8 Mon Sep 17 00:00:00 2001 From: Rox-Ace2 Date: Thu, 10 Oct 2013 20:59:24 +0200 Subject: [PATCH 143/248] Move gps.conf to device specific --- configs/gps.conf | 7 +++++++ janice.mk | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 configs/gps.conf diff --git a/configs/gps.conf b/configs/gps.conf new file mode 100644 index 0000000..1381cb4 --- /dev/null +++ b/configs/gps.conf @@ -0,0 +1,7 @@ +NTP_SERVER=north-america.pool.ntp.org +XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin +XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin +XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin +SUPL_HOST=supl.google.com +SUPL_PORT=7276 + diff --git a/janice.mk b/janice.mk index 4d0d88c..7d0f62c 100644 --- a/janice.mk +++ b/janice.mk @@ -44,6 +44,12 @@ PRODUCT_PACKAGES += \ GalaxySAdvanceSettings \ CMAccount +# Gps +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf + +$(call inherit-product, device/common/gps/gps_eu_supl.mk) + # Init files PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ From 509c8a2a9904475f91c4f9342a51f16d41fa2729 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 10 Oct 2013 17:28:48 -0300 Subject: [PATCH 144/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 869b98a..7bae413 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -744,11 +744,12 @@ service iprenew_bnep0 /system/bin/dhcpcd -n disabled oneshot -# service gpsd /system/bin/gpsd -c /system/etc/gps.xml -# class main -# user gps -# group system net_raw -# ioprio be 0 +# GPS +service gpsd /system/bin/gpsd -c /system/etc/gps.xml + class main + socket gps seqpacket 0660 gps system + user gps + group system inet sdcard_rwioprio be 0 #for WiFi MFG(TestMode) service mfgloader /system/bin/mfgloader From bcfc500215eabd2502ac31e7ba43fdd5747a2316 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 10 Oct 2013 20:25:10 -0300 Subject: [PATCH 145/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 7bae413..030e306 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -749,7 +749,7 @@ service gpsd /system/bin/gpsd -c /system/etc/gps.xml class main socket gps seqpacket 0660 gps system user gps - group system inet sdcard_rwioprio be 0 + group system inet sdcard_rw #for WiFi MFG(TestMode) service mfgloader /system/bin/mfgloader From a71f7cad97f8f680d76faed49265503116770da4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 12 Oct 2013 23:23:21 -0300 Subject: [PATCH 146/248] Update config.xml --- .../frameworks/base/core/res/res/values/config.xml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 09989a1..b594ddc 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -30,9 +30,6 @@ true - - false @@ -111,9 +108,6 @@ true - - true - true @@ -205,10 +199,5 @@ true - - - - 10 - - + From 45bd97d4f0ed29e516c8bc2bea7db410b70e3578 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 13 Oct 2013 01:48:32 -0300 Subject: [PATCH 147/248] Update config.xml --- overlay/frameworks/base/core/res/res/values/config.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index b594ddc..7e481d2 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -104,6 +104,9 @@ 5 7 + + + true true From f6ecb65d08cb1f63e20e89f493fa1a0a81d44ad5 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 14 Oct 2013 21:51:51 -0300 Subject: [PATCH 148/248] Update BoardConfig.mk --- BoardConfig.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index 479d078..e267dd2 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,9 +14,6 @@ BOARD_USES_STE_HARDWARE := true TARGET_SOC := u8500 COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE -DSTE_SAMSUNG_HARDWARE -# Debian multi-arch compatibility -COMMON_GLOBAL_CFLAGS += -B/usr/lib/x86_64-linux-gnu - # Partitions BOARD_NAND_PAGE_SIZE := 4096 BOARD_NAND_SPARE_SIZE := 128 From 41497d11451c1f486579c0972d8d861ed0ff7023 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:36:16 -0200 Subject: [PATCH 149/248] removed configs that are included in common - removed configs that are included in device_samsung_u8500-common --- BoardConfig.mk | 79 -------------------------------------------------- 1 file changed, 79 deletions(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index e267dd2..b62973c 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -2,91 +2,12 @@ TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 -# Board -TARGET_BOOTLOADER_BOARD_NAME := montblanc -TARGET_BOARD_INFO_FILE := device/samsung/janice/board-info.txt -TARGET_NO_BOOTLOADER := true -TARGET_NO_RADIOIMAGE := true - -# Platform -TARGET_BOARD_PLATFORM := montblanc -BOARD_USES_STE_HARDWARE := true -TARGET_SOC := u8500 -COMMON_GLOBAL_CFLAGS += -DSTE_HARDWARE -DSTE_SAMSUNG_HARDWARE - -# Partitions -BOARD_NAND_PAGE_SIZE := 4096 -BOARD_NAND_SPARE_SIZE := 128 -BOARD_FLASH_BLOCK_SIZE := 4096 -TARGET_USERIMAGES_USE_EXT4 := true -BOARD_BOOTIMAGE_PARTITION_SIZE := 16777216 -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 641728512 -BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 - # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig -BOARD_KERNEL_PAGESIZE := 4096 -BOARD_KERNEL_BASE := 0x40000000 -BOARD_KERNEL_CMDLINE := "console=ttySAC2,115200 consoleblank=0" - -# Graphics -BOARD_EGL_CFG := device/samsung/janice/configs/egl.cfg -BOARD_EGL_NEEDS_LEGACY_FB := true -COMMON_GLOBAL_CFLAGS += -DREFRESH_RATE=60 # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth -# Wifi -BOARD_WLAN_DEVICE := bcmdhd -BOARD_WLAN_DEVICE_REV := bcm4330 -WPA_SUPPLICANT_VERSION := VER_0_8_X -BOARD_WPA_SUPPLICANT_DRIVER := NL80211 -BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd -BOARD_HOSTAPD_DRIVER := NL80211 -BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd -WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/dhd.ko" -WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/dhd/parameters/firmware_path" -WIFI_DRIVER_FW_PATH_STA := "/system/etc/wifi/bcmdhd_sta.bin" -WIFI_DRIVER_FW_PATH_AP := "/system/etc/wifi/bcmdhd_apsta.bin" -WIFI_DRIVER_FW_PATH_P2P := "/system/etc/wifi/bcmdhd_p2p.bin" -WIFI_DRIVER_MODULE_NAME := "dhd" -WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.bin nvram_path=/system/etc/wifi/nvram_net.txt" -WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" -WIFI_BAND := 802_11_ABG -BOARD_LEGACY_NL80211_STA_EVENTS := true -BOARD_NO_APSME_ATTR := true - -# RIL -BOARD_MOBILEDATA_INTERFACE_NAME := "pdp0" - # Vibrator BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c - -# Vold -BOARD_VOLD_MAX_PARTITIONS := 12 -BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true -BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true - -# Recovery -BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/janice/recovery/recovery_keys.c -BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/janice/recovery/graphics.c -TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc - -# HWComposer -BOARD_USES_HWCOMPOSER := true -BOARD_USE_SYSFS_VSYNC_NOTIFICATION := true - -# Camera -BOARD_CAMERA_HAVE_ISO := true -COMMON_GLOBAL_CFLAGS += -DHAVE_ISO -COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARE -BOARD_USES_PROPRIETARY_LIBCAMERA := true -BOARD_USES_PROPRIETARY_LIBFIMC := true - -# OMX -BOARD_NONBLOCK_MODE_PROCESS := true -BOARD_USE_STOREMETADATA := true -BOARD_USE_METADATABUFFERTYPE := true -BOARD_USES_MFC_FPS := true From eef7b0328d42bde5a6fd2ba00ece7ba9faca8172 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:41:30 -0200 Subject: [PATCH 150/248] removed prerecovery.rc, compass workaround and STK added --- janice.mk | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/janice.mk b/janice.mk index 7d0f62c..808e2ca 100644 --- a/janice.mk +++ b/janice.mk @@ -42,11 +42,16 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ GalaxySAdvanceSettings \ - CMAccount + CMAccount \ + Stk # Gps PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf + +# Compass workaround +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/compass:system/etc/init.d/compass $(call inherit-product, device/common/gps/gps_eu_supl.mk) @@ -55,7 +60,6 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ - $(LOCAL_PATH)/rootdir/prerecovery.rc:root/prerecovery.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc # Audio From 9b90551dc58c38804bbd3ec118c5371c85988e5c Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:43:30 -0200 Subject: [PATCH 151/248] Delete prerecovery.rc --- rootdir/prerecovery.rc | 140 ----------------------------------------- 1 file changed, 140 deletions(-) delete mode 100644 rootdir/prerecovery.rc diff --git a/rootdir/prerecovery.rc b/rootdir/prerecovery.rc deleted file mode 100644 index 55f7bcc..0000000 --- a/rootdir/prerecovery.rc +++ /dev/null @@ -1,140 +0,0 @@ -on early-init - start ueventd - -on init - export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin - export LD_LIBRARY_PATH /vendor/lib:/system/lib - export ANDROID_ROOT /system - export ANDROID_DATA /data - export EXTERNAL_STORAGE /sdcard - - symlink /system/etc /etc - - mkdir /sdcard - mkdir /preload - mkdir /system - mkdir /data - mkdir /cache - mkdir /efs - mkdir /tmp - mkdir /dbdata - - mkdir /mnt 0775 root root - mkdir /mnt/.lfs 0775 root root - - mkdir /system 0775 system system - mkdir /modemfs 0771 system system - mkdir /data 0771 system system - - # STE: create /tmp directory needed by psccd and CSPSA - mkdir /tmp - -on early-fs - - mount ext4 /dev/block/mmcblk0p3 /system wait ro - insmod /lib/modules/j4fs.ko - mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait rw - insmod /lib/modules/param.ko - -on fs - mount tmpfs tmpfs /tmp - - # Start CSPSA before synchronously running the factory reset utility that - # checks the factory reset triggers in sysfs and CSPSA and then formats - # the block device belonging to /data. - start cspsa - #exec /system/bin/logwrapper /system/bin/factoryreset -f /sys/socinfo/reset_reason -r factory-reset -c CSPSA0 -p 0xfffffffc:31 /dev/block/mmcblk0p4 - - # Once any factory reset is completed (this is why exec is used above) it is - # OK to mount the remaining file system volumes. - - mount ext4 /dev/block/mmcblk0p2 /modemfs wait noatime nosuid nodev - mount ext4 /dev/block/mmcblk0p5 /data wait noatime nosuid nodev noauto_da_alloc - mount ext4 /dev/block/mmcblk0p7 /efs wait noatime nosuid nodev - - chmod 0666 /dev/log/radio - chmod 0666 /dev/log/main - chmod 0666 /dev/log/event - -on post-fs - - chown system system /system - chmod 0775 /system - - chown system system /modemfs - chmod 0775 /modemfs - - chown radio system /efs - chmod 0775 /efs - - chown system system /data - chmod 0771 /data - #temp - chmod 750 /sbin/fat.format - mount rootfs rootfs / ro remount - - write /proc/sys/kernel/panic_on_oops 1 - write /proc/sys/kernel/hung_task_timeout_secs 0 - write /proc/cpu/alignment 4 - write /proc/sys/kernel/sched_latency_ns 10000000 - write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000 - write /proc/sys/kernel/sched_compat_yield 1 - write /proc/sys/kernel/sched_child_runs_first 0 - -on boot - - ifup lo - hostname localhost - domainname localdomain - - class_start modem-u8500 - class_start modem-core - class_start default - -service ueventd /sbin/ueventd - critical - -service console /system/bin/sh - console - -# Crash Safe Parameter Storage Area, serving production parameter requests from clients. -# Configuration is read from file "/etc/cspsa.conf" and each found area spawns a CSPSA server -# process. -service cspsa /system/bin/logwrapper /system/bin/cspsa-server - class parameter_storage - user root - oneshot - -#STE: Copy RF trim data from CSPSA, and start the Modem Stroage Agent (MSA) service -service modem /system/bin/sh /system/etc/ste_modem.sh - class modem-u8500 - user root - -#STE: Modem-supervisor -service modem-supervisor /system/bin/modem-supervisor -r -f /dev/dbx500_mloader_fw -i /sys/devices/platform/ab8500-i2c.0/chip_id -c monitor -t 0 - class modem-u8500 - user root - -#STE: Creating Modem Security daemon -service copsd /system/bin/copsdaemon - class modem-core - user root - -#TA Loader to write default IMEI -service ta_load /system/bin/ta_loader recovery - user root - group radio - oneshot - -# block for prerecovery -#service recovery /sbin/recovery - -service adbd /sbin/adbd recovery -# disabled - -on property:persist.service.adb.enable=1 - start adbd - -#on property:persist.service.adb.enable=0 -# stop adbd - From 3b4fbb0a5b9d14efd0f947f7fb92fbc4c91443b4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:47:26 -0200 Subject: [PATCH 152/248] TARGET_RECOVERY_INITRC added --- BoardConfig.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index b62973c..efa9d49 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -11,3 +11,6 @@ BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth # Vibrator BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c + +# Recovery +TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc From 3cbca9699721356e0dbabe881d69b140a476e249 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:51:36 -0200 Subject: [PATCH 153/248] removed focal overlay --- .../packages/apps/Focal/res/values/config.xml | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 overlay/packages/apps/Focal/res/values/config.xml diff --git a/overlay/packages/apps/Focal/res/values/config.xml b/overlay/packages/apps/Focal/res/values/config.xml deleted file mode 100644 index 9e531fd..0000000 --- a/overlay/packages/apps/Focal/res/values/config.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - false - - - true - - From 2d6fb146691870406a92b5bfe62369ce41251d79 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:54:44 -0200 Subject: [PATCH 154/248] remove config_wifi_p2p_support it's not used anymore in 4.3 --- overlay/frameworks/base/core/res/res/values/config.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 7e481d2..b594ddc 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -104,9 +104,6 @@ 5 7 - - - true true From 401074de2fe6b5c77e3fb33e0a809b45c9df6ae7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 22:57:54 -0200 Subject: [PATCH 155/248] disable bluetooth low energy profile since our hardware doesn't support it --- bluetooth/bdroid_buildcfg.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bluetooth/bdroid_buildcfg.h b/bluetooth/bdroid_buildcfg.h index d57434e..152cc91 100644 --- a/bluetooth/bdroid_buildcfg.h +++ b/bluetooth/bdroid_buildcfg.h @@ -20,4 +20,8 @@ #define BTM_DEF_LOCAL_NAME "GT-I9070" +#define BLE_INCLUDED FALSE +#define BTA_GATT_INCLUDED FALSE +#define SMP_INCLUDED FALSE + #endif From 430df827192a5d7eabb2bbcdb51d38efe629f716 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 23:00:54 -0200 Subject: [PATCH 156/248] remove "exec sysinit" on boot, since it's not needed cm init already starts this as a service and run it (init.d support) --- rootdir/init.samsungjanice.rc | 3 --- 1 file changed, 3 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 030e306..bdb2b20 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -351,9 +351,6 @@ on early-boot on boot - # Run sysinit - exec /system/bin/sysinit - # debugfs mount debugfs /sys/kernel/debug /sys/kernel/debug From 8a9c3d12e8960cd5adedadd213b183463d73ebf6 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 23:04:16 -0200 Subject: [PATCH 157/248] delete graphics.c (already in common repo) --- recovery/graphics.c | 401 -------------------------------------------- 1 file changed, 401 deletions(-) delete mode 100644 recovery/graphics.c diff --git a/recovery/graphics.c b/recovery/graphics.c deleted file mode 100644 index daf75be..0000000 --- a/recovery/graphics.c +++ /dev/null @@ -1,401 +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. - */ - -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include - -#include - -#ifdef BOARD_USE_CUSTOM_RECOVERY_FONT -#include BOARD_USE_CUSTOM_RECOVERY_FONT -#else -#include "font_10x18.h" -#endif - -#include "minui.h" - -#if defined(RECOVERY_BGRA) -#define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888 -#define PIXEL_SIZE 4 -#elif defined(RECOVERY_RGBX) -#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBX_8888 -#define PIXEL_SIZE 4 -#else -#define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGB_565 -#define PIXEL_SIZE 2 -#endif - -#define NUM_BUFFERS 2 - -typedef struct { - GGLSurface texture; - unsigned cwidth; - unsigned cheight; - unsigned ascent; -} GRFont; - -static GRFont *gr_font = 0; -static GGLContext *gr_context = 0; -static GGLSurface gr_font_texture; -static GGLSurface gr_framebuffer[NUM_BUFFERS]; -static GGLSurface gr_mem_surface; -static unsigned gr_active_fb = 0; -static unsigned double_buffering = 0; - -static int gr_fb_fd = -1; -static int gr_vt_fd = -1; - -static struct fb_var_screeninfo vi; -static struct fb_fix_screeninfo fi; - -static int get_framebuffer(GGLSurface *fb) -{ - int fd; - void *bits; - - fd = open("/dev/graphics/fb0", O_RDWR); - if (fd < 0) { - perror("cannot open fb0"); - return -1; - } - - if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { - perror("failed to get fb0 info"); - close(fd); - return -1; - } - - vi.bits_per_pixel = PIXEL_SIZE * 8; - if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { - vi.red.offset = 8; - vi.red.length = 8; - vi.green.offset = 16; - vi.green.length = 8; - vi.blue.offset = 24; - vi.blue.length = 8; - vi.transp.offset = 0; - vi.transp.length = 8; - } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { - vi.red.offset = 24; - vi.red.length = 8; - vi.green.offset = 16; - vi.green.length = 8; - vi.blue.offset = 8; - vi.blue.length = 8; - vi.transp.offset = 0; - vi.transp.length = 8; - } else { /* RGB565*/ - vi.red.offset = 11; - vi.red.length = 5; - vi.green.offset = 5; - vi.green.length = 6; - vi.blue.offset = 0; - vi.blue.length = 5; - vi.transp.offset = 0; - vi.transp.length = 0; - } - if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { - perror("failed to put fb0 info"); - close(fd); - return -1; - } - - if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { - perror("failed to get fb0 info"); - close(fd); - return -1; - } - - bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (bits == MAP_FAILED) { - perror("failed to mmap framebuffer"); - close(fd); - return -1; - } - - fb->version = sizeof(*fb); - fb->width = vi.xres; - fb->height = vi.yres; - fb->stride = fi.line_length/PIXEL_SIZE; - fb->data = bits; - fb->format = PIXEL_FORMAT; - memset(fb->data, 0, vi.yres * fi.line_length); - - fb++; - - /* check if we can use double buffering */ - if (vi.yres * fi.line_length * 2 > fi.smem_len) - return fd; - - double_buffering = 1; - - fb->version = sizeof(*fb); - fb->width = vi.xres; - fb->height = vi.yres; - fb->stride = fi.line_length/PIXEL_SIZE; - fb->data = (void*) (((unsigned) bits) + vi.yres * fi.line_length); - fb->format = PIXEL_FORMAT; - memset(fb->data, 0, vi.yres * fi.line_length); - - return fd; -} - -static void get_memory_surface(GGLSurface* ms) { - ms->version = sizeof(*ms); - ms->width = vi.xres; - ms->height = vi.yres; - ms->stride = fi.line_length/PIXEL_SIZE; - ms->data = malloc(fi.line_length * vi.yres); - ms->format = PIXEL_FORMAT; -} - -static void set_active_framebuffer(unsigned n) -{ - if (n > 1 || !double_buffering) return; - vi.yres_virtual = vi.yres * NUM_BUFFERS; - vi.yoffset = n * vi.yres; - vi.bits_per_pixel = PIXEL_SIZE * 8; - if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) { - perror("active fb swap failed"); - } -} - -void gr_flip(void) -{ - GGLContext *gl = gr_context; - - /* swap front and back buffers */ - if (double_buffering) - gr_active_fb = (gr_active_fb + 1) & 1; - - /* copy data from the in-memory surface to the buffer we're about - * to make active. */ - memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data, - fi.line_length * vi.yres); - - /* inform the display driver */ - set_active_framebuffer(gr_active_fb); -} - -void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - GGLContext *gl = gr_context; - GGLint color[4]; - color[0] = ((r << 8) | r) + 1; - color[1] = ((g << 8) | g) + 1; - color[2] = ((b << 8) | b) + 1; - color[3] = ((a << 8) | a) + 1; - gl->color4xv(gl, color); -} - -int gr_measure(const char *s) -{ - return gr_font->cwidth * strlen(s); -} - -void gr_font_size(int *x, int *y) -{ - *x = gr_font->cwidth; - *y = gr_font->cheight; -} - -int gr_text(int x, int y, const char *s) -{ - GGLContext *gl = gr_context; - GRFont *font = gr_font; - unsigned off; - - y -= font->ascent; - - gl->bindTexture(gl, &font->texture); - gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); - gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->enable(gl, GGL_TEXTURE_2D); - - while((off = *s++)) { - off -= 32; - if (off < 96) { - gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y); - gl->recti(gl, x, y, x + font->cwidth, y + font->cheight); - } - x += font->cwidth; - } - - return x; -} - -void gr_fill(int x, int y, int w, int h) -{ - GGLContext *gl = gr_context; - gl->disable(gl, GGL_TEXTURE_2D); - gl->recti(gl, x, y, w, h); -} - -void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { - if (gr_context == NULL) { - return; - } - GGLContext *gl = gr_context; - - gl->bindTexture(gl, (GGLSurface*) source); - gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); - gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->enable(gl, GGL_TEXTURE_2D); - gl->texCoord2i(gl, sx - dx, sy - dy); - gl->recti(gl, dx, dy, dx + w, dy + h); -} - -unsigned int gr_get_width(gr_surface surface) { - if (surface == NULL) { - return 0; - } - return ((GGLSurface*) surface)->width; -} - -unsigned int gr_get_height(gr_surface surface) { - if (surface == NULL) { - return 0; - } - return ((GGLSurface*) surface)->height; -} - -static void gr_init_font(void) -{ - GGLSurface *ftex; - unsigned char *bits, *rle; - unsigned char *in, data; - - gr_font = calloc(sizeof(*gr_font), 1); - ftex = &gr_font->texture; - - bits = malloc(font.width * font.height); - - ftex->version = sizeof(*ftex); - ftex->width = font.width; - ftex->height = font.height; - ftex->stride = font.width; - ftex->data = (void*) bits; - ftex->format = GGL_PIXEL_FORMAT_A_8; - - in = font.rundata; - while((data = *in++)) { - memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); - bits += (data & 0x7f); - } - - gr_font->cwidth = font.cwidth; - gr_font->cheight = font.cheight; - gr_font->ascent = font.cheight - 2; -} - -int gr_init_real(void) -{ - gglInit(&gr_context); - GGLContext *gl = gr_context; - - gr_init_font(); - gr_vt_fd = open("/dev/tty0", O_RDWR | O_SYNC); - if (gr_vt_fd < 0) { - // This is non-fatal; post-Cupcake kernels don't have tty0. - perror("can't open /dev/tty0"); - } else if (ioctl(gr_vt_fd, KDSETMODE, (void*) KD_GRAPHICS)) { - // However, if we do open tty0, we expect the ioctl to work. - perror("failed KDSETMODE to KD_GRAPHICS on tty0"); - gr_exit(); - return -1; - } - - gr_fb_fd = get_framebuffer(gr_framebuffer); - if (gr_fb_fd < 0) { - gr_exit(); - return -1; - } - - get_memory_surface(&gr_mem_surface); - - fprintf(stderr, "framebuffer: fd %d (%d x %d)\n", - gr_fb_fd, gr_framebuffer[0].width, gr_framebuffer[0].height); - - /* start with 0 as front (displayed) and 1 as back (drawing) */ - gr_active_fb = 0; - set_active_framebuffer(0); - gl->colorBuffer(gl, &gr_mem_surface); - - gl->activeTexture(gl, 0); - gl->enable(gl, GGL_BLEND); - gl->blendFunc(gl, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA); - - gr_fb_blank(true); - gr_fb_blank(false); - - return 0; -} - -int gr_init(void) -{ - gr_init_real(); - gr_init_real(); - return 0; -} - -void gr_exit(void) -{ - close(gr_fb_fd); - gr_fb_fd = -1; - - free(gr_mem_surface.data); - - ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT); - close(gr_vt_fd); - gr_vt_fd = -1; -} - -int gr_fb_width(void) -{ - return gr_framebuffer[0].width; -} - -int gr_fb_height(void) -{ - return gr_framebuffer[0].height; -} - -gr_pixel *gr_fb_data(void) -{ - return (unsigned short *) gr_mem_surface.data; -} - -void gr_fb_blank(bool blank) -{ - int ret; - - ret = ioctl(gr_fb_fd, FBIOBLANK, blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK); - if (ret < 0) - perror("ioctl(): blank"); -} From f68a61216ab12c8cd5e87354a13e01a9f0348568 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 23:04:38 -0200 Subject: [PATCH 158/248] delete recovery_keys.c (already in common repo) --- recovery/recovery_keys.c | 62 ---------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 recovery/recovery_keys.c diff --git a/recovery/recovery_keys.c b/recovery/recovery_keys.c deleted file mode 100644 index 528a796..0000000 --- a/recovery/recovery_keys.c +++ /dev/null @@ -1,62 +0,0 @@ -#include - -#include "recovery_ui.h" -#include "common.h" -#include "extendedcommands.h" - - -int device_toggle_display(volatile char* key_pressed, int key_code) { - int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT]; - if (alt && key_code == KEY_L) - return 1; - // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off - if (ui_get_showing_back_button()) { - return 0; - //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END); - } - return get_allow_toggle_display() && (key_code == KEY_HOMEPAGE || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END); -} - -int device_handle_key(int key_code, int visible) { - if (visible) { - switch (key_code) { - case KEY_CAPSLOCK: - case KEY_DOWN: - case KEY_VOLUMEDOWN: - return HIGHLIGHT_DOWN; - case KEY_MENU: - return NO_ACTION; - case KEY_LEFTSHIFT: - case KEY_UP: - case KEY_VOLUMEUP: - return HIGHLIGHT_UP; - case KEY_HOMEPAGE: - if (ui_get_showing_back_button()) { - return SELECT_ITEM; - } - if (!get_allow_toggle_display()) - return GO_BACK; - break; - case KEY_POWER: - if (ui_get_showing_back_button()) { - return SELECT_ITEM; - } - if (!get_allow_toggle_display()) - return GO_BACK; - break; - case KEY_LEFTBRACE: - case KEY_ENTER: - case BTN_MOUSE: - case KEY_CAMERA: - case KEY_F21: - case KEY_SEND: - case KEY_END: - case KEY_BACKSPACE: - case KEY_SEARCH: - case KEY_BACK: - return GO_BACK; - } - } - - return NO_ACTION; -} From cb519b3a47ee2f33e342bd663376216fca724956 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 23:27:17 -0200 Subject: [PATCH 159/248] copying vold.fstab, since it was in common repo but not for cm-10.2 branch we are using legacy fstab version yet... --- janice.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/janice.mk b/janice.mk index 808e2ca..1a46bb3 100644 --- a/janice.mk +++ b/janice.mk @@ -68,6 +68,10 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ +# Vold and Storage +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/vold.fstab:system/etc/vold.fstab + # RIL PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ From 8b27a76c4c1f78a5368dca5b0177b8d4a2dabf84 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 23 Oct 2013 23:28:46 -0200 Subject: [PATCH 160/248] create vold.fstab, since it was in common but not for cm-10.2 branch we are using legacy fstab version yet... --- configs/vold.fstab | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 configs/vold.fstab diff --git a/configs/vold.fstab b/configs/vold.fstab new file mode 100644 index 0000000..66fd564 --- /dev/null +++ b/configs/vold.fstab @@ -0,0 +1,8 @@ +# internal sdcard +dev_mount sdcard0 /storage/sdcard0 8 /devices/sdi2/mmc_host/mmc0/mmc0 nonremovable,encryptable + +# external sdcard +dev_mount sdcard1 /storage/sdcard1 auto /devices/sdi0/mmc_host/mmc1/mmc1 + +# usbdisk +dev_mount usbdisk0 /storage/usbdisk0 auto /devices/platform/msm_hsusb_host.0 From c50fdb8980ce39ecb68d2f3d05233ef9b4f47e41 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 00:11:13 -0200 Subject: [PATCH 161/248] overwritting RECOVERY_FSTAB_VERSION since we are using legacy fstab yet... --- BoardConfig.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index efa9d49..96d6367 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,3 +14,4 @@ BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrat # Recovery TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc +RECOVERY_FSTAB_VERSION := 1 From cbc4a02868e2e6d680c0ffa11bf8341fd1b959e2 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 02:14:47 -0200 Subject: [PATCH 162/248] create compass (init.d script) workaround we write default calibration values to start compass from the first boot without manual calibration --- configs/compass | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 configs/compass diff --git a/configs/compass b/configs/compass new file mode 100644 index 0000000..3706ee3 --- /dev/null +++ b/configs/compass @@ -0,0 +1,17 @@ +#!/system/bin/sh + +# Default values for compass calibration, +# this is a workaround only, to make it +# work from the first boot without calibrating +# it manually. + +cfg_path="/data/system/yas.cfg" + +if [ -f $cfg_path ] +then + #echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path + #chmod 0644 $cfg_path +else + echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path + chmod 0644 $cfg_path +fi From 89e07c7957535de0fb2afe4c56a877fc4759efc7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 19:45:32 -0300 Subject: [PATCH 163/248] update fstab to version 2 (unified fstab) updating fstab we guarantee to be updated with the api, recovery uses version 2 from upstream too --- BoardConfig.mk | 2 +- configs/vold.fstab | 8 -------- janice.mk | 10 +--------- recovery.fstab | 11 ----------- rootdir/fstab.samsungjanice | 24 +++++++++++++++++------- 5 files changed, 19 insertions(+), 36 deletions(-) delete mode 100644 configs/vold.fstab delete mode 100644 recovery.fstab diff --git a/BoardConfig.mk b/BoardConfig.mk index 96d6367..74553c9 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,4 +14,4 @@ BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrat # Recovery TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc -RECOVERY_FSTAB_VERSION := 1 +TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice diff --git a/configs/vold.fstab b/configs/vold.fstab deleted file mode 100644 index 66fd564..0000000 --- a/configs/vold.fstab +++ /dev/null @@ -1,8 +0,0 @@ -# internal sdcard -dev_mount sdcard0 /storage/sdcard0 8 /devices/sdi2/mmc_host/mmc0/mmc0 nonremovable,encryptable - -# external sdcard -dev_mount sdcard1 /storage/sdcard1 auto /devices/sdi0/mmc_host/mmc1/mmc1 - -# usbdisk -dev_mount usbdisk0 /storage/usbdisk0 auto /devices/platform/msm_hsusb_host.0 diff --git a/janice.mk b/janice.mk index 1a46bb3..28188bd 100644 --- a/janice.mk +++ b/janice.mk @@ -34,10 +34,6 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.ril.gprsclass=10 \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 - -# Low in-call volume workaround test -# PRODUCT_PROPERTY_OVERRIDES += \ -# ro.config.vc_call_vol_steps=8 # Packages PRODUCT_PACKAGES += \ @@ -66,11 +62,7 @@ PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ $(LOCAL_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ - $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ - -# Vold and Storage -PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/configs/vold.fstab:system/etc/vold.fstab + $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf # RIL PRODUCT_COPY_FILES += \ diff --git a/recovery.fstab b/recovery.fstab deleted file mode 100644 index 7c803b7..0000000 --- a/recovery.fstab +++ /dev/null @@ -1,11 +0,0 @@ -/system ext4 /dev/block/mmcblk0p3 -/cache ext4 /dev/block/mmcblk0p4 -/data ext4 /dev/block/mmcblk0p5 -/efs ext4 /dev/block/mmcblk0p7 -/preload ext4 /dev/block/mmcblk0p9 - -/sdcard vfat /dev/block/mmcblk0p8 -/external_sd vfat /dev/block/mmcblk1p1 - -/boot emmc /dev/block/mmcblk0p15 -#kernel2 emmc /dev/block/mmcblk0p17 diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 80de7aa..760c184 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -1,13 +1,23 @@ # Android fstab file. -# +# # The filesystem that contains the filesystem checker binary (typically /system) cannot # specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK # data partition must be located at the bottom for supporting device encryption -/dev/block/mmcblk0p3 /system ext4 ro,noatime,errors=panic wait -/dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p9 /preload ext4 ro,noatime,errors=panic wait -/dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata +# + +/dev/block/mmcblk0p3 /system ext4 ro,noatime,errors=panic wait +/dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p9 /preload ext4 noatime,nosuid,nodev,journal_async_commit wait +/dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata + +## Vold managed volumes ## + +/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard:8,nonremovable +/devices/sdi0/mmc_host/mmc1/mmc1 /storage/sdcard1 auto defaults voldmanaged=sdcard:auto + +## Recovery only ## +/dev/block/mmcblk0p15 /boot emmc defaults recoveryonly From d3a1d51f26bc7160c6050159a9109d4186a69382 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 20:04:38 -0300 Subject: [PATCH 164/248] recovery.rc cleanup --- BoardConfig.mk | 1 - janice.mk | 1 + rootdir/init.recovery.samsungjanice.rc | 18 ++++++ rootdir/recovery.rc | 84 -------------------------- 4 files changed, 19 insertions(+), 85 deletions(-) create mode 100644 rootdir/init.recovery.samsungjanice.rc delete mode 100644 rootdir/recovery.rc diff --git a/BoardConfig.mk b/BoardConfig.mk index 74553c9..dfde148 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -13,5 +13,4 @@ BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrator.c # Recovery -TARGET_RECOVERY_INITRC := device/samsung/janice/rootdir/recovery.rc TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice diff --git a/janice.mk b/janice.mk index 28188bd..a09903f 100644 --- a/janice.mk +++ b/janice.mk @@ -56,6 +56,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ + $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc # Audio diff --git a/rootdir/init.recovery.samsungjanice.rc b/rootdir/init.recovery.samsungjanice.rc new file mode 100644 index 0000000..84f2a5f --- /dev/null +++ b/rootdir/init.recovery.samsungjanice.rc @@ -0,0 +1,18 @@ +on init + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 + +on early-fs + mount ext4 /dev/block/mmcblk0p3 /system noatime wait + + mkdir /efs + mount ext4 /dev/block/mmcblk0p7 /efs nosuid nodev noatime wait + + # J4FS(lfs) mount points. + mkdir /mnt 0775 root root + mkdir /mnt/.lfs 0755 root root + + # Install Kernel Module + insmod /system/lib/modules/j4fs.ko + insmod /system/lib/modules/param.ko + + mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait diff --git a/rootdir/recovery.rc b/rootdir/recovery.rc deleted file mode 100644 index 0a0c146..0000000 --- a/rootdir/recovery.rc +++ /dev/null @@ -1,84 +0,0 @@ -on early-init - start ueventd - -on init - export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin - export ANDROID_ROOT /system - export ANDROID_DATA /data - export SECONDARY_STORAGE /emmc - export EXTERNAL_STORAGE /sdcard - - symlink /system/etc /etc - - mkdir /emmc - mkdir /sdcard - mkdir /usbdisk - mkdir /system - mkdir /data - mkdir /cache - mkdir /preload - mount /tmp /tmp tmpfs - - write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 - -on early-fs - mount ext4 /dev/block/mmcblk0p3 /system noatime wait - - mkdir /efs - mount ext4 /dev/block/mmcblk0p7 /efs nosuid nodev noatime wait - -# Install Kernel Module - # J4FS(lfs) mount points. - mkdir /mnt 0775 root root - mkdir /mnt/.lfs 0755 root root - - insmod /system/lib/modules/j4fs.ko - insmod /system/lib/modules/param.ko - - mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait - -on boot - ifup lo - hostname localhost - domainname localdomain - - class_start default - -service ueventd /sbin/ueventd - critical - -service console /sbin/sh - class core - console - disabled - group log - -on property:ro.debuggable=1 - start console - -service recovery /sbin/recovery - -service adbd /sbin/adbd recovery - disabled - -# Always start adbd on userdebug and eng builds -# In recovery, always run adbd as root. -on property:ro.debuggable=1 - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04e8 - write /sys/class/android_usb/android0/idProduct 6860 - write /sys/class/android_usb/android0/functions adb - write /sys/class/android_usb/android0/enable 1 - write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer - write /sys/class/android_usb/android0/iProduct $ro.product.model - write /sys/class/android_usb/android0/iSerial $ro.serialno - write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 - start adbd - setprop service.adb.root 1 - -# Restart adbd so it can run as root -on property:service.adb.root=1 - write /sys/class/android_usb/android0/enable 0 - restart adbd - write /sys/class/android_usb/android0/enable 1 - write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 From 693a6f343dd6b30a3933d2ac8b111df299162750 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 20:10:17 -0300 Subject: [PATCH 165/248] Broadcom 4330 supports bluetooth low energy profile --- bluetooth/bdroid_buildcfg.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bluetooth/bdroid_buildcfg.h b/bluetooth/bdroid_buildcfg.h index 152cc91..012b747 100644 --- a/bluetooth/bdroid_buildcfg.h +++ b/bluetooth/bdroid_buildcfg.h @@ -20,8 +20,8 @@ #define BTM_DEF_LOCAL_NAME "GT-I9070" -#define BLE_INCLUDED FALSE -#define BTA_GATT_INCLUDED FALSE -#define SMP_INCLUDED FALSE +#define BLE_INCLUDED TRUE +#define BTA_GATT_INCLUDED TRUE +#define SMP_INCLUDED TRUE #endif From 833949b6e02ab8cabf056da184c0f023cf1641f5 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 20:21:09 -0300 Subject: [PATCH 166/248] overlay: update torch and storage overlay - updated led flashlight overlay - removed usbdisk from storage list --- overlay/frameworks/base/core/res/res/values/config.xml | 3 +++ overlay/frameworks/base/core/res/res/xml/storage_list.xml | 5 ----- overlay/packages/apps/Settings/res/values/config.xml | 2 -- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index b594ddc..49b5915 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -199,5 +199,8 @@ true + + + true diff --git a/overlay/frameworks/base/core/res/res/xml/storage_list.xml b/overlay/frameworks/base/core/res/res/xml/storage_list.xml index 7bdeabd..86b07e2 100644 --- a/overlay/frameworks/base/core/res/res/xml/storage_list.xml +++ b/overlay/frameworks/base/core/res/res/xml/storage_list.xml @@ -45,9 +45,4 @@ android:primary="false" android:removable="true" android:allowMassStorage="true" /> - - diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml index e7543d8..3ce5ecd 100644 --- a/overlay/packages/apps/Settings/res/values/config.xml +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -16,8 +16,6 @@ --> - - true true From cfc6c0655c5e72f2e7da67c0ecbdc820552f83d8 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 24 Oct 2013 21:40:40 -0200 Subject: [PATCH 167/248] compile kernel with GCC 4.6 toolchain --- BoardConfig.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index dfde148..69005fc 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -5,6 +5,7 @@ TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig +TARGET_KERNEL_CUSTOM_TOOLCHAIN := arm-eabi-4.6 # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth From 5803d85fd9c1841008bcdd6db2235be13c9dbbd7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 25 Oct 2013 20:14:19 -0200 Subject: [PATCH 168/248] create a temp shortcut for device settings --- DeviceSettings/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/DeviceSettings/AndroidManifest.xml b/DeviceSettings/AndroidManifest.xml index f02ae75..a103d20 100644 --- a/DeviceSettings/AndroidManifest.xml +++ b/DeviceSettings/AndroidManifest.xml @@ -14,6 +14,7 @@ + From f197dcae548da2c3513b7b6a7788c120ede96169 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 26 Oct 2013 14:00:53 -0200 Subject: [PATCH 169/248] enable electron beam animation --- overlay/frameworks/base/core/res/res/values/config.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 49b5915..1dc900f 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -21,9 +21,6 @@ for different hardware and product builds. --> - - false - 0 1 @@ -202,5 +199,8 @@ true + + + true From 11cfecb2e24b705074e414f9570cafcdb9ac6e3d Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 28 Oct 2013 02:12:50 -0200 Subject: [PATCH 170/248] set config_animateScreenLights to false to enable CRT off effect --- overlay/frameworks/base/core/res/res/values/config.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index 1dc900f..d3bb170 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -202,5 +202,8 @@ true + + + false From ab41a8e0c84c6c27d59cd1642bf815d446adf145 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 30 Oct 2013 14:05:11 -0200 Subject: [PATCH 171/248] using /preload as swap partition just testing our system behaviour swapping --- rootdir/fstab.samsungjanice | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 760c184..a2fd7db 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -11,9 +11,11 @@ /dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p9 /preload ext4 noatime,nosuid,nodev,journal_async_commit wait /dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata +## Swap ## +/dev/block/mmcblk0p9 /preload swap defaults defaults + ## Vold managed volumes ## /devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard:8,nonremovable From 16949e7cece2ddfdcd7124a21520e8232aca5b6f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 30 Oct 2013 15:30:18 -0200 Subject: [PATCH 172/248] swapping on init --- rootdir/init.samsungjanice.rc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index bdb2b20..88513a5 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -56,7 +56,8 @@ on fs # checks the factory reset triggers in sysfs and CSPSA and then formats # the block device belonging to /data. start cspsa - #exec /system/bin/logwrapper /system/bin/factoryreset -f /sys/socinfo/reset_reason -r factory-reset -c CSPSA0 -p 0xfffffffc:31 /dev/block/mmcblk0p5 + exec /system/xbin/mkswap /dev/block/mmcblk0p9 + exec /system/xbin/swapon /dev/block/mmcblk0p9 on post-fs From 74f1bc006de9b96b367384d38f5df6c9052ebfe9 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Fri, 1 Nov 2013 20:45:37 +0100 Subject: [PATCH 173/248] Move gps header to device specific --- BoardConfig.mk | 1 + include/hardware/gps.h | 952 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 953 insertions(+) create mode 100644 include/hardware/gps.h diff --git a/BoardConfig.mk b/BoardConfig.mk index 69005fc..f14e67e 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -1,5 +1,6 @@ -include device/samsung/u8500-common/BoardCommonConfig.mk +TARGET_SPECIFIC_HEADER_PATH := device/samsung/janice/include TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 # Kernel diff --git a/include/hardware/gps.h b/include/hardware/gps.h new file mode 100644 index 0000000..a86ee59 --- /dev/null +++ b/include/hardware/gps.h @@ -0,0 +1,952 @@ +/* + * Copyright (C) 2010 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. + */ + +#ifndef ANDROID_INCLUDE_HARDWARE_GPS_H +#define ANDROID_INCLUDE_HARDWARE_GPS_H + +#include +#include +#include +#include + +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define GPS_HARDWARE_MODULE_ID "gps" + + +/** Milliseconds since January 1, 1970 */ +typedef int64_t GpsUtcTime; + +/** Maximum number of SVs for gps_sv_status_callback(). */ +#define GPS_MAX_SVS 32 + +/** Requested operational mode for GPS operation. */ +typedef uint32_t GpsPositionMode; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Mode for running GPS standalone (no assistance). */ +#define GPS_POSITION_MODE_STANDALONE 0 +/** AGPS MS-Based mode. */ +#define GPS_POSITION_MODE_MS_BASED 1 +/** AGPS MS-Assisted mode. */ +#define GPS_POSITION_MODE_MS_ASSISTED 2 + +/** Requested recurrence mode for GPS operation. */ +typedef uint32_t GpsPositionRecurrence; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Receive GPS fixes on a recurring basis at a specified period. */ +#define GPS_POSITION_RECURRENCE_PERIODIC 0 +/** Request a single shot GPS fix. */ +#define GPS_POSITION_RECURRENCE_SINGLE 1 + +/** GPS status event values. */ +typedef uint16_t GpsStatusValue; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GPS status unknown. */ +#define GPS_STATUS_NONE 0 +/** GPS has begun navigating. */ +#define GPS_STATUS_SESSION_BEGIN 1 +/** GPS has stopped navigating. */ +#define GPS_STATUS_SESSION_END 2 +/** GPS has powered on but is not navigating. */ +#define GPS_STATUS_ENGINE_ON 3 +/** GPS is powered off. */ +#define GPS_STATUS_ENGINE_OFF 4 + +/** Flags to indicate which values are valid in a GpsLocation. */ +typedef uint16_t GpsLocationFlags; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GpsLocation has valid latitude and longitude. */ +#define GPS_LOCATION_HAS_LAT_LONG 0x0001 +/** GpsLocation has valid altitude. */ +#define GPS_LOCATION_HAS_ALTITUDE 0x0002 +/** GpsLocation has valid speed. */ +#define GPS_LOCATION_HAS_SPEED 0x0004 +/** GpsLocation has valid bearing. */ +#define GPS_LOCATION_HAS_BEARING 0x0008 +/** GpsLocation has valid accuracy. */ +#define GPS_LOCATION_HAS_ACCURACY 0x0010 + +/** Flags for the gps_set_capabilities callback. */ + +/** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. + If this is not set, then the framework will use 1000ms for min_interval + and will start and call start() and stop() to schedule the GPS. + */ +#define GPS_CAPABILITY_SCHEDULING 0x0000001 +/** GPS supports MS-Based AGPS mode */ +#define GPS_CAPABILITY_MSB 0x0000002 +/** GPS supports MS-Assisted AGPS mode */ +#define GPS_CAPABILITY_MSA 0x0000004 +/** GPS supports single-shot fixes */ +#define GPS_CAPABILITY_SINGLE_SHOT 0x0000008 +/** GPS supports on demand time injection */ +#define GPS_CAPABILITY_ON_DEMAND_TIME 0x0000010 +/** GPS supports Geofencing */ +#define GPS_CAPABILITY_GEOFENCING 0x0000020 + +/** Flags used to specify which aiding data to delete + when calling delete_aiding_data(). */ +typedef uint16_t GpsAidingData; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +#define GPS_DELETE_EPHEMERIS 0x0001 +#define GPS_DELETE_ALMANAC 0x0002 +#define GPS_DELETE_POSITION 0x0004 +#define GPS_DELETE_TIME 0x0008 +#define GPS_DELETE_IONO 0x0010 +#define GPS_DELETE_UTC 0x0020 +#define GPS_DELETE_HEALTH 0x0040 +#define GPS_DELETE_SVDIR 0x0080 +#define GPS_DELETE_SVSTEER 0x0100 +#define GPS_DELETE_SADATA 0x0200 +#define GPS_DELETE_RTI 0x0400 +#define GPS_DELETE_CELLDB_INFO 0x8000 +#define GPS_DELETE_ALL 0xFFFF + +/** AGPS type */ +typedef uint16_t AGpsType; +#define AGPS_TYPE_SUPL 1 +#define AGPS_TYPE_C2K 2 + +typedef uint16_t AGpsSetIDType; +#define AGPS_SETID_TYPE_NONE 0 +#define AGPS_SETID_TYPE_IMSI 1 +#define AGPS_SETID_TYPE_MSISDN 2 + +/** + * String length constants + */ +#define GPS_NI_SHORT_STRING_MAXLEN 256 +#define GPS_NI_LONG_STRING_MAXLEN 2048 + +/** + * GpsNiType constants + */ +typedef uint32_t GpsNiType; +#define GPS_NI_TYPE_VOICE 1 +#define GPS_NI_TYPE_UMTS_SUPL 2 +#define GPS_NI_TYPE_UMTS_CTRL_PLANE 3 + +/** + * GpsNiNotifyFlags constants + */ +typedef uint32_t GpsNiNotifyFlags; +/** NI requires notification */ +#define GPS_NI_NEED_NOTIFY 0x0001 +/** NI requires verification */ +#define GPS_NI_NEED_VERIFY 0x0002 +/** NI requires privacy override, no notification/minimal trace */ +#define GPS_NI_PRIVACY_OVERRIDE 0x0004 + +/** + * GPS NI responses, used to define the response in + * NI structures + */ +typedef int GpsUserResponseType; +#define GPS_NI_RESPONSE_ACCEPT 1 +#define GPS_NI_RESPONSE_DENY 2 +#define GPS_NI_RESPONSE_NORESP 3 + +/** + * NI data encoding scheme + */ +typedef int GpsNiEncodingType; +#define GPS_ENC_NONE 0 +#define GPS_ENC_SUPL_GSM_DEFAULT 1 +#define GPS_ENC_SUPL_UTF8 2 +#define GPS_ENC_SUPL_UCS2 3 +#define GPS_ENC_UNKNOWN -1 + +/** AGPS status event values. */ +typedef uint16_t AGpsStatusValue; +/** GPS requests data connection for AGPS. */ +#define GPS_REQUEST_AGPS_DATA_CONN 1 +/** GPS releases the AGPS data connection. */ +#define GPS_RELEASE_AGPS_DATA_CONN 2 +/** AGPS data connection initiated */ +#define GPS_AGPS_DATA_CONNECTED 3 +/** AGPS data connection completed */ +#define GPS_AGPS_DATA_CONN_DONE 4 +/** AGPS data connection failed */ +#define GPS_AGPS_DATA_CONN_FAILED 5 + +#define AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 +#define AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 +#define AGPS_REG_LOCATION_TYPE_MAC 3 + +/** Network types for update_network_state "type" parameter */ +#define AGPS_RIL_NETWORK_TYPE_MOBILE 0 +#define AGPS_RIL_NETWORK_TYPE_WIFI 1 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 +#define AGPS_RIL_NETWORK_TTYPE_WIMAX 6 + +/** + * Name for the GPS XTRA interface. + */ +#define GPS_XTRA_INTERFACE "gps-xtra" + +/** + * Name for the GPS DEBUG interface. + */ +#define GPS_DEBUG_INTERFACE "gps-debug" + +/** + * Name for the AGPS interface. + */ +#define AGPS_INTERFACE "agps" + +/** + * Name for NI interface + */ +#define GPS_NI_INTERFACE "gps-ni" + +/** + * Name for the AGPS-RIL interface. + */ +#define AGPS_RIL_INTERFACE "agps_ril" + +/** + * Name for the GPS_Geofencing interface. + */ +#define GPS_GEOFENCING_INTERFACE "gps_geofencing" + +/** + * The GPS chipset can use Psc for AGPS. + */ +#define AGPS_USE_PSC + +/** Represents a location. */ +typedef struct { + /** set to sizeof(GpsLocation) */ + size_t size; + /** Contains GpsLocationFlags bits. */ + uint16_t flags; + /** Represents latitude in degrees. */ + double latitude; + /** Represents longitude in degrees. */ + double longitude; + /** Represents altitude in meters above the WGS 84 reference + * ellipsoid. */ + double altitude; + /** Represents speed in meters per second. */ + float speed; + /** Represents heading in degrees. */ + float bearing; + /** Represents expected accuracy in meters. */ + float accuracy; + /** Timestamp for the location fix. */ + GpsUtcTime timestamp; +} GpsLocation; + +/** Represents the status. */ +typedef struct { + /** set to sizeof(GpsStatus) */ + size_t size; + GpsStatusValue status; +} GpsStatus; + +/** Represents SV information. */ +typedef struct { + /** set to sizeof(GpsSvInfo) */ + size_t size; + /** Pseudo-random number for the SV. */ + int prn; + /** Signal to noise ratio. */ + float snr; + /** Elevation of SV in degrees. */ + float elevation; + /** Azimuth of SV in degrees. */ + float azimuth; + /** Unknown field in Samsung I9100 libgps + May be an indicator for constellation type + (GPS, GLONASS, Galileo)? + Used on GT-I9100, likely also present on GT-N7000, + SGH-I717, SGH-I727 but this needs confirmation. + */ + int unknown_samsung_field; +} GpsSvInfo; + +/** Represents SV status. */ +typedef struct { + /** set to sizeof(GpsSvStatus) */ + size_t size; + + /** Number of SVs currently visible. */ + int num_svs; + + /** Contains an array of SV information. */ + GpsSvInfo sv_list[GPS_MAX_SVS]; + + /** Represents a bit mask indicating which SVs + * have ephemeris data. + */ + uint32_t ephemeris_mask; + + /** Represents a bit mask indicating which SVs + * have almanac data. + */ + uint32_t almanac_mask; + + /** + * Represents a bit mask indicating which SVs + * were used for computing the most recent position fix. + */ + uint32_t used_in_fix_mask; +} GpsSvStatus; + +/* 2G and 3G */ +/* In 3G lac is discarded */ +typedef struct { + uint16_t type; + uint16_t mcc; + uint16_t mnc; + uint16_t lac; +#ifdef AGPS_USE_PSC + uint16_t psc; +#endif + uint32_t cid; +} AGpsRefLocationCellID; + +typedef struct { + uint8_t mac[6]; +} AGpsRefLocationMac; + +/** Represents ref locations */ +typedef struct { + uint16_t type; + union { + AGpsRefLocationCellID cellID; + AGpsRefLocationMac mac; + } u; +} AGpsRefLocation; + +/** Callback with location information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_location_callback)(GpsLocation* location); + +/** Callback with status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_status_callback)(GpsStatus* status); + +/** Callback with SV status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); + +/** Callback for reporting NMEA sentences. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); + +/** Callback to inform framework of the GPS engine's capabilities. + * Capability parameter is a bit field of GPS_CAPABILITY_* flags. + */ +typedef void (* gps_set_capabilities)(uint32_t capabilities); + +/** Callback utility for acquiring the GPS wakelock. + * This can be used to prevent the CPU from suspending while handling GPS events. + */ +typedef void (* gps_acquire_wakelock)(); + +/** Callback utility for releasing the GPS wakelock. */ +typedef void (* gps_release_wakelock)(); + +/** Callback for requesting NTP time */ +typedef void (* gps_request_utc_time)(); + +/** Callback for creating a thread that can call into the Java framework code. + * This must be used to create any threads that report events up to the framework. + */ +typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); + +/** GPS callback structure. */ +typedef struct { + /** set to sizeof(GpsCallbacks) */ + size_t size; + gps_location_callback location_cb; + gps_status_callback status_cb; + gps_sv_status_callback sv_status_cb; + gps_nmea_callback nmea_cb; + gps_set_capabilities set_capabilities_cb; + gps_acquire_wakelock acquire_wakelock_cb; + gps_release_wakelock release_wakelock_cb; + gps_create_thread create_thread_cb; + gps_request_utc_time request_utc_time_cb; +} GpsCallbacks; + + +/** Represents the standard GPS interface. */ +typedef struct { + /** set to sizeof(GpsInterface) */ + size_t size; + /** + * Opens the interface and provides the callback routines + * to the implemenation of this interface. + */ + int (*init)( GpsCallbacks* callbacks ); + + /** Starts navigating. */ + int (*start)( void ); + + /** Stops navigating. */ + int (*stop)( void ); + + /** Closes the interface. */ + void (*cleanup)( void ); + + /** Injects the current time. */ + int (*inject_time)(GpsUtcTime time, int64_t timeReference, + int uncertainty); + + /** Injects current location from another location provider + * (typically cell ID). + * latitude and longitude are measured in degrees + * expected accuracy is measured in meters + */ + int (*inject_location)(double latitude, double longitude, float accuracy); + + /** + * Specifies that the next call to start will not use the + * information defined in the flags. GPS_DELETE_ALL is passed for + * a cold start. + */ + void (*delete_aiding_data)(GpsAidingData flags); + + /** + * min_interval represents the time between fixes in milliseconds. + * preferred_accuracy represents the requested fix accuracy in meters. + * preferred_time represents the requested time to first fix in milliseconds. + */ + int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, + uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); + + /** Get a pointer to extension information. */ + const void* (*get_extension)(const char* name); +} GpsInterface; + +/** Callback to request the client to download XTRA data. + * The client should download XTRA data and inject it by calling inject_xtra_data(). + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_xtra_download_request)(); + +/** Callback structure for the XTRA interface. */ +typedef struct { + gps_xtra_download_request download_request_cb; + gps_create_thread create_thread_cb; +} GpsXtraCallbacks; + +/** Extended interface for XTRA support. */ +typedef struct { + /** set to sizeof(GpsXtraInterface) */ + size_t size; + /** + * Opens the XTRA interface and provides the callback routines + * to the implemenation of this interface. + */ + int (*init)( GpsXtraCallbacks* callbacks ); + /** Injects XTRA data into the GPS. */ + int (*inject_xtra_data)( char* data, int length ); +} GpsXtraInterface; + +/** Extended interface for DEBUG support. */ +typedef struct { + /** set to sizeof(GpsDebugInterface) */ + size_t size; + + /** + * This function should return any information that the native + * implementation wishes to include in a bugreport. + */ + size_t (*get_internal_state)(char* buffer, size_t bufferSize); +} GpsDebugInterface; + +/** Represents the status of AGPS. */ +typedef struct { + /** set to sizeof(AGpsStatus) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; + uint32_t ipaddr; +} AGpsStatus; + +/** Callback with AGPS status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* agps_status_callback)(AGpsStatus* status); + +/** Callback structure for the AGPS interface. */ +typedef struct { + agps_status_callback status_cb; + gps_create_thread create_thread_cb; +} AGpsCallbacks; + + +/** Extended interface for AGPS support. */ +typedef struct { + /** set to sizeof(AGpsInterface) */ + size_t size; + + /** + * Opens the AGPS interface and provides the callback routines + * to the implemenation of this interface. + */ + void (*init)( AGpsCallbacks* callbacks ); + /** + * Notifies that a data connection is available and sets + * the name of the APN to be used for SUPL. + */ + int (*data_conn_open)( const char* apn ); + /** + * Notifies that the AGPS data connection has been closed. + */ + int (*data_conn_closed)(); + /** + * Notifies that a data connection is not available for AGPS. + */ + int (*data_conn_failed)(); + /** + * Sets the hostname and port for the AGPS server. + */ + int (*set_server)( AGpsType type, const char* hostname, int port ); +} AGpsInterface; + + +/** Represents an NI request */ +typedef struct { + /** set to sizeof(GpsNiNotification) */ + size_t size; + + /** + * An ID generated by HAL to associate NI notifications and UI + * responses + */ + int notification_id; + + /** + * An NI type used to distinguish different categories of NI + * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ... + */ + GpsNiType ni_type; + + /** + * Notification/verification options, combinations of GpsNiNotifyFlags constants + */ + GpsNiNotifyFlags notify_flags; + + /** + * Timeout period to wait for user response. + * Set to 0 for no time out limit. + */ + int timeout; + + /** + * Default response when time out. + */ + GpsUserResponseType default_response; + + /** + * Requestor ID + */ + char requestor_id[GPS_NI_SHORT_STRING_MAXLEN]; + + /** + * Notification message. It can also be used to store client_id in some cases + */ + char text[GPS_NI_LONG_STRING_MAXLEN]; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType requestor_id_encoding; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType text_encoding; + + /** + * A pointer to extra data. Format: + * key_1 = value_1 + * key_2 = value_2 + */ + char extras[GPS_NI_LONG_STRING_MAXLEN]; + +} GpsNiNotification; + +/** Callback with NI notification. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification); + +/** GPS NI callback structure. */ +typedef struct +{ + /** + * Sends the notification request from HAL to GPSLocationProvider. + */ + gps_ni_notify_callback notify_cb; + gps_create_thread create_thread_cb; +} GpsNiCallbacks; + +/** + * Extended interface for Network-initiated (NI) support. + */ +typedef struct +{ + /** set to sizeof(GpsNiInterface) */ + size_t size; + + /** Registers the callbacks for HAL to use. */ + void (*init) (GpsNiCallbacks *callbacks); + + /** Sends a response to HAL. */ + void (*respond) (int notif_id, GpsUserResponseType user_response); +} GpsNiInterface; + +struct gps_device_t { + struct hw_device_t common; + + /** + * Set the provided lights to the provided values. + * + * Returns: 0 on succes, error code on failure. + */ + const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev); +}; + +#define AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) +#define AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) + +#define AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) +#define AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) + +typedef void (*agps_ril_request_set_id)(uint32_t flags); +typedef void (*agps_ril_request_ref_loc)(uint32_t flags); + +typedef struct { + agps_ril_request_set_id request_setid; + agps_ril_request_ref_loc request_refloc; + gps_create_thread create_thread_cb; +} AGpsRilCallbacks; + +/** Extended interface for AGPS_RIL support. */ +typedef struct { + /** set to sizeof(AGpsRilInterface) */ + size_t size; + /** + * Opens the AGPS interface and provides the callback routines + * to the implemenation of this interface. + */ + void (*init)( AGpsRilCallbacks* callbacks ); + + /** + * Sets the reference location. + */ + void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct); + /** + * Sets the set ID. + */ + void (*set_set_id) (AGpsSetIDType type, const char* setid); + + /** + * Send network initiated message. + */ + void (*ni_message) (uint8_t *msg, size_t len); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_availability) (int avaiable, const char* apn); +} AGpsRilInterface; + +/** + * GPS Geofence. + * There are 3 states associated with a Geofence: Inside, Outside, Unknown. + * There are 3 transitions: ENTERED, EXITED, UNCERTAIN. + * + * An example state diagram with confidence level: 95% and Unknown time limit + * set as 30 secs is shown below. (confidence level and Unknown time limit are + * explained latter) + * ____________________________ + * | Unknown (30 secs) | + * """""""""""""""""""""""""""" + * ^ | | ^ + * UNCERTAIN| |ENTERED EXITED| |UNCERTAIN + * | v v | + * ________ EXITED _________ + * | Inside | -----------> | Outside | + * | | <----------- | | + * """""""" ENTERED """"""""" + * + * Inside state: We are 95% confident that the user is inside the geofence. + * Outside state: We are 95% confident that the user is outside the geofence + * Unknown state: Rest of the time. + * + * The Unknown state is better explained with an example: + * + * __________ + * | c| + * | ___ | _______ + * | |a| | | b | + * | """ | """"""" + * | | + * """""""""" + * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy + * circle reported by the GPS subsystem. Now with regard to "b", the system is + * confident that the user is outside. But with regard to "a" is not confident + * whether it is inside or outside the geofence. If the accuracy remains the + * same for a sufficient period of time, the UNCERTAIN transition would be + * triggered with the state set to Unknown. If the accuracy improves later, an + * appropriate transition should be triggered. This "sufficient period of time" + * is defined by the parameter in the add_geofence_area API. + * In other words, Unknown state can be interpreted as a state in which the + * GPS subsystem isn't confident enough that the user is either inside or + * outside the Geofence. It moves to Unknown state only after the expiry of the + * timeout. + * + * The geofence callback needs to be triggered for the ENTERED and EXITED + * transitions, when the GPS system is confident that the user has entered + * (Inside state) or exited (Outside state) the Geofence. An implementation + * which uses a value of 95% as the confidence is recommended. The callback + * should be triggered only for the transitions requested by the + * add_geofence_area call. + * + * Even though the diagram and explanation talks about states and transitions, + * the callee is only interested in the transistions. The states are mentioned + * here for illustrative purposes. + * + * Startup Scenario: When the device boots up, if an application adds geofences, + * and then we get an accurate GPS location fix, it needs to trigger the + * appropriate (ENTERED or EXITED) transition for every Geofence it knows about. + * By default, all the Geofences will be in the Unknown state. + * + * When the GPS system is unavailable, gps_geofence_status_callback should be + * called to inform the upper layers of the same. Similarly, when it becomes + * available the callback should be called. This is a global state while the + * UNKNOWN transition described above is per geofence. + * + * An important aspect to note is that users of this API (framework), will use + * other subsystems like wifi, sensors, cell to handle Unknown case and + * hopefully provide a definitive state transition to the third party + * application. GPS Geofence will just be a signal indicating what the GPS + * subsystem knows about the Geofence. + * + */ +#define GPS_GEOFENCE_ENTERED (1<<0L) +#define GPS_GEOFENCE_EXITED (1<<1L) +#define GPS_GEOFENCE_UNCERTAIN (1<<2L) + +#define GPS_GEOFENCE_UNAVAILABLE (1<<0L) +#define GPS_GEOFENCE_AVAILABLE (1<<1L) + +#define GPS_GEOFENCE_OPERATION_SUCCESS 0 +#define GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES -100 +#define GPS_GEOFENCE_ERROR_ID_EXISTS -101 +#define GPS_GEOFENCE_ERROR_ID_UNKNOWN -102 +#define GPS_GEOFENCE_ERROR_INVALID_TRANSITION -103 +#define GPS_GEOFENCE_ERROR_GENERIC -149 + +/** + * The callback associated with the geofence. + * Parameters: + * geofence_id - The id associated with the add_geofence_area. + * location - The current GPS location. + * transition - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED, + * GPS_GEOFENCE_UNCERTAIN. + * timestamp - Timestamp when the transition was detected. + * + * The callback should only be called when the caller is interested in that + * particular transition. For instance, if the caller is interested only in + * ENTERED transition, then the callback should NOT be called with the EXITED + * transition. + * + * IMPORTANT: If a transition is triggered resulting in this callback, the GPS + * subsystem will wake up the application processor, if its in suspend state. + */ +typedef void (*gps_geofence_transition_callback) (int32_t geofence_id, GpsLocation* location, + int32_t transition, GpsUtcTime timestamp); + +/** + * The callback associated with the availablity of the GPS system for geofencing + * monitoring. If the GPS system determines that it cannot monitor geofences + * because of lack of reliability or unavailability of the GPS signals, it will + * call this callback with GPS_GEOFENCE_UNAVAILABLE parameter. + * + * Parameters: + * status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE. + * last_location - Last known location. + */ +typedef void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location); + +/** + * The callback associated with the add_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES - geofence limit has been reached. + * GPS_GEOFENCE_ERROR_ID_EXISTS - geofence with id already exists + * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - the monitorTransition contains an + * invalid transition + * GPS_GEOFENCE_ERROR_GENERIC - for other errors. + */ +typedef void (*gps_geofence_add_callback) (int32_t geofence_id, int32_t status); + +/** + * The callback associated with the remove_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_remove_callback) (int32_t geofence_id, int32_t status); + + +/** + * The callback associated with the pause_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - + * when monitor_transitions is invalid + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_pause_callback) (int32_t geofence_id, int32_t status); + +/** + * The callback associated with the resume_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_resume_callback) (int32_t geofence_id, int32_t status); + +typedef struct { + gps_geofence_transition_callback geofence_transition_callback; + gps_geofence_status_callback geofence_status_callback; + gps_geofence_add_callback geofence_add_callback; + gps_geofence_remove_callback geofence_remove_callback; + gps_geofence_pause_callback geofence_pause_callback; + gps_geofence_resume_callback geofence_resume_callback; + gps_create_thread create_thread_cb; +} GpsGeofenceCallbacks; + +/** Extended interface for GPS_Geofencing support */ +typedef struct { + /** set to sizeof(GpsGeofencingInterface) */ + size_t size; + + /** + * Opens the geofence interface and provides the callback routines + * to the implemenation of this interface. + */ + void (*init)( GpsGeofenceCallbacks* callbacks ); + + /** + * Add a geofence area. This api currently supports circular geofences. + * Parameters: + * geofence_id - The id for the geofence. If a geofence with this id + * already exists, an error value (GPS_GEOFENCE_ERROR_ID_EXISTS) + * should be returned. + * latitude, longtitude, radius_meters - The lat, long and radius + * (in meters) for the geofence + * last_transition - The current state of the geofence. For example, if + * the system already knows that the user is inside the geofence, + * this will be set to GPS_GEOFENCE_ENTERED. In most cases, it + * will be GPS_GEOFENCE_UNCERTAIN. + * monitor_transition - Which transitions to monitor. Bitwise OR of + * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and + * GPS_GEOFENCE_UNCERTAIN. + * notification_responsiveness_ms - Defines the best-effort description + * of how soon should the callback be called when the transition + * associated with the Geofence is triggered. For instance, if set + * to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback + * should be called 1000 milliseconds within entering the geofence. + * This parameter is defined in milliseconds. + * NOTE: This is not to be confused with the rate that the GPS is + * polled at. It is acceptable to dynamically vary the rate of + * sampling the GPS for power-saving reasons; thus the rate of + * sampling may be faster or slower than this. + * unknown_timer_ms - The time limit after which the UNCERTAIN transition + * should be triggered. This paramter is defined in milliseconds. + * See above for a detailed explanation. + */ + void (*add_geofence_area) (int32_t geofence_id, double latitude, + double longitude, double radius_meters, + int last_transition, int monitor_transitions, + int notification_responsiveness_ms, + int unknown_timer_ms); + + /** + * Pause monitoring a particular geofence. + * Parameters: + * geofence_id - The id for the geofence. + */ + void (*pause_geofence) (int32_t geofence_id); + + /** + * Resume monitoring a particular geofence. + * Parameters: + * geofence_id - The id for the geofence. + * monitor_transitions - Which transitions to monitor. Bitwise OR of + * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and + * GPS_GEOFENCE_UNCERTAIN. + * This supersedes the value associated provided in the + * add_geofence_area call. + */ + void (*resume_geofence) (int32_t geofence_id, int monitor_transitions); + + /** + * Remove a geofence area. After the function returns, no notifications + * should be sent. + * Parameter: + * geofence_id - The id for the geofence. + */ + void (*remove_geofence_area) (int32_t geofence_id); +} GpsGeofencingInterface; +__END_DECLS + +#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ From 04cd948d2c27c601e262035f7ccfbe0567988841 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 1 Nov 2013 23:35:50 -0300 Subject: [PATCH 174/248] using new CM Hardware Abstraction Framework dummy DIsplayColorCalibration class to be implemented --- BoardConfig.mk | 3 + .../hardware/DisplayColorCalibration.java | 78 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java diff --git a/BoardConfig.mk b/BoardConfig.mk index f14e67e..589847a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -16,3 +16,6 @@ BOARD_HAS_VIBRATOR_IMPLEMENTATION := ../../device/samsung/janice/vibrator/vibrat # Recovery TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice + +# Hardware tunables (device parts replacement) +BOARD_HARDWARE_CLASS := device/samsung/janice/cmhw diff --git a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java new file mode 100644 index 0000000..3a6f39b --- /dev/null +++ b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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 org.cyanogenmod.hardware; + +/* + * Display RGB intensity calibration (kcal) + * + * Exports methods to get the valid value boundaries, the + * current color values, and a method to set new ones. + * + * Values exported by min/max can be the direct values required + * by the hardware, or a local (to DisplayColorCalibration) abstraction + * that's internally converted to something else prior to actual use. The + * Settings user interface will normalize these into a 0-100 (percentage) + * scale before showing them to the user, but all values passed to/from + * the client (Settings) are in this class' scale. + */ + +public class DisplayColorCalibration { + + /* + * All HAF classes should export this boolean. + * Real implementations must, of course, return true + */ + + public static boolean isSupported() { return false; } + + /* + * Set the RGB values to the given input triplet. Input is + * expected to consist of 3 values, space-separated, each to + * be a value between the boundaries set by get(Max|Min)Value + * (see below), and it's meant to be locally interpreted/used. + */ + + public static boolean setColors(String colors) { + throw new UnsupportedOperationException(); + } + + /* + * What's the maximum integer value we take for a color + */ + + public static int getMaxValue() { + return -1; + } + + /* + * What's the minimum integer value we take for a color + */ + + public static int getMinValue() { + return -1; + } + + /* + * What's the current RGB triplet? + * This should return a space-separated set of integers in + * a string, same format as the input to setColors() + */ + + public static String getCurColors() { + return "0 0 0"; + } +} From 4bdecf3cb7eba3ee583cb38e3dca74b6433d727b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 1 Nov 2013 23:39:41 -0300 Subject: [PATCH 175/248] CM Hardware Abstraction Framework package added --- janice.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index a09903f..f3e92ba 100644 --- a/janice.mk +++ b/janice.mk @@ -39,7 +39,9 @@ PRODUCT_PROPERTY_OVERRIDES += \ PRODUCT_PACKAGES += \ GalaxySAdvanceSettings \ CMAccount \ - Stk + Stk \ + org.cyanogenmod.hardware \ + org.cyanogenmod.hardware.xml # Gps PRODUCT_COPY_FILES += \ From 5ac81a9748fd05aad264c7ca0b0a8124258faa99 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 1 Nov 2013 23:45:39 -0300 Subject: [PATCH 176/248] CM HAF: implement DisplayColorCalibration --- .../hardware/DisplayColorCalibration.java | 38 ++++++++++++++++--- rootdir/init.samsungjanice.rc | 3 ++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java index 3a6f39b..9dbb605 100644 --- a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java +++ b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java @@ -16,6 +16,9 @@ package org.cyanogenmod.hardware; +import org.cyanogenmod.hardware.util.FileUtils; +import java.io.File; + /* * Display RGB intensity calibration (kcal) * @@ -31,13 +34,27 @@ */ public class DisplayColorCalibration { + + private static final String[] FILE_PATH = new String[] { + "/sys/devices/pri_lcd_s6e63m0.0/filter_R", + "/sys/devices/pri_lcd_s6e63m0.0/filter_G", + "/sys/devices/pri_lcd_s6e63m0.0/filter_B" + }; /* * All HAF classes should export this boolean. * Real implementations must, of course, return true */ - public static boolean isSupported() { return false; } + public static boolean isSupported() { + + for (String filePath : FILE_PATH) { + if (!new File(filePath).exists()) { + return false; + } + } + return true; + } /* * Set the RGB values to the given input triplet. Input is @@ -47,7 +64,13 @@ public class DisplayColorCalibration { */ public static boolean setColors(String colors) { - throw new UnsupportedOperationException(); + String[] valuesSplit = colors.split(" "); + boolean result = true; + for (int i = 0; i < valuesSplit.length; i++) { + String targetFile = FILE_PATH[i]; + result &= FileUtils.writeLine(targetFile, Integer.parseInt(valuesSplit[i])); + } + return result; } /* @@ -55,7 +78,7 @@ public static boolean setColors(String colors) { */ public static int getMaxValue() { - return -1; + return 255; } /* @@ -63,7 +86,7 @@ public static int getMaxValue() { */ public static int getMinValue() { - return -1; + return 0; } /* @@ -73,6 +96,11 @@ public static int getMinValue() { */ public static String getCurColors() { - return "0 0 0"; + + StringBuilder values = new StringBuilder(); + for (String filePath : FILE_PATH) { + values.append(FileUtils.readOneLine(filePath)).append(" "); + } + return values.toString(); } } diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 88513a5..d467021 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -470,6 +470,9 @@ on boot chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/module/mmc_core/parameters/use_spi_crc chown system system /sys/kernel/mxt224e/threshold_t48 + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B write /sys/kernel/mxt224e/threshold_t48 on From 273583fef5bdfc9c8dd1724168e73746093dfc6a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 1 Nov 2013 23:53:09 -0300 Subject: [PATCH 177/248] long term orbits support, kanged from tuna repo (?) to be tested, if our hardware doesn't support it rollback this commit --- .../cyanogenmod/hardware/LongTermOrbits.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 cmhw/org/cyanogenmod/hardware/LongTermOrbits.java diff --git a/cmhw/org/cyanogenmod/hardware/LongTermOrbits.java b/cmhw/org/cyanogenmod/hardware/LongTermOrbits.java new file mode 100644 index 0000000..3122402 --- /dev/null +++ b/cmhw/org/cyanogenmod/hardware/LongTermOrbits.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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 org.cyanogenmod.hardware; + +import java.io.File; + +/** + * Long Term Orbits (LTO) support. + */ +public class LongTermOrbits { + + // We use the "7 day" data file + private static final String LTO_SRC = "http://gllto.glpals.com/7day/v2/latest/lto2.dat"; + private static final File LTO_DST = new File("/data/gps/lto.dat"); + private static final long DOWNLOAD_INTERVAL_DEFAULT = 259200000; /* 3 days */ + + /** + * Whether device supports the LTO technology. + * + * @return boolean Supported devices must return always true. + */ + public static boolean isSupported() { return true; } + + /** + * Returns the source location of the LTO data. + * + * @return String The LTO source location. + */ + public static String getSourceLocation() { return LTO_SRC; } + + /** + * Returns the source location of the LTO data. + * + * @return File The LTO source location. + */ + public static File getDestinationLocation() { return LTO_DST; } + + /** + * Returns the interval in milliseconds to trigger the LTO data download.
    + *
    + * As convenience, implementations should set the download interval to the half of the + * validity of the downloaded data. + * + * @return long The download interval in milliseconds + */ + public static long getDownloadInterval() { return DOWNLOAD_INTERVAL_DEFAULT; } + +} From 93ba9b085b9a5a137f134d17434ea65b7365dfff Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 2 Nov 2013 00:39:47 -0300 Subject: [PATCH 178/248] enable AAC 5.1 output and set dalvik type precise --- janice.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/janice.mk b/janice.mk index f3e92ba..999cef0 100644 --- a/janice.mk +++ b/janice.mk @@ -35,6 +35,12 @@ PRODUCT_PROPERTY_OVERRIDES += \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 +# Enable AAC 5.1 output +PRODUCT_PROPERTY_OVERRIDES += \ + media.aac_51_output_enabled=true + +PRODUCT_TAGS += dalvik.gc.type-precise + # Packages PRODUCT_PACKAGES += \ GalaxySAdvanceSettings \ From 2bb836402c6b614ec62704a90f306c4e635c8d4f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 2 Nov 2013 02:45:57 -0300 Subject: [PATCH 179/248] CM HAF: initial support for AdaptiveBacklight dummy class added to be implemented --- .../hardware/AdaptiveBacklight.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java diff --git a/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java b/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java new file mode 100644 index 0000000..fb52566 --- /dev/null +++ b/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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 org.cyanogenmod.hardware; + +/** + * Adaptive backlight support (this refers to technologies like NVIDIA SmartDimmer, + * QCOM CABL or Samsung CABC). + */ +public class AdaptiveBacklight { + + /** + * Whether device supports an adaptive backlight technology. + * + * @return boolean Supported devices must return always true + */ + public static boolean isSupported() { return false; } + + /** + * This method return the current activation status of the adaptive backlight technology. + * + * @return boolean Must be false when adaptive backlight is not supported or not activated, or + * the operation failed while reading the status; true in any other case. + */ + public static boolean isEnabled() { return false; } + + /** + * This method allows to setup adaptive backlight technology status. + * + * @param status The new adaptive backlight status + * @return boolean Must be false if adaptive backlight is not supported or the operation + * failed; true in any other case. + */ + public static boolean setEnabled(boolean status) { return false; } + +} From 6c929dcb5e45daa601975ceee37f7f9bad7a969e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 2 Nov 2013 02:48:48 -0300 Subject: [PATCH 180/248] CM HAF: AdaptiveBacklight implementation --- .../hardware/AdaptiveBacklight.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java b/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java index fb52566..7871592 100644 --- a/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java +++ b/cmhw/org/cyanogenmod/hardware/AdaptiveBacklight.java @@ -16,18 +16,29 @@ package org.cyanogenmod.hardware; +import org.cyanogenmod.hardware.util.FileUtils; +import java.io.File; + /** * Adaptive backlight support (this refers to technologies like NVIDIA SmartDimmer, * QCOM CABL or Samsung CABC). */ public class AdaptiveBacklight { + private static final String PATH = "/sys/class/lcd/panel/power_reduce"; + /** * Whether device supports an adaptive backlight technology. * * @return boolean Supported devices must return always true */ - public static boolean isSupported() { return false; } + public static boolean isSupported() { + if (!new File(PATH).exists()) { + return false; + } + + return true; + } /** * This method return the current activation status of the adaptive backlight technology. @@ -35,7 +46,13 @@ public class AdaptiveBacklight { * @return boolean Must be false when adaptive backlight is not supported or not activated, or * the operation failed while reading the status; true in any other case. */ - public static boolean isEnabled() { return false; } + public static boolean isEnabled() { + if (Integer.parseInt(FileUtils.readOneLine(PATH)) <= 0) { + return false; + } + + return true; + } /** * This method allows to setup adaptive backlight technology status. @@ -44,6 +61,9 @@ public class AdaptiveBacklight { * @return boolean Must be false if adaptive backlight is not supported or the operation * failed; true in any other case. */ - public static boolean setEnabled(boolean status) { return false; } + public static boolean setEnabled(boolean status) { + String value = (status ? "1" : "0"); + return (FileUtils.writeLine(PATH, value)); + } } From cf499e516edabaa87f807477321773435916c03b Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 5 Nov 2013 00:39:50 +0100 Subject: [PATCH 181/248] Add copybit header --- include/hardware/copybit.h | 251 +++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 include/hardware/copybit.h diff --git a/include/hardware/copybit.h b/include/hardware/copybit.h new file mode 100644 index 0000000..1b93eab --- /dev/null +++ b/include/hardware/copybit.h @@ -0,0 +1,251 @@ +/* + * 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. + */ + +#ifndef ANDROID_COPYBIT_INTERFACE_H +#define ANDROID_COPYBIT_INTERFACE_H + +#include + +#include +#include +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define COPYBIT_HARDWARE_MODULE_ID "copybit" + +/** + * Name of the graphics device to open + */ +#define COPYBIT_HARDWARE_COPYBIT0 "copybit0" + +/* supported pixel-formats. these must be compatible with + * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h + */ +enum { + COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, + COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, + COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, + COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, + COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, + COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, + COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, + COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP, + COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP, + COPYBIT_FORMAT_YCbCr_420_P = HAL_PIXEL_FORMAT_YCbCr_420_P, + /* STE: Added Support for YUV42XMBN, required for Copybit CC acceleration */ + COPYBIT_FORMAT_YCBCR42XMBN = HAL_PIXEL_FORMAT_YCBCR42XMBN, + /* STE: Added for YCbCr422R -> RGB888 use-case */ + COPYBIT_FORMAT_YCbCr_422_I = HAL_PIXEL_FORMAT_YCbCr_422_I, +}; + +/* name for copybit_set_parameter */ +enum { + /* rotation of the source image in degrees (0 to 359) */ + COPYBIT_ROTATION_DEG = 1, + /* plane alpha value */ + COPYBIT_PLANE_ALPHA = 2, + /* enable or disable dithering */ + COPYBIT_DITHER = 3, + /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */ + COPYBIT_TRANSFORM = 4, + /* blurs the copied bitmap. The amount of blurring cannot be changed + * at this time. */ + COPYBIT_BLUR = 5 +}; + +/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */ +enum { + /* flip source image horizontally */ + COPYBIT_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H, + /* flip source image vertically */ + COPYBIT_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V, + /* rotate source image 90 degres */ + COPYBIT_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90, + /* rotate source image 180 degres */ + COPYBIT_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180, + /* rotate source image 270 degres */ + COPYBIT_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, +}; + +/* enable/disable value copybit_set_parameter */ +enum { + COPYBIT_DISABLE = 0, + COPYBIT_ENABLE = 1 +}; + +/* use get_static_info() to query static informations about the hardware */ +enum { + /* Maximum amount of minification supported by the hardware*/ + COPYBIT_MINIFICATION_LIMIT = 1, + /* Maximum amount of magnification supported by the hardware */ + COPYBIT_MAGNIFICATION_LIMIT = 2, + /* Number of fractional bits support by the scaling engine */ + COPYBIT_SCALING_FRAC_BITS = 3, + /* Supported rotation step in degres. */ + COPYBIT_ROTATION_STEP_DEG = 4, +}; + +/* Image structure */ +struct copybit_image_t { + /* width */ + uint32_t w; + /* height */ + uint32_t h; + /* format COPYBIT_FORMAT_xxx */ + int32_t format; + /* base of buffer with image */ + void *base; + /* handle to the image */ + native_handle_t* handle; +}; + +/* Rectangle */ +struct copybit_rect_t { + /* left */ + int l; + /* top */ + int t; + /* right */ + int r; + /* bottom */ + int b; +}; + +/* Color (components in range 0-255) */ +struct copybit_color_t { + /* Red */ + uint8_t r; + /* Green */ + uint8_t g; + /* Blue */ + uint8_t b; + /* Alpha */ + uint8_t a; +}; + +/* Region */ +struct copybit_region_t { + int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect); +}; + +/** + * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM + * and the fields of this data structure must begin with hw_module_t + * followed by module specific information. + */ +struct copybit_module_t { + struct hw_module_t common; +}; + +/** + * Every device data structure must begin with hw_device_t + * followed by module specific public methods and attributes. + */ +struct copybit_device_t { + struct hw_device_t common; + + /** + * Set a copybit parameter. + * + * @param dev from open + * @param name one for the COPYBIT_NAME_xxx + * @param value one of the COPYBIT_VALUE_xxx + * + * @return 0 if successful + */ + int (*set_parameter)(struct copybit_device_t *dev, int name, int value); + + /** + * Get a static copybit information. + * + * @param dev from open + * @param name one of the COPYBIT_STATIC_xxx + * + * @return value or -EINVAL if error + */ + int (*get)(struct copybit_device_t *dev, int name); + + /** + * Execute the bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param region the clip region + * + * @return 0 if successful + */ + int (*blit)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_region_t const *region); + + /** + * Execute the stretch bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param dst_rect is the destination rectangle + * @param src_rect is the source rectangle + * @param region the clip region + * + * @return 0 if successful + */ + int (*stretch)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_rect_t const *dst_rect, + struct copybit_rect_t const *src_rect, + struct copybit_region_t const *region); + + /** + * Execute the fill bit blit operation + * + * @param dev from open + * @param dst is the destination image + * @param rect is the destination rectangle + * @param color is the fill color + * @param region the clip region + */ + int (*fill)(struct copybit_device_t *dev, + struct copybit_image_t *dst, + struct copybit_rect_t *rect, + struct copybit_color_t *color, + struct copybit_region_t *region); +}; + + +/** convenience API for opening and closing a device */ + +static inline int copybit_open(const struct hw_module_t* module, + struct copybit_device_t** device) { + return module->methods->open(module, + COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device); +} + +static inline int copybit_close(struct copybit_device_t* device) { + return device->common.close(&device->common); +} + + +__END_DECLS + +#endif // ANDROID_COPYBIT_INTERFACE_H From 3f186ba14b3a02aa9f0b17fd798285001244212a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 12 Nov 2013 19:55:55 -0200 Subject: [PATCH 182/248] ops... writeLine needs (String, String) not (String, int) --- cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java index 9dbb605..6aad5b6 100644 --- a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java +++ b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java @@ -68,7 +68,7 @@ public static boolean setColors(String colors) { boolean result = true; for (int i = 0; i < valuesSplit.length; i++) { String targetFile = FILE_PATH[i]; - result &= FileUtils.writeLine(targetFile, Integer.parseInt(valuesSplit[i])); + result &= FileUtils.writeLine(targetFile, valuesSplit[i]); } return result; } From d35d5b909122727a8652ec27560730ee881ee748 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 13 Nov 2013 18:32:08 -0200 Subject: [PATCH 183/248] rename bluetooth interface to bt-pan --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index d467021..5d98f2a 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -720,7 +720,7 @@ service dhcpcd_p2p /system/bin/dhcpcd -aABKL disabled oneshot -service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG +service dhcpcd_bt-pan /system/bin/dhcpcd -BKLG # This properly enables bluetooth tethering, it asigns a IP to any conected device class main disabled @@ -740,7 +740,7 @@ service iprenew_p2p /system/bin/dhcpcd -n disabled oneshot -service iprenew_bnep0 /system/bin/dhcpcd -n +service iprenew_bt-pan /system/bin/dhcpcd -n class main disabled oneshot From b5a904e5eb0d99b4be5aed48267dbc33da24120d Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sat, 16 Nov 2013 20:42:37 +0100 Subject: [PATCH 184/248] CM 11 initial commit for janice --- janice.mk | 3 +-- rootdir/fstab.samsungjanice | 8 +++--- rootdir/init.samsungjanice.rc | 48 ++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/janice.mk b/janice.mk index 999cef0..f1fde82 100644 --- a/janice.mk +++ b/janice.mk @@ -30,8 +30,7 @@ PRODUCT_COPY_FILES += \ # RIL PRODUCT_PROPERTY_OVERRIDES += \ mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ - ro.ril.hsxpa=1 \ - ro.ril.gprsclass=10 \ + ro.telephony.default_network=0 \ ro.telephony.ril_class=SamsungU8500RIL \ ro.telephony.sends_barcount=1 diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index a2fd7db..8a27b9a 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -11,15 +11,13 @@ /dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p9 /preload swap ro,noatime,errors=panic wait /dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata -## Swap ## -/dev/block/mmcblk0p9 /preload swap defaults defaults - ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard:8,nonremovable -/devices/sdi0/mmc_host/mmc1/mmc1 /storage/sdcard1 auto defaults voldmanaged=sdcard:auto +/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard:8,nonremovable +/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard:auto ## Recovery only ## /dev/block/mmcblk0p15 /boot emmc defaults recoveryonly diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5d98f2a..3ca9999 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -3,15 +3,14 @@ import /init.samsungjanice.usb.rc on early-init export EXTERNAL_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 - mkdir /storage 0775 system system - mkdir /storage/sdcard0 0775 system system - mkdir /storage/sdcard1 0775 system system - mkdir /storage/usbdisk 0775 system system + mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw + mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw + mkdir /storage/sdcard0 0700 root root + mkdir /storage/sdcard1 0700 root root mkdir /efs 0771 radio system mkdir /preload 0771 system system mkdir /modemfs 0771 system system - mkdir /mnt 0755 root system mkdir /mnt/.lfs 0755 root root # for backwards compatibility @@ -56,8 +55,6 @@ on fs # checks the factory reset triggers in sysfs and CSPSA and then formats # the block device belonging to /data. start cspsa - exec /system/xbin/mkswap /dev/block/mmcblk0p9 - exec /system/xbin/swapon /dev/block/mmcblk0p9 on post-fs @@ -685,19 +682,31 @@ on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 -service p2p_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ - -d -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ +service p2p_supplicant /system/bin/wpa_supplicant \ -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ - -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 + -I/system/etc/wifi/p2p_supplicant_overlay.conf -N \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ + -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot - - -service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant \ + +service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -e/data/misc/wifi/entropy.bin + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ + -O/data/misc/wifi/sockets \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled @@ -710,7 +719,7 @@ service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport oneshot keycodes 114 115 116 -service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL +service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL class main disabled oneshot @@ -764,3 +773,12 @@ service wlandutservice /system/bin/wlandutservice disabled oneshot # end of wifi + +# FUSE sdcard daemon service for sdcard +service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 + class late_start + disabled + +service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 + class late_start + disabled From 3548df5eee03597ed1803ce5824f427840f95d4f Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sat, 16 Nov 2013 22:55:06 +0100 Subject: [PATCH 185/248] Fix sdcards and wifi --- rootdir/fstab.samsungjanice | 4 ++-- rootdir/init.samsungjanice.rc | 39 ++++++++--------------------------- 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 8a27b9a..a7e7e85 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -16,8 +16,8 @@ ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard:8,nonremovable -/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard:auto +/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard0:8,nonremovable +/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,,noemulatedsd ## Recovery only ## /dev/block/mmcblk0p15 /boot emmc defaults recoveryonly diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 3ca9999..f886855 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,16 +1,13 @@ import /init.samsungjanice.usb.rc -on early-init +on init export EXTERNAL_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 - - mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw + mkdir /storage/sdcard0 0775 system system mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw - mkdir /storage/sdcard0 0700 root root - mkdir /storage/sdcard1 0700 root root mkdir /efs 0771 radio system - mkdir /preload 0771 system system mkdir /modemfs 0771 system system + mkdir /preload 0771 system system mkdir /mnt/.lfs 0755 root root # for backwards compatibility @@ -21,8 +18,6 @@ on early-init symlink /storage/usbdisk /usbdisk0 symlink /storage/usbdisk /mnt/usbdisk0 -on init - # setup the global environment export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib @@ -683,30 +678,18 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ - -I/system/etc/wifi/p2p_supplicant_overlay.conf -N \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ - -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ + -puse_p2p_group_interface=1 class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot service wpa_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets \ - -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -Dnl80211 -iwlan0 -e/data/misc/wifi/entropy.bin + -c/data/misc/wifi/wpa_supplicant.conf + -O/data/misc/wifi/sockets -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled @@ -775,10 +758,6 @@ service wlandutservice /system/bin/wlandutservice # end of wifi # FUSE sdcard daemon service for sdcard -service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 - class late_start - disabled - service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled From cb500a862af7c174b921b990e0d4d66c3b9239d1 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sat, 16 Nov 2013 23:43:16 +0100 Subject: [PATCH 186/248] Update janice.mk --- janice.mk | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/janice.mk b/janice.mk index f1fde82..c3f5384 100644 --- a/janice.mk +++ b/janice.mk @@ -31,8 +31,14 @@ PRODUCT_COPY_FILES += \ PRODUCT_PROPERTY_OVERRIDES += \ mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ ro.telephony.default_network=0 \ - ro.telephony.ril_class=SamsungU8500RIL \ - ro.telephony.sends_barcount=1 + ro.telephony.ril_class=SamsungU8500RIL \ + ro.telephony.sends_barcount=1 + +# CM 11 Required lines +PRODUCT_PROPERTY_OVERRIDES += \ + ro.zygote.disable_gl_preload=1 \ + ro.bq.gpu_to_cpu_unsupported=1 \ + ro.boot.selinux=disabled # Enable AAC 5.1 output PRODUCT_PROPERTY_OVERRIDES += \ From 1a5a57b689695f1c6d665a6da48b410ad5dbfa4b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 16 Nov 2013 22:17:54 -0200 Subject: [PATCH 187/248] prepare fstab for new KK storage layout --- rootdir/fstab.samsungjanice | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index a7e7e85..7fc4fa0 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -16,8 +16,8 @@ ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard0:8,nonremovable -/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,,noemulatedsd +/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:auto,nonremovable,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file +/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file ## Recovery only ## /dev/block/mmcblk0p15 /boot emmc defaults recoveryonly From 7e278f5e428e056d174b3234a58a324146831164 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 16 Nov 2013 23:03:32 -0200 Subject: [PATCH 188/248] mount /preload as swap --- rootdir/fstab.samsungjanice | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 7fc4fa0..d97a450 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -11,13 +11,19 @@ /dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check -/dev/block/mmcblk0p9 /preload swap ro,noatime,errors=panic wait /dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata + +## Swap ## + +/dev/block/mmcblk0p9 /preload swap defaults defaults + + ## Vold managed volumes ## /devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:auto,nonremovable,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file /devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file + ## Recovery only ## /dev/block/mmcblk0p15 /boot emmc defaults recoveryonly From 15d6fc0848e88f4683a4d8b01d278601599cccd7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sat, 16 Nov 2013 23:15:03 -0200 Subject: [PATCH 189/248] fix our init for KK --- rootdir/init.samsungjanice.rc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index f886855..90d1132 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,13 +1,16 @@ import /init.samsungjanice.usb.rc -on init +on early-init + export EXTERNAL_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 - mkdir /storage/sdcard0 0775 system system + mkdir /storage 0775 system system + mkdir /storage/sdcard0 0775 system system + mkdir /storage/sdcard1 0775 system system + mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw mkdir /efs 0771 radio system mkdir /modemfs 0771 system system - mkdir /preload 0771 system system mkdir /mnt/.lfs 0755 root root # for backwards compatibility @@ -18,6 +21,8 @@ on init symlink /storage/usbdisk /usbdisk0 symlink /storage/usbdisk /mnt/usbdisk0 +on init + # setup the global environment export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib @@ -50,6 +55,9 @@ on fs # checks the factory reset triggers in sysfs and CSPSA and then formats # the block device belonging to /data. start cspsa + + exec /system/xbin/mkswap /dev/block/mmcblk0p9 + exec /system/xbin/swapon /dev/block/mmcblk0p9 on post-fs @@ -758,6 +766,10 @@ service wlandutservice /system/bin/wlandutservice # end of wifi # FUSE sdcard daemon service for sdcard +service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 + class late_start + disabled + service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled From c0ab06f48e2b4c846c54aa9ed73ecd5d96a4c29b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 17 Nov 2013 21:28:58 -0200 Subject: [PATCH 190/248] update our init --- rootdir/init.samsungjanice.rc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 90d1132..39b6d3d 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -6,9 +6,11 @@ on early-init export SECONDARY_STORAGE /storage/sdcard1 mkdir /storage 0775 system system mkdir /storage/sdcard0 0775 system system + chmod 0701 /mnt/media_rw mkdir /storage/sdcard1 0775 system system mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw + mkdir /mnt/shell 0700 shell shell mkdir /efs 0771 radio system mkdir /modemfs 0771 system system mkdir /mnt/.lfs 0755 root root @@ -18,8 +20,6 @@ on early-init symlink /storage/sdcard0 /mnt/sdcard symlink /storage/sdcard1 /extSdCard symlink /storage/sdcard1 /mnt/extSdCard - symlink /storage/usbdisk /usbdisk0 - symlink /storage/usbdisk /mnt/usbdisk0 on init @@ -49,15 +49,17 @@ on init on fs + exec /system/xbin/mkswap /dev/block/mmcblk0p9 + mount_all /fstab.samsungjanice + swapon_all /fstab.samsungjanice + + setprop ro.crypto.fuse_sdcard true # Start CSPSA before synchronously running the factory reset utility that # checks the factory reset triggers in sysfs and CSPSA and then formats # the block device belonging to /data. start cspsa - - exec /system/xbin/mkswap /dev/block/mmcblk0p9 - exec /system/xbin/swapon /dev/block/mmcblk0p9 on post-fs @@ -688,7 +690,7 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ - -puse_p2p_group_interface=1 + -puse_p2p_group_interface=1 -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled From 49ea60faad3766736a1cef652e14d0429600112e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Mon, 18 Nov 2013 17:30:27 -0200 Subject: [PATCH 191/248] KSM tunning --- rootdir/init.samsungjanice.rc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 39b6d3d..75c5e93 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -20,6 +20,11 @@ on early-init symlink /storage/sdcard0 /mnt/sdcard symlink /storage/sdcard1 /extSdCard symlink /storage/sdcard1 /mnt/extSdCard + + # KSM tunning + write /sys/kernel/mm/ksm/pages_to_scan 100 + write /sys/kernel/mm/ksm/sleep_millisecs 500 + write /sys/kernel/mm/ksm/run 1 on init From 7952a958a8a08c70b0df9d19b41dd259037b28b8 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 19 Nov 2013 13:27:21 -0200 Subject: [PATCH 192/248] set correct permissions for KK mount points --- rootdir/init.samsungjanice.rc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 75c5e93..cb06269 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -4,13 +4,15 @@ on early-init export EXTERNAL_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 - mkdir /storage 0775 system system - mkdir /storage/sdcard0 0775 system system + + mkdir /mnt/shell 0700 shell shell + mkdir /storage 0550 system sdcard_r + mkdir /storage/sdcard0 0700 root root + mkdir /storage/sdcard1 0700 root root chmod 0701 /mnt/media_rw - mkdir /storage/sdcard1 0775 system system mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw - mkdir /mnt/shell 0700 shell shell + mkdir /efs 0771 radio system mkdir /modemfs 0771 system system mkdir /mnt/.lfs 0755 root root From 2e25725cd1794434d678d300024f42280c37ed7f Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 19 Nov 2013 14:39:20 -0200 Subject: [PATCH 193/248] fstab: update mount flags for sdcard0 --- rootdir/fstab.samsungjanice | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index d97a450..78322af 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -21,7 +21,7 @@ ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:auto,nonremovable,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file +/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file /devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file From 013c6156af6b1edeeaa6bafb6c58cb9e34244879 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 19 Nov 2013 15:03:30 -0200 Subject: [PATCH 194/248] init: update wpa and p2p --- rootdir/init.samsungjanice.rc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index cb06269..768791e 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -695,18 +695,20 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ - -puse_p2p_group_interface=1 -g@android:wpa_wlan0 + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -O/data/misc/wifi/sockets -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ + -puse_p2p_group_interface=1 \ + -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot service wpa_supplicant /system/bin/wpa_supplicant \ - -Dnl80211 -iwlan0 -e/data/misc/wifi/entropy.bin - -c/data/misc/wifi/wpa_supplicant.conf - -O/data/misc/wifi/sockets -g@android:wpa_wlan0 + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -e/data/misc/wifi/entropy.bin \ + -O/data/misc/wifi/sockets -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled From a2310d82e09579aa33037f878e369c25c5cb38b1 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 19 Nov 2013 18:24:47 -0200 Subject: [PATCH 195/248] fix fuse service --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 768791e..35d40ae 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -777,10 +777,10 @@ service wlandutservice /system/bin/wlandutservice # end of wifi # FUSE sdcard daemon service for sdcard -service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 +service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard0 /storage/sdcard0 class late_start disabled -service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 +service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled From 3b00129626a55fd019648dab20a2e0c41851300a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 19 Nov 2013 18:50:36 -0200 Subject: [PATCH 196/248] fstab: force mounting to /storage dir --- rootdir/fstab.samsungjanice | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 78322af..e85d4d7 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -21,8 +21,8 @@ ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file -/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file +/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file +/devices/sdi0/mmc_host/mmc1/mmc1 /storage/sdcard1 auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file ## Recovery only ## From bc520ad7509e9ba4084f1c1ad5b91fcea293bcc9 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Wed, 20 Nov 2013 14:56:38 +0100 Subject: [PATCH 197/248] fstab: Update fstab to fix storages mounting in KK --- rootdir/fstab.samsungjanice | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index e85d4d7..78322af 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -21,8 +21,8 @@ ## Vold managed volumes ## -/devices/sdi2/mmc_host/mmc0/mmc0 /storage/sdcard0 auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file -/devices/sdi0/mmc_host/mmc1/mmc1 /storage/sdcard1 auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file +/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file +/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file ## Recovery only ## From a77415cdbce4d22ddbb3171e191e0abc9b5827db Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Wed, 20 Nov 2013 14:59:34 +0100 Subject: [PATCH 198/248] init: Update init to fix storages in KK --- rootdir/init.samsungjanice.rc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 35d40ae..010d8d3 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -2,16 +2,16 @@ import /init.samsungjanice.usb.rc on early-init - export EXTERNAL_STORAGE /storage/sdcard0 - export SECONDARY_STORAGE /storage/sdcard1 - + chmod 0701 /mnt/media_rw mkdir /mnt/shell 0700 shell shell mkdir /storage 0550 system sdcard_r mkdir /storage/sdcard0 0700 root root mkdir /storage/sdcard1 0700 root root - chmod 0701 /mnt/media_rw mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw + + export EXTERNAL_STORAGE /storage/sdcard0 + export SECONDARY_STORAGE /storage/sdcard1 mkdir /efs 0771 radio system mkdir /modemfs 0771 system system @@ -780,7 +780,7 @@ service wlandutservice /system/bin/wlandutservice service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard0 /storage/sdcard0 class late_start disabled - + service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled From 4152afde6bfbc2cfb35be73794ec56b8be2954c4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 20 Nov 2013 12:30:24 -0200 Subject: [PATCH 199/248] move early-init block to init --- rootdir/init.samsungjanice.rc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 010d8d3..d5e7300 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,6 +1,6 @@ import /init.samsungjanice.usb.rc -on early-init +on init chmod 0701 /mnt/media_rw mkdir /mnt/shell 0700 shell shell @@ -27,9 +27,7 @@ on early-init write /sys/kernel/mm/ksm/pages_to_scan 100 write /sys/kernel/mm/ksm/sleep_millisecs 500 write /sys/kernel/mm/ksm/run 1 - -on init - + # setup the global environment export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib From e1de067b31e05f9ea73ebc46da8ae41f6c4cb096 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 20 Nov 2013 17:21:44 -0200 Subject: [PATCH 200/248] remove unneeded / conflictive lines --- rootdir/init.samsungjanice.rc | 3 --- 1 file changed, 3 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index d5e7300..cd7d218 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -2,9 +2,6 @@ import /init.samsungjanice.usb.rc on init - chmod 0701 /mnt/media_rw - mkdir /mnt/shell 0700 shell shell - mkdir /storage 0550 system sdcard_r mkdir /storage/sdcard0 0700 root root mkdir /storage/sdcard1 0700 root root mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw From 0705aa40d3780f08397f575113e16732af32728c Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 20 Nov 2013 17:29:49 -0200 Subject: [PATCH 201/248] derive file permissions based on path --- rootdir/init.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index cd7d218..dabf9c9 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -772,10 +772,10 @@ service wlandutservice /system/bin/wlandutservice # end of wifi # FUSE sdcard daemon service for sdcard -service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard0 /storage/sdcard0 +service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 class late_start disabled -service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 /mnt/media_rw/sdcard1 /storage/sdcard1 +service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled From 8a2130018b9b84f906f09cf05ff2f808e739ddd4 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 20 Nov 2013 17:04:46 -0300 Subject: [PATCH 202/248] move include to common --- BoardConfig.mk | 1 - include/hardware/copybit.h | 251 ---------- include/hardware/gps.h | 952 ------------------------------------- 3 files changed, 1204 deletions(-) delete mode 100644 include/hardware/copybit.h delete mode 100644 include/hardware/gps.h diff --git a/BoardConfig.mk b/BoardConfig.mk index 589847a..db06c9c 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -1,6 +1,5 @@ -include device/samsung/u8500-common/BoardCommonConfig.mk -TARGET_SPECIFIC_HEADER_PATH := device/samsung/janice/include TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 # Kernel diff --git a/include/hardware/copybit.h b/include/hardware/copybit.h deleted file mode 100644 index 1b93eab..0000000 --- a/include/hardware/copybit.h +++ /dev/null @@ -1,251 +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. - */ - -#ifndef ANDROID_COPYBIT_INTERFACE_H -#define ANDROID_COPYBIT_INTERFACE_H - -#include - -#include -#include -#include - -__BEGIN_DECLS - -/** - * The id of this module - */ -#define COPYBIT_HARDWARE_MODULE_ID "copybit" - -/** - * Name of the graphics device to open - */ -#define COPYBIT_HARDWARE_COPYBIT0 "copybit0" - -/* supported pixel-formats. these must be compatible with - * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h - */ -enum { - COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, - COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, - COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, - COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, - COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, - COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, - COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, - COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP, - COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP, - COPYBIT_FORMAT_YCbCr_420_P = HAL_PIXEL_FORMAT_YCbCr_420_P, - /* STE: Added Support for YUV42XMBN, required for Copybit CC acceleration */ - COPYBIT_FORMAT_YCBCR42XMBN = HAL_PIXEL_FORMAT_YCBCR42XMBN, - /* STE: Added for YCbCr422R -> RGB888 use-case */ - COPYBIT_FORMAT_YCbCr_422_I = HAL_PIXEL_FORMAT_YCbCr_422_I, -}; - -/* name for copybit_set_parameter */ -enum { - /* rotation of the source image in degrees (0 to 359) */ - COPYBIT_ROTATION_DEG = 1, - /* plane alpha value */ - COPYBIT_PLANE_ALPHA = 2, - /* enable or disable dithering */ - COPYBIT_DITHER = 3, - /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */ - COPYBIT_TRANSFORM = 4, - /* blurs the copied bitmap. The amount of blurring cannot be changed - * at this time. */ - COPYBIT_BLUR = 5 -}; - -/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */ -enum { - /* flip source image horizontally */ - COPYBIT_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H, - /* flip source image vertically */ - COPYBIT_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V, - /* rotate source image 90 degres */ - COPYBIT_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90, - /* rotate source image 180 degres */ - COPYBIT_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180, - /* rotate source image 270 degres */ - COPYBIT_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, -}; - -/* enable/disable value copybit_set_parameter */ -enum { - COPYBIT_DISABLE = 0, - COPYBIT_ENABLE = 1 -}; - -/* use get_static_info() to query static informations about the hardware */ -enum { - /* Maximum amount of minification supported by the hardware*/ - COPYBIT_MINIFICATION_LIMIT = 1, - /* Maximum amount of magnification supported by the hardware */ - COPYBIT_MAGNIFICATION_LIMIT = 2, - /* Number of fractional bits support by the scaling engine */ - COPYBIT_SCALING_FRAC_BITS = 3, - /* Supported rotation step in degres. */ - COPYBIT_ROTATION_STEP_DEG = 4, -}; - -/* Image structure */ -struct copybit_image_t { - /* width */ - uint32_t w; - /* height */ - uint32_t h; - /* format COPYBIT_FORMAT_xxx */ - int32_t format; - /* base of buffer with image */ - void *base; - /* handle to the image */ - native_handle_t* handle; -}; - -/* Rectangle */ -struct copybit_rect_t { - /* left */ - int l; - /* top */ - int t; - /* right */ - int r; - /* bottom */ - int b; -}; - -/* Color (components in range 0-255) */ -struct copybit_color_t { - /* Red */ - uint8_t r; - /* Green */ - uint8_t g; - /* Blue */ - uint8_t b; - /* Alpha */ - uint8_t a; -}; - -/* Region */ -struct copybit_region_t { - int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect); -}; - -/** - * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM - * and the fields of this data structure must begin with hw_module_t - * followed by module specific information. - */ -struct copybit_module_t { - struct hw_module_t common; -}; - -/** - * Every device data structure must begin with hw_device_t - * followed by module specific public methods and attributes. - */ -struct copybit_device_t { - struct hw_device_t common; - - /** - * Set a copybit parameter. - * - * @param dev from open - * @param name one for the COPYBIT_NAME_xxx - * @param value one of the COPYBIT_VALUE_xxx - * - * @return 0 if successful - */ - int (*set_parameter)(struct copybit_device_t *dev, int name, int value); - - /** - * Get a static copybit information. - * - * @param dev from open - * @param name one of the COPYBIT_STATIC_xxx - * - * @return value or -EINVAL if error - */ - int (*get)(struct copybit_device_t *dev, int name); - - /** - * Execute the bit blit copy operation - * - * @param dev from open - * @param dst is the destination image - * @param src is the source image - * @param region the clip region - * - * @return 0 if successful - */ - int (*blit)(struct copybit_device_t *dev, - struct copybit_image_t const *dst, - struct copybit_image_t const *src, - struct copybit_region_t const *region); - - /** - * Execute the stretch bit blit copy operation - * - * @param dev from open - * @param dst is the destination image - * @param src is the source image - * @param dst_rect is the destination rectangle - * @param src_rect is the source rectangle - * @param region the clip region - * - * @return 0 if successful - */ - int (*stretch)(struct copybit_device_t *dev, - struct copybit_image_t const *dst, - struct copybit_image_t const *src, - struct copybit_rect_t const *dst_rect, - struct copybit_rect_t const *src_rect, - struct copybit_region_t const *region); - - /** - * Execute the fill bit blit operation - * - * @param dev from open - * @param dst is the destination image - * @param rect is the destination rectangle - * @param color is the fill color - * @param region the clip region - */ - int (*fill)(struct copybit_device_t *dev, - struct copybit_image_t *dst, - struct copybit_rect_t *rect, - struct copybit_color_t *color, - struct copybit_region_t *region); -}; - - -/** convenience API for opening and closing a device */ - -static inline int copybit_open(const struct hw_module_t* module, - struct copybit_device_t** device) { - return module->methods->open(module, - COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device); -} - -static inline int copybit_close(struct copybit_device_t* device) { - return device->common.close(&device->common); -} - - -__END_DECLS - -#endif // ANDROID_COPYBIT_INTERFACE_H diff --git a/include/hardware/gps.h b/include/hardware/gps.h deleted file mode 100644 index a86ee59..0000000 --- a/include/hardware/gps.h +++ /dev/null @@ -1,952 +0,0 @@ -/* - * Copyright (C) 2010 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. - */ - -#ifndef ANDROID_INCLUDE_HARDWARE_GPS_H -#define ANDROID_INCLUDE_HARDWARE_GPS_H - -#include -#include -#include -#include - -#include - -__BEGIN_DECLS - -/** - * The id of this module - */ -#define GPS_HARDWARE_MODULE_ID "gps" - - -/** Milliseconds since January 1, 1970 */ -typedef int64_t GpsUtcTime; - -/** Maximum number of SVs for gps_sv_status_callback(). */ -#define GPS_MAX_SVS 32 - -/** Requested operational mode for GPS operation. */ -typedef uint32_t GpsPositionMode; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** Mode for running GPS standalone (no assistance). */ -#define GPS_POSITION_MODE_STANDALONE 0 -/** AGPS MS-Based mode. */ -#define GPS_POSITION_MODE_MS_BASED 1 -/** AGPS MS-Assisted mode. */ -#define GPS_POSITION_MODE_MS_ASSISTED 2 - -/** Requested recurrence mode for GPS operation. */ -typedef uint32_t GpsPositionRecurrence; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** Receive GPS fixes on a recurring basis at a specified period. */ -#define GPS_POSITION_RECURRENCE_PERIODIC 0 -/** Request a single shot GPS fix. */ -#define GPS_POSITION_RECURRENCE_SINGLE 1 - -/** GPS status event values. */ -typedef uint16_t GpsStatusValue; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** GPS status unknown. */ -#define GPS_STATUS_NONE 0 -/** GPS has begun navigating. */ -#define GPS_STATUS_SESSION_BEGIN 1 -/** GPS has stopped navigating. */ -#define GPS_STATUS_SESSION_END 2 -/** GPS has powered on but is not navigating. */ -#define GPS_STATUS_ENGINE_ON 3 -/** GPS is powered off. */ -#define GPS_STATUS_ENGINE_OFF 4 - -/** Flags to indicate which values are valid in a GpsLocation. */ -typedef uint16_t GpsLocationFlags; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -/** GpsLocation has valid latitude and longitude. */ -#define GPS_LOCATION_HAS_LAT_LONG 0x0001 -/** GpsLocation has valid altitude. */ -#define GPS_LOCATION_HAS_ALTITUDE 0x0002 -/** GpsLocation has valid speed. */ -#define GPS_LOCATION_HAS_SPEED 0x0004 -/** GpsLocation has valid bearing. */ -#define GPS_LOCATION_HAS_BEARING 0x0008 -/** GpsLocation has valid accuracy. */ -#define GPS_LOCATION_HAS_ACCURACY 0x0010 - -/** Flags for the gps_set_capabilities callback. */ - -/** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. - If this is not set, then the framework will use 1000ms for min_interval - and will start and call start() and stop() to schedule the GPS. - */ -#define GPS_CAPABILITY_SCHEDULING 0x0000001 -/** GPS supports MS-Based AGPS mode */ -#define GPS_CAPABILITY_MSB 0x0000002 -/** GPS supports MS-Assisted AGPS mode */ -#define GPS_CAPABILITY_MSA 0x0000004 -/** GPS supports single-shot fixes */ -#define GPS_CAPABILITY_SINGLE_SHOT 0x0000008 -/** GPS supports on demand time injection */ -#define GPS_CAPABILITY_ON_DEMAND_TIME 0x0000010 -/** GPS supports Geofencing */ -#define GPS_CAPABILITY_GEOFENCING 0x0000020 - -/** Flags used to specify which aiding data to delete - when calling delete_aiding_data(). */ -typedef uint16_t GpsAidingData; -// IMPORTANT: Note that the following values must match -// constants in GpsLocationProvider.java. -#define GPS_DELETE_EPHEMERIS 0x0001 -#define GPS_DELETE_ALMANAC 0x0002 -#define GPS_DELETE_POSITION 0x0004 -#define GPS_DELETE_TIME 0x0008 -#define GPS_DELETE_IONO 0x0010 -#define GPS_DELETE_UTC 0x0020 -#define GPS_DELETE_HEALTH 0x0040 -#define GPS_DELETE_SVDIR 0x0080 -#define GPS_DELETE_SVSTEER 0x0100 -#define GPS_DELETE_SADATA 0x0200 -#define GPS_DELETE_RTI 0x0400 -#define GPS_DELETE_CELLDB_INFO 0x8000 -#define GPS_DELETE_ALL 0xFFFF - -/** AGPS type */ -typedef uint16_t AGpsType; -#define AGPS_TYPE_SUPL 1 -#define AGPS_TYPE_C2K 2 - -typedef uint16_t AGpsSetIDType; -#define AGPS_SETID_TYPE_NONE 0 -#define AGPS_SETID_TYPE_IMSI 1 -#define AGPS_SETID_TYPE_MSISDN 2 - -/** - * String length constants - */ -#define GPS_NI_SHORT_STRING_MAXLEN 256 -#define GPS_NI_LONG_STRING_MAXLEN 2048 - -/** - * GpsNiType constants - */ -typedef uint32_t GpsNiType; -#define GPS_NI_TYPE_VOICE 1 -#define GPS_NI_TYPE_UMTS_SUPL 2 -#define GPS_NI_TYPE_UMTS_CTRL_PLANE 3 - -/** - * GpsNiNotifyFlags constants - */ -typedef uint32_t GpsNiNotifyFlags; -/** NI requires notification */ -#define GPS_NI_NEED_NOTIFY 0x0001 -/** NI requires verification */ -#define GPS_NI_NEED_VERIFY 0x0002 -/** NI requires privacy override, no notification/minimal trace */ -#define GPS_NI_PRIVACY_OVERRIDE 0x0004 - -/** - * GPS NI responses, used to define the response in - * NI structures - */ -typedef int GpsUserResponseType; -#define GPS_NI_RESPONSE_ACCEPT 1 -#define GPS_NI_RESPONSE_DENY 2 -#define GPS_NI_RESPONSE_NORESP 3 - -/** - * NI data encoding scheme - */ -typedef int GpsNiEncodingType; -#define GPS_ENC_NONE 0 -#define GPS_ENC_SUPL_GSM_DEFAULT 1 -#define GPS_ENC_SUPL_UTF8 2 -#define GPS_ENC_SUPL_UCS2 3 -#define GPS_ENC_UNKNOWN -1 - -/** AGPS status event values. */ -typedef uint16_t AGpsStatusValue; -/** GPS requests data connection for AGPS. */ -#define GPS_REQUEST_AGPS_DATA_CONN 1 -/** GPS releases the AGPS data connection. */ -#define GPS_RELEASE_AGPS_DATA_CONN 2 -/** AGPS data connection initiated */ -#define GPS_AGPS_DATA_CONNECTED 3 -/** AGPS data connection completed */ -#define GPS_AGPS_DATA_CONN_DONE 4 -/** AGPS data connection failed */ -#define GPS_AGPS_DATA_CONN_FAILED 5 - -#define AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 -#define AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 -#define AGPS_REG_LOCATION_TYPE_MAC 3 - -/** Network types for update_network_state "type" parameter */ -#define AGPS_RIL_NETWORK_TYPE_MOBILE 0 -#define AGPS_RIL_NETWORK_TYPE_WIFI 1 -#define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 -#define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 -#define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 -#define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 -#define AGPS_RIL_NETWORK_TTYPE_WIMAX 6 - -/** - * Name for the GPS XTRA interface. - */ -#define GPS_XTRA_INTERFACE "gps-xtra" - -/** - * Name for the GPS DEBUG interface. - */ -#define GPS_DEBUG_INTERFACE "gps-debug" - -/** - * Name for the AGPS interface. - */ -#define AGPS_INTERFACE "agps" - -/** - * Name for NI interface - */ -#define GPS_NI_INTERFACE "gps-ni" - -/** - * Name for the AGPS-RIL interface. - */ -#define AGPS_RIL_INTERFACE "agps_ril" - -/** - * Name for the GPS_Geofencing interface. - */ -#define GPS_GEOFENCING_INTERFACE "gps_geofencing" - -/** - * The GPS chipset can use Psc for AGPS. - */ -#define AGPS_USE_PSC - -/** Represents a location. */ -typedef struct { - /** set to sizeof(GpsLocation) */ - size_t size; - /** Contains GpsLocationFlags bits. */ - uint16_t flags; - /** Represents latitude in degrees. */ - double latitude; - /** Represents longitude in degrees. */ - double longitude; - /** Represents altitude in meters above the WGS 84 reference - * ellipsoid. */ - double altitude; - /** Represents speed in meters per second. */ - float speed; - /** Represents heading in degrees. */ - float bearing; - /** Represents expected accuracy in meters. */ - float accuracy; - /** Timestamp for the location fix. */ - GpsUtcTime timestamp; -} GpsLocation; - -/** Represents the status. */ -typedef struct { - /** set to sizeof(GpsStatus) */ - size_t size; - GpsStatusValue status; -} GpsStatus; - -/** Represents SV information. */ -typedef struct { - /** set to sizeof(GpsSvInfo) */ - size_t size; - /** Pseudo-random number for the SV. */ - int prn; - /** Signal to noise ratio. */ - float snr; - /** Elevation of SV in degrees. */ - float elevation; - /** Azimuth of SV in degrees. */ - float azimuth; - /** Unknown field in Samsung I9100 libgps - May be an indicator for constellation type - (GPS, GLONASS, Galileo)? - Used on GT-I9100, likely also present on GT-N7000, - SGH-I717, SGH-I727 but this needs confirmation. - */ - int unknown_samsung_field; -} GpsSvInfo; - -/** Represents SV status. */ -typedef struct { - /** set to sizeof(GpsSvStatus) */ - size_t size; - - /** Number of SVs currently visible. */ - int num_svs; - - /** Contains an array of SV information. */ - GpsSvInfo sv_list[GPS_MAX_SVS]; - - /** Represents a bit mask indicating which SVs - * have ephemeris data. - */ - uint32_t ephemeris_mask; - - /** Represents a bit mask indicating which SVs - * have almanac data. - */ - uint32_t almanac_mask; - - /** - * Represents a bit mask indicating which SVs - * were used for computing the most recent position fix. - */ - uint32_t used_in_fix_mask; -} GpsSvStatus; - -/* 2G and 3G */ -/* In 3G lac is discarded */ -typedef struct { - uint16_t type; - uint16_t mcc; - uint16_t mnc; - uint16_t lac; -#ifdef AGPS_USE_PSC - uint16_t psc; -#endif - uint32_t cid; -} AGpsRefLocationCellID; - -typedef struct { - uint8_t mac[6]; -} AGpsRefLocationMac; - -/** Represents ref locations */ -typedef struct { - uint16_t type; - union { - AGpsRefLocationCellID cellID; - AGpsRefLocationMac mac; - } u; -} AGpsRefLocation; - -/** Callback with location information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_location_callback)(GpsLocation* location); - -/** Callback with status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_status_callback)(GpsStatus* status); - -/** Callback with SV status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); - -/** Callback for reporting NMEA sentences. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); - -/** Callback to inform framework of the GPS engine's capabilities. - * Capability parameter is a bit field of GPS_CAPABILITY_* flags. - */ -typedef void (* gps_set_capabilities)(uint32_t capabilities); - -/** Callback utility for acquiring the GPS wakelock. - * This can be used to prevent the CPU from suspending while handling GPS events. - */ -typedef void (* gps_acquire_wakelock)(); - -/** Callback utility for releasing the GPS wakelock. */ -typedef void (* gps_release_wakelock)(); - -/** Callback for requesting NTP time */ -typedef void (* gps_request_utc_time)(); - -/** Callback for creating a thread that can call into the Java framework code. - * This must be used to create any threads that report events up to the framework. - */ -typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); - -/** GPS callback structure. */ -typedef struct { - /** set to sizeof(GpsCallbacks) */ - size_t size; - gps_location_callback location_cb; - gps_status_callback status_cb; - gps_sv_status_callback sv_status_cb; - gps_nmea_callback nmea_cb; - gps_set_capabilities set_capabilities_cb; - gps_acquire_wakelock acquire_wakelock_cb; - gps_release_wakelock release_wakelock_cb; - gps_create_thread create_thread_cb; - gps_request_utc_time request_utc_time_cb; -} GpsCallbacks; - - -/** Represents the standard GPS interface. */ -typedef struct { - /** set to sizeof(GpsInterface) */ - size_t size; - /** - * Opens the interface and provides the callback routines - * to the implemenation of this interface. - */ - int (*init)( GpsCallbacks* callbacks ); - - /** Starts navigating. */ - int (*start)( void ); - - /** Stops navigating. */ - int (*stop)( void ); - - /** Closes the interface. */ - void (*cleanup)( void ); - - /** Injects the current time. */ - int (*inject_time)(GpsUtcTime time, int64_t timeReference, - int uncertainty); - - /** Injects current location from another location provider - * (typically cell ID). - * latitude and longitude are measured in degrees - * expected accuracy is measured in meters - */ - int (*inject_location)(double latitude, double longitude, float accuracy); - - /** - * Specifies that the next call to start will not use the - * information defined in the flags. GPS_DELETE_ALL is passed for - * a cold start. - */ - void (*delete_aiding_data)(GpsAidingData flags); - - /** - * min_interval represents the time between fixes in milliseconds. - * preferred_accuracy represents the requested fix accuracy in meters. - * preferred_time represents the requested time to first fix in milliseconds. - */ - int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, - uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); - - /** Get a pointer to extension information. */ - const void* (*get_extension)(const char* name); -} GpsInterface; - -/** Callback to request the client to download XTRA data. - * The client should download XTRA data and inject it by calling inject_xtra_data(). - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* gps_xtra_download_request)(); - -/** Callback structure for the XTRA interface. */ -typedef struct { - gps_xtra_download_request download_request_cb; - gps_create_thread create_thread_cb; -} GpsXtraCallbacks; - -/** Extended interface for XTRA support. */ -typedef struct { - /** set to sizeof(GpsXtraInterface) */ - size_t size; - /** - * Opens the XTRA interface and provides the callback routines - * to the implemenation of this interface. - */ - int (*init)( GpsXtraCallbacks* callbacks ); - /** Injects XTRA data into the GPS. */ - int (*inject_xtra_data)( char* data, int length ); -} GpsXtraInterface; - -/** Extended interface for DEBUG support. */ -typedef struct { - /** set to sizeof(GpsDebugInterface) */ - size_t size; - - /** - * This function should return any information that the native - * implementation wishes to include in a bugreport. - */ - size_t (*get_internal_state)(char* buffer, size_t bufferSize); -} GpsDebugInterface; - -/** Represents the status of AGPS. */ -typedef struct { - /** set to sizeof(AGpsStatus) */ - size_t size; - - AGpsType type; - AGpsStatusValue status; - uint32_t ipaddr; -} AGpsStatus; - -/** Callback with AGPS status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* agps_status_callback)(AGpsStatus* status); - -/** Callback structure for the AGPS interface. */ -typedef struct { - agps_status_callback status_cb; - gps_create_thread create_thread_cb; -} AGpsCallbacks; - - -/** Extended interface for AGPS support. */ -typedef struct { - /** set to sizeof(AGpsInterface) */ - size_t size; - - /** - * Opens the AGPS interface and provides the callback routines - * to the implemenation of this interface. - */ - void (*init)( AGpsCallbacks* callbacks ); - /** - * Notifies that a data connection is available and sets - * the name of the APN to be used for SUPL. - */ - int (*data_conn_open)( const char* apn ); - /** - * Notifies that the AGPS data connection has been closed. - */ - int (*data_conn_closed)(); - /** - * Notifies that a data connection is not available for AGPS. - */ - int (*data_conn_failed)(); - /** - * Sets the hostname and port for the AGPS server. - */ - int (*set_server)( AGpsType type, const char* hostname, int port ); -} AGpsInterface; - - -/** Represents an NI request */ -typedef struct { - /** set to sizeof(GpsNiNotification) */ - size_t size; - - /** - * An ID generated by HAL to associate NI notifications and UI - * responses - */ - int notification_id; - - /** - * An NI type used to distinguish different categories of NI - * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ... - */ - GpsNiType ni_type; - - /** - * Notification/verification options, combinations of GpsNiNotifyFlags constants - */ - GpsNiNotifyFlags notify_flags; - - /** - * Timeout period to wait for user response. - * Set to 0 for no time out limit. - */ - int timeout; - - /** - * Default response when time out. - */ - GpsUserResponseType default_response; - - /** - * Requestor ID - */ - char requestor_id[GPS_NI_SHORT_STRING_MAXLEN]; - - /** - * Notification message. It can also be used to store client_id in some cases - */ - char text[GPS_NI_LONG_STRING_MAXLEN]; - - /** - * Client name decoding scheme - */ - GpsNiEncodingType requestor_id_encoding; - - /** - * Client name decoding scheme - */ - GpsNiEncodingType text_encoding; - - /** - * A pointer to extra data. Format: - * key_1 = value_1 - * key_2 = value_2 - */ - char extras[GPS_NI_LONG_STRING_MAXLEN]; - -} GpsNiNotification; - -/** Callback with NI notification. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification); - -/** GPS NI callback structure. */ -typedef struct -{ - /** - * Sends the notification request from HAL to GPSLocationProvider. - */ - gps_ni_notify_callback notify_cb; - gps_create_thread create_thread_cb; -} GpsNiCallbacks; - -/** - * Extended interface for Network-initiated (NI) support. - */ -typedef struct -{ - /** set to sizeof(GpsNiInterface) */ - size_t size; - - /** Registers the callbacks for HAL to use. */ - void (*init) (GpsNiCallbacks *callbacks); - - /** Sends a response to HAL. */ - void (*respond) (int notif_id, GpsUserResponseType user_response); -} GpsNiInterface; - -struct gps_device_t { - struct hw_device_t common; - - /** - * Set the provided lights to the provided values. - * - * Returns: 0 on succes, error code on failure. - */ - const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev); -}; - -#define AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) -#define AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) - -#define AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) -#define AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) - -typedef void (*agps_ril_request_set_id)(uint32_t flags); -typedef void (*agps_ril_request_ref_loc)(uint32_t flags); - -typedef struct { - agps_ril_request_set_id request_setid; - agps_ril_request_ref_loc request_refloc; - gps_create_thread create_thread_cb; -} AGpsRilCallbacks; - -/** Extended interface for AGPS_RIL support. */ -typedef struct { - /** set to sizeof(AGpsRilInterface) */ - size_t size; - /** - * Opens the AGPS interface and provides the callback routines - * to the implemenation of this interface. - */ - void (*init)( AGpsRilCallbacks* callbacks ); - - /** - * Sets the reference location. - */ - void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct); - /** - * Sets the set ID. - */ - void (*set_set_id) (AGpsSetIDType type, const char* setid); - - /** - * Send network initiated message. - */ - void (*ni_message) (uint8_t *msg, size_t len); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_availability) (int avaiable, const char* apn); -} AGpsRilInterface; - -/** - * GPS Geofence. - * There are 3 states associated with a Geofence: Inside, Outside, Unknown. - * There are 3 transitions: ENTERED, EXITED, UNCERTAIN. - * - * An example state diagram with confidence level: 95% and Unknown time limit - * set as 30 secs is shown below. (confidence level and Unknown time limit are - * explained latter) - * ____________________________ - * | Unknown (30 secs) | - * """""""""""""""""""""""""""" - * ^ | | ^ - * UNCERTAIN| |ENTERED EXITED| |UNCERTAIN - * | v v | - * ________ EXITED _________ - * | Inside | -----------> | Outside | - * | | <----------- | | - * """""""" ENTERED """"""""" - * - * Inside state: We are 95% confident that the user is inside the geofence. - * Outside state: We are 95% confident that the user is outside the geofence - * Unknown state: Rest of the time. - * - * The Unknown state is better explained with an example: - * - * __________ - * | c| - * | ___ | _______ - * | |a| | | b | - * | """ | """"""" - * | | - * """""""""" - * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy - * circle reported by the GPS subsystem. Now with regard to "b", the system is - * confident that the user is outside. But with regard to "a" is not confident - * whether it is inside or outside the geofence. If the accuracy remains the - * same for a sufficient period of time, the UNCERTAIN transition would be - * triggered with the state set to Unknown. If the accuracy improves later, an - * appropriate transition should be triggered. This "sufficient period of time" - * is defined by the parameter in the add_geofence_area API. - * In other words, Unknown state can be interpreted as a state in which the - * GPS subsystem isn't confident enough that the user is either inside or - * outside the Geofence. It moves to Unknown state only after the expiry of the - * timeout. - * - * The geofence callback needs to be triggered for the ENTERED and EXITED - * transitions, when the GPS system is confident that the user has entered - * (Inside state) or exited (Outside state) the Geofence. An implementation - * which uses a value of 95% as the confidence is recommended. The callback - * should be triggered only for the transitions requested by the - * add_geofence_area call. - * - * Even though the diagram and explanation talks about states and transitions, - * the callee is only interested in the transistions. The states are mentioned - * here for illustrative purposes. - * - * Startup Scenario: When the device boots up, if an application adds geofences, - * and then we get an accurate GPS location fix, it needs to trigger the - * appropriate (ENTERED or EXITED) transition for every Geofence it knows about. - * By default, all the Geofences will be in the Unknown state. - * - * When the GPS system is unavailable, gps_geofence_status_callback should be - * called to inform the upper layers of the same. Similarly, when it becomes - * available the callback should be called. This is a global state while the - * UNKNOWN transition described above is per geofence. - * - * An important aspect to note is that users of this API (framework), will use - * other subsystems like wifi, sensors, cell to handle Unknown case and - * hopefully provide a definitive state transition to the third party - * application. GPS Geofence will just be a signal indicating what the GPS - * subsystem knows about the Geofence. - * - */ -#define GPS_GEOFENCE_ENTERED (1<<0L) -#define GPS_GEOFENCE_EXITED (1<<1L) -#define GPS_GEOFENCE_UNCERTAIN (1<<2L) - -#define GPS_GEOFENCE_UNAVAILABLE (1<<0L) -#define GPS_GEOFENCE_AVAILABLE (1<<1L) - -#define GPS_GEOFENCE_OPERATION_SUCCESS 0 -#define GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES -100 -#define GPS_GEOFENCE_ERROR_ID_EXISTS -101 -#define GPS_GEOFENCE_ERROR_ID_UNKNOWN -102 -#define GPS_GEOFENCE_ERROR_INVALID_TRANSITION -103 -#define GPS_GEOFENCE_ERROR_GENERIC -149 - -/** - * The callback associated with the geofence. - * Parameters: - * geofence_id - The id associated with the add_geofence_area. - * location - The current GPS location. - * transition - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED, - * GPS_GEOFENCE_UNCERTAIN. - * timestamp - Timestamp when the transition was detected. - * - * The callback should only be called when the caller is interested in that - * particular transition. For instance, if the caller is interested only in - * ENTERED transition, then the callback should NOT be called with the EXITED - * transition. - * - * IMPORTANT: If a transition is triggered resulting in this callback, the GPS - * subsystem will wake up the application processor, if its in suspend state. - */ -typedef void (*gps_geofence_transition_callback) (int32_t geofence_id, GpsLocation* location, - int32_t transition, GpsUtcTime timestamp); - -/** - * The callback associated with the availablity of the GPS system for geofencing - * monitoring. If the GPS system determines that it cannot monitor geofences - * because of lack of reliability or unavailability of the GPS signals, it will - * call this callback with GPS_GEOFENCE_UNAVAILABLE parameter. - * - * Parameters: - * status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE. - * last_location - Last known location. - */ -typedef void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location); - -/** - * The callback associated with the add_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - GPS_GEOFENCE_OPERATION_SUCCESS - * GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES - geofence limit has been reached. - * GPS_GEOFENCE_ERROR_ID_EXISTS - geofence with id already exists - * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - the monitorTransition contains an - * invalid transition - * GPS_GEOFENCE_ERROR_GENERIC - for other errors. - */ -typedef void (*gps_geofence_add_callback) (int32_t geofence_id, int32_t status); - -/** - * The callback associated with the remove_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - GPS_GEOFENCE_OPERATION_SUCCESS - * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*gps_geofence_remove_callback) (int32_t geofence_id, int32_t status); - - -/** - * The callback associated with the pause_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - GPS_GEOFENCE_OPERATION_SUCCESS - * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - - * when monitor_transitions is invalid - * GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*gps_geofence_pause_callback) (int32_t geofence_id, int32_t status); - -/** - * The callback associated with the resume_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - GPS_GEOFENCE_OPERATION_SUCCESS - * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*gps_geofence_resume_callback) (int32_t geofence_id, int32_t status); - -typedef struct { - gps_geofence_transition_callback geofence_transition_callback; - gps_geofence_status_callback geofence_status_callback; - gps_geofence_add_callback geofence_add_callback; - gps_geofence_remove_callback geofence_remove_callback; - gps_geofence_pause_callback geofence_pause_callback; - gps_geofence_resume_callback geofence_resume_callback; - gps_create_thread create_thread_cb; -} GpsGeofenceCallbacks; - -/** Extended interface for GPS_Geofencing support */ -typedef struct { - /** set to sizeof(GpsGeofencingInterface) */ - size_t size; - - /** - * Opens the geofence interface and provides the callback routines - * to the implemenation of this interface. - */ - void (*init)( GpsGeofenceCallbacks* callbacks ); - - /** - * Add a geofence area. This api currently supports circular geofences. - * Parameters: - * geofence_id - The id for the geofence. If a geofence with this id - * already exists, an error value (GPS_GEOFENCE_ERROR_ID_EXISTS) - * should be returned. - * latitude, longtitude, radius_meters - The lat, long and radius - * (in meters) for the geofence - * last_transition - The current state of the geofence. For example, if - * the system already knows that the user is inside the geofence, - * this will be set to GPS_GEOFENCE_ENTERED. In most cases, it - * will be GPS_GEOFENCE_UNCERTAIN. - * monitor_transition - Which transitions to monitor. Bitwise OR of - * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and - * GPS_GEOFENCE_UNCERTAIN. - * notification_responsiveness_ms - Defines the best-effort description - * of how soon should the callback be called when the transition - * associated with the Geofence is triggered. For instance, if set - * to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback - * should be called 1000 milliseconds within entering the geofence. - * This parameter is defined in milliseconds. - * NOTE: This is not to be confused with the rate that the GPS is - * polled at. It is acceptable to dynamically vary the rate of - * sampling the GPS for power-saving reasons; thus the rate of - * sampling may be faster or slower than this. - * unknown_timer_ms - The time limit after which the UNCERTAIN transition - * should be triggered. This paramter is defined in milliseconds. - * See above for a detailed explanation. - */ - void (*add_geofence_area) (int32_t geofence_id, double latitude, - double longitude, double radius_meters, - int last_transition, int monitor_transitions, - int notification_responsiveness_ms, - int unknown_timer_ms); - - /** - * Pause monitoring a particular geofence. - * Parameters: - * geofence_id - The id for the geofence. - */ - void (*pause_geofence) (int32_t geofence_id); - - /** - * Resume monitoring a particular geofence. - * Parameters: - * geofence_id - The id for the geofence. - * monitor_transitions - Which transitions to monitor. Bitwise OR of - * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and - * GPS_GEOFENCE_UNCERTAIN. - * This supersedes the value associated provided in the - * add_geofence_area call. - */ - void (*resume_geofence) (int32_t geofence_id, int monitor_transitions); - - /** - * Remove a geofence area. After the function returns, no notifications - * should be sent. - * Parameter: - * geofence_id - The id for the geofence. - */ - void (*remove_geofence_area) (int32_t geofence_id); -} GpsGeofencingInterface; -__END_DECLS - -#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ From 6ce49ecb2e77f2db94ca7da7ba6a0a6bfd9895db Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 28 Nov 2013 11:13:44 -0200 Subject: [PATCH 203/248] additional configuration file flag, disable scan offload --- rootdir/init.samsungjanice.rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index dabf9c9..2bcf64b 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -691,6 +691,7 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/p2p_supplicant_overlay.conf \ -O/data/misc/wifi/sockets -N \ -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ -puse_p2p_group_interface=1 \ @@ -702,6 +703,7 @@ service p2p_supplicant /system/bin/wpa_supplicant \ service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ -e/data/misc/wifi/entropy.bin \ -O/data/misc/wifi/sockets -g@android:wpa_wlan0 class main From 1a3490541f854723d788e5128a01f7ec6e1cde1e Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 3 Dec 2013 17:41:47 +0100 Subject: [PATCH 204/248] This lines are now in common --- janice.mk | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/janice.mk b/janice.mk index c3f5384..388ec78 100644 --- a/janice.mk +++ b/janice.mk @@ -1,7 +1,6 @@ # Include common makefile $(call inherit-product, device/samsung/u8500-common/common.mk) - ifneq ($(TARGET_SCREEN_HEIGHT),800) # Call cm.mk because somehow it's not being called! $(call inherit-product, device/samsung/janice/cm.mk) @@ -12,10 +11,6 @@ LOCAL_PATH := device/samsung/janice # Overlay DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay -# This device is HDPI -PRODUCT_AAPT_CONFIG := normal hdpi -PRODUCT_AAPT_PREF_CONFIG := hdpi - # STE PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh @@ -27,29 +22,13 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/tee/libbassapp_ssw:system/lib/tee/libbassapp_ssw \ $(LOCAL_PATH)/tee/smcl_ta_8500bx_secure.ssw:system/lib/tee/smcl_ta_8500bx_secure.ssw -# RIL -PRODUCT_PROPERTY_OVERRIDES += \ - mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ - ro.telephony.default_network=0 \ - ro.telephony.ril_class=SamsungU8500RIL \ - ro.telephony.sends_barcount=1 - -# CM 11 Required lines -PRODUCT_PROPERTY_OVERRIDES += \ - ro.zygote.disable_gl_preload=1 \ - ro.bq.gpu_to_cpu_unsupported=1 \ - ro.boot.selinux=disabled - # Enable AAC 5.1 output PRODUCT_PROPERTY_OVERRIDES += \ media.aac_51_output_enabled=true -PRODUCT_TAGS += dalvik.gc.type-precise - # Packages PRODUCT_PACKAGES += \ GalaxySAdvanceSettings \ - CMAccount \ Stk \ org.cyanogenmod.hardware \ org.cyanogenmod.hardware.xml From 34abfe87859f3491d3660bc618d2b58e736ea8ca Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 3 Dec 2013 18:07:51 +0100 Subject: [PATCH 205/248] Add janice hardware info --- system.prop | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/system.prop b/system.prop index 5f74176..b4323ae 100644 --- a/system.prop +++ b/system.prop @@ -35,3 +35,11 @@ ste.cam.back.orientation=90 # STE: Camera file path configuration ste.cam.ext.cfg.path.secondary=/system/usr/share/camera/config_file/samsung_s5k4ecgx_janice.dat + +# Hardware info +ro.device.chipset=ST-Ericsson NovaThor U8500 (45nm) +ro.device.cpu=ARMv7 1GHz Dual-core ARM Cortex-A9 +ro.device.gpu=Mali-400MP Single Core +ro.device.rear_cam=5 Mpix (2592x1944) +ro.device.front_cam=1.3 Mpix (1280x1024) +ro.device.screen_res=4,0' 800x480 pixels ( ~233 ppi) From dbcbd02f314435a33614195a5d7713b621f19a74 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sun, 8 Dec 2013 14:27:52 +0100 Subject: [PATCH 206/248] Move permissions to device specific --- janice.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/janice.mk b/janice.mk index 388ec78..bbf4d67 100644 --- a/janice.mk +++ b/janice.mk @@ -51,6 +51,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc +# Permissions +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml + # Audio PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ From 6fd25213fc6773fce95b376241e13128d6311744 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 24 Dec 2013 13:08:01 -0200 Subject: [PATCH 207/248] update wlan supplicant services init --- rootdir/init.samsungjanice.rc | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 2bcf64b..cee73cf 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -690,22 +690,30 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/p2p_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ - -puse_p2p_group_interface=1 \ - -g@android:wpa_wlan0 - class main - socket wpa_wlan0 dgram 660 wifi wifi - disabled - oneshot + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ + -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -e/data/misc/wifi/entropy.bin \ - -O/data/misc/wifi/sockets -g@android:wpa_wlan0 + -O/data/misc/wifi/sockets \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore class main socket wpa_wlan0 dgram 660 wifi wifi disabled @@ -728,7 +736,7 @@ service dhcpcd_p2p /system/bin/dhcpcd -aABKL disabled oneshot -service dhcpcd_bt-pan /system/bin/dhcpcd -BKLG +service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL # This properly enables bluetooth tethering, it asigns a IP to any conected device class main disabled From 40c3b84e61333421cf8eac344d117b92b81a471b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 24 Dec 2013 13:26:54 -0200 Subject: [PATCH 208/248] indent: tabs to spaces --- rootdir/init.samsungjanice.rc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index cee73cf..c4672ff 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -57,7 +57,7 @@ on fs swapon_all /fstab.samsungjanice setprop ro.crypto.fuse_sdcard true - + # Start CSPSA before synchronously running the factory reset utility that # checks the factory reset triggers in sysfs and CSPSA and then formats # the block device belonging to /data. @@ -690,20 +690,20 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ + -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore - class main - socket wpa_wlan0 dgram 660 wifi wifi + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + class main + socket wpa_wlan0 dgram 660 wifi wifi disabled - oneshot + oneshot service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ From d209c66ed5062f856e25f25838ec12192ca43879 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 4 Mar 2014 18:49:45 +0100 Subject: [PATCH 209/248] Huge janice cleanup tee folder is moved to vendor as RIL config files Lot of unneded init services are removed. --- board-info.txt | 2 - cm.mk | 8 +- configs/manuf_id.cfg | 1 - configs/model_id.cfg | 1 - configs/spn-conf.xml | 132 ------------ configs/system_id.cfg | 1 - janice.mk | 14 -- .../base/core/res/res/values/cm_arrays.xml | 37 ---- .../base/core/res/res/values/config.xml | 122 ----------- rootdir/init.samsungjanice.rc | 203 ++---------------- system.prop | 5 - tee/cops_ta.ssw | Bin 29408 -> 0 bytes tee/custom_ta.ssw | Bin 20048 -> 0 bytes tee/libbassapp_ssw | 0 tee/smcl_ta_8500bx_secure.ssw | Bin 2548 -> 0 bytes 15 files changed, 23 insertions(+), 503 deletions(-) delete mode 100644 board-info.txt delete mode 100644 configs/manuf_id.cfg delete mode 100644 configs/model_id.cfg delete mode 100644 configs/spn-conf.xml delete mode 100644 configs/system_id.cfg delete mode 100644 overlay/frameworks/base/core/res/res/values/cm_arrays.xml delete mode 100644 tee/cops_ta.ssw delete mode 100644 tee/custom_ta.ssw delete mode 100644 tee/libbassapp_ssw delete mode 100644 tee/smcl_ta_8500bx_secure.ssw diff --git a/board-info.txt b/board-info.txt deleted file mode 100644 index c9621d0..0000000 --- a/board-info.txt +++ /dev/null @@ -1,2 +0,0 @@ -require board=montblanc -require version-bootloader=I9070XXLQB diff --git a/cm.mk b/cm.mk index 8889915..b587ec1 100644 --- a/cm.mk +++ b/cm.mk @@ -11,12 +11,6 @@ TARGET_SCREEN_WIDTH := 480 # Inherit some common CM stuff. $(call inherit-product, vendor/cm/config/common_full_phone.mk) -# If the boot animation is not automatically selected, we chose it here :) - -PRODUCT_COPY_FILES += \ - vendor/cm/prebuilt/common/bootanimation/480.zip:system/media/bootanimation.zip - - # Inherit device configuration $(call inherit-product, device/samsung/janice/full_janice.mk) @@ -28,4 +22,4 @@ PRODUCT_MODEL := GT-I9070 PRODUCT_MANUFACTURER := samsung # Set build fingerprint / ID / Product Name ect. -PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=GT-I9070 TARGET_DEVICE=GT-I9070 +PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=GT-I9070 TARGET_DEVICE=janice diff --git a/configs/manuf_id.cfg b/configs/manuf_id.cfg deleted file mode 100644 index 6c55b3f..0000000 --- a/configs/manuf_id.cfg +++ /dev/null @@ -1 +0,0 @@ -ST-Ericsson diff --git a/configs/model_id.cfg b/configs/model_id.cfg deleted file mode 100644 index 94b77a4..0000000 --- a/configs/model_id.cfg +++ /dev/null @@ -1 +0,0 @@ -GT-I9070 diff --git a/configs/spn-conf.xml b/configs/spn-conf.xml deleted file mode 100644 index 191bc05..0000000 --- a/configs/spn-conf.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/configs/system_id.cfg b/configs/system_id.cfg deleted file mode 100644 index 6d46bf7..0000000 --- a/configs/system_id.cfg +++ /dev/null @@ -1 +0,0 @@ -Not Available diff --git a/janice.mk b/janice.mk index bbf4d67..9314f22 100644 --- a/janice.mk +++ b/janice.mk @@ -15,13 +15,6 @@ DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh -# TEE -PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/tee/cops_ta.ssw:system/lib/tee/cops_ta.ssw \ - $(LOCAL_PATH)/tee/custom_ta.ssw:system/lib/tee/custom_ta.ssw \ - $(LOCAL_PATH)/tee/libbassapp_ssw:system/lib/tee/libbassapp_ssw \ - $(LOCAL_PATH)/tee/smcl_ta_8500bx_secure.ssw:system/lib/tee/smcl_ta_8500bx_secure.ssw - # Enable AAC 5.1 output PRODUCT_PROPERTY_OVERRIDES += \ media.aac_51_output_enabled=true @@ -59,14 +52,7 @@ PRODUCT_COPY_FILES += \ # Audio PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ - $(LOCAL_PATH)/configs/audio_policy.conf:system/vendor/etc/audio_policy.conf \ $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf -# RIL -PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/configs/manuf_id.cfg:system/etc/AT/manuf_id.cfg \ - $(LOCAL_PATH)/configs/model_id.cfg:system/etc/AT/model_id.cfg \ - $(LOCAL_PATH)/configs/system_id.cfg:system/etc/AT/system_id.cfg - # Use non-open-source parts if present $(call inherit-product-if-exists, vendor/samsung/u8500-common/janice/janice-vendor-blobs.mk) diff --git a/overlay/frameworks/base/core/res/res/values/cm_arrays.xml b/overlay/frameworks/base/core/res/res/values/cm_arrays.xml deleted file mode 100644 index 2558b33..0000000 --- a/overlay/frameworks/base/core/res/res/values/cm_arrays.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - @string/reboot_reboot - @string/reboot_recovery - @string/reboot_download - - - - - - recovery - download - - - diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml index d3bb170..aa654b1 100644 --- a/overlay/frameworks/base/core/res/res/values/config.xml +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -21,116 +21,6 @@ for different hardware and product builds. --> - 0 - 1 - - - true - - - - - - - - - - wifi,1,1,1,-1,true - mobile,0,0,0,-1,true - mobile_mms,2,0,2,60000,true - mobile_supl,3,0,2,60000,true - mobile_dun,4,0,2,60000,true - mobile_hipri,5,0,3,60000,true - mobile_bluetooth,7,7,2,-1,true - mobile_fota,10,0,2,60000,true - mobile_ims,11,0,2,60000,true - mobile_cbs,12,0,2,60000,true - wifi_p2p,13,1,0,-1,true - mobile_bip,17,0,2,60000,true - - - - - - - "1,1" - "0,1" - "7,1" - - - - - - - "rndis0" - - - - - - - - "wlan0" - - - - - - - "bnep0" - - - - - - 0 - 1 - 4 - 5 - 7 - - - - true - - - true - - - true - - - pdp0 - - - true - - - true - - - true - - - true - - - /sys/devices/virtual/android_usb/android0/f_mass_storage/lun0/file - true @@ -193,17 +83,5 @@ * The device must be provisioned with HDCP keys (for protected content). --> true - - - true - - - true - - - true - - - false diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index c4672ff..cc0960e 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -6,7 +6,7 @@ on init mkdir /storage/sdcard1 0700 root root mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw - + export EXTERNAL_STORAGE /storage/sdcard0 export SECONDARY_STORAGE /storage/sdcard1 @@ -19,12 +19,12 @@ on init symlink /storage/sdcard0 /mnt/sdcard symlink /storage/sdcard1 /extSdCard symlink /storage/sdcard1 /mnt/extSdCard - + # KSM tunning write /sys/kernel/mm/ksm/pages_to_scan 100 write /sys/kernel/mm/ksm/sleep_millisecs 500 write /sys/kernel/mm/ksm/run 1 - + # setup the global environment export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib @@ -48,6 +48,8 @@ on init mkdir /debug mount debugfs none /debug + # Prevents permission denied error for telephony + chmod 0644 /proc/cmdline on fs @@ -134,13 +136,7 @@ on post-fs chown system radio /sys/class/sec/tsp_noise_test/disp_all_deltadata chown system system /sys/class/sec/sec_touchscreen/tsp_threshold - # DVFS LOCK - chown radio system /sys/power/cpufreq_table - chown radio system /sys/power/cpufreq_max_limit - chown radio system /sys/power/cpufreq_min_limit - chmod 0660 /sys/power/cpufreq_table - chmod 0660 /sys/power/cpufreq_max_limit - chmod 0660 /sys/power/cpufreq_min_limit + # PRCMU debug fs chown radio system /debug/prcmu/ape_opp chown radio system /debug/prcmu/ddr_opp chmod 0660 /debug/prcmu/ape_opp @@ -224,7 +220,6 @@ on post-fs-data mkdir /data/media 0770 media_rw media_rw chown media_rw media_rw /data/media # give system access to wpa_supplicant.conf for backup and restore - mkdir /data/misc/psdata mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth mkdir /data/misc/bluetooth 0770 system system mkdir /data/misc/wifi 0770 wifi system @@ -292,7 +287,6 @@ on post-fs-data #] # create basic filesystem structure - mkdir /data/misc/psdata mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth mkdir /data/misc/bluetooth 0770 system system @@ -304,29 +298,6 @@ on post-fs-data # Create directory for STE OMX debug logs mkdir /data/ste-debug 0777 root root - # give system access to sterc_script when enabling usb nap - copy -u /system/etc/psdata/sterc_conf /data/misc/psdata/sterc_conf - copy -u /system/etc/psdata/sterc_script_connect /data/misc/psdata/sterc_script_connect - copy -u /system/etc/psdata/sterc_script_disconnect /data/misc/psdata/sterc_script_disconnect - copy -u /system/etc/psdata/sterc_conf_alt /data/misc/psdata/sterc_conf_alt - copy -u /system/etc/psdata/sterc_script_connect_alt /data/misc/psdata/sterc_script_connect_alt - copy -u /system/etc/psdata/sterc_script_connect_dun /data/misc/psdata/sterc_script_connect_dun - copy -u /system/etc/psdata/sterc_script_disconnect_dun /data/misc/psdata/sterc_script_disconnect_dun - chmod 0660 /data/misc/psdata/sterc_conf - chmod 0500 /data/misc/psdata/sterc_script_connect - chmod 0500 /data/misc/psdata/sterc_script_disconnect - chmod 0660 /data/misc/psdata/sterc_conf_alt - chmod 0500 /data/misc/psdata/sterc_script_connect_alt - chmod 0500 /data/misc/psdata/sterc_script_connect_dun - chmod 0500 /data/misc/psdata/sterc_script_disconnect_dun - chown root radio /data/misc/psdata/sterc_conf - chown root radio /data/misc/psdata/sterc_conf_alt - - # give system access to stepscc_conf - copy -u /system/etc/psdata/stepscc_conf /data/misc/psdata/stepscc_conf - chmod 0660 /data/misc/psdata/stepscc_conf - chown root radio /data/misc/psdata/stepscc_conf - # create var/run, var/lib for avahi mkdir /var mkdir /var/run @@ -343,9 +314,6 @@ on post-fs-data on early-boot - # Launch core services in case charging mode is entered - start watchdog-kicker - # Prepare modem class_start modem-u8500 class_start modem-core @@ -355,7 +323,6 @@ on early-boot on boot - # debugfs mount debugfs /sys/kernel/debug /sys/kernel/debug @@ -407,10 +374,9 @@ on boot chown root system sys/class/sec/gps/GPS_ON_OFF/value chmod 0664 sys/class/sec/gps/GPS_ON_OFF/value - chown root system sys/class/sec/gps/GPS_nRST/value chmod 0664 sys/class/sec/gps/GPS_nRST/value - + # permissions for FMRadio of Broadcom chmod 0777 /system/bin/btld @@ -462,11 +428,11 @@ on boot # temp Torch workaround chmod 0222 /sys/class/sec/flash/enable - + # system permissions for device parts + chown system system /d/cpuidle/deepest_state chown system system /sys/module/mali/parameters/mali_l2_max_reads chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max - chown system system /d/cpuidle/deepest_state chown system system /sys/kernel/abb-regu/VOTG chown system system /sys/kernel/abb-charger/max_ac_c chown system system /sys/kernel/abb-charger/max_usb_c @@ -511,28 +477,6 @@ on boot class_start modem class_start default -# Make sure we startup btld before hcid -service btld /system/bin/btld -hb 3000000 -hp /dev/ttyAMA0 -lpm 1 - user root - group bluetooth net_bt_admin - disabled - oneshot - -# for bluetooth -service hciattach /system/bin/brcm_patchram_plus --enable_hci --enable_lpm --no2bytes --tosleep 5000 \ - --baudrate 3000000 -use_baudrate_for_download --patchram /system/bin/bcm4330.hcd /dev/ttyAMA0 - class main - user bluetooth - group bluetooth net_bt_admin - disabled - oneshot - -# for bluetooth rf test -service bt_dut_cmd /system/bin/bcm_dut - group bluetooth net_bt_admin - disabled - oneshot - # Crash Safe Parameter Storage Area, serving production parameter requests from clients. # Configuration is read from file "/etc/cspsa.conf" and each found area spawns a CSPSA server # process. @@ -551,67 +495,11 @@ service modem /system/bin/sh /system/etc/ste_modem.sh class modem-u8500 user root -# Modem-supervisor -service modem-supervisor /system/bin/modem-supervisor -f /dev/dbx500_mloader_fw -i /sys/devices/platform/ab8500-i2c.0/chip_id -c monitor - class modem-u8500 - user root - # Creating Modem Security daemon service copsd /system/bin/copsdaemon class modem-core user root -service bdaddr /system/bin/bdaddr_read - class main - user root - disabled - oneshot - -service dbus /system/bin/dbus-daemon --system --nofork - socket dbus stream 660 bluetooth bluetooth - user bluetooth - group bluetooth net_bt_admin - -service bluetoothd /system/bin/bluetoothd -n - socket bluetooth stream 660 bluetooth bluetooth - socket dbus_bluetooth stream 660 bluetooth bluetooth - # init.rc does not yet support applying capabilities, so run as root and - # let bluetoothd drop uid to bluetooth with the right linux capabilities - group bluetooth net_bt_admin misc - disabled - -service hfag /system/bin/sdptool add --channel=10 HFAG - user bluetooth - group bluetooth net_bt_admin - disabled - oneshot - -service hsag /system/bin/sdptool add --channel=11 HSAG - user bluetooth - group bluetooth net_bt_admin - disabled - oneshot - -service opush /system/bin/sdptool add --channel=12 OPUSH - user bluetooth - group bluetooth net_bt_admin - disabled - oneshot - -service pbap /system/bin/sdptool add --channel=19 PBAP - user bluetooth - group bluetooth net_bt_admin - disabled - oneshot - -on property:ril.bt_macaddr=* - start bdaddr - -# Modem_log_relay -service modem_log_relay /system/bin/modem_log_relay --ctrl_port=2001 --data_port=2002 --inv_port=2003 --report_port=2005 - class modem - user root - service admsrv /system/bin/admsrv class main user root @@ -619,17 +507,13 @@ service admsrv /system/bin/admsrv ioprio rt 4 capability NET_ADMIN NET_RAW SYS_NICE -service stedump /system/bin/stedump - class main - user root - service geomagneticd /system/bin/geomagneticd6x user compass group system input service orientationd /system/bin/orientationd6x user compass - group system input group system input + group system input # AT daemon service atd /system/bin/at_core -mode normal -serial ttyAMA2 @@ -647,14 +531,6 @@ service at_distributor /system/bin/at_distributor user root group radio log -service watchdog-kicker /system/xbin/watchdog -d /dev/watchdog -t 120 - class main - oneshot - -service battery_params /system/xbin/battery_params - class main - oneshot - service usbid_init /system/bin/usbid_init.sh class main oneshot @@ -664,13 +540,6 @@ service mobex-daemon /system/bin/npsmobex user system group system radio inet sdcard_rw -# SA, System SW, SAMSUNG -service bugreport /system/bin/bugmailer.sh -v - class main - disabled - oneshot - keycodes 114 115 116 - # Vibetonz service immvibed /system/bin/immvibed class core @@ -691,41 +560,26 @@ on property:ro.dumpstate.dmesg=1 service p2p_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ - -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -O/data/misc/wifi/sockets -N \ + -I/system/etc/wifi/p2p_supplicant_overlay.conf \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ + -puse_p2p_group_interface=1 \ + -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi - disabled - oneshot + disabled + oneshot service wpa_supplicant /system/bin/wpa_supplicant \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -e/data/misc/wifi/entropy.bin \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets \ - -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - # we will start as root and wpa_supplicant will switch to user wifi - # after setting up the capabilities required for WEXT - # user wifi - # group wifi inet keystore + -O/data/misc/wifi/sockets -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot -# bugreport is triggered by holding down volume down, volume up and power -service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport - class main - disabled - oneshot - keycodes 114 115 116 - service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL class main disabled @@ -760,26 +614,13 @@ service iprenew_bt-pan /system/bin/dhcpcd -n class main disabled oneshot - -# GPS -service gpsd /system/bin/gpsd -c /system/etc/gps.xml - class main - socket gps seqpacket 0660 gps system - user gps - group system inet sdcard_rw - -#for WiFi MFG(TestMode) -service mfgloader /system/bin/mfgloader - class main - disabled -service wlandutservice /system/bin/wlandutservice +# Bugreport is triggered by holding down volume down, volume up and power +service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport class main - user system - group wifi net_raw net_admin system inet disabled oneshot -# end of wifi + keycodes 114 115 116 # FUSE sdcard daemon service for sdcard service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 diff --git a/system.prop b/system.prop index b4323ae..71121e4 100644 --- a/system.prop +++ b/system.prop @@ -8,14 +8,9 @@ rild.libargs=-d /dev/ttyS0 ro.sf.lcd_density=240 ro.lcd_min_brightness=30 -debug.hwui.render_dirty_regions=false - # STE: Low power audio - enable ULP mode ste.nmf.autoidle=1 -# STE: Address of DBus STE bus -ste.dbus.bus.address=unix:path=/dev/socket/dbus_ste - # STE: UNSOL_CALL_RING is only sent once from RIL. # Android needs to generate more rings if needed. ro.telephony.call_ring.multiple=false diff --git a/tee/cops_ta.ssw b/tee/cops_ta.ssw deleted file mode 100644 index d1c5a2593106a56b8f8bac7de9682704254e4385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29408 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%0DRgHj*3L?%pX?c1J-p^!kx3rr6ma+V)n0SE)L0&| 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 diff --git a/tee/custom_ta.ssw b/tee/custom_ta.ssw deleted file mode 100644 index 0b0066150821812683f08d76beb0125189d86eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20048 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 diff --git a/tee/libbassapp_ssw b/tee/libbassapp_ssw deleted file mode 100644 index e69de29..0000000 diff --git a/tee/smcl_ta_8500bx_secure.ssw b/tee/smcl_ta_8500bx_secure.ssw deleted file mode 100644 index 126d7e66200178fbcf53b50165fab316c8f7c640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2548 zcmah~4{#Gz8h@MJY?7wEq%_5lP~4_eqcJ5C99uXfjdT;T^;*jGC^|^4^=>w;H>QdslN25o-QeVB? zmc8)hEpN|rE`IKnV9I}zJGyR8$%)}D+td%#4lfv3DFkQPpQK0rFr3r1Yjj2Lh6nHX zHphN{d;G~WKixUrP`TsipL<%Ka#sH2y^V?13QJz`voFlkwt4IWyF91cQ-53b!u9n9 z=WAcJMzpKmwZ2d9eWs)E&36tCRP2#`-bSCl?`nm{e6nqg?F_Tw+%K=9hmTs{EA-WF z)m^&%zc~ZxucO1-Rw)YMP-8@1efgJdVcbmE4z%Xs@#s}wcmV` zm7|)izoCo1ZEW4RdiU|6w)~P-i#grYp)Ivh3e8ZPL}O{%SQQt(B-iZ59ZLkz*F1V!3&)8C%zrp?wi1q?f&eOhk9ZxYC;I*;!Y_2V6duWHs)93z>Dp zMSO$-21iIXTk@!fQHTf{c`c8`T$F3p!OWxx$q9&gVkpkOp+E@FftKg{QFXpw+aG7q zJ_V<6hx7_hsLlxS{Vtk2qnBA;lUQqq9)WMv8E)074JmCu#iquNrIe>ATdttx47_vH zFEe;kV;58AXqAZSvpK{Vyrh8Nvp9pds3}iWYLtm9jd`L>LnV3}DGL>AXw-YPz-cG& zxDIw0Y`w$>6*H3R5$1kSo!D;Y(e`wf5YY=7I}3;HQs!8TDp8Pp_kr&qsPT~G^S7V? zVGFoYW3Q(eiB%3Tp(Re)oSZdykw6yz5VHdBrlFm5TB|8;V!x5o+(Ox#BMnO_R>K~L zm3`=A>c~tFD&AdJK2EL1oQQ2Q%ykFJGEggro%#$@8LUyMteUg)Rrx_yg3x8_t-;;V! zP^dr0$v{7${!gG})-hBh53}Rc;t2Br_idd8D(6v2`8ccwGRJS7^Q!_{k)$2sAN`8L z)Y!^NstcJN;=-3yVGDn{v)4vCbrpIg@qUc{INPIPGlWJg#CRJfYmpeMm39ryr;B!M5?CfRI^O7tj zu~(jw7srHYES2H^8^Egzfxk5FV9kRcjVt3+_?Az#L(zS97XE_VmaYIr@I^pd_)^TS z3up8Xz@9bWOww6>G)~3WdK4il{5!~s2EC@UngO#f3EG{;yCUVTD-QESyCa;@4#MN}u)tuqq2m%6N~#2#x-67Qa7 zXEmqBU(_hzj%uVBHBt=cGN=oAm<}y-lQ+G;aC39K<=iB6O{_cuK617+nyz@fM;)ee z$hVA>2N%2lnnBTkasUPu%e{}ozrY?m&8N~;ygbuEo{~C;34rW@+GDzV)O z+He7<`XaF?;55e|^Oo4?&-=nKY9C$GxANKy__uxZ>Au=)YS_DTmNjcgH_?4?Hv|36FZw1o5?^(#DSHY3@oLt|ulc=TPB%7LUwq^H2xY1Wb>g(piEv zJo3HTR09U*i@Bg)MdgTI0a4{_S`+7NiZe@bn?Y|g;AVsA!0x{MaBkm#KK&~=BM*S7 qV2rQ(w`}?Qiv0a2?tFIPt%&Kw*~=wG&;EAec6Yd~pBt=4%l->`hi+>C From 91d9f9753cdf0f72cc4bd14a9885909020e8634a Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 4 Mar 2014 19:00:49 +0100 Subject: [PATCH 210/248] Remove janice overlays All this overlays are in common-u8500 device tree --- .../SettingsProvider/res/values/defaults.xml | 24 ------------ .../packages/SystemUI/res/values/config.xml | 26 ------------- .../apps/Camera/res/values/config.xml | 39 ------------------- .../apps/Settings/res/values/config.xml | 36 ----------------- .../packages/apps/Torch/res/values/config.xml | 30 -------------- 5 files changed, 155 deletions(-) delete mode 100644 overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml delete mode 100644 overlay/frameworks/base/packages/SystemUI/res/values/config.xml delete mode 100644 overlay/packages/apps/Camera/res/values/config.xml delete mode 100644 overlay/packages/apps/Settings/res/values/config.xml delete mode 100644 overlay/packages/apps/Torch/res/values/config.xml diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml deleted file mode 100644 index c7c7562..0000000 --- a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - 30000 - diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml deleted file mode 100644 index 210c15b..0000000 --- a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - true - diff --git a/overlay/packages/apps/Camera/res/values/config.xml b/overlay/packages/apps/Camera/res/values/config.xml deleted file mode 100644 index cedd0ad..0000000 --- a/overlay/packages/apps/Camera/res/values/config.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - true - - true - - true - - false - - true - - true - - true - - true - diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml deleted file mode 100644 index 3ce5ecd..0000000 --- a/overlay/packages/apps/Settings/res/values/config.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - true - - - true - - - true - - - true - - - /sys/power/cpufreq_max_limit - /sys/power/cpufreq_min_limit - diff --git a/overlay/packages/apps/Torch/res/values/config.xml b/overlay/packages/apps/Torch/res/values/config.xml deleted file mode 100644 index 80629bc..0000000 --- a/overlay/packages/apps/Torch/res/values/config.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - /sys/class/sec/flash/enable - - - -1 - - From 80a07b51761ba12887fb039fc7bdfd0c9caf3475 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Thu, 27 Feb 2014 20:35:49 +0100 Subject: [PATCH 211/248] Fix Error opening /dev/ape_opp: Permission denied --- rootdir/ueventd.samsungjanice.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootdir/ueventd.samsungjanice.rc b/rootdir/ueventd.samsungjanice.rc index 92c1a2d..2453410 100644 --- a/rootdir/ueventd.samsungjanice.rc +++ b/rootdir/ueventd.samsungjanice.rc @@ -19,8 +19,8 @@ /dev/i2c-2 0660 media system /dev/i2c-4 0660 system system # PWR QOS devices -/dev/ape_opp 0660 media system -/dev/ddr_opp 0660 media system +/dev/ape_opp 0660 system graphics +/dev/ddr_opp 0660 system graphics # hwmem driver /dev/hwmem 0666 media system From 7e69fa02cfcd225b9b0e5e37d3ecf3b1a6bc3804 Mon Sep 17 00:00:00 2001 From: t4n017 Date: Thu, 13 Mar 2014 10:29:50 -0200 Subject: [PATCH 212/248] Clean Wi-Fi folder creation process Change Wi-Fi folder group and delete second mkdir which make no sense --- rootdir/init.samsungjanice.rc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index cc0960e..91be82c 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -222,10 +222,9 @@ on post-fs-data # give system access to wpa_supplicant.conf for backup and restore mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth mkdir /data/misc/bluetooth 0770 system system - mkdir /data/misc/wifi 0770 wifi system + mkdir /data/misc/wifi 0770 wifi wifi mkdir /data/misc/wifi/sockets 0770 wifi wifi mkdir /data/misc/dhcp 0775 dhcp dhcp - mkdir /data/misc/wifi 0770 wifi system chmod 0770 /data/misc/wifi chmod 0660 /data/misc/wifi/wpa_supplicant.conf chmod 0660 /data/misc/wifi/p2p_supplicant.conf From 3074b13a3be1386f5ba18eb2bc0b739fd66ea22d Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Thu, 13 Mar 2014 20:11:54 +0100 Subject: [PATCH 213/248] Sirfgps is janice specific --- configs/sirfgps.conf | 38 ++++++++++++++++++++++++++++++++++++++ janice.mk | 7 ++++--- 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 configs/sirfgps.conf diff --git a/configs/sirfgps.conf b/configs/sirfgps.conf new file mode 100644 index 0000000..edee41e --- /dev/null +++ b/configs/sirfgps.conf @@ -0,0 +1,38 @@ +#CSR SiRF plc +#PROJECT_NAME : white Space is not allowed +#UART_DRIVER : Uart Driver Path +#RESET_GPIO : Reset GPIO Driver Path +#ONOFF_GPIO : OnOff GPIO Driver Path +#EXTERNAL_LNA : 1 - use External LNA, 0 - use Internal LNA only +#REF_CLOCK_26MHZ: 1 - use 26MHz TCXO, 0 - use 16.369MHz TCXO +#UART_BAUD_RATE : 0 - 115200bps 1 - 230400, 2 - 460800, 3 - 57600 +#FREQUENCY_AIDING : 0 - Disable, 1 - Enable +#SENSOR_AIDING : 0 - Disable, 1 - Enable +#SET_ID_IMSI : 1 - Use IMSI for SET ID, 0 - Use MSISDN for SET ID, especially for Japan Network Operators +#DEBUGGING_FILES : 0 - no log file, 1 - log files enabled +#SSL_ENABLED : 0 - SSL Disabled, 1 - SSL Enabled +#CERTI_VERSION : 0 - TLSv1 , 1 - SSLv3 , 2 - SSLv23 +#CP_RESPONSETIME : 0 - no priority, 1 - resposne priority time, 2 - resposne priority position ,3 - resposne priority use entire response time +#REAIDING=20 +#CONTROL_PLANE : 1 - CP Enabled, 0 - CP Disabled, for MP3 player or PND +#ATT_NETWORK_OPERATOR : 1 - for AT&T, 0 - for other network operator +PROJECT=SAMSUNG_STE +UART_DRIVER=/dev/ttyAMA1 +RESET_GPIO=/sys/class/sec/gps/GPS_nRST/value +ONOFF_GPIO=/sys/class/sec/gps/GPS_ON_OFF/value +EXTERNAL_LNA=1 +REF_CLOCK_26MHZ=1 +UART_BAUD_RATE=2 +FREQUENCY_AIDING=0 +SENSOR_AIDING=0 +SET_ID_IMSI=1 +DEBUGGING_FILES=0 +STE=1 +SSL_ENABLED=0 +CERTI_VERSION=0 +CP_RESPONSETIME=2 +CONTROL_PLANE=1 +ATT_NETWORK_OPERATOR=0 +EMC_ENABLE=0 +SGEE=0 +LOG_PATH=/data \ No newline at end of file diff --git a/janice.mk b/janice.mk index 9314f22..5accb15 100644 --- a/janice.mk +++ b/janice.mk @@ -26,10 +26,11 @@ PRODUCT_PACKAGES += \ org.cyanogenmod.hardware \ org.cyanogenmod.hardware.xml -# Gps +# GPS PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf - + $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf \ + $(COMMON_PATH)/configs/sirfgps.conf:system/etc/sirfgps.conf + # Compass workaround PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/compass:system/etc/init.d/compass From d274efeb3843a01144748bf194d71dcf6785521b Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Fri, 14 Mar 2014 00:01:02 +0100 Subject: [PATCH 214/248] Typo --- janice.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index 5accb15..5ca3380 100644 --- a/janice.mk +++ b/janice.mk @@ -29,7 +29,7 @@ PRODUCT_PACKAGES += \ # GPS PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf \ - $(COMMON_PATH)/configs/sirfgps.conf:system/etc/sirfgps.conf + $(LOCAL_PATH)/configs/sirfgps.conf:system/etc/sirfgps.conf # Compass workaround PRODUCT_COPY_FILES += \ From 3880424ab6e8ed38cb2f1dd2ea01a31fd06984d8 Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Fri, 28 Mar 2014 12:52:46 -0300 Subject: [PATCH 215/248] update compass init.d script --- configs/compass | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/configs/compass b/configs/compass index 3706ee3..99893be 100644 --- a/configs/compass +++ b/configs/compass @@ -7,11 +7,8 @@ cfg_path="/data/system/yas.cfg" -if [ -f $cfg_path ] +if [ ! -f $cfg_path ] then - #echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path - #chmod 0644 $cfg_path -else echo -n "-1,-3,9,256815,32824,-972243,3,127,127,127,2147483647,2147483647,2147483647,0," > $cfg_path chmod 0644 $cfg_path fi From 9d1ea4e43b92f251af826788ceba0e34c9f9cdbf Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Sat, 29 Mar 2014 18:54:44 -0300 Subject: [PATCH 216/248] remove cm.mk import source calls that file when building cyanogenmod --- janice.mk | 5 ----- 1 file changed, 5 deletions(-) diff --git a/janice.mk b/janice.mk index 5ca3380..1e28f11 100644 --- a/janice.mk +++ b/janice.mk @@ -1,11 +1,6 @@ # Include common makefile $(call inherit-product, device/samsung/u8500-common/common.mk) -ifneq ($(TARGET_SCREEN_HEIGHT),800) -# Call cm.mk because somehow it's not being called! -$(call inherit-product, device/samsung/janice/cm.mk) -endif - LOCAL_PATH := device/samsung/janice # Overlay From 9309bb9721b1b99f18cb97915099d6c0ca2bf276 Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Sat, 29 Mar 2014 19:08:38 -0300 Subject: [PATCH 217/248] move cyanogenmod specific packages to cm.mk --- cm.mk | 6 ++++++ janice.mk | 5 +---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cm.mk b/cm.mk index b587ec1..4586ef4 100644 --- a/cm.mk +++ b/cm.mk @@ -14,6 +14,12 @@ $(call inherit-product, vendor/cm/config/common_full_phone.mk) # Inherit device configuration $(call inherit-product, device/samsung/janice/full_janice.mk) +# CM Packages +PRODUCT_PACKAGES += \ + Stk \ + org.cyanogenmod.hardware \ + org.cyanogenmod.hardware.xml + # Device identifier. This must come after all inclusions PRODUCT_DEVICE := janice PRODUCT_NAME := cm_janice diff --git a/janice.mk b/janice.mk index 1e28f11..da059e1 100644 --- a/janice.mk +++ b/janice.mk @@ -16,10 +16,7 @@ PRODUCT_PROPERTY_OVERRIDES += \ # Packages PRODUCT_PACKAGES += \ - GalaxySAdvanceSettings \ - Stk \ - org.cyanogenmod.hardware \ - org.cyanogenmod.hardware.xml + GalaxySAdvanceSettings # GPS PRODUCT_COPY_FILES += \ From bb2f6d5f4059de30d836e19efe71d3bad21b20e2 Mon Sep 17 00:00:00 2001 From: zwliew Date: Mon, 14 Apr 2014 20:48:35 +0800 Subject: [PATCH 218/248] DeviceSettings: Bring janice up to speed with everything that has been going on --- DeviceSettings/Android.mk | 15 -- DeviceSettings/AndroidManifest.xml | 33 ---- .../res/drawable-hdpi/ic_launcher.png | Bin 4041 -> 0 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 2414 -> 0 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 5136 -> 0 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 7515 -> 0 bytes .../drawable/ic_launcher_cmdevicesettings.png | Bin 8207 -> 0 bytes DeviceSettings/res/layout/top.xml | 5 - DeviceSettings/res/menu/device_settings.xml | 9 - DeviceSettings/res/values-de/arrays.xml | 54 ------ DeviceSettings/res/values-de/strings.xml | 73 ------- DeviceSettings/res/values-es/arrays.xml | 54 ------ DeviceSettings/res/values-es/strings.xml | 73 ------- DeviceSettings/res/values-fi/arrays.xml | 54 ------ DeviceSettings/res/values-fi/strings.xml | 73 ------- DeviceSettings/res/values-hu/arrays.xml | 56 ------ DeviceSettings/res/values-hu/strings.xml | 73 ------- DeviceSettings/res/values-it/arrays.xml | 51 ----- DeviceSettings/res/values-it/strings.xml | 66 ------- DeviceSettings/res/values-nl/arrays.xml | 70 ------- DeviceSettings/res/values-nl/strings.xml | 89 --------- DeviceSettings/res/values-pt-rBR/arrays.xml | 55 ------ DeviceSettings/res/values-pt-rBR/strings.xml | 73 ------- DeviceSettings/res/values-sw600dp/dimens.xml | 8 - .../res/values-sw720dp-land/dimens.xml | 9 - DeviceSettings/res/values-v11/styles.xml | 11 -- DeviceSettings/res/values-v14/styles.xml | 12 -- DeviceSettings/res/values-zh-rCN/arrays.xml | 54 ------ DeviceSettings/res/values-zh-rCN/strings.xml | 75 -------- DeviceSettings/res/values/arrays.xml | 98 ---------- DeviceSettings/res/values/dimens.xml | 7 - DeviceSettings/res/values/strings.xml | 80 -------- DeviceSettings/res/values/styles.xml | 20 -- .../res/xml/advanced_preferences.xml | 46 ----- .../res/xml/general_preferences.xml | 30 --- DeviceSettings/res/xml/screen_preferences.xml | 32 ---- DeviceSettings/res/xml/usb_preferences.xml | 34 ---- .../device/AdvancedFragmentActivity.java | 73 ------- .../settings/device/ChargerCurrency.java | 63 ------ .../settings/device/DeepestSleepState.java | 63 ------ .../settings/device/DeviceSettings.java | 180 ------------------ .../settings/device/FsyncMode.java | 63 ------ .../device/GeneralFragmentActivity.java | 93 --------- .../com/cyanogenmod/settings/device/Hspa.java | 71 ------- .../settings/device/MaliL2MaxReads.java | 63 ------ .../settings/device/MaliPreAllocMem.java | 63 ------ .../settings/device/PanelGamma.java | 65 ------- .../device/ScreenFragmentActivity.java | 81 -------- .../cyanogenmod/settings/device/Startup.java | 39 ---- .../device/TouchscreenSensitivity.java | 64 ------- .../settings/device/USBFragmentActivity.java | 79 -------- .../settings/device/UsbCurrency.java | 63 ------ .../cyanogenmod/settings/device/Utils.java | 153 --------------- janice.mk | 4 - rootdir/init.samsungjanice.rc | 46 +++++ 55 files changed, 46 insertions(+), 2772 deletions(-) delete mode 100644 DeviceSettings/Android.mk delete mode 100644 DeviceSettings/AndroidManifest.xml delete mode 100644 DeviceSettings/res/drawable-hdpi/ic_launcher.png delete mode 100644 DeviceSettings/res/drawable-mdpi/ic_launcher.png delete mode 100644 DeviceSettings/res/drawable-xhdpi/ic_launcher.png delete mode 100644 DeviceSettings/res/drawable-xxhdpi/ic_launcher.png delete mode 100755 DeviceSettings/res/drawable/ic_launcher_cmdevicesettings.png delete mode 100755 DeviceSettings/res/layout/top.xml delete mode 100644 DeviceSettings/res/menu/device_settings.xml delete mode 100644 DeviceSettings/res/values-de/arrays.xml delete mode 100644 DeviceSettings/res/values-de/strings.xml delete mode 100644 DeviceSettings/res/values-es/arrays.xml delete mode 100644 DeviceSettings/res/values-es/strings.xml delete mode 100644 DeviceSettings/res/values-fi/arrays.xml delete mode 100644 DeviceSettings/res/values-fi/strings.xml delete mode 100644 DeviceSettings/res/values-hu/arrays.xml delete mode 100644 DeviceSettings/res/values-hu/strings.xml delete mode 100644 DeviceSettings/res/values-it/arrays.xml delete mode 100644 DeviceSettings/res/values-it/strings.xml delete mode 100644 DeviceSettings/res/values-nl/arrays.xml delete mode 100644 DeviceSettings/res/values-nl/strings.xml delete mode 100755 DeviceSettings/res/values-pt-rBR/arrays.xml delete mode 100755 DeviceSettings/res/values-pt-rBR/strings.xml delete mode 100644 DeviceSettings/res/values-sw600dp/dimens.xml delete mode 100644 DeviceSettings/res/values-sw720dp-land/dimens.xml delete mode 100644 DeviceSettings/res/values-v11/styles.xml delete mode 100644 DeviceSettings/res/values-v14/styles.xml delete mode 100644 DeviceSettings/res/values-zh-rCN/arrays.xml delete mode 100644 DeviceSettings/res/values-zh-rCN/strings.xml delete mode 100644 DeviceSettings/res/values/arrays.xml delete mode 100644 DeviceSettings/res/values/dimens.xml delete mode 100644 DeviceSettings/res/values/strings.xml delete mode 100644 DeviceSettings/res/values/styles.xml delete mode 100644 DeviceSettings/res/xml/advanced_preferences.xml delete mode 100644 DeviceSettings/res/xml/general_preferences.xml delete mode 100644 DeviceSettings/res/xml/screen_preferences.xml delete mode 100644 DeviceSettings/res/xml/usb_preferences.xml delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/DeepestSleepState.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java delete mode 100755 DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java delete mode 100644 DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java diff --git a/DeviceSettings/Android.mk b/DeviceSettings/Android.mk deleted file mode 100644 index 0aabc3f..0000000 --- a/DeviceSettings/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13 - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := GalaxySAdvanceSettings -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/DeviceSettings/AndroidManifest.xml b/DeviceSettings/AndroidManifest.xml deleted file mode 100644 index a103d20..0000000 --- a/DeviceSettings/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DeviceSettings/res/drawable-hdpi/ic_launcher.png b/DeviceSettings/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index c0cefa1a61b4b3e07daaf389739b2fbcd1bccc73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 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 diff --git a/DeviceSettings/res/drawable-xhdpi/ic_launcher.png b/DeviceSettings/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index a7f789b09078bf737083822ce691a16817fc7ecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5136 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 diff --git a/DeviceSettings/res/drawable-xxhdpi/ic_launcher.png b/DeviceSettings/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index 4bb62107e000ac6c88568ecb397f8d127e802f36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7515 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 KUX_kZ^#1_2tO$t! diff --git a/DeviceSettings/res/drawable/ic_launcher_cmdevicesettings.png b/DeviceSettings/res/drawable/ic_launcher_cmdevicesettings.png deleted file mode 100755 index 66de9c39a16e398679a44c88a16c5b685e63d8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8207 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 B$jATy diff --git a/DeviceSettings/res/layout/top.xml b/DeviceSettings/res/layout/top.xml deleted file mode 100755 index 744b568..0000000 --- a/DeviceSettings/res/layout/top.xml +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/DeviceSettings/res/menu/device_settings.xml b/DeviceSettings/res/menu/device_settings.xml deleted file mode 100644 index 70f8954..0000000 --- a/DeviceSettings/res/menu/device_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ -

    - - - - diff --git a/DeviceSettings/res/values-de/arrays.xml b/DeviceSettings/res/values-de/arrays.xml deleted file mode 100644 index 4cca017..0000000 --- a/DeviceSettings/res/values-de/arrays.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - 2.2 (Standard) - 1.9 - - - 7 - 10 - 13 - 17 (Standard) - 25 - 30 - - - Nur UMTS - Nur HSDPA - HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-de/strings.xml b/DeviceSettings/res/values-de/strings.xml deleted file mode 100644 index 50d20b5..0000000 --- a/DeviceSettings/res/values-de/strings.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - Galaxy S Advance Einstellungen - Bildschirm - Farben - Gamma - Gamma Wert - Touchscreen - Empfindlichkeit - Berührungs-Empfindlichkeit - Beschleunigungssensor - Kalibierungsdaten - Kalibrierungswerte verwenden\nNach Aktivierung bitte Kalibrierung ausführen - Kalibrieren - Sensor kalibrieren\nZum Starten das Telefon auf eine horizontale, ebene Fläche legen - Kalibrierung beendet - Der Beschleunigungssensor wurde kalibriert - HSPA - HSDPA/HSUPA an/aus - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-es/arrays.xml b/DeviceSettings/res/values-es/arrays.xml deleted file mode 100644 index bbcfd98..0000000 --- a/DeviceSettings/res/values-es/arrays.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - 2.2 (por defecto) - 1.9 - - - 7 - 10 - 13 - 17 (por defecto) - 25 - 30 - - - Solo UMTS - Solo HSDPA - HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-es/strings.xml b/DeviceSettings/res/values-es/strings.xml deleted file mode 100644 index 0f8e3f7..0000000 --- a/DeviceSettings/res/values-es/strings.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - "Ajustes Galaxy S Advance" - "Pantalla" - "Colores" - "Gamma" - "Establece el valor Gamma de la pantalla" - "Pantalla táctil" - "Sensibilidad táctil" - "Establecer la sensibilidad del panel táctil" - "Acelerómetro" - "Usar datos de calibración" - "Usar los valores de calibración del acelerómetro. ¡Realizar una calibración después de habilitar esta funcionalidad!" - "Calibrar" - "Poner el teléfono sobre una superficie plana, y presionar este menú para calibrar de nuevo" - "Calibración realizada" - "El sensor ha sido calibrado satisfactoriamente" - "HSPA" - "Habilitar HSDPA/HSUPA" - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-fi/arrays.xml b/DeviceSettings/res/values-fi/arrays.xml deleted file mode 100644 index 606eec8..0000000 --- a/DeviceSettings/res/values-fi/arrays.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - 2.2 (Oletus) - 1.9 - - - 7 - 10 - 13 - 17 (Oletus) - 25 - 30 - - - Vain UMTS - Vain HSDPA - HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-fi/strings.xml b/DeviceSettings/res/values-fi/strings.xml deleted file mode 100644 index c3b2c91..0000000 --- a/DeviceSettings/res/values-fi/strings.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - Galaxy S Advance-asetukset - Näyttö - Värit - Näytön gamma - Säädä näytön gamma-arvo - Kosketusnäyttö - Kosketuksen herkkyys - Säädä näytön herkkyyttä - Kiihtyvyysanturi - Käytä kalibrointitietoja - Käytä kiihtyvyysanturin kalibrointiarvoja. Kalibroi merkattuasi tämän! - Kalibroi - Aseta puhelin tasaiselle alustalle ja paina tätä kalibroidaksesi - Kalibrointi valmis - Sensori kalibroitu onnistuneesti - HSPA - Ota HSDPA/HSUPA käyttöön - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-hu/arrays.xml b/DeviceSettings/res/values-hu/arrays.xml deleted file mode 100644 index b3c00d7..0000000 --- a/DeviceSettings/res/values-hu/arrays.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - 2.2 (Alapbeállítás) - 1.9 - - - - 7 - 10 - 13 - 17 (Alapbeállítás) - 25 - 30 - - - - UMTS - HSDPA - HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-hu/strings.xml b/DeviceSettings/res/values-hu/strings.xml deleted file mode 100644 index a1ac33e..0000000 --- a/DeviceSettings/res/values-hu/strings.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - Galaxy S Advance Beállítások - KijelzÅ‘ - Színek - KijelzÅ‘ gamma-értéke - KijelzÅ‘ gamma-érték beállítása - ÉrintÅ‘képernyÅ‘ - Érzékenység - ÉrintÅ‘képernyÅ‘ érzékenységének beállítása - Giroszkóp - Kalibrálási érték használata - Kalibrálási érték használata. Érdemes újra kalibrálni, ha ez a funkció használatban van! - Kalibrálás - Kalibráláshoz a telefont vízszintes felületre kell helyezni, és megérinteni ezt a gombot - Kalibrálás befejezve - Az érzékelÅ‘ sikeresen bekalibrálva. - HSPA - HSDPA/HSUPA engedélyezése - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-it/arrays.xml b/DeviceSettings/res/values-it/arrays.xml deleted file mode 100644 index b6b4387..0000000 --- a/DeviceSettings/res/values-it/arrays.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - 800 mAh *ATTENZIONE* - 600 mAh (Ricarica Veloce) - 400 mAh - - - Stato 5 - Stato 4 - Stato 3 (Predefinito) - - - 800 mAh *ATTENZIONE* - 600 mAh (Predefinito) - 400 mAh - - - 2.2 (Predefinito) - 1.9 - - - 7 - 10 - 13 - 17 (Predefinito) - 25 - 30 - - - Solo UMTS - Solo HSDPA - HSDPA + HSUPA - - - 28kb (stock) - 48kb (predefinito) - - - 16mb - 24mb - 32mb - 48mb - - - Abilitato (predefinito) - Disabilitato - Dinamico - - - diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml deleted file mode 100644 index 9a56793..0000000 --- a/DeviceSettings/res/values-it/strings.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - Impostazioni Galaxy S Advance - Generale - HSPA - Abilita HSDPA/HSUPA - Accelerometro - Usa dati di calibrazione - Usa i valori di calibrazione dell\'accelerometro. Effettuare una calibrazione dopo aver attivato questa impostazione! - Calibrazione - Posizionare il telefono su una superficie orizzontale piana e premere per effettuare la calibrazione - Calibrazione effettuata - Il sensore è stato correttamente calibrato. - Profondissimo Deep Sleep - Specifica il più alto livello di deep sleep - Schermo - Colori - Gamma schermo - Imposta il valore gamma dello schermo - Schermo tattile - Sensibilità tocco - Imposta la sensibilità al tocco dello schermo - Impostazioni USB OTG - Attivazione USB-OTG - Abilita alimentazione (in uscita) della porta USB - Controllo Caricabatterie - Intensità Caricabatterie - Intensità caricabatterie in mAh, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - Intensità Caricabatterie USB - Intensità carica USB in mAh, utile per implementare la ricarica veloce, bassi livelli proteggono la batteria ma è richiesto maggior tempo per la ricarica, alte frequenze potrebbero danneggiare la durata della batteria - - - Modalità Rete - - - Sweep2Wake - Sblocca il telefono con uno swype - - - Usb - - - Avanzate - - - Deep Sleep - - - FSync - Modalità FSync - Disabilitando Fsync puoi migliorare le performace I/O, ma potrebbe causare la corruzione dei dati. L\'Fsync dinamico sincronizzerà i buffer quando lo schermo si spegnerà. - - - GPU - Mali L2 Letture Massime - Aumentandole potrebbero migliorare le performance grafiche. - Grandezza memoria Mali Pre-allocata - Aumentandola potrebbero migliorare le performance grafiche. - - - Scheda SD - Disabilita SPI CRC - Disabilitando lo SPI CRC, possono migliorare le performance della Scheda SD (10% - 30%) ma il telefono potrebbe freezare in modo casuale - - diff --git a/DeviceSettings/res/values-nl/arrays.xml b/DeviceSettings/res/values-nl/arrays.xml deleted file mode 100644 index f8a84d8..0000000 --- a/DeviceSettings/res/values-nl/arrays.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - 2,2 (standaard) - 1,9 - - - 7 - 10 - 13 - 17 (default) - 25 - 30 - - - Alleen UMTS - Alleen HSDPA - HSDPA & HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-nl/strings.xml b/DeviceSettings/res/values-nl/strings.xml deleted file mode 100644 index 9ca34f0..0000000 --- a/DeviceSettings/res/values-nl/strings.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Galaxy S Advance-instellingen - Kleuren - Scherm - Schermgamma - Schermgammawaarden instellen - Aanraakscherm - Aanraakgevoeligheid - Gevoeligheid aanraakscherm instellen - Gyroscoop - Kalibratiegegevens gebruiken - Kalibratiewaarden van de gyroscoop gebruiken. Voer hierna a.u.b. een kalibratie uit. - Kalibreren - Plaats de telefoon op een vlakke ondergrond en tik hier om te kalibreren - Kalibratie afgerond - De sensor is succesvol gekalibreerd. - HSPA - HSDPA/HSUPA inschakelen - - - - General - - - Radio mode - - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-pt-rBR/arrays.xml b/DeviceSettings/res/values-pt-rBR/arrays.xml deleted file mode 100755 index cdd75d4..0000000 --- a/DeviceSettings/res/values-pt-rBR/arrays.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - 2.2 (Padrão) - 1.9 - - - 7 - 10 - 13 - 17 (Padrão) - 25 - 30 - - - Somente UMTS - Somente HSDPA - HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-pt-rBR/strings.xml b/DeviceSettings/res/values-pt-rBR/strings.xml deleted file mode 100755 index fb96874..0000000 --- a/DeviceSettings/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - Config. Galaxy S Advance - Cores - Gama da Tela - Define valor da gama da tela - Tela sensível ao toque - Sensitividade do toque - Define a sensitividade do toque na tela - HSPA - Ativa HSDPA/HSUPA - Tela - Acelerômetro - Usar dados de calibragem - Usa os valores dos dados de calibragem. Calibre após marcar isto! - Calibrar - Coloque seu telefone em uma superfície plana, e pressione isto para calibrar - Calibragem terminada - O sensor foi calibrado com sucesso. - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values-sw600dp/dimens.xml b/DeviceSettings/res/values-sw600dp/dimens.xml deleted file mode 100644 index 3534241..0000000 --- a/DeviceSettings/res/values-sw600dp/dimens.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-sw720dp-land/dimens.xml b/DeviceSettings/res/values-sw720dp-land/dimens.xml deleted file mode 100644 index 941d575..0000000 --- a/DeviceSettings/res/values-sw720dp-land/dimens.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 128dp - - \ No newline at end of file diff --git a/DeviceSettings/res/values-v11/styles.xml b/DeviceSettings/res/values-v11/styles.xml deleted file mode 100644 index 037ee98..0000000 --- a/DeviceSettings/res/values-v11/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-v14/styles.xml b/DeviceSettings/res/values-v14/styles.xml deleted file mode 100644 index 603e7c5..0000000 --- a/DeviceSettings/res/values-v14/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/values-zh-rCN/arrays.xml b/DeviceSettings/res/values-zh-rCN/arrays.xml deleted file mode 100644 index 11085e0..0000000 --- a/DeviceSettings/res/values-zh-rCN/arrays.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - 2.2 (默认) - 1.9 - - - 7 - 10 - 13 - 17 (默认) - 25 - 30 - - - 仅使用 UMTS - 仅使用 HSDPA - 使用 HSDPA + HSUPA - - - - - - 28kb (stock) - 48kb (default) - - - 16mb - 24mb - 32mb - 48mb - - - Enabled (default) - Disabled - Dynamic - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - State 5 - State 4 - State 3 (default) - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - diff --git a/DeviceSettings/res/values-zh-rCN/strings.xml b/DeviceSettings/res/values-zh-rCN/strings.xml deleted file mode 100644 index 5df99c0..0000000 --- a/DeviceSettings/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - Galaxy S Advance 设置 - å±å¹• - 颜色 - å±å¹•çˆçŽ› - 设置å±å¹•çˆçŽ› - è§¦æ‘¸å± - 触摸å±çµæ•åº¦ - 设置触摸å±çµæ•åº¦ - 加速规 - ä½¿ç”¨æ ¡å‡†æ•°æ® - 使用加速规的校准数æ®. 请在检查此之åŽé‡æ–°æ ¡å‡†! - 校准 - 把手机放在平é¢ä¸Šï¼Œç„¶åŽç‚¹å‡»æ­¤æŒ‰é”®è¿›è¡Œæ ¡å‡† - æ ¡å‡†å®Œæˆ - 感应器已被æˆåŠŸçš„校准. - HSPA - å¯ç”¨ HSDPA/HSUPA - - - - - - General - - - Radio mode - - - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Advanced - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - \ No newline at end of file diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml deleted file mode 100644 index d838b6c..0000000 --- a/DeviceSettings/res/values/arrays.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - 28kb (stock) - 48kb (default) - - - 28 - 48 - - - 16mb - 24mb - 32mb - 48mb - - - 16777216 - 25165824 - 33554432 - 50331648 - - - Enabled (default) - Disabled - Dynamic - - - 0 - 1 - 2 - - - 800 mAh *WARNING* - 600 mAh (fast charge) - 400 mAh - - - 800 - 600 - 400 - - - State 5 - State 4 - State 3 (default) - - - 5 - 4 - 3 - - - 800 mAh *WARNING* - 600 mAh (default) - 400 mAh - - - 800 - 600 - 400 - - - 2.2 (Default) - 1.9 - - - 0 - 1 - - - 7 - 10 - 13 - 17 (Default) - 25 - 30 - - - val=7 - val=10 - val=13 - val=17 - val=25 - val=30 - - - UMTS Only - HSDPA Only - HSDPA + HSUPA - - - 21 - 22 - 23 - - - \ No newline at end of file diff --git a/DeviceSettings/res/values/dimens.xml b/DeviceSettings/res/values/dimens.xml deleted file mode 100644 index 55c1e59..0000000 --- a/DeviceSettings/res/values/dimens.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 16dp - 16dp - - diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml deleted file mode 100644 index b85a29d..0000000 --- a/DeviceSettings/res/values/strings.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - Galaxy S Advance Settings - - - General - - - Radio mode - HSPA - Enable HSDPA/HSUPA - - - Accelerometer - Use calibration data - Use the accelerometer calibration values. Do a calibration after checking this! - Calibrate - Put your phone on a flat surface, and press this to calibrate - Calibration done - The sensor has been successfully calibrated. - - - Screen - - - Colors - Screen Gamma - Set screen gamma value - - - Touchscreen - Touch sensitivity - Set touch panel sensitivity - Sweep2Wake - Unlock device with a swype - - - Usb - - - USB OTG Settings - USB-VBUS Power - Enables output voltage to the USB port - - - Charger control - Wall charger currency - Wall charger currency in mAh, low levels protect battery but takes longer to charge, high levels may damage battery life - USB cable currency - USB cable currency in mAh, useful to implement Fast Charge, low levels protect battery but takes longer to charge, high levels may damage battery life - - - Deep Sleep - Deepest sleep state - Specify the highest deep sleep level - - - - Advanced - - - FSync - FSync mode - Disabling fsync can improve IO performace, but it may cause data corruption. Dynamic fsync will sync all buffers when screen turns off. - - - GPU - Mali L2 Max Reads - Increasing it may improve graphics performance. - Mali Pre-allocated memory size - Increasing it may improve graphics performance. - - - MMC - Disable SPI CRC - Disabling SPI CRC can improve mmc performance (10% - 30%) but phone may freeze randomly - - diff --git a/DeviceSettings/res/values/styles.xml b/DeviceSettings/res/values/styles.xml deleted file mode 100644 index b0930e7..0000000 --- a/DeviceSettings/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/xml/advanced_preferences.xml b/DeviceSettings/res/xml/advanced_preferences.xml deleted file mode 100644 index 079c003..0000000 --- a/DeviceSettings/res/xml/advanced_preferences.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/DeviceSettings/res/xml/general_preferences.xml b/DeviceSettings/res/xml/general_preferences.xml deleted file mode 100644 index d3959a1..0000000 --- a/DeviceSettings/res/xml/general_preferences.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/DeviceSettings/res/xml/screen_preferences.xml b/DeviceSettings/res/xml/screen_preferences.xml deleted file mode 100644 index e5684e9..0000000 --- a/DeviceSettings/res/xml/screen_preferences.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeviceSettings/res/xml/usb_preferences.xml b/DeviceSettings/res/xml/usb_preferences.xml deleted file mode 100644 index 67f7c01..0000000 --- a/DeviceSettings/res/xml/usb_preferences.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java deleted file mode 100644 index e8995e8..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/AdvancedFragmentActivity.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import com.cyanogenmod.settings.device.R; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.util.Log; - -public class AdvancedFragmentActivity extends PreferenceFragment { - - private static final String TAG = "GalaxySAdvance_Settings_Advanced"; - - public static final String FILE_SPI_CRC = "/sys/module/mmc_core/parameters/use_spi_crc"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.advanced_preferences); - - PreferenceScreen prefSet = getPreferenceScreen(); - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - - String boxValue; - String key = preference.getKey(); - - Log.w(TAG, "key: " + key); - - if (key.equals(DeviceSettings.KEY_USE_SPI_CRC)) { - boxValue = (((CheckBoxPreference) preference).isChecked() ? "0" - : "1"); - Utils.writeValue(FILE_SPI_CRC, boxValue); - } - - return true; - } - - public static void restore(Context context) { - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - - String value = sharedPrefs.getBoolean(DeviceSettings.KEY_USE_SPI_CRC, - false) ? "0" : "1"; - Utils.writeValue(FILE_SPI_CRC, value); - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java deleted file mode 100644 index 3c28135..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ChargerCurrency.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class ChargerCurrency extends ListPreference implements - OnPreferenceChangeListener { - - public ChargerCurrency(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/kernel/abb-charger/max_ac_c"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore currency setting from SharedPreferences. (Write to kernel.) - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_AC_CURRENCY, "600")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeepestSleepState.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeepestSleepState.java deleted file mode 100644 index cab8276..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeepestSleepState.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class DeepestSleepState extends ListPreference implements - OnPreferenceChangeListener { - - public DeepestSleepState(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/d/cpuidle/deepest_state"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore deepest sleep state from SharedPreferences. - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString( - DeviceSettings.KEY_DEEPEST_SLEEP_STATE, "3")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java deleted file mode 100644 index 8b7165f..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.app.ActionBar; -import android.app.ActionBar.Tab; -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentTransaction; -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.v13.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.view.MenuItem; - -import java.util.ArrayList; - -import com.cyanogenmod.settings.device.R; - -public class DeviceSettings extends FragmentActivity { - - public static final String SHARED_PREFERENCES_BASENAME = "com.cyanogenmod.settings.device"; - public static final String ACTION_UPDATE_PREFERENCES = "com.cyanogenmod.settings.device.UPDATE"; - public static final String KEY_PANEL_GAMMA = "panel_gamma"; - public static final String KEY_HSPA = "hspa"; - public static final String KEY_USE_ACCELEROMETER_CALIBRATION = "use_accelerometer_calibration"; - public static final String KEY_CALIBRATE_ACCELEROMETER = "calibrate_accelerometer"; - public static final String KEY_TOUCHSCREEN_SENSITIVITY = "touchscreen_sensitivity"; - public static final String KEY_USE_DOCK_AUDIO = "dock_audio"; - public static final String KEY_USB_OTG_POWER = "usb_otg_power"; - public static final String KEY_DEEPEST_SLEEP_STATE = "deepest_sleep_state"; - public static final String KEY_AC_CURRENCY = "ac_currency"; - public static final String KEY_USB_CURRENCY = "usb_currency"; - public static final String KEY_FSYNC_MODE = "fsync_mode"; - public static final String KEY_MALI_L2MR = "mali_l2_mr"; - public static final String KEY_MALI_PAM = "mali_pam"; - public static final String KEY_USE_SWEEP2WAKE = "use_sweep2wake"; - public static final String KEY_USE_SPI_CRC = "use_spi_crc"; - - ViewPager mViewPager; - TabsAdapter mTabsAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mViewPager = new ViewPager(this); - mViewPager.setId(R.id.viewPager); - setContentView(mViewPager); - - final ActionBar bar = getActionBar(); - bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); - bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, - ActionBar.DISPLAY_SHOW_TITLE); - bar.setTitle(R.string.app_name); - bar.setDisplayHomeAsUpEnabled(true); - - mTabsAdapter = new TabsAdapter(this, mViewPager); - mTabsAdapter.addTab( - bar.newTab().setText(R.string.category_general_title), - GeneralFragmentActivity.class, null); - mTabsAdapter.addTab(bar.newTab() - .setText(R.string.category_screen_title), - ScreenFragmentActivity.class, null); - mTabsAdapter.addTab(bar.newTab().setText(R.string.category_usb_title), - USBFragmentActivity.class, null); - mTabsAdapter.addTab( - bar.newTab().setText(R.string.category_advanced_title), - AdvancedFragmentActivity.class, null); - - if (savedInstanceState != null) { - bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); - } - - public static class TabsAdapter extends FragmentPagerAdapter implements - ActionBar.TabListener, ViewPager.OnPageChangeListener { - private final Context mContext; - private final ActionBar mActionBar; - private final ViewPager mViewPager; - private final ArrayList mTabs = new ArrayList(); - - static final class TabInfo { - private final Class clss; - private final Bundle args; - - TabInfo(Class _class, Bundle _args) { - clss = _class; - args = _args; - } - } - - public TabsAdapter(Activity activity, ViewPager pager) { - super(activity.getFragmentManager()); - mContext = activity; - mActionBar = activity.getActionBar(); - mViewPager = pager; - mViewPager.setAdapter(this); - mViewPager.setOnPageChangeListener(this); - } - - public void addTab(ActionBar.Tab tab, Class clss, Bundle args) { - TabInfo info = new TabInfo(clss, args); - tab.setTag(info); - tab.setTabListener(this); - mTabs.add(info); - mActionBar.addTab(tab); - notifyDataSetChanged(); - } - - @Override - public int getCount() { - return mTabs.size(); - } - - @Override - public Fragment getItem(int position) { - TabInfo info = mTabs.get(position); - return Fragment.instantiate(mContext, info.clss.getName(), - info.args); - } - - public void onPageScrolled(int position, float positionOffset, - int positionOffsetPixels) { - } - - public void onPageSelected(int position) { - mActionBar.setSelectedNavigationItem(position); - } - - public void onPageScrollStateChanged(int state) { - } - - public void onTabSelected(Tab tab, FragmentTransaction ft) { - Object tag = tab.getTag(); - for (int i = 0; i < mTabs.size(); i++) { - if (mTabs.get(i) == tag) { - mViewPager.setCurrentItem(i); - } - } - } - - public void onTabUnselected(Tab tab, FragmentTransaction ft) { - } - - public void onTabReselected(Tab tab, FragmentTransaction ft) { - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - DeviceSettings.this.onBackPressed(); - default: - return super.onOptionsItemSelected(item); - } - } -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java b/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java deleted file mode 100644 index fc1c123..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/FsyncMode.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class FsyncMode extends ListPreference implements - OnPreferenceChangeListener { - - public FsyncMode(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/kernel/fsync/mode"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore deepest sleep state from SharedPreferences. - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_FSYNC_MODE, "0")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java deleted file mode 100644 index e67c5c0..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/GeneralFragmentActivity.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import com.cyanogenmod.settings.device.R; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.util.Log; - -public class GeneralFragmentActivity extends PreferenceFragment { - - private static final String TAG = "GalaxySAdvance_Settings_General"; - - private static final String FILE_ACCELEROMETER_CALIB = "/sys/class/sensors/accelerometer_sensor/calibration"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.general_preferences); - - // PreferenceScreen prefSet = getPreferenceScreen(); - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - - String boxValue; - String key = preference.getKey(); - - Log.w(TAG, "key: " + key); - - if (key.compareTo(DeviceSettings.KEY_USE_ACCELEROMETER_CALIBRATION) == 0) { - boxValue = (((CheckBoxPreference) preference).isChecked() ? "1" - : "0"); - Utils.writeValue(FILE_ACCELEROMETER_CALIB, boxValue); - } else if (key.compareTo(DeviceSettings.KEY_CALIBRATE_ACCELEROMETER) == 0) { - // when calibration data utilization is disabled and enabled back, - // calibration is done at the same time by driver - Utils.writeValue(FILE_ACCELEROMETER_CALIB, "0"); - Utils.writeValue(FILE_ACCELEROMETER_CALIB, "1"); - Utils.showDialog((Context) getActivity(), - getString(R.string.accelerometer_dialog_head), - getString(R.string.accelerometer_dialog_message)); - } - - return true; - } - - public static boolean isSupported(String FILE) { - return Utils.fileExists(FILE); - } - - public static void restore(Context context) { - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - boolean accelerometerCalib = sharedPrefs.getBoolean( - DeviceSettings.KEY_USE_ACCELEROMETER_CALIBRATION, true); - - // When use accelerometer calibration value is set to 1, calibration is - // done at the same time, which - // means it is reset at each boot, providing wrong calibration most of - // the time at each reboot. - // So we only set it to "0" if user wants it, as it defaults to 1 at - // boot - if (!accelerometerCalib) - Utils.writeValue(FILE_ACCELEROMETER_CALIB, "0"); - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java deleted file mode 100644 index d196dc6..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Hspa.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.util.AttributeSet; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class Hspa extends ListPreference implements OnPreferenceChangeListener { - - private static final String FILE = "/system/app/SamsungServiceMode.apk"; - private Context mCtx; - - public Hspa(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - mCtx = context; - } - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore hspa setting from SharedPreferences. (Write to kernel.) - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - sendIntent(context, - sharedPrefs.getString(DeviceSettings.KEY_HSPA, "23")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - sendIntent(mCtx, (String) newValue); - return true; - } - - private static void sendIntent(Context context, String value) { - Intent i = new Intent("com.cyanogenmod.SamsungServiceMode.EXECUTE"); - i.putExtra("sub_type", 20); // HSPA Setting - i.putExtra("data", value); - context.sendBroadcast(i); - } -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java deleted file mode 100644 index bd89c0e..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliL2MaxReads.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class MaliL2MaxReads extends ListPreference implements - OnPreferenceChangeListener { - - public MaliL2MaxReads(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/module/mali/parameters/mali_l2_max_reads"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore deepest sleep state from SharedPreferences. - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_MALI_L2MR, "48")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java b/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java deleted file mode 100644 index 002b881..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/MaliPreAllocMem.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class MaliPreAllocMem extends ListPreference implements - OnPreferenceChangeListener { - - public MaliPreAllocMem(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/module/mali/parameters/pre_allocated_memory_size_max"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore deepest sleep state from SharedPreferences. - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_MALI_PAM, "50331648")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java b/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java deleted file mode 100644 index a3c8555..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/PanelGamma.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.Log; -import android.content.SharedPreferences; -import android.util.AttributeSet; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class PanelGamma extends ListPreference implements - OnPreferenceChangeListener { - - public PanelGamma(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/class/lcd/panel/device/gamma_mode"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore panel gamma setting from SharedPreferences. (Write to kernel.) - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_PANEL_GAMMA, "0")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Log.d("SGS2", "Writing " + ((String) newValue) + " to " + FILE); - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java deleted file mode 100755 index 9ad65c3..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/ScreenFragmentActivity.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import com.cyanogenmod.settings.device.R; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.util.Log; - -public class ScreenFragmentActivity extends PreferenceFragment { - - private static final String TAG = "GalaxySAdvance_Settings_Screen"; - - private TouchscreenSensitivity mTouchscreenSensitivity; - - public static final String FILE_SWEEP2WAKE = "/sys/kernel/mxt224e/sweep2wake"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.screen_preferences); - // PreferenceScreen prefSet = getPreferenceScreen(); - - mTouchscreenSensitivity = (TouchscreenSensitivity) findPreference(DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY); - mTouchscreenSensitivity - .setEnabled(TouchscreenSensitivity.isSupported()); - - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - - String boxValue; - String key = preference.getKey(); - - Log.w(TAG, "key: " + key); - - if (key.equals(DeviceSettings.KEY_USE_SWEEP2WAKE)) { - boxValue = (((CheckBoxPreference) preference).isChecked() ? "on" - : "off"); - Utils.writeValue(FILE_SWEEP2WAKE, boxValue); - - } - - return true; - } - - public static void restore(Context context) { - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - sharedPrefs.getBoolean(DeviceSettings.KEY_USE_SWEEP2WAKE, false); - - String value = sharedPrefs.getBoolean( - DeviceSettings.KEY_USE_SWEEP2WAKE, false) ? "on" : "off"; - Utils.writeValue(FILE_SWEEP2WAKE, value); - - } -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java deleted file mode 100644 index 06d5495..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -public class Startup extends BroadcastReceiver { - - @Override - public void onReceive(final Context context, final Intent bootintent) { - ScreenFragmentActivity.restore(context); - USBFragmentActivity.restore(context); - ChargerCurrency.restore(context); - UsbCurrency.restore(context); - DeepestSleepState.restore(context); - GeneralFragmentActivity.restore(context); - PanelGamma.restore(context); - FsyncMode.restore(context); - MaliL2MaxReads.restore(context); - MaliPreAllocMem.restore(context); - AdvancedFragmentActivity.restore(context); - } -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java deleted file mode 100644 index 6c4b141..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/TouchscreenSensitivity.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class TouchscreenSensitivity extends ListPreference implements - OnPreferenceChangeListener { - - public TouchscreenSensitivity(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/kernel/mxt224e/threshold_t48"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore touchscreen sensitivity setting from SharedPreferences. (Write to - * kernel.) - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, sharedPrefs.getString( - DeviceSettings.KEY_TOUCHSCREEN_SENSITIVITY, "val=17")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java deleted file mode 100644 index 690c023..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/USBFragmentActivity.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.preference.CheckBoxPreference; -import android.util.Log; - -import com.cyanogenmod.settings.device.R; - -public class USBFragmentActivity extends PreferenceFragment { - - private static final String TAG = "GalaxySAdvance_Settings_Usb"; - private final String FILE = "/sys/kernel/abb-regu/VOTG"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.usb_preferences); - - PreferenceScreen prefSet = getPreferenceScreen(); - - prefSet.findPreference(DeviceSettings.KEY_AC_CURRENCY).setEnabled( - ChargerCurrency.isSupported()); - prefSet.findPreference(DeviceSettings.KEY_USB_CURRENCY).setEnabled( - UsbCurrency.isSupported()); - prefSet.findPreference(DeviceSettings.KEY_USB_OTG_POWER).setEnabled( - isSupported(FILE)); - - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - - // String boxValue; - String key = preference.getKey(); - - Log.w(TAG, "key: " + key); - - if (key.equals(DeviceSettings.KEY_USB_OTG_POWER)) { - if (((CheckBoxPreference) preference).isChecked()) { - Utils.writeValue(FILE, "1"); - } else { - Utils.writeValue(FILE, "0"); - } - } - - return true; - } - - public static boolean isSupported(String FILE) { - return Utils.fileExists(FILE); - } - - public static void restore(Context context) { - PreferenceManager.getDefaultSharedPreferences(context); - } -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java b/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java deleted file mode 100644 index 35261ef..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/UsbCurrency.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.content.Context; -import android.util.AttributeSet; -import android.content.SharedPreferences; -import android.preference.Preference; -import android.preference.ListPreference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; - -public class UsbCurrency extends ListPreference implements - OnPreferenceChangeListener { - - public UsbCurrency(Context context, AttributeSet attrs) { - super(context, attrs); - this.setOnPreferenceChangeListener(this); - } - - private static final String FILE = "/sys/kernel/abb-charger/max_usb_c"; - - public static boolean isSupported() { - return Utils.fileExists(FILE); - } - - /** - * Restore currency setting from SharedPreferences. (Write to kernel.) - * - * @param context - * The context to read the SharedPreferences from - */ - public static void restore(Context context) { - if (!isSupported()) { - return; - } - - SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(context); - Utils.writeValue(FILE, - sharedPrefs.getString(DeviceSettings.KEY_USB_CURRENCY, "600")); - } - - public boolean onPreferenceChange(Preference preference, Object newValue) { - Utils.writeValue(FILE, (String) newValue); - return true; - } - -} diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java deleted file mode 100644 index e7c7b2b..0000000 --- a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.settings.device; - -import android.util.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.SyncFailedException; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; - -public class Utils { - - private static final String TAG = "GalaxySAdvance_Settings_Utils"; - // private static final String TAG_READ = - // "GalaxySAdvance_Settings_Utils_Read"; - private static final String TAG_WRITE = "GalaxySAdvance_Settings_Utils_Write"; - - /** - * Write a string value to the specified file. - * - * @param filename - * The filename - * @param value - * The value - */ - public static void writeValue(String filename, String value) { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(new File(filename), false); - fos.write(value.getBytes()); - fos.flush(); - // fos.getFD().sync(); - } catch (FileNotFoundException ex) { - Log.w(TAG, "file " + filename + " not found: " + ex); - } catch (SyncFailedException ex) { - Log.w(TAG, "file " + filename + " sync failed: " + ex); - } catch (IOException ex) { - Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while syncing file: ", ex); - } finally { - if (fos != null) { - try { - Log.w(TAG_WRITE, "file " + filename + ": " + value); - fos.close(); - } catch (IOException ex) { - Log.w(TAG, "IOException while closing synced file: ", ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while closing file: ", ex); - } - } - } - - } - - /** - * Write a string value to the specified file. - * - * @param filename - * The filename - * @param value - * The value - */ - public static void writeValue(String filename, Boolean value) { - FileOutputStream fos = null; - String sEnvia; - try { - fos = new FileOutputStream(new File(filename), false); - if (value) - sEnvia = "1"; - else - sEnvia = "0"; - fos.write(sEnvia.getBytes()); - fos.flush(); - // fos.getFD().sync(); - } catch (FileNotFoundException ex) { - Log.w(TAG, "file " + filename + " not found: " + ex); - } catch (SyncFailedException ex) { - Log.w(TAG, "file " + filename + " sync failed: " + ex); - } catch (IOException ex) { - Log.w(TAG, "IOException trying to sync " + filename + ": " + ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while syncing file: ", ex); - } finally { - if (fos != null) { - try { - Log.w(TAG_WRITE, "file " + filename + ": " + value); - fos.close(); - } catch (IOException ex) { - Log.w(TAG, "IOException while closing synced file: ", ex); - } catch (RuntimeException ex) { - Log.w(TAG, "exception while closing file: ", ex); - } - } - } - } - - /** - * Write the "color value" to the specified file. The value is scaled from - * an integer to an unsigned integer by multiplying by 2. - * - * @param filename - * The filename - * @param value - * The value of max value Integer.MAX - */ - public static void writeColor(String filename, int value) { - writeValue(filename, String.valueOf((long) value * 2)); - } - - /** - * Check if the specified file exists. - * - * @param filename - * The filename - * @return Whether the file exists or not - */ - public static boolean fileExists(String filename) { - return new File(filename).exists(); - } - - public static void showDialog(Context ctx, String title, String message) { - final AlertDialog alertDialog = new AlertDialog.Builder(ctx).create(); - alertDialog.setTitle(title); - alertDialog.setMessage(message); - alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - alertDialog.dismiss(); - } - }); - alertDialog.show(); - } -} diff --git a/janice.mk b/janice.mk index da059e1..40cb46f 100644 --- a/janice.mk +++ b/janice.mk @@ -14,10 +14,6 @@ PRODUCT_COPY_FILES += \ PRODUCT_PROPERTY_OVERRIDES += \ media.aac_51_output_enabled=true -# Packages -PRODUCT_PACKAGES += \ - GalaxySAdvanceSettings - # GPS PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf \ diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 91be82c..5abeda5 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -629,3 +629,49 @@ service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled + +# System permission for device parts +on property:sys.boot_completed=1 + chown system system /proc/sys/net/ipv4/tcp_congestion_control + chown system system /sys/block/mmcblk0/queue/read_ahead_kb + chown system system /sys/devices/system/cpu/sched_mc_power_savings + chown system system /sys/kernel/abb-fg/cyc_fg + chown system system /sys/kernel/abb-charger/charger_curr + chown system system /sys/kernel/abb-chargalg/eoc_first + chown system system /sys/kernel/abb-chargalg/eoc_real + chown system system /sys/kernel/abb-codec/anagain3 + chown system system /sys/kernel/abb-codec/hsrdiggain + chown system system /sys/kernel/abb-codec/hsldiggain + chown system system /sys/kernel/abb-codec/hslowpow + chown system system /sys/kernel/abb-codec/hsdaclowpow + chown system system /sys/kernel/abb-codec/hshpen + chown system system /sys/kernel/abb-codec/classdhpg + chown system system /sys/kernel/abb-codec/classdwg + chown system system /sys/kernel/abb-codec/addiggain2 + chown system system /sys/kernel/abb-codec/eardiggain + chown system system /sys/kernel/abb-regu/VOTG + chown system system /sys/kernel/mxt224e/sweep2wake + chown system system /sys/kernel/debug/cpuidle/deepest_state + chown system system /sys/kernel/fsync/mode + chown system system /sys/kernel/liveopp/arm_step0 + chown system system /sys/kernel/liveopp/arm_step1 + chown system system /sys/kernel/liveopp/arm_step2 + chown system system /sys/kernel/liveopp/arm_step3 + chown system system /sys/kernel/liveopp/arm_step4 + chown system system /sys/kernel/liveopp/arm_step5 + chown system system /sys/kernel/liveopp/arm_step6 + chown system system /sys/kernel/liveopp/arm_step7 + chown system system /sys/kernel/liveopp/arm_step8 + chown system system /sys/kernel/liveopp/arm_step9 + chown system system /sys/kernel/mali/mali_gpu_clock + chown system system /sys/kernel/mali/mali_auto_boost + chown system system /sys/kernel/mali/mali_gpu_fullspeed + chown system system /sys/module/mmc_core/parameters/use_spi_crc + chown system system /sys/module/dhd/parameters/dhdpm_fast + chown system system /sys/kernel/mxt224e/threshold_t48 + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B + chown system system /sys/module/mali/parameters/mali_l2_max_reads + chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max + write /sys/kernel/mxt224e/threshold_t48 on From 71f2ec9feb609d97f73df452cc26db0dd67103ef Mon Sep 17 00:00:00 2001 From: t4n017 Date: Mon, 14 Apr 2014 23:19:57 -0300 Subject: [PATCH 219/248] Use ARM_EABI_TOOLCHAIN variable Use ARM_EABI_TOOLCHAIN variable to avoid editing toolchain path on build/core/task/kernel.mk --- BoardConfig.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BoardConfig.mk b/BoardConfig.mk index db06c9c..50ecf02 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -5,7 +5,8 @@ TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig -TARGET_KERNEL_CUSTOM_TOOLCHAIN := arm-eabi-4.6 +#TARGET_KERNEL_CUSTOM_TOOLCHAIN := arm-eabi-4.6 +ARM_EABI_TOOLCHAIN := $(ANDROID_BUILD_TOP)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth From 03d05b37ddccce92f93e5fd40ecee114fcef733a Mon Sep 17 00:00:00 2001 From: zwliew Date: Tue, 15 Apr 2014 20:59:35 +0800 Subject: [PATCH 220/248] init: Update Novathor settings permissions --- rootdir/init.samsungjanice.rc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5abeda5..f38d748 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -630,15 +630,14 @@ service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 class late_start disabled -# System permission for device parts +# System permission for NovaThor Settings on property:sys.boot_completed=1 chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb chown system system /sys/devices/system/cpu/sched_mc_power_savings - chown system system /sys/kernel/abb-fg/cyc_fg + chown system system /sys/kernel/abb-fg/fg_cyc + chown system system /sys/kernel/abb-fg/fg_refresh chown system system /sys/kernel/abb-charger/charger_curr - chown system system /sys/kernel/abb-chargalg/eoc_first - chown system system /sys/kernel/abb-chargalg/eoc_real chown system system /sys/kernel/abb-codec/anagain3 chown system system /sys/kernel/abb-codec/hsrdiggain chown system system /sys/kernel/abb-codec/hsldiggain @@ -649,6 +648,7 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/abb-codec/classdwg chown system system /sys/kernel/abb-codec/addiggain2 chown system system /sys/kernel/abb-codec/eardiggain + chown system system /sys/kernel/abb-ponkey/emulator chown system system /sys/kernel/abb-regu/VOTG chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/kernel/debug/cpuidle/deepest_state @@ -666,6 +666,7 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/mali/mali_gpu_clock chown system system /sys/kernel/mali/mali_auto_boost chown system system /sys/kernel/mali/mali_gpu_fullspeed + chown system system /sys/kernel/mali/mali_dvfs_config chown system system /sys/module/mmc_core/parameters/use_spi_crc chown system system /sys/module/dhd/parameters/dhdpm_fast chown system system /sys/kernel/mxt224e/threshold_t48 From a50daddfdf14cca51335dd02e4b2aff716fd95df Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 15 Apr 2014 19:51:16 +0200 Subject: [PATCH 221/248] Update permissions for NovaThor Settings --- rootdir/init.samsungjanice.rc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index f38d748..258fcc7 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -634,9 +634,10 @@ service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 on property:sys.boot_completed=1 chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B chown system system /sys/devices/system/cpu/sched_mc_power_savings - chown system system /sys/kernel/abb-fg/fg_cyc - chown system system /sys/kernel/abb-fg/fg_refresh chown system system /sys/kernel/abb-charger/charger_curr chown system system /sys/kernel/abb-codec/anagain3 chown system system /sys/kernel/abb-codec/hsrdiggain @@ -648,9 +649,10 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/abb-codec/classdwg chown system system /sys/kernel/abb-codec/addiggain2 chown system system /sys/kernel/abb-codec/eardiggain + chown system system /sys/kernel/abb-fg/fg_cyc + chown system system /sys/kernel/abb-fg/fg_refresh chown system system /sys/kernel/abb-ponkey/emulator chown system system /sys/kernel/abb-regu/VOTG - chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/kernel/debug/cpuidle/deepest_state chown system system /sys/kernel/fsync/mode chown system system /sys/kernel/liveopp/arm_step0 @@ -667,12 +669,10 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/mali/mali_auto_boost chown system system /sys/kernel/mali/mali_gpu_fullspeed chown system system /sys/kernel/mali/mali_dvfs_config - chown system system /sys/module/mmc_core/parameters/use_spi_crc - chown system system /sys/module/dhd/parameters/dhdpm_fast + chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/kernel/mxt224e/threshold_t48 - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B + chown system system /sys/module/dhd/parameters/dhdpm_fast chown system system /sys/module/mali/parameters/mali_l2_max_reads chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max + chown system system /sys/module/mmc_core/parameters/use_spi_crc write /sys/kernel/mxt224e/threshold_t48 on From a03a5f3f4d7a80a24304a43370f0d71623f1e00b Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Wed, 16 Apr 2014 21:09:02 +0200 Subject: [PATCH 222/248] Dont use legacy sensors --- BoardConfig.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BoardConfig.mk b/BoardConfig.mk index 50ecf02..ea9574a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -19,3 +19,6 @@ TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice # Hardware tunables (device parts replacement) BOARD_HARDWARE_CLASS := device/samsung/janice/cmhw + +# Disable legacy sensors using because janice has gyro +BOARD_USE_LEGACY_SENSORS_FUSION := false From 65bae1260ce579f00b2f0a47451af22f848c6f56 Mon Sep 17 00:00:00 2001 From: t4n017 Date: Sun, 20 Apr 2014 11:02:13 -0300 Subject: [PATCH 223/248] Update permissions for NovaThor Settings --- rootdir/init.samsungjanice.rc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 258fcc7..ae6bb60 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -634,21 +634,24 @@ service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 on property:sys.boot_completed=1 chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb + chown system system /sys/class/camera/flash/burning_led chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B chown system system /sys/devices/system/cpu/sched_mc_power_savings chown system system /sys/kernel/abb-charger/charger_curr + chown system system /sys/kernel/abb-codec/addiggain2 chown system system /sys/kernel/abb-codec/anagain3 - chown system system /sys/kernel/abb-codec/hsrdiggain - chown system system /sys/kernel/abb-codec/hsldiggain - chown system system /sys/kernel/abb-codec/hslowpow - chown system system /sys/kernel/abb-codec/hsdaclowpow - chown system system /sys/kernel/abb-codec/hshpen + chown system system /sys/kernel/abb-codec/chargepump chown system system /sys/kernel/abb-codec/classdhpg chown system system /sys/kernel/abb-codec/classdwg - chown system system /sys/kernel/abb-codec/addiggain2 chown system system /sys/kernel/abb-codec/eardiggain + chown system system /sys/kernel/abb-codec/hsdaclowpow + chown system system /sys/kernel/abb-codec/hshpen + chown system system /sys/kernel/abb-codec/hsldiggain + chown system system /sys/kernel/abb-codec/hslowpow + chown system system /sys/kernel/abb-codec/hsrdiggain + chown system system /sys/kernel/abb-codec/lpa_mode chown system system /sys/kernel/abb-fg/fg_cyc chown system system /sys/kernel/abb-fg/fg_refresh chown system system /sys/kernel/abb-ponkey/emulator @@ -665,10 +668,10 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/liveopp/arm_step7 chown system system /sys/kernel/liveopp/arm_step8 chown system system /sys/kernel/liveopp/arm_step9 - chown system system /sys/kernel/mali/mali_gpu_clock chown system system /sys/kernel/mali/mali_auto_boost - chown system system /sys/kernel/mali/mali_gpu_fullspeed chown system system /sys/kernel/mali/mali_dvfs_config + chown system system /sys/kernel/mali/mali_gpu_clock + chown system system /sys/kernel/mali/mali_gpu_fullspeed chown system system /sys/kernel/mxt224e/sweep2wake chown system system /sys/kernel/mxt224e/threshold_t48 chown system system /sys/module/dhd/parameters/dhdpm_fast From 4e7584cf1db187aa2a7cffce95368b7d2f19dea4 Mon Sep 17 00:00:00 2001 From: t4n017 Date: Thu, 24 Apr 2014 18:07:16 -0300 Subject: [PATCH 224/248] Update permissions for NovaThor Settings v1.2 Change-Id: I5930c38476e30483beb5828e057e3ceccdc8fad6 --- rootdir/init.samsungjanice.rc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index ae6bb60..5776c72 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -669,6 +669,9 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/liveopp/arm_step8 chown system system /sys/kernel/liveopp/arm_step9 chown system system /sys/kernel/mali/mali_auto_boost + chown system system /sys/kernel/mali/mali_boost_delay + chown system system /sys/kernel/mali/mali_boost_high + chown system system /sys/kernel/mali/mali_boost_low chown system system /sys/kernel/mali/mali_dvfs_config chown system system /sys/kernel/mali/mali_gpu_clock chown system system /sys/kernel/mali/mali_gpu_fullspeed From 5f78b675577853d22e2d1c7bb19074682923e457 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 8 May 2014 18:01:36 -0300 Subject: [PATCH 225/248] default RGB values added janices needs to fix this commit: http://review.cyanogenmod.org/#/c/59752/ in Settings package too Change-Id: I498767fb63bfce9bb5c6be8b0e48cf9a041d8336 --- cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java index 6aad5b6..b49461f 100644 --- a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java +++ b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java @@ -35,6 +35,8 @@ public class DisplayColorCalibration { + public static final int[] DEFAULT_RGB_VALUES = { 24, 8, 36 }; + private static final String[] FILE_PATH = new String[] { "/sys/devices/pri_lcd_s6e63m0.0/filter_R", "/sys/devices/pri_lcd_s6e63m0.0/filter_G", From 68e77677ba9a085a9130018588d4fd6a81313cfe Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 11 May 2014 16:01:07 -0300 Subject: [PATCH 226/248] export Novathor Settings permissions export Novathor Settings permissions to device_tunnables.rc for better compatibility and reduce init..rc size --- rootdir/device_tunnables.rc | 53 +++++++++++++++++++++++ rootdir/init.samsungjanice.rc | 79 +++-------------------------------- 2 files changed, 59 insertions(+), 73 deletions(-) create mode 100644 rootdir/device_tunnables.rc diff --git a/rootdir/device_tunnables.rc b/rootdir/device_tunnables.rc new file mode 100644 index 0000000..682bc58 --- /dev/null +++ b/rootdir/device_tunnables.rc @@ -0,0 +1,53 @@ +# System permission for NovaThor Settings + chown system system /proc/sys/net/ipv4/tcp_congestion_control + chown system system /sys/block/mmcblk0/queue/read_ahead_kb + chown system system /sys/class/camera/flash/burning_led + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G + chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B + chown system system /sys/devices/system/cpu/sched_mc_power_savings + chown system system /sys/kernel/abb-charger/charger_curr + chown system system /sys/kernel/abb-charger/max_ac_c + chown system system /sys/kernel/abb-charger/max_usb_c + chown system system /sys/kernel/abb-codec/addiggain2 + chown system system /sys/kernel/abb-codec/anagain3 + chown system system /sys/kernel/abb-codec/chargepump + chown system system /sys/kernel/abb-codec/classdhpg + chown system system /sys/kernel/abb-codec/classdwg + chown system system /sys/kernel/abb-codec/eardiggain + chown system system /sys/kernel/abb-codec/hsdaclowpow + chown system system /sys/kernel/abb-codec/hshpen + chown system system /sys/kernel/abb-codec/hsldiggain + chown system system /sys/kernel/abb-codec/hslowpow + chown system system /sys/kernel/abb-codec/hsrdiggain + chown system system /sys/kernel/abb-codec/lpa_mode + chown system system /sys/kernel/abb-fg/fg_cyc + chown system system /sys/kernel/abb-fg/fg_refresh + chown system system /sys/kernel/abb-ponkey/emulator + chown system system /sys/kernel/abb-regu/VOTG + chown system system /sys/kernel/debug/cpuidle/deepest_state + chown system system /sys/kernel/fsync/mode + chown system system /sys/kernel/liveopp/arm_step0 + chown system system /sys/kernel/liveopp/arm_step1 + chown system system /sys/kernel/liveopp/arm_step2 + chown system system /sys/kernel/liveopp/arm_step3 + chown system system /sys/kernel/liveopp/arm_step4 + chown system system /sys/kernel/liveopp/arm_step5 + chown system system /sys/kernel/liveopp/arm_step6 + chown system system /sys/kernel/liveopp/arm_step7 + chown system system /sys/kernel/liveopp/arm_step8 + chown system system /sys/kernel/liveopp/arm_step9 + chown system system /sys/kernel/mali/mali_auto_boost + chown system system /sys/kernel/mali/mali_boost_delay + chown system system /sys/kernel/mali/mali_boost_high + chown system system /sys/kernel/mali/mali_boost_low + chown system system /sys/kernel/mali/mali_dvfs_config + chown system system /sys/kernel/mali/mali_gpu_clock + chown system system /sys/kernel/mali/mali_gpu_fullspeed + chown system system /sys/kernel/mxt224e/sweep2wake + chown system system /sys/kernel/mxt224e/threshold_t48 + chown system system /sys/module/dhd/parameters/dhdpm_fast + chown system system /sys/module/mali/parameters/mali_l2_max_reads + chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max + chown system system /sys/module/mmc_core/parameters/use_spi_crc + write /sys/kernel/mxt224e/threshold_t48 on diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5776c72..5684e4b 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -425,28 +425,14 @@ on boot chown system system /sys/class/camera/rear/rear_camtype chown system system /sys/class/camera/flash/rear_flash - # temp Torch workaround - chmod 0222 /sys/class/sec/flash/enable - - # system permissions for device parts - chown system system /d/cpuidle/deepest_state - chown system system /sys/module/mali/parameters/mali_l2_max_reads - chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max - chown system system /sys/kernel/abb-regu/VOTG - chown system system /sys/kernel/abb-charger/max_ac_c - chown system system /sys/kernel/abb-charger/max_usb_c - chown system system /sys/kernel/fsync/mode - chown system system /sys/kernel/mxt224e/sweep2wake - chown system system /sys/module/mmc_core/parameters/use_spi_crc - chown system system /sys/kernel/mxt224e/threshold_t48 - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B - write /sys/kernel/mxt224e/threshold_t48 on + # Torch + chmod 0222 /sys/class/sec/flash/ + # Set permissions for NovathorSettings app tunnables + import /device_tunnables.rc - # Define TCP buffer sizes for various networks - # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, + # Define TCP buffer sizes for various networks + # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, setprop net.tcp.buffersize.default 4096,87380,704512,4096,16384,110208 setprop net.tcp.buffersize.lte 4096,87380,1220608,4096,16384,563200 @@ -629,56 +615,3 @@ service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled - -# System permission for NovaThor Settings -on property:sys.boot_completed=1 - chown system system /proc/sys/net/ipv4/tcp_congestion_control - chown system system /sys/block/mmcblk0/queue/read_ahead_kb - chown system system /sys/class/camera/flash/burning_led - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B - chown system system /sys/devices/system/cpu/sched_mc_power_savings - chown system system /sys/kernel/abb-charger/charger_curr - chown system system /sys/kernel/abb-codec/addiggain2 - chown system system /sys/kernel/abb-codec/anagain3 - chown system system /sys/kernel/abb-codec/chargepump - chown system system /sys/kernel/abb-codec/classdhpg - chown system system /sys/kernel/abb-codec/classdwg - chown system system /sys/kernel/abb-codec/eardiggain - chown system system /sys/kernel/abb-codec/hsdaclowpow - chown system system /sys/kernel/abb-codec/hshpen - chown system system /sys/kernel/abb-codec/hsldiggain - chown system system /sys/kernel/abb-codec/hslowpow - chown system system /sys/kernel/abb-codec/hsrdiggain - chown system system /sys/kernel/abb-codec/lpa_mode - chown system system /sys/kernel/abb-fg/fg_cyc - chown system system /sys/kernel/abb-fg/fg_refresh - chown system system /sys/kernel/abb-ponkey/emulator - chown system system /sys/kernel/abb-regu/VOTG - chown system system /sys/kernel/debug/cpuidle/deepest_state - chown system system /sys/kernel/fsync/mode - chown system system /sys/kernel/liveopp/arm_step0 - chown system system /sys/kernel/liveopp/arm_step1 - chown system system /sys/kernel/liveopp/arm_step2 - chown system system /sys/kernel/liveopp/arm_step3 - chown system system /sys/kernel/liveopp/arm_step4 - chown system system /sys/kernel/liveopp/arm_step5 - chown system system /sys/kernel/liveopp/arm_step6 - chown system system /sys/kernel/liveopp/arm_step7 - chown system system /sys/kernel/liveopp/arm_step8 - chown system system /sys/kernel/liveopp/arm_step9 - chown system system /sys/kernel/mali/mali_auto_boost - chown system system /sys/kernel/mali/mali_boost_delay - chown system system /sys/kernel/mali/mali_boost_high - chown system system /sys/kernel/mali/mali_boost_low - chown system system /sys/kernel/mali/mali_dvfs_config - chown system system /sys/kernel/mali/mali_gpu_clock - chown system system /sys/kernel/mali/mali_gpu_fullspeed - chown system system /sys/kernel/mxt224e/sweep2wake - chown system system /sys/kernel/mxt224e/threshold_t48 - chown system system /sys/module/dhd/parameters/dhdpm_fast - chown system system /sys/module/mali/parameters/mali_l2_max_reads - chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max - chown system system /sys/module/mmc_core/parameters/use_spi_crc - write /sys/kernel/mxt224e/threshold_t48 on From eaf6073f84e75bb4b787b026dee7e9c36c23cde7 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 11 May 2014 16:20:52 -0300 Subject: [PATCH 227/248] copy the new device_tunnables.rc to ramdisk --- janice.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/janice.mk b/janice.mk index 40cb46f..42565e1 100644 --- a/janice.mk +++ b/janice.mk @@ -29,6 +29,7 @@ $(call inherit-product, device/common/gps/gps_eu_supl.mk) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ + $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/device_tunnables.rc \ $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc From bd6367435e53598311565e29a0c2a290213b9f6f Mon Sep 17 00:00:00 2001 From: Tano Abeleyra Date: Sun, 11 May 2014 20:11:58 -0300 Subject: [PATCH 228/248] Create vendorsetup.sh --- vendorsetup.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vendorsetup.sh diff --git a/vendorsetup.sh b/vendorsetup.sh new file mode 100644 index 0000000..59ad938 --- /dev/null +++ b/vendorsetup.sh @@ -0,0 +1,2 @@ +add_lunch_combo cm_janice-eng +add_lunch_combo cm_janice-userdebug From 519a08f6169fc9234ab6a7e156f4c85dd0ea08ce Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 13 May 2014 11:25:37 -0300 Subject: [PATCH 229/248] fix device_tunnables.rc export and fix typo on torch permission... --- rootdir/device_tunnables.rc | 3 ++- rootdir/init.samsungjanice.rc | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rootdir/device_tunnables.rc b/rootdir/device_tunnables.rc index 682bc58..e378f80 100644 --- a/rootdir/device_tunnables.rc +++ b/rootdir/device_tunnables.rc @@ -1,4 +1,5 @@ -# System permission for NovaThor Settings +on boot + # System permission for NovaThor Settings chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb chown system system /sys/class/camera/flash/burning_led diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5684e4b..1c382a6 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,4 +1,6 @@ import /init.samsungjanice.usb.rc +# Set permissions for NovathorSettings app tunnables +import /device_tunnables.rc on init @@ -426,10 +428,7 @@ on boot chown system system /sys/class/camera/flash/rear_flash # Torch - chmod 0222 /sys/class/sec/flash/ - - # Set permissions for NovathorSettings app tunnables - import /device_tunnables.rc + chmod 0222 /sys/class/sec/flash/enable # Define TCP buffer sizes for various networks # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, From e5303772b1c97614decde15914739e4b93d85951 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Tue, 13 May 2014 17:09:09 -0300 Subject: [PATCH 230/248] stupid meh -.- copy paste typo --- janice.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/janice.mk b/janice.mk index 42565e1..ddddbe9 100644 --- a/janice.mk +++ b/janice.mk @@ -29,7 +29,7 @@ $(call inherit-product, device/common/gps/gps_eu_supl.mk) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ - $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/device_tunnables.rc \ + $(LOCAL_PATH)/rootdir/device_tunnables.rc:root/device_tunnables.rc \ $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc From 1ee2602fff11c8b57fd0bffb6517e1eb530bfc8a Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 14 May 2014 18:37:45 -0300 Subject: [PATCH 231/248] rename device_tunnables > device_tunables... - rename device_tunnables.rc > device_tunables.rc - wait "on property:sys.boot_completed=1" before setting permissions --- janice.mk | 2 +- rootdir/{device_tunnables.rc => device_tunables.rc} | 2 +- rootdir/init.samsungjanice.rc | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename rootdir/{device_tunnables.rc => device_tunables.rc} (98%) diff --git a/janice.mk b/janice.mk index ddddbe9..334bafc 100644 --- a/janice.mk +++ b/janice.mk @@ -29,7 +29,7 @@ $(call inherit-product, device/common/gps/gps_eu_supl.mk) PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ - $(LOCAL_PATH)/rootdir/device_tunnables.rc:root/device_tunnables.rc \ + $(LOCAL_PATH)/rootdir/device_tunables.rc:root/device_tunables.rc \ $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc diff --git a/rootdir/device_tunnables.rc b/rootdir/device_tunables.rc similarity index 98% rename from rootdir/device_tunnables.rc rename to rootdir/device_tunables.rc index e378f80..9398180 100644 --- a/rootdir/device_tunnables.rc +++ b/rootdir/device_tunables.rc @@ -1,4 +1,4 @@ -on boot +on property:sys.boot_completed=1 # System permission for NovaThor Settings chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 1c382a6..5d345e9 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,6 +1,6 @@ import /init.samsungjanice.usb.rc -# Set permissions for NovathorSettings app tunnables -import /device_tunnables.rc +# Set permissions for NovathorSettings app tunables +import /device_tunables.rc on init From b2f8dd9bce805ebded281d886a1e21483da8e6ac Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 14 May 2014 18:55:06 -0300 Subject: [PATCH 232/248] start adb daemon on recovery for userdebug / eng --- rootdir/init.recovery.samsungjanice.rc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/rootdir/init.recovery.samsungjanice.rc b/rootdir/init.recovery.samsungjanice.rc index 84f2a5f..ffe530d 100644 --- a/rootdir/init.recovery.samsungjanice.rc +++ b/rootdir/init.recovery.samsungjanice.rc @@ -16,3 +16,25 @@ on early-fs insmod /system/lib/modules/param.ko mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait + +# Always start adbd on userdebug and eng builds +# In recovery, always run adbd as root. +on property:ro.debuggable=1 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04e8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/functions adb + write /sys/class/android_usb/android0/enable 1 + write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer + write /sys/class/android_usb/android0/iProduct $ro.product.model + write /sys/class/android_usb/android0/iSerial $ro.serialno + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 + start adbd + setprop service.adb.root 1 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + write /sys/class/android_usb/android0/enable 0 + restart adbd + write /sys/class/android_usb/android0/enable 1 + write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 From bd5f0d112c979bbccd9c6622b6714f4da0256660 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Wed, 14 May 2014 20:23:45 -0300 Subject: [PATCH 233/248] start hostapd_bin daemon service --- rootdir/init.samsungjanice.rc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5d345e9..7e55af8 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -598,6 +598,11 @@ service iprenew_bt-pan /system/bin/dhcpcd -n class main disabled oneshot + +service hostapd_bin /system/bin/hostapd -d /data/misc/wifi/hostapd.conf + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot # Bugreport is triggered by holding down volume down, volume up and power service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport From 736c9e71b0da4192083f5158c2567cb17886fc53 Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Thu, 15 May 2014 19:37:18 -0300 Subject: [PATCH 234/248] update p2p supplicant and increase verbosity --- rootdir/init.samsungjanice.rc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 7e55af8..6287b46 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -388,7 +388,7 @@ on boot # for bluetooth. change access rights as btld runs as bluetooth user chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0 - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/claim + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/claim chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/soft chmod 0664 /sys/class/rfkill/rfkill0/state chmod 0664 /sys/class/rfkill/rfkill0/claim @@ -541,14 +541,13 @@ service mtpd /system/bin/mtpd on property:ro.dumpstate.dmesg=1 write /proc/sys/kernel/dmesg_restrict 0 - service p2p_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -O/data/misc/wifi/sockets -N \ + -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ -I/system/etc/wifi/p2p_supplicant_overlay.conf \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin \ - -puse_p2p_group_interface=1 \ - -g@android:wpa_wlan0 + -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled @@ -598,8 +597,8 @@ service iprenew_bt-pan /system/bin/dhcpcd -n class main disabled oneshot - -service hostapd_bin /system/bin/hostapd -d /data/misc/wifi/hostapd.conf + +service hostapd_bin /system/bin/hostapd -dd /data/misc/wifi/hostapd.conf socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot From 662c146ca191b04acaa1605f4ac4b5be6199890b Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Sun, 18 May 2014 01:02:05 -0300 Subject: [PATCH 235/248] CM performance profiles 2/2 --- rootdir/init.samsungjanice.rc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 6287b46..344c565 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -618,3 +618,22 @@ service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 class late_start disabled + +# CM Performance Profiles + +# Powersave +on property:sys.perf.profile=0 + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor conservative + write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor conservative + +# Balanced +on property:sys.perf.profile=1 + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor interactive + write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor interactive + +# High performance +on property:sys.perf.profile=2 + write /sys/devices/system/cpu/cpu0/online 1 + write /sys/devices/system/cpu/cpu1/online 1 + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor performance + write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor performance From 0330197fc418fa9557c311d2df910137b8225d4a Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Tue, 3 Jun 2014 16:14:44 +0200 Subject: [PATCH 236/248] Adapt init.samsungjanice.rc to new common init +Move audio_policy.conf to common +Remove useless file --- configs/audio_policy.conf | 52 ---- configs/egl.cfg | 2 - janice.mk | 3 +- rootdir/init.samsungjanice.rc | 504 +--------------------------------- 4 files changed, 10 insertions(+), 551 deletions(-) delete mode 100644 configs/audio_policy.conf delete mode 100644 configs/egl.cfg diff --git a/configs/audio_policy.conf b/configs/audio_policy.conf deleted file mode 100644 index 8c04af4..0000000 --- a/configs/audio_policy.conf +++ /dev/null @@ -1,52 +0,0 @@ -# Global configuration section: lists input and output devices always present on the device -# as well as the output device selected by default. -# Devices are designated by a string that corresponds to the enum in audio.h - -global_configuration { - attached_output_devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER - default_output_device AUDIO_DEVICE_OUT_SPEAKER - attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_VOICE_CALL -} - -# audio hardware module section: contains descriptors for all audio hw modules present on the -# device. Each hw module node is named after the corresponding hw module library base name. -# For instance, "primary" corresponds to audio.primary..so. -# The "primary" module is mandatory and must include at least one output with -# AUDIO_OUTPUT_FLAG_PRIMARY flag. -# Each module descriptor contains one or more output profile descriptors and zero or more -# input profile descriptors. Each profile lists all the parameters supported by a given output -# or input stream category. -# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding -# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n". - -audio_hw_modules { - primary { - outputs { - primary { - sampling_rates 44100 - channel_masks AUDIO_CHANNEL_OUT_STEREO - formats AUDIO_FORMAT_PCM_16_BIT - devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET - flags AUDIO_OUTPUT_FLAG_PRIMARY - } - } - inputs { - primary { - sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000 - channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO - formats AUDIO_FORMAT_PCM_16_BIT - devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_FM|AUDIO_DEVICE_IN_VOICE_CALL - } - } - } - a2dp { - outputs { - a2dp { - sampling_rates 44100 - channel_masks AUDIO_CHANNEL_OUT_STEREO - formats AUDIO_FORMAT_PCM_16_BIT - devices AUDIO_DEVICE_OUT_ALL_A2DP - } - } - } -} diff --git a/configs/egl.cfg b/configs/egl.cfg deleted file mode 100644 index 9438b87..0000000 --- a/configs/egl.cfg +++ /dev/null @@ -1,2 +0,0 @@ -0 0 android -0 1 mali diff --git a/janice.mk b/janice.mk index 334bafc..3967e8a 100644 --- a/janice.mk +++ b/janice.mk @@ -41,8 +41,7 @@ PRODUCT_COPY_FILES += \ # Audio PRODUCT_COPY_FILES += \ - $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 \ - $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf + $(LOCAL_PATH)/configs/adm.sqlite-u8500:system/etc/adm.sqlite-u8500 # Use non-open-source parts if present $(call inherit-product-if-exists, vendor/samsung/u8500-common/janice/janice-vendor-blobs.mk) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 344c565..bc69d76 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,57 +1,6 @@ -import /init.samsungjanice.usb.rc -# Set permissions for NovathorSettings app tunables +import /init.u8500.rc import /device_tunables.rc - -on init - - mkdir /storage/sdcard0 0700 root root - mkdir /storage/sdcard1 0700 root root - mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw - mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw - - export EXTERNAL_STORAGE /storage/sdcard0 - export SECONDARY_STORAGE /storage/sdcard1 - - mkdir /efs 0771 radio system - mkdir /modemfs 0771 system system - mkdir /mnt/.lfs 0755 root root - - # for backwards compatibility - symlink /storage/sdcard0 /sdcard - symlink /storage/sdcard0 /mnt/sdcard - symlink /storage/sdcard1 /extSdCard - symlink /storage/sdcard1 /mnt/extSdCard - - # KSM tunning - write /sys/kernel/mm/ksm/pages_to_scan 100 - write /sys/kernel/mm/ksm/sleep_millisecs 500 - write /sys/kernel/mm/ksm/run 1 - - # setup the global environment - export PATH /system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin - export LD_LIBRARY_PATH /system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents:/vendor/lib - export OMX_STE_ENS_COMPONENTS_DIR /system/lib/ste_omxcomponents/ - export OMX_BELLAGIO_LOADER_REGISTRY /system/etc/omxloaders - export OMX_STE_CSCALL_COMPONENTS_DIR /system/lib/ste_omxcomponents/ - - # Vibetonz - export VIBE_PIPE_PATH /dev/pipes - mkdir /dev/pipes 0771 shell shell - - # Shared memory file system - mkdir /dev/shm 0700 root system - mount tmpfs tmpfs /dev/shm mode=0755,gid=1000 - - # create /tmp directory needed by psccd and CSPSA - # ...but make it a symlink so that sysmon may use it also - symlink /dev/socket /tmp - - # mount debugfs in order for Audio ADM component to retrieve debug information - mkdir /debug - mount debugfs none /debug - - # Prevents permission denied error for telephony - chmod 0644 /proc/cmdline +import /init.samsungjanice.usb.rc on fs @@ -59,18 +8,9 @@ on fs mount_all /fstab.samsungjanice swapon_all /fstab.samsungjanice - - setprop ro.crypto.fuse_sdcard true - - # Start CSPSA before synchronously running the factory reset utility that - # checks the factory reset triggers in sysfs and CSPSA and then formats - # the block device belonging to /data. - start cspsa on post-fs - chown radio radio /modemfs - chmod 0771 /modemfs chown radio radio /modemfs/APPL mkdir /modemfs/APPL chmod 0755 /modemfs/APPL @@ -86,29 +26,7 @@ on post-fs mkdir /modemfs/TMP chown radio radio /modemfs/TMP chmod 0755 /modemfs/TMP - chown radio radio /modemfs/CONF - chmod 0755 /modemfs/CONF - chown radio radio /modemfs/CONF/MCE - chmod 0755 /modemfs/CONF/MCE - chown radio radio /modemfs/CONF/MCE/MCE.CFG - chmod 0644 /modemfs/CONF/MCE/MCE.CFG - chown radio radio /modemfs/PERM - chmod 0755 /modemfs/PERM - chown radio radio /modemfs/PERM/PROT - chmod 0755 /modemfs/PERM/PROT - chown radio radio /modemfs/PERM/PROT/LABEP.CFG - chmod 0644 /modemfs/PERM/PROT/LABEP.CFG - chown radio radio /modemfs/PERM/PROT/PPVALUES.DAT - chmod 0644 /modemfs/PERM/PROT/PPVALUES.DAT - chown radio system /efs - chmod 0775 /efs - chown radio system /efs/FactoryApp - chmod 0775 /efs/FactoryApp - chown radio system /efs/imei - chmod 0770 /efs/imei - chown radio system /efs/bluetooth - chown radio system /efs/wifi mkdir /data/mediaserver 0740 media media # Samsung Device permissions @@ -119,31 +37,16 @@ on post-fs chmod 0666 /dev/bma222 chmod 0666 /dev/ecompass_ctrl - # change the permission sensor chips - chown root system /dev/alps_io - chmod 0660 /dev/alps_io + # Change the permission sensor chips chown root root /dev/rn5t592 chmod 777 /dev/rn5t592 # Change permission for touchscreen and touch key - chown system radio /sys/class/sec/tsp/cmd - chown system radio /sys/class/sec/tsp/cmd_status - chown system radio /sys/class/sec/tsp/cmd_result - chown system radio /sys/class/sec/sec_touchkey/touchkey_back - chown system radio /sys/class/sec/sec_touchkey/touchkey_menu - chown radio system /sys/class/sec/sec_touchkey/touch_sensitivity - chown system radio /sys/class/sec/sec_touchscreen/tsp_firm_version_panel - chown system radio /sys/class/sec/sec_touchscreen/tsp_firm_version_phone - chown system radio /sys/class/sec/tsp_noise_test/disp_all_refdata - chown system radio /sys/class/sec/tsp_noise_test/disp_all_deltadata + chown system system /sys/class/sec/sec_touchkey/touch_sensitivity + chown system system /sys/class/sec/tsp_noise_test/disp_all_refdata + chown system system /sys/class/sec/tsp_noise_test/disp_all_deltadata chown system system /sys/class/sec/sec_touchscreen/tsp_threshold - # PRCMU debug fs - chown radio system /debug/prcmu/ape_opp - chown radio system /debug/prcmu/ddr_opp - chmod 0660 /debug/prcmu/ape_opp - chmod 0660 /debug/prcmu/ddr_opp - # Samsung: ensure read/write access to sensor control device files chmod 0666 /dev/gp2a_prox chmod 0666 /dev/gp2a_light @@ -151,74 +54,11 @@ on post-fs chmod 0666 /dev/mpu60x0_accel chmod 0666 /dev/mmc3280 - # change the permission sensor chips - chown root system /dev/alps_io - chmod 0660 /dev/alps_io - chown system system /system/etc/sensors.dat - chown system system /system/etc/calib.dat - chown system system /system/etc/param.dat - chmod 0664 /system/etc/sensors.dat - chmod 0664 /system/etc/calib.dat - chmod 0664 /system/etc/param.dat - - # Change permission for magnetic sensor rev02 - chown system input /sys/class/input/input8/delay - chown system input /sys/class/input/input8/enable - chown system input /sys/class/input/input8/filter_enable - chown system input /sys/class/input/input8/filter_len - chown system input /sys/class/input/input8/filter_threshold - chown system input /sys/class/input/input8/filter_noise - chown system input /sys/class/input/input8/data - chown system input /sys/class/input/input8/status - chown system input /sys/class/input/input8/wake - chown system input /sys/class/input/input8/position - - chown system input /sys/class/input/input9/threshold - chown system input /sys/class/input/input9/distortion - chown system input /sys/class/input/input9/shape - chown compass input /sys/class/input/input9/offsets - - # orientation - chown system input /sys/class/input/input6/enable - chown system input /sys/class/input/input6/delay - chown system input /sys/class/input/input6/wake - chown system input /sys/class/input/input6/data - chown system input /sys/class/input/input6/status - - write /sys/class/input9/filter_enable 0 - - # Change permission for accelerometer - chown system input /sys/class/sensors/accelerometer_sensor/raw_data - chown system system /sys/class/sensors/accelerometer_sensor/calibration - - chown system system /sys/class/sensors/magnetic_sensor/selftest - chown system system /sys/class/sensors/magnetic_sensor/status - chown system system /sys/class/sensors/magnetic_sensor/dac - chown system system /sys/class/sensors/magnetic_sensor/adc - - chown system system /sys/class/sensors/proximity_sensor/state - chown system system /sys/class/sensors/proximity_sensor/proximity_avg - # Change permission for gyro_sensor chown system system /sys/class/sensors/gyro_sensor/temperature - symlink /dev/block/mmcblk0p1 /dev/block/param - - # Install Kernel Module - insmod /system/lib/modules/j4fs.ko - mount j4fs /dev/block/mmcblk0p1 /mnt/.lfs wait - - insmod /system/lib/modules/param.ko - write /sys/class/power_supply/battery/batt_reinit_capacity 1 - insmod /system/lib/modules/bthid.ko - - # loading exFAT-fs drivers - insmod /system/lib/modules/exfat_core.ko - insmod /system/lib/modules/exfat_fs.ko - on post-fs-data - mkdir /data/media 0770 media_rw media_rw chown media_rw media_rw /data/media # give system access to wpa_supplicant.conf for backup and restore @@ -231,116 +71,28 @@ on post-fs-data chmod 0660 /data/misc/wifi/wpa_supplicant.conf chmod 0660 /data/misc/wifi/p2p_supplicant.conf mkdir /data/misc/wifi/hostapd.sockets 0770 wifi wifi - mkdir /data/misc/dhcp 0775 dhcp dhcp chown dhcp dhcp /data/misc/dhcp chown system system /efs/wifi/.mac.info chmod 0664 /efs/wifi/.mac.info - # FactoryTest files permission - mkdir /efs/FactoryApp 0775 - chown radio system /efs/FactoryApp - chmod 0775 /efs/FactoryApp - write /efs/FactoryApp/factorymode ON - chown system system /efs/FactoryApp/factorymode - chmod 0744 /efs/FactoryApp/factorymode - - # SA, System SW, SAMSUNG create log directory - mkdir /data/log 0775 system log - chown system log /data/log - chmod 0775 /data/log - chmod 0775 /data/anr - - # After we setup wireless subsystem, let dnsmasq create files for soft ap chown dhcp system /data/misc/dhcp -#[ SEC_MM_DRM - # DRM directory creation - mkdir /system/etc/security/.drm 0775 - chown root root /system/etc/security/.drm - chmod 0775 /system/etc/security/.drm - - # Added for Playready DRM Support - mkdir /data/data/.drm 0775 - chown drm system /data/data/.drm - chmod 0775 /data/data/.drm - mkdir /data/data/.drm/.playready 0775 - chown drm system /data/data/.drm/.playready - chmod 0775 /data/data/.drm/.playready - - # Added drm folder to copy drm plugins - mkdir /system/lib/drm 0775 - chown root root /system/lib/drm - chmod 0775 /system/lib/drm - - # DivX DRM - mkdir /efs/.files 0775 - mkdir /efs/.files/.dx1 0775 - mkdir /efs/.files/.dm33 0775 - mkdir /efs/.files/.mp301 0775 - chown media system /efs/.files/.dx1 - chown media system /efs/.files/.dm33 - chown media system /efs/.files/.mp301 - chmod 0775 /efs/.files/.dx1 - chmod 0775 /efs/.files/.dm33 - chmod 0775 /efs/.files/.mp301 -#] - - # create basic filesystem structure - mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth - mkdir /data/misc/bluetooth 0770 system system - - # give system access to ril_config - copy -u /system/etc/ril_config /data/misc/ril_config - chmod 0660 /data/misc/ril_config - chown root radio /data/misc/ril_config - - # Create directory for STE OMX debug logs - mkdir /data/ste-debug 0777 root root - - # create var/run, var/lib for avahi - mkdir /var - mkdir /var/run - mkdir /var/lib - - # Change permissions for modem_log_relay config file - chmod 666 /modemfs/trace_auto.conf - - # If there is no fs-post-data action in the init..rc file, you - # must uncomment this line, otherwise encrypted filesystems - # won't work. - # Set indication (checked by vold) that we have finished this action - setprop vold.post_fs_data_done 1 - -on early-boot - - # Prepare modem - class_start modem-u8500 - class_start modem-core - - # Enable autonomous power management in CM - write /sys/module/cm/parameters/enable_auto_pm 1 on boot - # debugfs - mount debugfs /sys/kernel/debug /sys/kernel/debug - # Set timeout value for rmnet stats. write /sys/devices/virtual/net/rmnet0/timeout_suspend 5000000 chown system system /sys/class/backlight/pri_lcd_bl/brightness chown system system /sys/class/backlight/pwm-backlight/brightness - chown system radio /sys/class/backlight/pwm-backlight/device/lcd_power + chown system system /sys/class/backlight/pwm-backlight/device/lcd_power chown system system /sys/class/backlight/pwm-backlight/device/panel_id chown system system /sys/class/backlight/pwm-backlight/device/acl_set chown system system /sys/class/lcd/panel/device/gamma_mode chown system system /sys/class/lcd/panel/device/gamma_table chown system system /sys/class/leds/button-backlight/brightness - chown radio radio /sys/class/usb_switch/FSA_SWITCH/jig_smd - chown radio system /sys/class/usb_switch/FSA_SWITCH/smd_wakelock - chown system radio /sys/class/sec/switch/usb_state chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-005c/enable chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0029/power_state @@ -357,82 +109,21 @@ on boot chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0019/mode chown system system /sys/devices/platform/nmk-i2c.2/i2c-2/2-0019/range chown system system /sys/devices/platform/sim-detect.0/voltage - chown audio audio /sys/devices/system/cpu/usecase/voice-call - chown audio audio /sys/devices/system/cpu/usecase/low-power-audio - chown system radio /proc/dump_enable - # Permission for gpio_keys - chown radio system /sys/devices/platform/gpio-keys.0/wakeup_keys - write /sys/devices/platform/gpio-keys.0/wakeup_keys 172 - -# Vibetonz + # Vibetonz chmod 0660 /dev/tspdrv chown root shell /dev/tspdrv -# GPS - chown root system /dev/ttyAMA1 - chmod 0660 dev/ttyAMA1 - - chown root system sys/class/sec/gps/GPS_ON_OFF/value - chmod 0664 sys/class/sec/gps/GPS_ON_OFF/value - chown root system sys/class/sec/gps/GPS_nRST/value - chmod 0664 sys/class/sec/gps/GPS_nRST/value - -# permissions for FMRadio of Broadcom - chmod 0777 /system/bin/btld - -# Peremissions for bluetooth - # UART device - chown bluetooth net_bt_stack /dev/ttyAMA0 - chmod 0660 /dev/ttyAMA0 - -# for bluetooth. change access rights as btld runs as bluetooth user - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0 - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/claim - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/soft - chmod 0664 /sys/class/rfkill/rfkill0/state - chmod 0664 /sys/class/rfkill/rfkill0/claim - chmod 0664 /sys/class/rfkill/rfkill0/soft - setprop service.brcm.bt.pbap_mode btld - -# power up/down interface - chmod 0660 /sys/class/rfkill/rfkill0/type - chmod 0660 /sys/class/rfkill/rfkill0/state - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state - chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type - -# bluetooth MAC address programming - setprop ro.bt.bdaddr_path "/efs/bluetooth/bt_addr" - chown bluetooth bluetooth ro.bt.bdaddr_path + # Bluetooth MAC address programming chown bluetooth bluetooth /system/etc/bt_addr - chmod 0644 /efs/bluetooth/addr.txt # Permissions for LCD - chown system system /sys/class/backlight/panel/brightness chown system system /sys/class/backlight/panel/auto_brightness - chown system radio /sys/class/lcd/panel/lcd_power - chown system radio /sys/class/lcd/panel/lcd_type chown system media_rw /sys/class/lcd/panel/power_reduce chown system system /sys/class/sec/sec_touchkey/brightness - # MTP device permission - chmod 0660 /dev/usb_mtp_gadget - chown system system /dev/usb_mtp_gadget - - # camera factory - chown system system /sys/class/sec/sec_cam/camtype - chown system system /sys/class/sec/flash/enable - chown system system /sys/class/camera/rear/rear_flash - chown system system /sys/class/camera/front/front_camtype - chown system system /sys/class/camera/rear/rear_camtype - chown system system /sys/class/camera/flash/rear_flash - - # Torch - chmod 0222 /sys/class/sec/flash/enable - # Define TCP buffer sizes for various networks # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, - setprop net.tcp.buffersize.default 4096,87380,704512,4096,16384,110208 setprop net.tcp.buffersize.lte 4096,87380,1220608,4096,16384,563200 setprop net.tcp.buffersize.umts 4096,87380,563200,4096,16384,110208 @@ -445,92 +136,6 @@ on boot setprop net.tcp.buffersize.evdo 4096,87380,563200,4096,16384,262144 setprop net.tcp.buffersize.evdo_b 4096,87380,704512,4096,16384,262144 - # camera debug - setprop persist.debug.extcamera.level 777 - setprop persist.debug.mmiocamera.level 777 - setprop debug.libcamera.trace 666 - - # Battery - chown system system /sys/class/power_supply/battery/batt_vol_adc_cal - chown system radio /sys/class/power_supply/battery/fg_reset_soc - - #Set property to change the decoder profile level to 4.1 - setprop ste.video.decoder.h264.def.lev 4.1 - - # Modem - class_start modem - class_start default - -# Crash Safe Parameter Storage Area, serving production parameter requests from clients. -# Configuration is read from file "/etc/cspsa.conf" and each found area spawns a CSPSA server -# process. -service cspsa /system/bin/cspsa-server - class parameter_storage - user root - oneshot - -# init Phonet net device required for Phonet communication with Modem -service phonet-netdev /system/bin/ifconfig upnlink0 up - class main - oneshot - -# Copy RF trim data from CSPSA, and start the Modem Storage Agent (MSA) service -service modem /system/bin/sh /system/etc/ste_modem.sh - class modem-u8500 - user root - -# Creating Modem Security daemon -service copsd /system/bin/copsdaemon - class modem-core - user root - -service admsrv /system/bin/admsrv - class main - user root - group system audio inet net_bt net_bt_admin net_raw shell log - ioprio rt 4 - capability NET_ADMIN NET_RAW SYS_NICE - -service geomagneticd /system/bin/geomagneticd6x - user compass - group system input - -service orientationd /system/bin/orientationd6x - user compass - group system input - -# AT daemon -service atd /system/bin/at_core -mode normal -serial ttyAMA2 - class modem - user root - group radio audio - -# TA Loader -service ta_load /system/bin/ta_loader - user root - group radio - -# AT Distributor for factory test -service at_distributor /system/bin/at_distributor - user root - group radio log - -service usbid_init /system/bin/usbid_init.sh - class main - oneshot - -service mobex-daemon /system/bin/npsmobex - class main - user system - group system radio inet sdcard_rw - -# Vibetonz -service immvibed /system/bin/immvibed - class core - user shell - group shell - oneshot - service mtpd /system/bin/mtpd socket mtpd stream 600 system system user vpn @@ -538,102 +143,11 @@ service mtpd /system/bin/mtpd disabled oneshot -on property:ro.dumpstate.dmesg=1 - write /proc/sys/kernel/dmesg_restrict 0 - -service p2p_supplicant /system/bin/wpa_supplicant \ - -dd -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ - -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ - -I/system/etc/wifi/p2p_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \ - -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 - class main - socket wpa_wlan0 dgram 660 wifi wifi - disabled - oneshot - -service wpa_supplicant /system/bin/wpa_supplicant \ - -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ - -e/data/misc/wifi/entropy.bin \ - -I/system/etc/wifi/wpa_supplicant_overlay.conf \ - -O/data/misc/wifi/sockets -g@android:wpa_wlan0 - class main - socket wpa_wlan0 dgram 660 wifi wifi - disabled - oneshot - -service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL - class main - disabled - oneshot - -service dhcpcd_p2p /system/bin/dhcpcd -aABKL - class main - disabled - oneshot - -service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL - # This properly enables bluetooth tethering, it asigns a IP to any conected device - class main - disabled - oneshot - on property:ro.data.large_tcp_window_size=true # We enable receiving of high-speed conections via ipv4 write /proc/sys/net/ipv4/tcp_adv_win_scale 1 -service iprenew_wlan0 /system/bin/dhcpcd -n - class main - disabled - oneshot - -service iprenew_p2p /system/bin/dhcpcd -n - class main - disabled - oneshot - -service iprenew_bt-pan /system/bin/dhcpcd -n - class main - disabled - oneshot - service hostapd_bin /system/bin/hostapd -dd /data/misc/wifi/hostapd.conf socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot - -# Bugreport is triggered by holding down volume down, volume up and power -service bugreport /system/bin/dumpstate -d -v -o /sdcard/bugreports/bugreport - class main - disabled - oneshot - keycodes 114 115 116 - -# FUSE sdcard daemon service for sdcard -service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0 - class late_start - disabled - -service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 - class late_start - disabled - -# CM Performance Profiles - -# Powersave -on property:sys.perf.profile=0 - write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor conservative - write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor conservative - -# Balanced -on property:sys.perf.profile=1 - write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor interactive - write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor interactive - -# High performance -on property:sys.perf.profile=2 - write /sys/devices/system/cpu/cpu0/online 1 - write /sys/devices/system/cpu/cpu1/online 1 - write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor performance - write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor performance From 5ddde6cc803c14ba99f6fe0f8093ec223e9e1afd Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Thu, 5 Jun 2014 22:08:30 +0200 Subject: [PATCH 237/248] Move more lines to common init +Make common usb init --- janice.mk | 3 +- rootdir/init.samsungjanice.rc | 5 -- rootdir/init.samsungjanice.usb.rc | 108 ------------------------------ 3 files changed, 1 insertion(+), 115 deletions(-) delete mode 100644 rootdir/init.samsungjanice.usb.rc diff --git a/janice.mk b/janice.mk index 3967e8a..b5598f8 100644 --- a/janice.mk +++ b/janice.mk @@ -27,10 +27,9 @@ $(call inherit-product, device/common/gps/gps_eu_supl.mk) # Init files PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/rootdir/device_tunables.rc:root/device_tunables.rc \ $(LOCAL_PATH)/rootdir/fstab.samsungjanice:root/fstab.samsungjanice \ $(LOCAL_PATH)/rootdir/init.samsungjanice.rc:root/init.samsungjanice.rc \ - $(LOCAL_PATH)/rootdir/device_tunables.rc:root/device_tunables.rc \ - $(LOCAL_PATH)/rootdir/init.samsungjanice.usb.rc:root/init.samsungjanice.usb.rc \ $(LOCAL_PATH)/rootdir/init.recovery.samsungjanice.rc:root/init.recovery.samsungjanice.rc \ $(LOCAL_PATH)/rootdir/ueventd.samsungjanice.rc:root/ueventd.samsungjanice.rc diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index bc69d76..5dd82fa 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -1,14 +1,9 @@ import /init.u8500.rc -import /device_tunables.rc -import /init.samsungjanice.usb.rc on fs exec /system/xbin/mkswap /dev/block/mmcblk0p9 - mount_all /fstab.samsungjanice - swapon_all /fstab.samsungjanice - on post-fs chown radio radio /modemfs/APPL diff --git a/rootdir/init.samsungjanice.usb.rc b/rootdir/init.samsungjanice.usb.rc deleted file mode 100644 index 26b8468..0000000 --- a/rootdir/init.samsungjanice.usb.rc +++ /dev/null @@ -1,108 +0,0 @@ -# USB initialization -# - -on init - write /sys/class/android_usb/android0/iSerial ${ro.serialno} - write /sys/class/android_usb/android0/f_rndis/manufacturer Samsung - write /sys/class/android_usb/android0/f_rndis/vendorID 04E8 - write /sys/class/android_usb/android0/f_rndis/wceis 0 - -on boot - write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer} - write /sys/class/android_usb/android0/iProduct ${ro.product.model} - write /sys/devices/platform/ab8500-i2c.0/ab8500-usb.0/boot_time_device 1 - -on post-fs-data - chown system system /sys/class/android_usb/android0/f_mass_storage/lun0/file - chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun0/file - chown system system /sys/class/android_usb/android0/f_mass_storage/lun1/file - chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun1/file - chown system system /sys/class/android_usb/android0/f_rndis/ethaddr - chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr - -on property:sys.usb.config=mtp - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6860 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mtp,adb - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6860 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - start adbd - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=ptp - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6865 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=ptp,adb - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6866 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - start adbd - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mass_storage - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 685B - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mass_storage,adb - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 685E - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - start adbd - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6863 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis,adb - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6864 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - start adbd - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis,dm - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6864 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis,acm,dm - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04E8 - write /sys/class/android_usb/android0/idProduct 6864 - write /sys/class/android_usb/android0/functions ${sys.usb.config} - write /sys/class/android_usb/android0/f_acm/instances 1 - write /sys/class/android_usb/android0/enable 1 - setprop sys.usb.state ${sys.usb.config} - - From a2f4d9bebec1f1251ccd438e7bbf93db05cc2ff4 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Fri, 6 Jun 2014 19:22:27 +0200 Subject: [PATCH 238/248] Update init.samsungjanice.rc --- rootdir/init.samsungjanice.rc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index 5dd82fa..b87abc3 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -4,6 +4,9 @@ on fs exec /system/xbin/mkswap /dev/block/mmcblk0p9 + mount_all /fstab.samsungjanice + swapon_all /fstab.samsungjanice + on post-fs chown radio radio /modemfs/APPL @@ -75,6 +78,9 @@ on post-fs-data # After we setup wireless subsystem, let dnsmasq create files for soft ap chown dhcp system /data/misc/dhcp + # Set indication (checked by vold) that we have finished this action + setprop vold.post_fs_data_done 1 + on boot # Set timeout value for rmnet stats. From ad6f21568ac21e46fef165f74f3452c444362a69 Mon Sep 17 00:00:00 2001 From: Michal Mazurek Date: Wed, 11 Jun 2014 20:01:49 +0100 Subject: [PATCH 239/248] update README.md to current version --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index a6e0462..e63e66b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,7 @@ android_device_samsung_janice ============================= -CyanogenMod 10 Device Tree for Samsung Galaxy S Advance (GT-I9070) - -Original thread: http://forum.xda-developers.com/showthread.php?t=2108362 - -Local manifest: http://pastebin.com/f9CbfMWT +CyanogenMod 11 Device Tree for Samsung Galaxy S Advance (GT-I9070) Supported variants: - GT-I9070 (INTL) From 133d9780026157564fea0b047467a9be8911857e Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 13 Jun 2014 13:40:39 -0300 Subject: [PATCH 240/248] Implement VibratorHW class for CM HAF thanks Davide Pianca (KINGBabasula) for the new pwm sysfs, (original idea from codeworkx) --- cmhw/org/cyanogenmod/hardware/VibratorHW.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 cmhw/org/cyanogenmod/hardware/VibratorHW.java diff --git a/cmhw/org/cyanogenmod/hardware/VibratorHW.java b/cmhw/org/cyanogenmod/hardware/VibratorHW.java new file mode 100644 index 0000000..cdb93af --- /dev/null +++ b/cmhw/org/cyanogenmod/hardware/VibratorHW.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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 org.cyanogenmod.hardware; + +import org.cyanogenmod.hardware.util.FileUtils; +import java.io.File; + +/* + * Vibrator intensity adjustment + * + * Exports methods to get the valid value boundaries, the + * default and current intensities, and a method to set + * the vibrator. + * + * Values exported by min/max can be the direct values required + * by the hardware, or a local (to VibratorHW) abstraction that's + * internally converted to something else prior to actual use. The + * Settings user interface will normalize these into a 0-100 (percentage) + * scale before showing them to the user, but all values passed to/from + * the client (Settings) are in this class' scale. + */ + +/* This would be just "Vibrator", but it conflicts with android.os.Vibrator */ +public class VibratorHW { + + private static final String PATH = "/sys/vibrator/pwm_value"; + + /* + * All HAF classes should export this boolean. + * Real implementations must, of course, return true + */ + + public static boolean isSupported() { + return new File(PATH).exists(); + } + + /* + * Set the vibrator intensity to given integer input. That'll + * be a value between the boundaries set by get(Max|Min)Intensity + * (see below), and it's meant to be locally interpreted/used. + */ + + public static boolean setIntensity(int intensity) { + + int finalValue = intensity - 60; + if (finalValue < 0) { finalValue *= -1;} + + return FileUtils.writeLine(PATH, String.valueOf(finalValue)); + } + + /* + * What's the maximum integer value we take for setIntensity()? + */ + + public static int getMaxIntensity() { + return 60; // 0 + } + + /* + * What's the minimum integer value we take for setIntensity()? + */ + + public static int getMinIntensity() { + return 0; // 60 + } + + /* + * Is there a value between the 2 above which is considered + * the safe max? If not, return anything < 0 + */ + + public static int getWarningThreshold() { + return 50; // 10 + } + + /* + * What's the current intensity value? + */ + + public static int getCurIntensity() { + int finalValue = Integer.parseInt(FileUtils.readOneLine(PATH)); + + // Invert the max / min returned values + + finalValue *= -1; + finalValue += 60; + + return finalValue; + } + + /* + * What's the shipping intensity value? + */ + + public static int getDefaultIntensity() { + return 50; //10 + } +} From 18f640e8c7894db956da702183543ad975092abd Mon Sep 17 00:00:00 2001 From: Franco Rapetti Date: Fri, 13 Jun 2014 14:49:17 -0300 Subject: [PATCH 241/248] fix permissions for the new vibrator sysfs chown /sys/vibrator/pwm_value to system:system --- rootdir/device_tunables.rc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rootdir/device_tunables.rc b/rootdir/device_tunables.rc index 9398180..463b232 100644 --- a/rootdir/device_tunables.rc +++ b/rootdir/device_tunables.rc @@ -1,5 +1,5 @@ on property:sys.boot_completed=1 - # System permission for NovaThor Settings + # System permissions for NovaThor Settings package and CyanogenMod Hardware Abstraction Framework chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb chown system system /sys/class/camera/flash/burning_led @@ -51,4 +51,5 @@ on property:sys.boot_completed=1 chown system system /sys/module/mali/parameters/mali_l2_max_reads chown system system /sys/module/mali/parameters/pre_allocated_memory_size_max chown system system /sys/module/mmc_core/parameters/use_spi_crc + chown system system /sys/vibrator/pwm_value write /sys/kernel/mxt224e/threshold_t48 on From addcb2efa56221dbcd892c81adf00d8262883ba6 Mon Sep 17 00:00:00 2001 From: Pablo Lunarenko Date: Sat, 14 Jun 2014 10:09:46 -0300 Subject: [PATCH 242/248] Initial SELinux for janice Very basic. TODO: fix SELinux policies and change to Enforcing mode Change-Id: Ibc61752d359c7564ed487a0f6b9a238aa90ca43d Reminder: Kill Rox. --- BoardConfig.mk | 18 ++++++++++++++-- janice.mk | 4 ++++ selinux/device.te | 2 ++ selinux/domain.te | 2 ++ selinux/drmserver.te | 1 + selinux/file.te | 3 +++ selinux/file_contexts | 45 +++++++++++++++++++++++++++++++++++++++ selinux/rild.te | 7 ++++++ selinux/system.te | 10 +++++++++ selinux/ueventd.te | 2 ++ selinux/vold.te | 1 + selinux/wpa_supplicant.te | 9 ++++++++ 12 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 selinux/device.te create mode 100644 selinux/domain.te create mode 100644 selinux/drmserver.te create mode 100644 selinux/file.te create mode 100644 selinux/file_contexts create mode 100644 selinux/rild.te create mode 100644 selinux/system.te create mode 100644 selinux/ueventd.te create mode 100644 selinux/vold.te create mode 100644 selinux/wpa_supplicant.te diff --git a/BoardConfig.mk b/BoardConfig.mk index ea9574a..644d00b 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -5,8 +5,6 @@ TARGET_OTA_ASSERT_DEVICE := janice,i9070,GT-I9070 # Kernel TARGET_KERNEL_SOURCE := kernel/samsung/u8500 TARGET_KERNEL_CONFIG := cyanogenmod_i9070_defconfig -#TARGET_KERNEL_CUSTOM_TOOLCHAIN := arm-eabi-4.6 -ARM_EABI_TOOLCHAIN := $(ANDROID_BUILD_TOP)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin # Bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/janice/bluetooth @@ -20,5 +18,21 @@ TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice # Hardware tunables (device parts replacement) BOARD_HARDWARE_CLASS := device/samsung/janice/cmhw +# SELinux +BOARD_SEPOLICY_DIRS += \ + device/samsung/janice/selinux + +BOARD_SEPOLICY_UNION += \ + device.te \ + file.te \ + rild.te \ + drmserver.te \ + ueventd.te \ + domain.te \ + system.te \ + file_contexts \ + wpa_supplicant.te \ + vold.te + # Disable legacy sensors using because janice has gyro BOARD_USE_LEGACY_SENSORS_FUSION := false diff --git a/janice.mk b/janice.mk index b5598f8..bfd4627 100644 --- a/janice.mk +++ b/janice.mk @@ -6,6 +6,10 @@ LOCAL_PATH := device/samsung/janice # Overlay DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay +# SELinux +PRODUCT_PROPERTY_OVERRIDES += \ + ro.boot.selinux=permissive + # STE PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh diff --git a/selinux/device.te b/selinux/device.te new file mode 100644 index 0000000..6de8078 --- /dev/null +++ b/selinux/device.te @@ -0,0 +1,2 @@ +type rfkill_device, dev_type; +type efs_block_device, dev_type; diff --git a/selinux/domain.te b/selinux/domain.te new file mode 100644 index 0000000..e21439a --- /dev/null +++ b/selinux/domain.te @@ -0,0 +1,2 @@ +## Firmwares +allow ueventd { firmware_wlan }:file r_file_perms; diff --git a/selinux/drmserver.te b/selinux/drmserver.te new file mode 100644 index 0000000..a456bbf --- /dev/null +++ b/selinux/drmserver.te @@ -0,0 +1 @@ +allow drmserver sdcard_external:file open; diff --git a/selinux/file.te b/selinux/file.te new file mode 100644 index 0000000..8929a8d --- /dev/null +++ b/selinux/file.te @@ -0,0 +1,3 @@ +type radio_efs_file, fs_type; +type firmware_wlan, file_type; +type sensors_data_file, file_type, data_file_type; diff --git a/selinux/file_contexts b/selinux/file_contexts new file mode 100644 index 0000000..81330ff --- /dev/null +++ b/selinux/file_contexts @@ -0,0 +1,45 @@ +# GFX +/dev/mali u:object_r:graphics_device:s0 +/dev/ump u:object_r:graphics_device:s0 +/dev/b2r2_blt u:object_r:graphics_device:s0 +/dev/disp0 u:object_r:graphics_device:s0 +/dev/comp0 u:object_r:graphics_device:s0 + +# RIL +/modemfs u:object_r:radio_device:s0 +/dev/rpc u:object_r:radio_device:s0 +/modemfs/* u:object_r:radio_data_file:s0 + +/efs u:object_r:efs_block_device:s0 +/dev/block/mmcblk0p7 u:object_r:efs_block_device:s0 +/efs/* u:object_r:efs_file:s0 +/efs/wifi/* u:object_r:wifi_data_file:s0 + +# Bluetooth +/dev/ttySAC0 u:object_r:hci_attach_dev:s0 +/efs/bluetooth/* u:object_r:bluetooth_data_file:s0 + +# GPS +/dev/ttyAMA1 u:object_r:gps_device:s0 +/dev/mmc328x u:object_r:gps_device:s0 +/dev/bma222 u:object_r:gps_device:s0 +/dev/ecompass_ctrl u:object_r:gps_device:s0 + +# Sensors +/dev/rn5t592 u:object_r:sensors_device:s0 +/dev/alps_io u:object_r:sensors_device:s0 +/dev/gp2a_prox u:object_r:sensors_device:s0 +/dev/gp2a_light u:object_r:sensors_device:s0 +/dev/mpu60x0_gyro u:object_r:sensors_device:s0 +/dev/mpu60x0_accel u:object_r:accelerometer_device:s0 + + +/dev/tee u:object_r:tee_device:s0 +/dev/pipes u:object_r:socket_device:s0 + +# for wpa_supp +/dev/rfkill u:object_r:rfkill_device:s0 + +# Firmwares +/system/vendor/firmware/fw_bcmdhd.bin u:object_r:firmware_wlan:s0 +/system/vendor/firmware/fw_bcmdhd_apsta.bin u:object_r:firmware_wlan:s0 diff --git a/selinux/rild.te b/selinux/rild.te new file mode 100644 index 0000000..40406e3 --- /dev/null +++ b/selinux/rild.te @@ -0,0 +1,7 @@ +allow rild self:netlink_socket { create bind read write }; +allow rild self:netlink_route_socket { write }; +allow rild self:netlink_kobject_uevent_socket { create bind read write }; + +allow rild radio_device:chr_file rw_file_perms; +allow rild efs_block_device:blk_file rw_file_perms; +allow rild efs_file:file { read open write setattr }; diff --git a/selinux/system.te b/selinux/system.te new file mode 100644 index 0000000..86e3868 --- /dev/null +++ b/selinux/system.te @@ -0,0 +1,10 @@ +#allow system uinput_device:chr_file { read ioctl write open }; +allow system sensors_device:chr_file { read open }; +allow system sensors_data_file:file r_file_perms; +allow system wpa_socket:unix_dgram_socket sendto; + +allow system sysfs:file { read open write }; +allow system self:capability { sys_module }; + +# /efs/wifi/.mac.info +allow system wifi_data_file:file { read open }; diff --git a/selinux/ueventd.te b/selinux/ueventd.te new file mode 100644 index 0000000..95a5698 --- /dev/null +++ b/selinux/ueventd.te @@ -0,0 +1,2 @@ +allow ueventd sdcard_external:dir search; +allow ueventd sdcard_external:file r_file_perms; diff --git a/selinux/vold.te b/selinux/vold.te new file mode 100644 index 0000000..d179865 --- /dev/null +++ b/selinux/vold.te @@ -0,0 +1 @@ +allow vold sdcard_external:file rw_file_perms; diff --git a/selinux/wpa_supplicant.te b/selinux/wpa_supplicant.te new file mode 100644 index 0000000..bbe679b --- /dev/null +++ b/selinux/wpa_supplicant.te @@ -0,0 +1,9 @@ +allow wpa init:unix_dgram_socket { read write }; + +# logwrapper used with wpa_supplicant +allow wpa devpts:chr_file { read write }; + +allow wpa wpa_socket:unix_dgram_socket { read write }; +allow wpa_socket system:unix_dgram_socket sendto; + +allow wpa_socket wifi_data_file:sock_file unlink; From a95217916894b6b679e2a2bebfa9b4d43c20c0e2 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sun, 15 Jun 2014 14:04:49 +0200 Subject: [PATCH 243/248] Revert "Initial SELinux for janice" SELinux is moved to common This reverts commit addcb2efa56221dbcd892c81adf00d8262883ba6. --- BoardConfig.mk | 16 -------------- janice.mk | 4 ---- selinux/device.te | 2 -- selinux/domain.te | 2 -- selinux/drmserver.te | 1 - selinux/file.te | 3 --- selinux/file_contexts | 45 --------------------------------------- selinux/rild.te | 7 ------ selinux/system.te | 10 --------- selinux/ueventd.te | 2 -- selinux/vold.te | 1 - selinux/wpa_supplicant.te | 9 -------- 12 files changed, 102 deletions(-) delete mode 100644 selinux/device.te delete mode 100644 selinux/domain.te delete mode 100644 selinux/drmserver.te delete mode 100644 selinux/file.te delete mode 100644 selinux/file_contexts delete mode 100644 selinux/rild.te delete mode 100644 selinux/system.te delete mode 100644 selinux/ueventd.te delete mode 100644 selinux/vold.te delete mode 100644 selinux/wpa_supplicant.te diff --git a/BoardConfig.mk b/BoardConfig.mk index 644d00b..54635aa 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -18,21 +18,5 @@ TARGET_RECOVERY_FSTAB := device/samsung/janice/rootdir/fstab.samsungjanice # Hardware tunables (device parts replacement) BOARD_HARDWARE_CLASS := device/samsung/janice/cmhw -# SELinux -BOARD_SEPOLICY_DIRS += \ - device/samsung/janice/selinux - -BOARD_SEPOLICY_UNION += \ - device.te \ - file.te \ - rild.te \ - drmserver.te \ - ueventd.te \ - domain.te \ - system.te \ - file_contexts \ - wpa_supplicant.te \ - vold.te - # Disable legacy sensors using because janice has gyro BOARD_USE_LEGACY_SENSORS_FUSION := false diff --git a/janice.mk b/janice.mk index bfd4627..b5598f8 100644 --- a/janice.mk +++ b/janice.mk @@ -6,10 +6,6 @@ LOCAL_PATH := device/samsung/janice # Overlay DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay -# SELinux -PRODUCT_PROPERTY_OVERRIDES += \ - ro.boot.selinux=permissive - # STE PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/configs/ste_modem.sh:system/etc/ste_modem.sh diff --git a/selinux/device.te b/selinux/device.te deleted file mode 100644 index 6de8078..0000000 --- a/selinux/device.te +++ /dev/null @@ -1,2 +0,0 @@ -type rfkill_device, dev_type; -type efs_block_device, dev_type; diff --git a/selinux/domain.te b/selinux/domain.te deleted file mode 100644 index e21439a..0000000 --- a/selinux/domain.te +++ /dev/null @@ -1,2 +0,0 @@ -## Firmwares -allow ueventd { firmware_wlan }:file r_file_perms; diff --git a/selinux/drmserver.te b/selinux/drmserver.te deleted file mode 100644 index a456bbf..0000000 --- a/selinux/drmserver.te +++ /dev/null @@ -1 +0,0 @@ -allow drmserver sdcard_external:file open; diff --git a/selinux/file.te b/selinux/file.te deleted file mode 100644 index 8929a8d..0000000 --- a/selinux/file.te +++ /dev/null @@ -1,3 +0,0 @@ -type radio_efs_file, fs_type; -type firmware_wlan, file_type; -type sensors_data_file, file_type, data_file_type; diff --git a/selinux/file_contexts b/selinux/file_contexts deleted file mode 100644 index 81330ff..0000000 --- a/selinux/file_contexts +++ /dev/null @@ -1,45 +0,0 @@ -# GFX -/dev/mali u:object_r:graphics_device:s0 -/dev/ump u:object_r:graphics_device:s0 -/dev/b2r2_blt u:object_r:graphics_device:s0 -/dev/disp0 u:object_r:graphics_device:s0 -/dev/comp0 u:object_r:graphics_device:s0 - -# RIL -/modemfs u:object_r:radio_device:s0 -/dev/rpc u:object_r:radio_device:s0 -/modemfs/* u:object_r:radio_data_file:s0 - -/efs u:object_r:efs_block_device:s0 -/dev/block/mmcblk0p7 u:object_r:efs_block_device:s0 -/efs/* u:object_r:efs_file:s0 -/efs/wifi/* u:object_r:wifi_data_file:s0 - -# Bluetooth -/dev/ttySAC0 u:object_r:hci_attach_dev:s0 -/efs/bluetooth/* u:object_r:bluetooth_data_file:s0 - -# GPS -/dev/ttyAMA1 u:object_r:gps_device:s0 -/dev/mmc328x u:object_r:gps_device:s0 -/dev/bma222 u:object_r:gps_device:s0 -/dev/ecompass_ctrl u:object_r:gps_device:s0 - -# Sensors -/dev/rn5t592 u:object_r:sensors_device:s0 -/dev/alps_io u:object_r:sensors_device:s0 -/dev/gp2a_prox u:object_r:sensors_device:s0 -/dev/gp2a_light u:object_r:sensors_device:s0 -/dev/mpu60x0_gyro u:object_r:sensors_device:s0 -/dev/mpu60x0_accel u:object_r:accelerometer_device:s0 - - -/dev/tee u:object_r:tee_device:s0 -/dev/pipes u:object_r:socket_device:s0 - -# for wpa_supp -/dev/rfkill u:object_r:rfkill_device:s0 - -# Firmwares -/system/vendor/firmware/fw_bcmdhd.bin u:object_r:firmware_wlan:s0 -/system/vendor/firmware/fw_bcmdhd_apsta.bin u:object_r:firmware_wlan:s0 diff --git a/selinux/rild.te b/selinux/rild.te deleted file mode 100644 index 40406e3..0000000 --- a/selinux/rild.te +++ /dev/null @@ -1,7 +0,0 @@ -allow rild self:netlink_socket { create bind read write }; -allow rild self:netlink_route_socket { write }; -allow rild self:netlink_kobject_uevent_socket { create bind read write }; - -allow rild radio_device:chr_file rw_file_perms; -allow rild efs_block_device:blk_file rw_file_perms; -allow rild efs_file:file { read open write setattr }; diff --git a/selinux/system.te b/selinux/system.te deleted file mode 100644 index 86e3868..0000000 --- a/selinux/system.te +++ /dev/null @@ -1,10 +0,0 @@ -#allow system uinput_device:chr_file { read ioctl write open }; -allow system sensors_device:chr_file { read open }; -allow system sensors_data_file:file r_file_perms; -allow system wpa_socket:unix_dgram_socket sendto; - -allow system sysfs:file { read open write }; -allow system self:capability { sys_module }; - -# /efs/wifi/.mac.info -allow system wifi_data_file:file { read open }; diff --git a/selinux/ueventd.te b/selinux/ueventd.te deleted file mode 100644 index 95a5698..0000000 --- a/selinux/ueventd.te +++ /dev/null @@ -1,2 +0,0 @@ -allow ueventd sdcard_external:dir search; -allow ueventd sdcard_external:file r_file_perms; diff --git a/selinux/vold.te b/selinux/vold.te deleted file mode 100644 index d179865..0000000 --- a/selinux/vold.te +++ /dev/null @@ -1 +0,0 @@ -allow vold sdcard_external:file rw_file_perms; diff --git a/selinux/wpa_supplicant.te b/selinux/wpa_supplicant.te deleted file mode 100644 index bbe679b..0000000 --- a/selinux/wpa_supplicant.te +++ /dev/null @@ -1,9 +0,0 @@ -allow wpa init:unix_dgram_socket { read write }; - -# logwrapper used with wpa_supplicant -allow wpa devpts:chr_file { read write }; - -allow wpa wpa_socket:unix_dgram_socket { read write }; -allow wpa_socket system:unix_dgram_socket sendto; - -allow wpa_socket wifi_data_file:sock_file unlink; From 1eab083b3cea6b6821f83ee850413de6c292fd50 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Sun, 15 Jun 2014 21:55:30 +0200 Subject: [PATCH 244/248] Do not use preload as swap partition anymore +Move storage_list.xml to common --- .../base/core/res/res/xml/storage_list.xml | 48 ------------------- rootdir/fstab.samsungjanice | 25 ++++------ rootdir/init.samsungjanice.rc | 2 - 3 files changed, 9 insertions(+), 66 deletions(-) delete mode 100644 overlay/frameworks/base/core/res/res/xml/storage_list.xml diff --git a/overlay/frameworks/base/core/res/res/xml/storage_list.xml b/overlay/frameworks/base/core/res/res/xml/storage_list.xml deleted file mode 100644 index 86b07e2..0000000 --- a/overlay/frameworks/base/core/res/res/xml/storage_list.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - diff --git a/rootdir/fstab.samsungjanice b/rootdir/fstab.samsungjanice index 78322af..34384cb 100644 --- a/rootdir/fstab.samsungjanice +++ b/rootdir/fstab.samsungjanice @@ -1,29 +1,22 @@ # Android fstab file. -# # The filesystem that contains the filesystem checker binary (typically /system) cannot # specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK -# data partition must be located at the bottom for supporting device encryption - +# Data partition must be located at the bottom for supporting device encryption # - /dev/block/mmcblk0p3 /system ext4 ro,noatime,errors=panic wait /dev/block/mmcblk0p2 /modemfs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p4 /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check /dev/block/mmcblk0p7 /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/mmcblk0p9 /preload ext4 ro,noatime,errors=panic wait /dev/block/mmcblk0p5 /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=/efs/metadata +# Vold managed volumes +/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:8,nonremovable,noemulatedsd +/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto -## Swap ## - -/dev/block/mmcblk0p9 /preload swap defaults defaults - - -## Vold managed volumes ## - -/devices/sdi2/mmc_host/mmc0/mmc0 auto auto defaults voldmanaged=sdcard0:8,nonremovable,lun=/sys/class/android_usb/android0/f_mass_storage/lun0/file -/devices/sdi0/mmc_host/mmc1/mmc1 auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd,lun=/sys/class/android_usb/android0/f_mass_storage/lun1/file - - -## Recovery only ## +# Recovery /dev/block/mmcblk0p15 /boot emmc defaults recoveryonly + +# ZRAM +/dev/block/zram0 none swap defaults zramsize=104857600 diff --git a/rootdir/init.samsungjanice.rc b/rootdir/init.samsungjanice.rc index b87abc3..e013ac4 100644 --- a/rootdir/init.samsungjanice.rc +++ b/rootdir/init.samsungjanice.rc @@ -2,8 +2,6 @@ import /init.u8500.rc on fs - exec /system/xbin/mkswap /dev/block/mmcblk0p9 - mount_all /fstab.samsungjanice swapon_all /fstab.samsungjanice From e0bf85e03e511a6e727d982cb733c400f7bcf9ef Mon Sep 17 00:00:00 2001 From: Diego Porto Date: Tue, 17 Jun 2014 13:54:28 -0300 Subject: [PATCH 245/248] fix permissions for OmxILOsalPrm there's a permission error when stericsson blobs try to access those files ie. playing media results on this error: V/OmxILOsalPrm( 1833): ChangeResourceState(0, 50, 0x447e79f4) E/OmxILOsalPrm( 1833): updateSocDvfsOpp - failed to open /dev/ape_opp V/OmxILOsalPrm( 1833): ChangeResourceState(1, 50, 0x447e79f4) E/OmxILOsalPrm( 1833): updateDDROpp - failed to open /dev/ddr_opp V/OmxILOsalPrm( 1833): ChangeResourceState(2, 600, 0x447e79f4) changing user to media and group to system fixes the error --- rootdir/ueventd.samsungjanice.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rootdir/ueventd.samsungjanice.rc b/rootdir/ueventd.samsungjanice.rc index 2453410..8134ffb 100644 --- a/rootdir/ueventd.samsungjanice.rc +++ b/rootdir/ueventd.samsungjanice.rc @@ -18,9 +18,10 @@ # Sensor i2c /dev/i2c-2 0660 media system /dev/i2c-4 0660 system system + # PWR QOS devices -/dev/ape_opp 0660 system graphics -/dev/ddr_opp 0660 system graphics +/dev/ape_opp 0660 media system +/dev/ddr_opp 0660 media system # hwmem driver /dev/hwmem 0666 media system From 493b98e21aa92dd89e22e8162df889aa1b88e242 Mon Sep 17 00:00:00 2001 From: Tano Abeleyra Date: Thu, 19 Jun 2014 14:33:23 -0300 Subject: [PATCH 246/248] ColorCalibration: Update path regarding s6e63m0 changes Change-Id: Id65d3c1b6c1914ae9af365a5a8a5af9a626969e6 --- cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java | 6 +++--- rootdir/device_tunables.rc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java index b49461f..59c0366 100644 --- a/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java +++ b/cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java @@ -38,9 +38,9 @@ public class DisplayColorCalibration { public static final int[] DEFAULT_RGB_VALUES = { 24, 8, 36 }; private static final String[] FILE_PATH = new String[] { - "/sys/devices/pri_lcd_s6e63m0.0/filter_R", - "/sys/devices/pri_lcd_s6e63m0.0/filter_G", - "/sys/devices/pri_lcd_s6e63m0.0/filter_B" + "/sys/kernel/s6e63m0/color/main_R", + "/sys/kernel/s6e63m0/color/main_G", + "/sys/kernel/s6e63m0/color/main_B" }; /* diff --git a/rootdir/device_tunables.rc b/rootdir/device_tunables.rc index 463b232..a8c108f 100644 --- a/rootdir/device_tunables.rc +++ b/rootdir/device_tunables.rc @@ -3,9 +3,9 @@ on property:sys.boot_completed=1 chown system system /proc/sys/net/ipv4/tcp_congestion_control chown system system /sys/block/mmcblk0/queue/read_ahead_kb chown system system /sys/class/camera/flash/burning_led - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_R - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_G - chown system system /sys/devices/pri_lcd_s6e63m0.0/filter_B + chown system system /sys/kernel/s6e63m0/color/main_R + chown system system /sys/kernel/s6e63m0/color/main_G + chown system system /sys/kernel/s6e63m0/color/main_B chown system system /sys/devices/system/cpu/sched_mc_power_savings chown system system /sys/kernel/abb-charger/charger_curr chown system system /sys/kernel/abb-charger/max_ac_c From 996f269611b392706043ad698a19b6df2204e047 Mon Sep 17 00:00:00 2001 From: Balint Reczey Date: Sun, 20 Jul 2014 11:14:50 +0200 Subject: [PATCH 247/248] Fix broken linking due to not exported sendit() Change-Id: I3c71e4339a21514abacadf0e084aaffba8569aa7 --- vibrator/vibrator.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/vibrator/vibrator.c b/vibrator/vibrator.c index 32b5249..05ebbd8 100644 --- a/vibrator/vibrator.c +++ b/vibrator/vibrator.c @@ -33,35 +33,26 @@ int vibrator_exists() return 1; } -static int sendit(int timeout_ms) +int sendit(int timeout_ms) { int nwr, ret, fd; char value[20]; + if (timeout_ms == 0) { + /* Called from from vibrator_off(), checks if the device is vibrating, + if it's vibrating stop, if not, do nothing */ + return (vibrator_exists() == 0) ? 0 : 1; + } + fd = open(THE_DEVICE, O_RDWR); if(fd < 0) return errno; - nwr = sprintf(value, "%d\n", timeout_ms); + /* timeout_ms < 0 means constant on, up to maximum allowed time */ + nwr = sprintf(value, "%d\n", (timeout_ms < 0)?15000:timeout_ms); ret = write(fd, value, nwr); close(fd); return (ret == nwr) ? 0 : -1; } - - -int vibrator_on(int timeout_ms) -{ - /* constant on, up to maximum allowed time */ - if(timeout_ms < 0) - return sendit(15000); - return sendit(timeout_ms); -} - -int vibrator_off() -{ - /* checks if the device is vibrating, if it's vibrating stop, if not, do nothing */ - return (vibrator_exists() == 0) ? 0 : 1; -} - From 714a8f711fab3cbf3a5b6bc1cb23516e811fc881 Mon Sep 17 00:00:00 2001 From: Robert Rozic Date: Mon, 28 Jul 2014 13:32:54 +0200 Subject: [PATCH 248/248] Update permissions for arm steps --- rootdir/device_tunables.rc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/rootdir/device_tunables.rc b/rootdir/device_tunables.rc index a8c108f..ee37b37 100644 --- a/rootdir/device_tunables.rc +++ b/rootdir/device_tunables.rc @@ -28,16 +28,17 @@ on property:sys.boot_completed=1 chown system system /sys/kernel/abb-regu/VOTG chown system system /sys/kernel/debug/cpuidle/deepest_state chown system system /sys/kernel/fsync/mode - chown system system /sys/kernel/liveopp/arm_step0 - chown system system /sys/kernel/liveopp/arm_step1 - chown system system /sys/kernel/liveopp/arm_step2 - chown system system /sys/kernel/liveopp/arm_step3 - chown system system /sys/kernel/liveopp/arm_step4 - chown system system /sys/kernel/liveopp/arm_step5 - chown system system /sys/kernel/liveopp/arm_step6 - chown system system /sys/kernel/liveopp/arm_step7 - chown system system /sys/kernel/liveopp/arm_step8 - chown system system /sys/kernel/liveopp/arm_step9 + chown system system /sys/kernel/liveopp/arm_step00 + chown system system /sys/kernel/liveopp/arm_step01 + chown system system /sys/kernel/liveopp/arm_step02 + chown system system /sys/kernel/liveopp/arm_step03 + chown system system /sys/kernel/liveopp/arm_step04 + chown system system /sys/kernel/liveopp/arm_step05 + chown system system /sys/kernel/liveopp/arm_step06 + chown system system /sys/kernel/liveopp/arm_step07 + chown system system /sys/kernel/liveopp/arm_step08 + chown system system /sys/kernel/liveopp/arm_step09 + chown system system /sys/kernel/liveopp/arm_step10 chown system system /sys/kernel/mali/mali_auto_boost chown system system /sys/kernel/mali/mali_boost_delay chown system system /sys/kernel/mali/mali_boost_high
  • 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 z

    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

    W(|cJxlo-p%cpH@F>(`J?ps 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�?iO;Zo~C|OVmUw1X?3tLy0!12VVr*BH)KWI|Td@XpcY#1Ue$n34zWCbU~mi z0^JbkjzA9tdLqyZf!+x8L7*=J{SfGH!~73KO$^2>f{cpCG>dKL<527lC;Q z*id3V>R|x_3lUg^z+wcJAg~mHWe6-sU?A0-q81g1}b5&|}qh>UuOfe_4Cj#*iNPs{> z1QH>T7=a`RBt;+@0?BQd|CFeSR0yO-z=jfOP!DMlNQXdr1Tr9y5rIqyWJVwh0$CBr zhCp@%av+csfm{gWMj#IYc@fBmKz;-YAW#s2LN?5Q5!6Ic1d1VGLy6+3hY|>sM4%J` zr4cBDKv@LJAy6KH3J6q0pb`R=5vYPdRRpRbP#u992-HNN76P>qsDnUV8|L2&HBldd z1_;dVxtfWI^1 z8U+j=V~BbkfHTHN)6*<$HZ@0>>zcXcuOkHNeq#!SK7rOZs@F>Q_>53Jg}xxvSs}DNzfqmZ-Qzo2X{GvZYX}`uNJr?dLTERB zlltCyq8<57aTN*%%5737P4^6rP(_78Ak%tl}i0&@|VhroOU79g+?fkg-`Mqmj7OA%Oxz;Xmu*f9UAP!p>W zSc8BKCDx)I)*-MSfei?3L|_vFn-SQ8z*YnT5ZH!5AOhPF*nz-K1a={?8-YCt>_uQ7 z0{am-fWSc;=KnBi;s^pq5wM}eG1S9x1Wq7u5`j|)oJQab0%s98hroFRE+B9bflCNn zM&JqpR}r{|z;y&}AaE0bTL|1n;EoORe-AZrAAtu5*ihmj>fsRrj}dr+z*7XCA@Cf5 z7YMvW;1vR|5qN{ZTLjRq(?+!8v=QzQ!QCOaGX!^q;EoX74f=+@P~U@o{x_jbq)l)G z32q+QPy+5v!F{O^;G3}t?nlABD7X(52K5jYfp7?fM<4AP^OSXb40{ zAO-?45r~CAYy{%iF#qvT6CMb7B49&__^5{j2qZ)x5dw)3NP<981d<_;9Dx)Fq(mSU z0;v&5gFspY(jkx@feZ*_L?9CanGwi>Kvo;(KRaq72Ld?}u%SdQ)I)9r@*t2GfqV$$ zN1y-#1raEOKw$)mAW#&6Vh9vRpacRX5h#T~X#~n3P!@r52$V;lf(`Ru2{lm}fhq{t zP@*d8p&A0!5vYMcO$2HoP#b|d2-HQO9s*tn)JLEJ0u2%HMxYS_J_s~Mpa}v^5om@$ za|Bx0F#oMk6RiR}iH!x0#Pz(@o}Aut+&F$j!B zU>pMD5tx9$LVo z2rNcm2?9$IScbrI1Xduh5`k3+tVUoB0&5XihroISHXyJOflUZ(Mqmp9TM-Cw%ztcc zyQbc5=(?UrFRVAx`|Atz{rUqVw2{gvZL~Co8!L?C#tSownZ>MTb~2}!0p>O5N5=#6 z|Mo{c=vb9Sl>-sjj=&Dvs{Hd&+s#`4`JnBcsLx#p>_%V@0((W^t8GY!Kzan^?QB)z z*W1~ShqrsTZsO&wZT7>1F=C}uQO&;D6v9FylCRyqyE87R&| zVNaEFu#fXlT!7*t6qlg548;{Fu0nAQitA9^fZ`?;x1hKU#T_W_LU9j@`%pZ9;vp1| zpm=QC{6B@gJcHsn6!uhk0sD9f#VaUYL-7WRw@|!;;yn}}p!f*ICn!Ec@db*nP<(^p zI})2UD0C4VK@r@p`QIE8_7Vz;&`{V@1wNB=Gkg~3X8a6J{OrvL@aqu~ibzmI zh9U|SQK5(iMRX`)KoJv)SWv`U{;R@XszFg53VW*5fPK`2q81djp{N5zT`1~7;RQu~C>lV~5DIT78bRR$ zMPn$MK+zP6W>7STq6HK!p=f2>{I`L<_(IVZ3VW*f!9LnS;SWW7C^|sV5sFSwbcUh} z6kVa{21R!$dO*<=ie6CkhN2G?eWB83M&nDD0^+4E8Y`iV;wZ zgklsFqoEiB#aJlDK`|bR2~bRgViFXSp_l^2R4ArFF&&B-P|Sp478E}o{})@``5)Bx z|8JfPdzlBtd?@UxvHMUjNsY`QHY634~%h6!uiv0sGhq#V#mzL$L>ny-@6fVm}lIpg0J{ zAt(+*aRiE^P#lBeI20$KI0?lmC{9Ch28y$`-Tprhd$|C`MJVj4atZcv8Hy`VT!rEq z6xX4+0mV%yZb5MyiaSu;h2kC*_n~+I#X~3_LGc)hCr~_v;u#dr9q0d#p{-LNJ(H=w zF6o+{OfRGR>66qWfbSS#j0{FKqnk0uIAA<8qnWwP`sM(0nR&`wV4ikdDC$oo)ITHt z^-uM$h=2XdtEo?eM(uq3y>fUt9**tr=hId_CVX=hr6NJq+OC!VrOQF8eiYcH<3#X3 ze>r~r83!m84X$-gspwF>P%0);Thy<3&sb0;Q7Sf6`IL$SRSl)$LglAaJg9~#%}CV=XVQVEgT8bPT?T^5_P`$6%?Zu!w@&aa6MU-#-y*@cM(`~W zd@CdY{F=gBA6wupk1dI9oByQn^GOCpawzPnk^=UT5{gt%q=q656ltMI2Ss`)GC+|L zicC;sh9V0TS)s@VMRq81K#>!QTu|hOA`cXKZJYo6u$KZ*6okT_DurMlg`p?{MNue< zK~Wrv5>S+cq7)RRp(q1ISt!auQ67p4P*jAX5)_r8r~*Y*D5^nG-M0C!345spMQteT zsZs~_Q5TAOP>P|Sg1E)?^im~Y$sFND1;f?_cg_EcE{`&bIaGANcqu>y*f zP^^MtH56;0SPR8EDAq%<0g8=KY=UAl6kDL!3Pk`E+n@-9V!LhgzZ3Sd3yR%P*i&T> z>|-w!`=Hnl#Q`V|LU9O+!%!T7;wTiypg0c22`ElNaSDplP@I9{EEMOUI1j}IC@$JI z|CeDeSD?5Gg*{cS!9K1-aRZ8*P~3vzHWYWDxC_NSDDFe?0E&lDJc8me6i=Xd3dJ)h zo`>%@A}18NpvVnH9w_ockq?UeP!xco;Qx32 z|9GYmtW+3^B2W~C!k#L{U?0VyC;>%DC`v(58j3Pdl!c-k6y>3)07XS8DnU^hiYic4 zg`yf1)uE^XMNKGbK~dW=|1mW6B+FqxodKx6K15%qUo%1(nT$Hd0ArPL$qZ(uGi#WA z)N_B&Io{#Qb!FkJZQA#D@%MlK{n^4>|HGR9yN0R?cGZ;tyXs0D{NuM?Gw+|Cne(^j zS9<%m(gF_C@(3e;JZEzSEmzWV6)jiOat$rl(sCUw*VA$XEjQ9~6D>E>atkfD((=da z|3%j(Y3gm4_C$}N7tovQ<$hWoaQuvP@b+pY{l0AHqXnd8 zVLBG3XJG~wW@KR|7G`E)78Yh@VK&G0e{^lGrrwTdZ*@<-xbCY@)_3WTjc7(*X8!;D zMd17owsH;@=49dTUojV3IyVdRurMzR^RX~L3k$HYAPWnzurLdYu&^i#i?Ogc3rn!D zBnwNiurv$HxNZK+u`QNo;qPCu0$aKw3oEg(G7GD)uqq3yv9LM|Yp}2;3v02kHVf;p zur3ShvCxZ!^;y_}g$>;{|BcudeOUPWS8U9dZo#-#lqGsY{Nod z7Pe)f9}C;D(4U3vS=fPv9a-4vH_v|xldar^gTg|u8m%f+-@Ld&JJ zTt>^~@H$HU22}S^Z1rX#J|1vhx5Fd}aAU+;-!KT0Y_P?gFUmbkh>S_@mx4Pi( zUlAV(yGr9DVHd>d`+T%`9d$vy(Z+3^1>`K3>!EJ1$nl!^~?q?%Y-Xt&Rztx3$%OC;#KW(Vf0! z6;8ooZ~LpD{yVFdQnCGyR5&$#r8Gn7G;nFx_p+J7X<6J;VSL}XYvu6@XJA)es&GaY z?^GDyPwr|%J?z92-&gL!PZh@ZmpgHQsW86J+=XK+ob8VvddClk<7F)}X7g&++V!#) zapo(LT@<^N$RUdBO5_y97bS8@BCey;+@f&9{r|4-58k(OLA-AjWGmvGFjr~36Xt?= zC(H%$PM8bgoiG=~J7F$}cfwo{?}WJ^-U)L-yc6bvcqhyS@lKcvj$nUfjbtI-^>UR~ zyIx?2$_2-;a4ZYQx$XA<1h&PAEd2c|PGU<>X5kbTPG#XV7EWj33>MC0;Vc%;X5kzb z&Sl{|7S3nk0v0Z0;UX3;X5kXI&HpmCMS5fA_pi8u?QtawSFvz43)ir4EeqGNa6Jn* zuy7*_H?eRt3%9UvD+>cyxQ&H@EZok*9d4WdU2KcHS@`=`+{2dM%ffvu+|R-TEIi1< zLo7VZ!Xqp^%EDtTJkG)sEIi4=Q!G5q!ZR#9%ffSRoBs=Jix*k=`&YcgmcGowD=fUq z!fPzN&cYikyvf2_EWFLaJ1o4*!h0;d&%y^Re8|E_EPTwuCvKbnXKahlS@`=`e8HA} z$--AGe9gi)EPTttcPxC*!VfI`$ih!7{LI2HEd0vCZ!G*y!T|Qp^#Gk+(Qw!N2LxkV z49>#ezhVfsbVwG4Vqs_&hGAh?7KUSCcos%rVMG>2Vqs(!Mqy!87Di)XbQZ>7VN4dr za?F1WZK|f;_GnMl^Z)bfP4&_0@qf3Ca7I?6o-t6J{o|r(n5oSwW_NRexyQWa`gluS zlzzNVKpeKExPQPu{{Gkd-<|i0{D+m%it*Ue9xU`^VSE-QU|~WQCSqY?7A9d~QWhp- zVR9CxU|~uYrea}g7N(Kz!;dpZOy`Q}JjeXU(>7`9?VR>TJ^nX?UQTbR&i}JW-=`h} zY#0fQeCixPU5rWUalmJcS7s!29-uO2b92zozY8?&*HwP~fBpS@+Io4%Ssis>pbT`i_-#B{Bgt`pPsV!A<0H;U;dG2JYtTf}s$ zmye4Z4+Yi*@ga>0L3sC#Lts^nsW@6w^my`dCb#i0M-?eI};Q#q@=kz7*3} zV)|N4--zj3F?}bd@5S_kn0^$~Ph$Gnjr0Fi?ChJEeizdqTRHB(9OpQXXyWQpS8)w7 zHN`ZTmtoG=Z2V6w^dvnpjMeh-p$W zO(v$v#WaPOrWDguVwze^(}-zWF-<3?>BTgIm}V5yOk$c@OtXk-R`*^1$IUKwCO$hV zuK3KTAY3_@*t7gxt32Xm^NMLcG0iWg1;n(Vm=+S#!eUxPOpA(XF)=MJrX|F*q?ncx z)6!yEMoi0!X*n@1FQyg5w4#_+a^w705j(3Yrq#qW=vJ;S)~z9?HN~`+nAR54I$~N^ zOzVlMmzdTU(*|PNP)xnWw2_$lh-qUnZ6c;k#k852HW$+tV%kznTZw6FF>T|<`EM(B z<|n4@#5Cwu_80567t;=6+EGk9iD_ps?INaK#k8B4b{EqgV%k$odx>dpG3_I!eZ{n& znD!Ub0b)8(Ob3bSU@;vcrbESam>cJRgxJ|gF&!nQLAUZ~vF;c#9V@2e#B{uvP7u?H zVme7oCyVJ6F`X)=)5LVTn9dN>nPNIiOlOPf95J0Mrt`#fzL+i$(}iNXNK6;IasHQz zoh=j7&0|~m~Ir)O=7xPOt*;XRxu3_(`{lJ zD5l%RbcdMk6w_T|x?4>5i0NK2-RH*nKOlB?P)rYrY0#~FSgd~my)LFV#Pp_^-V)Q>Zk+$S zVrTcn^uCw|-O3Ndx(~(lk(fRf(2ooCA*L_I^p%*t7SlIk`c_QeiRpVW z{UD|v#q^VyeiqX&V)|7~zlrI0DUGMOZ~o&MVrQn91{2euTRFH`H-wmm6w^>*8d^-l zh-p|c4JW4I#WaGLMikRXVj5XYqljr#F^wjs(Zw`|n8p;-SYjGmOyh`YTrrI&rXFsb z|M+5O3B)v^mzM{>O@)jT6)HVj6TSPY~-)6w^s!I$2Doi0M=@ohGK!#dL<4&J@#GVmez) z=ZNWCF`Xx-^Tl+5m@X94MPj;GOqYo1QZZd7rpv{2g&XI8mDt&8F%)7@gaM@;vM={_;tFQx~? z^q`m?64S$Ood2U@XUD|!xR?gr$|uCSC&l!Xn4T8XGh%vHOwWnwc`>~prWeKZl9*l= z(<@?nRZOpm>2)!^A*MIQ^p=?37SlUodRI*EiRpbYec;CVeP)pS4`uHsfU<)ifMc?O(3QT#Way~{x@pcM(wQjT92%!*URcH z^uhW@ zG0iNdS;RD}kov}%A*M6Mbe5RT{zdAzd(pdf6EE-hzdD@#EB)2s>|g1x4m$rze|6CL zS9(gm|L@1+|Ke&}HT8B$`>4m#v+LFL_UhjMwfZUjr4h+UZ^d^}oC3zlQuhsVT>` zS{ zFO=g&a=ciMm$-BOm&v^?m*W+39Hfh{lxwe&YEJLGt$9Pg6j-EzD~j`zy(kMn=I>-hhG+}lApJ|xFMy7*za z_7OQgD#yp<__!ROkmHkb47Q6;%a=YQ$7kjEoE)E*;|p?pQI0Rk@nt!_BF9(d_?jGF zm*X39d{d5Zx%2w}j@;W_Ild>yLAv;Tx%LA&ekjL}T+zzagZ)<%C&>Z zad0^fA;%%*IFuZRmg6vT99E9Q$#Hl&jv&VoF=206|s$C>0fvm9rUw_4svLvGtILxaj$4%w9nH)El;}&w4 z<+!~ZcaY8t9QTmpo^sqvj(f{-A35$T$Nl8EzZ?&cj@QcZIyqi1#~b8$qa1INRF03y@o_mmA;%}>_>>%eueo#nZ^*sfl;c}+9HfiimTTXUjUw{7jCY%kc|2eksSVO$5G@ssvJj?sR#eMk1rA(bO1ftS~N`raJpqb+fm*)I4V{GtW6L z=9kng>pEkW`d4+ao@aJNYRIIrA~pXaL9wP+({?`oUKz7_InI;h@8{Fj%UgZ+nrE%Q z%KnNBRiw5|7AjIlCc71>E0gPr)RW0)MZ823Kc*t}Ws+HuhB7Iyh__5yDAGtK0~PU+ z$y`Mm%VfJEO_G`A|9*nDcD_D7-c7xH{n~hY`E~MY=M(>eJFow<$lvX(a-2<$ zgLLuia_t;)oKuc-$#HHu&LhWp}EzI=-(KDf05Zs|0Tzo_6w5V!#ZZv227KHx@A6S?!I za@@Uad<+y_!ca-B!a@<*tyU1}@ zIqoLM-Q~E49QTytUUJ-9j{C@QUpek4$NlAafIH`Zklfo~IUXX%LAv-*x%MzQ9xlft zhE9H2V9Iuw+HFCUGj@QZY zdO6-8#~bB%lN@iB<1KQ$RgMGXc$*vtI_5u)Hbql!o3#ttdp(ApRj;CU|HtU7^%MGY zBZ86EC}XrRh8T;D1IBYRhMCuFWDYggm=_)IT2<}O3V;5G_pc5ucgXS1zsG<7_y26y z$G5uL|6Y2Ry!dW8-Xq6*<#?YQ@0a5Pa(qyZ56SUiIX)uCN2S=;Bbyv&m*X6AoD*z} zt9u2!{aYo>&9OX~IqqZd>jwRw)V#oZ)&=zUx?YQ<%_t1-|SN|EK?)kf6 zgf!9_RgG@OT=mKyFU?qHezUPT++1f~a=dG~!2JvAE6%l$lwuT0$gPzy8Mj(;j-}vO zN{*%CSZa=?;aFOZrQ=w7j%DCjMvi6TSZ0o8;aFCVW#d?Oj^)6Ur|#CAPN^Br`47;v z0PU6@N>8V*`@86~^nLmhBZ`s3sAu#umKZ0DcV;}ZklEB6@nimfd{nWIzre~jwtIHgWd%KnNcslHB8>NKU!Q0gqD&Qa<-r7lqFBBd@- z>N2ISQ0gkBu2JebrEXB_CZ%ps>b7J4V`>vL^=9P=z_A1HzkiZa_3l#Y9;JTgTKB1n z4=DAJQjaM0m{LzD^^{W2DD|9DFDUhrQm-iWno@5l^_EiaDD|FFA1L*aQlBXG*?IlH zOw*QWr?d~cr`rE(u8-0;>er0mMjE5C(Z!hk%YFacn!H<~%9DEnU#U*N{qEKNc+$e3 z_f`D!q2b?|&Jt2bJ_&VdEkpjIdZ|ZktJjlGn3rSuIF_Gd1vplaU}`HK?btg$Q^j)O z)f`*#CdYztEI7wPa4aOpLUAlK$HH(dtaJXCYT8mY{~z@PdU3tAK3)&dZyRBZj7ANk zr?J2|YP>Py{yEE>n6 zb1VkOVsb1N$6|9V4#(nhEFQ-^!0&bE^K8&@oKvCWIHy9#aZZJf(WO(Nqf4hkN0&~8jxL=F9bGyVI=XbK+th5_p%gmWb5=x0 zj!uP+_M8eG?Ku@X+H)#&wC7alXwRw8(VkPGqdlj3X7l``BSL3a=!np%&=H|i*{$DmGyjzOIY9fLX*ItFzrbPVcL=or+g&@re}eWvFB3#HJpq_d(rmK2ZvoC+QN z{ZI+e(VtVHqd%uIn7$IAd)l3A1*6sqZtwgj2uXDnic+B|Wq-vmR9|5!6^>HjDHVZI z5h)dkQjsYYg;G%|6^&BSDHVfKF)0;`Qn4u&hf;AV70>4R_oTXtPpJfyvcFL^q*N+OrKVIGN~NV#I!dLdR0c|Aq*NwKWwv?#vr=7U zqf~ZE*O68$cUP|SoRDMbopj1Ih6{1vON)@40QA!n~RB=j`pj1gp zm9lyM%TQgZdk*pOS%PwuvcF<^s;>%^sz|9yl&VarDwL{9scMv}PN^D{s!6F@l&Vds zI+UtQsd|+1qEvlKHL!X9y{WDmQObu>_E&67_0@z@O)1rkQq3vVf>JFh)rwNBDbPxA9l$)OsOH18cL~Qlp0Q{5tJH9sZoykkF6ch)Y~&Xnx0Fq zuMg0d>8JD$hNn@)Xl@KN<{3MUYsP2w4B)J0C9{n=%v@~lGjIR-_ie4X7SH^t+)w}c z$BA}-er%m{pJ@!G#!_k=d~9Hl)Fh5k##8-IpwvW4O`_CfN=>2ER7y>YXXgH&^Y-TO zYS!9y^5ulZq_DUYmXN}dQdmj~OG{xHDJ(06<)pB@6jqSJic(lf3M)I#{~b$PtUh`U zR)3w=zUs;Kih5UlzJ6SPVMI1EsmB2O8{>@)#(Cp|8QaWd);7DD)6GEhy7Qw}+;f1s zG?nP|t0>S} z0&NxOB7qSKbd`X5EU9NV38*U@&+Zbqt3VF{BvL=Lo;@WHUx8i{$fH1S3Di`ej|4g> z&{qOu73e2{RSNW%fa5IU10?WBfq?=@98!Tn5=i2>{*R}f(bU^ZJ%XNEFQNPBee{{? z5x^JqcScm>|A@N_@TRh_Yv5OKcc-OLDDLj=?p~l2mr{zmyK8|$Dems>?(RCcyYrp2 znRgfl_FDOW^oFN0%=-20O`DzMo}{^%jS9@Y0JY37{|Lq1YDi&CDXb-hwWZJ*HS0(X z)s@0}QdnOK8%SY8DfE=WMpD>V3Y$owmlQUYLT@Q-CWXzVu!R)1l)_e0*jftPNMTzk zY$t{7rO?Nj^Y1Hl)=>)mq_C3|I-_Q1sUh*^x~ue+;_bM28!p~{i?`k4?Y4BA?Izt` zyGggzZqn_vn{*rPCfz=}Nw>{z((SUFberrZ-5$G1x5aM5q#yQhDI6h%Bc*VZGv|Md z)Y(`m94Ce2rO+8QCrAxVl)_0;I9Up(Na0i|^q0bEQaD`-#pC|~=__YS;VdZ(l)~9k z7$k*rq;Rej&XdCVQn)}07fRtGDO~K#`Clq^woD3_OW_JBbVkjUQbVhxaJ3Y!k;1i7 zxK0Y!OW_77+$e>cq;RtoZjr*RQn*bDw@cv;DcmWAyQFZp6z-A2y;8VO3inIl0cXzt zA*r*&Qg}oPk4m94Y95msIxdALr0}E^o|3}TQg}uR&r0DrDLgNQ7o_l_6kd|T%Tjnn z3a?7xH7UF27gG3A3SUX#Ybksqg>R+sofN*8!VgmTQ3^jv;b$rQB86Y2@S7BV7sBM46zWc# z|Kz6BSr{n{D}~{t&>1zuOASSk!iZ8BNeUxNVH7EhDuvOcFuD}RkiwW!7)uIcOJN)- zj4Orlq%gh|CXm8}QkX~z6H8$dDNHJbF3z0)WKw5tQkYx{Q%IpRYPw4erIf-{Qs^Ot zsiiQD6sDEJbW)gJ3NuJyMk&lBg_)%=ixg&+!faBQT?%tZVNNN`C55@AFpm`GmBM_^ zoc{t+X9cCOkQ5e{LTA)0A~jT03X4f$aVabzg(ao1loXbh!ZK1=Rtn2WVR>?Ax|l6B!!Ko zu!$6UNnukd^p?VAQrKJyTS#F`DQqQ$t);My6tUQaD=*gQRed6wZ~xc~UrE3KvM>LMdD%g^Q(di4-oC!evspTnbk> zbN*LJovoI_HBz`%3Y}4Noz&2JDcm518>MiQ6mFKnEmF8u3b#q&b}8H;g*&BimlW=n z!aY*BR|@w@;eIJRAcY5|@Q@T9mck=a7<~ROC;k3U^5arxC#3MC6rPeoXVg3`HFQP_ z&r0DrDLgNQ7o_l_6kd|T%Tjnn3a?7xH7UFA^g;?>O5rOhd@Y4z zDf}#jU!?G>6n>M!??RYDlR{kz4JkCGFpLz2mBMgNoc|ONq|PErVI(PxEQQXf8AWO+ zsuV_(!st>MLkeR`VJs<(EroHUFs>BFlfw8?m_P~>N?{@?Oe}>-q%f%zx=5j`6eg2G zHz`amg(;jl|0$);Qc0nQ6sDF!XVgq1HI!Bg(@9}^Da;^+8Kp3j6lRvfEK-;YcYQC55A`TNZ~{& zoFs*lrErRE{*!7OH1+nsz5-zIs{#M=#sAd*l#2UH;WR0nE`_1A>YT80=pLSdOt|!s+=r#3@ z`dEFLeptV6gfZNVf<}F#yD?S02KZUyl^Mg#XqGoynM2L_=3eu5$VXKq-#yb!7@|F+?aQcstDANsfzmBM0DSX>HA{5Ndh$6PNTnBEZ6n__xPOmBvs*qNXAV6@9zDJwV#RU zb1{7(rlGg;OR?@NF?}tjZ^ZPin7$L!_hR}%Oh1b0Co%mjreDPLtC)Th)9+I1u8FBG zriPfBVj4zF!-{D*F%2)K5yUj2^XA_@ve;P^F^wvwp|^50v2JuRjUlEn#Wa?f#un2! zVj5RWMo`!#Wa-@=RdXB zSsF1-E2g2hayqeYdNIu)rWwUFlbB`}(=1||RZO#qX?8KqA*MOSG?$p>7SlXpnpaHo ziD`Z@Eg+@^#k7!^78cVYVp>#8i`mZql~7xwKDx|RpU!G;^>}(Ny|&(6pP_HpZ>l2z zccY}y!WeEWHI5rE%vff2v!>bAoMvt{uZMh8U%Mdq9B}GC#7A-(Dj+_Z(?bFA5uK?D zSW`uO>}b8}L45p3olwbTjP#vP@l=VilCYhc$z_}(;8x0Q%q}#X>BpBBc^r5w4RvO7t;n}+E7eA#k7$V=f8>AnU|P0 z71PjL*;}mJOiY`LX$vuJDWZ&8b`VovG3_X(eq!25OgoEd z7cuQBrrpG}yO{P6)1G45%Zc;fN9?SxnD!IX&|A5`Sa*P!4iwWtVmeq%hluG=F&!qR z!^L!jn2r?FQDQn;OvNKBcloGFKBAJ3rY4A8$;VmpF_wIMB_CVK$5rw%)ifv0zjz$x zE*^uqi^pH?p|`SlROc=p(YcF9bME4ioV$1w=RQ}wT+S2I`C__2Oc#pjA~9Vorc1rhCP7pP23!(*t69P)rYr>0vQFBBn>h^q80)7t<4BdQwbJiRo!E zJtL-PojCvJ#m+8>=|wROy_GMCbuWwQ6*0Xkrq{&ux|rS&)0<*?OH6Nz=^Zh>E2e*m z={+&MFQyN~^r4tO64S?G`b12his>^keJ-Xi#Pp>T=l`|X*&8u^E2g2h@;kBadoleW zrXR)hlbC)M(=THBRZPE$>31njsfnpBriPfBVj4zF!-{D*F%2)K5yUj2m_`!Q$YL5r zOrwfvH0RBK${1p2F~u~Nn17SlXpnpaHoiD`Z@Eg+@^#k7!^78cVYVp>#8i-~D*F)bmc zCB?Lqn3i_p{FfCwD<`Jq#WeI*t{~Q}D5jOfw6d615!0$-T1`x=i)jrpttqCp#I&}U z))CXXVp>m3>x*dvF>NTOo?_ZaOdE@76EXD?)23qT?Zo+SE_T*JOk0X+=&jsJtlL^l z+lXmfF>NQN?ZwnbOgo6Fub6feQ$I27B&MCkw2PQ_71M5F+FeY0h-ptT?IotY#k7x@ z_7&59V%pz{^FL7RY>=1^7SqsMd5BndsF)5D)8S$|LQF@B=_oNBEv93{bgY<;6Vvfx zIzdb)is>XVoh+tP#B{2d`ito_F`X`^GsHANOlOMeEGN$YY_YQ-F`Xl(p||o}vFw3>BVu|~ zOpl4_aWOq1rYFVpl$f3t(=%dvR!q-{>3K1|Af^|^^pX?j|BBezRWZFLrlGg;b+PUZ zF}*3Kx5V_enBEc7yJGs6nBEi9`(pY)OdpErBQbp}rccE5shBG_070 z6Vvcw8bM4WifJS@1#`#uwAjTRDMP zH=&p&64S(DnnX;Kim8j3x{7HsF?AEu&FsYa&nkA7O-!?kY3Qw-L#&%qOmm58ZZXXxrg_CQpP1$s(*j~zP)rMn zX<;!fBBn*fw3wI{7t<1AT2f3)iD_vuEhDC7#k8E5mKW0sPMrTrVrP}bw2GL9-pWM5p;#I&)PHW5=VF>NZQ-eTHJ zOq+{o3o&germbxApFrEGskiIe7d?@lTfO?fpFUn+sUO#$7_p4pMnhwuvDi3iyfc%S zMa>rGXmhQ3Ipm{OTYdQtN1tM?He%XVOxyh~{oVh!y#jrzP^lQaa(l6^kC=84QlAu; z#q^4pUKP`8!LQNi<=M8SmuHKP-hQ6BJv;h%dwaF;^zm))<>}ki)61`|#|=u|gsQ2p zm&a~O?V;3OO6{Z6eo7sn)ImxeqSRqZ9ih}wN*%M!e|&A0rr!2xkM)@9wLcr^1N24u z3H_~+*eGH&H%1w2jElxsGr3vHY-5fy*PB;t@3zVR#UFRGoI#a7!6?RfP%C+yq}Dn` zsne7?L#eZrI!CGVl)6Bvi6^pFs^6)Q~}*3~I!n z#-Ts|UQ8cN8RX3%i_0}*dTP#~77S|1pjHfO&7d|6YRjN@3~J9H9|m<`kS~KeGRTiX zofy=aL0uTsl|kJ?j{k>h+E54Y0R$fbFeQ30s3(K|+)BNea=jVUhe3TA)Q>^^88m=F z0~s`kL4z4Igh4|YG>k#R88m`HBN;S`L8BQohCyQ)G>$>zLvH^UY1$&~xb|94pcl}a z=tK0S`YHXLI{q(gc&jsitWf9u{AjwE#r|*iPwfC|`K7}(RovZVI+)0yNq=@NeEc|> z>1qmtrZUK%LDLvCok24g6u_XF44TEDKnBfbP!NOWFla7=<}ql#G%H@7eroTvU2~6H zl)6o+JCwR>JO58SZKC? z+cm)d{c%wz5O$d->^^&?s;I<#QM6Vf_&h>?axHPA$hJp)Tvc1h{0Pe`xQKyG6kN=} z?g}np-~#>co4RSVU((b=Dveuv`+8={>DjWK{Zz=>baeykvI(j^ zN^OSfno?V!vYq>9D^fFJ+U7s57N9=5ep8I~p@^`3f=en|gdBsGc|9gG=j z{$HD^%*tkWbDnv@+-6=^UjqKP#7k{f`TP6Q!n<+PUq0y6(OcV^OEvqSr!i&8ss8W( z?-Kv~5E55Y%aw953;k>JSpAs(Ic2p=VnrJNJU)v2_&8bcRJcA@vg?1($Nhgl@)SiB zm>^!?Wl>@o{0XH~YJYOG#NXe?A1+`2G_K9GT}9kTYu5M$`?2|u2l=$1e2TwKW)}IG z=leTZ z_pH2+l0V+o|5jF1w|1^ufBUcd@mpM3O^5553}%C0cl_^1af2_NRdTDZcwoQw^7HHF zX?y?G#W;0L+x`D|+Ez`y-PR-M8PzR+cRf&@`x`&@|I_sU@csG4qsz8?IO@@5@EEjR zU59JgZoxv%Ir!TLf}B#(*4IL+`$d#mOsOT5!uKF--7lloT23kMp2$jStyPp-O{q1M zT1%;Qlv+=z4V2nQsZEsH9CG}>K+_gz$JFtELcNggO+5Z*dk(-AcT@u9p0*3zRz@*~ zTghV^wbph@?V!|7O6?-&_ssEgMn}Z19F4uq_*cz_x4% z0^7172yDxSAh0bPg21+H2m;%(AqZ^Ch9Iyl8-l>LYzP_>GXJ6T_Rdt=SM1{Q5uf)kA*{KKe&J|0kpb z*s~2mV9z!LfjwKNlmlDDAw7XD;t({Sx$rMw5ZKNPDF?PPLlD@;3_)NEGXyPV8ehhs zP*FKbEXPD|5xbF|0d=~v6(?z7-Vs|txQkb7_^;1 zI~cT+LDb>KZf2!D4BE?}eGJ;qpaTp#$e=?EI?SLW3_8l7V+=aZpcA2g|Nj)z$7u$g zVUWe;&N4lnW6*g9U0~2f23=y%Wd>bg&{YOqW6*U5-C)p72Hj%NZ3f+8&|L=o#h`l( zx*z)U|B&h95rZBx$l`KOn4X?8=oy2aGw20_UNYzvgI+V}4TIh?=pBRJGw1_@J~HSN zgFZ9p3xmEg=o^E+hx+_`=tLhL27^onSzIm*(^FUmg=0{721Q^{L^tFvy)jDH)WCK^_cB&7d?4O3R>h3`)`D>}E}~t2xcwYF@X0RL=oaPY?TTo!y^R=*DZ|6k?rm9jDAvNI?LgK{z`7lU#$C=Y}3GAJK|@-wIag9P zTBzRuT523u&;S3$b->?G0)&+oL$L&krBGN?1wLzc`f}Lm3Mf`Wu?mXSP^^JsEfnjZ zSP#VpDDboF@iXl4v+MCQ>*2HNr*DJ*mhDjNfMO>UyP()@+5GQ?z3hWxKNQwfIRN`O z2*n{N4nuJSila~*gW@<8C!jb9#VIIGLvaR*vrwFa;ye@=ptuOdB`7XKaRrL2md*cl z*vkzlZbD&Am0Pfn+fdwr;w}__L2(a?`%pZ9;vp1|pm+?$6DXcS@eGRRP`rTRB^0lq zcn!rHDBeO5eEtth?*D&)y?lh?6BO1|`3(E`0>xJ-zCrOFi5VIcIur&JCKO?y2n$6x zD8fS#0g8xFM1ta1zcl%;J%kxi;2Ke(hz3P;C}LQ3`#&QV>?Jl7aiFlKN?h1SJSgHr zkpPN>P$YsPF%(IlND74u6s}MtgTf7pW%HjN_L2dL zj8IrpB@^r;GZa~%$O=U^D6&J51B#qbhCVK1eiC=G=*Rm#9V%0f{NitQK~xq9zoz zpr{Q+9VqHTQ4fmxP&9y|p=I;m2=>w#iY8E4Q^gDR(G&`AD4Idh9EuiDw1lD+6s@6X z14UaX+CkAC3LhvsK;a8TM=1QD=mbS)D7rw=)w22T4twbVMNcTKsnQGf(Hn|BQ1peO z9~Awe7y!jUC7>XfK425DC6vLqy0mVotMnN$eiZM`(g<>2O!LR>o#s2?{iLjSR zP)vrxnkrLZA5)?5hhiEO)1jCFMF12tp_m0lAQZEq2!dh`6my}N2gQ6S7C^BOibYT? zhGGd6OD((oUk-a&0mVuvtf{gJ_OTj@HBhXDVjUFgq1XV$MkqExu^EajP;7-_8x-52 z*a5{(D0V@y8;U(p?1f?<6#Ffk|AVlXLr@%s!kQ{aU>`@JI0nUWC{93e5{gq$oQC2I z6lbA02gP|PE zb2+a*ZPIS&Vb%FRs_0$x0DX`CQ2iEQ4x^sY&sbm_Q)d83XcjWP%@O8m^OEh|_S-)$ z!5{D)s}hRhJ6E26dNr4w@SD(0b%yV<*a zqdo#OD0C5AKoJ&-a8QJYA_5cXiL6osM~6vd$^0YynDNb)l#SMSUn5K+zBiPbeBe(HM#*md$@t*o!w5&7iQRN^{sp z3n*Gb(F%&zP_%)fEfnpbXb*)C6dj=Og`y)Aeo%CRqB9g-py&!kHz>M8(F2N}md$@} z*h?QM`a)q%m42{~{!k2nVjvWQpco9r5GaO1F${{~P>g_LBow2d7!Ac3D8@oD4vO(m zOn_n{6qBHsY}x!zg}wMgF%1f9s!WG{%zz>QikVQ%f+7%#*-!*QF$apdP|Sm3J`@X} zSO~=;C>BGp1d63lEQ4Y>6f2-uY1#a*hP|wTVl5QbR9Of6SP#VpC^kZ|35v~7Y=L4c z6x*QK4#f^Ac0#cWirrA`fnqNd`=Hnl#Q`V|LU9O+!#W^U>LvaC$i%?vG;xZIhptuUfH7Kq_aRZ8*P~3vzHWYWDxNF(`--Er} zhvESg)>L^2`*;M!V64DBeKv7K(RJyocfg6d$4Z1jT14 zzCiI6if>lU|4a?_GE;}bfWn$8ChQ{&6k(wV2Ss=&B0v!libzmIh9U|SQK5(iMRX`) zKoJv)SWv`flFzJLzXH2?a z(iM|#md}3=+*D6YdSPN&q29QcKA7~yq#q{zF&Ti#KuiWR^nb(VX_*NHJGf$ zWF02!G1-90MoczgvKf;tm~6#l8z$Q^*@4MUOm<%L*OB zy&T5m2qs4{Iflt`Oio~O5|dMy5DzpEFNt*)7dnT@c}y-~auJhDm|Vu>3MN-Exn}wN z-@r}X#N-wxmKC~#Q80;$NiR?jW zcK(le+I;oV<(c|)Onajz){E*b^|AT}{kjp>NN-d#x*M~NgT`|+o>{}^(2#jaykPcgiiI?GQnyrDX4lwx?VbC$X+x!l3M?NAKwdCt11 z7~c1s^-?js_Zg^e?OgEwXJ87&@E&Mje#P)UXkZP+9>H%&U^~U|erVtj#qgeJV4z}n zUo>!&<+uO!;df$I156rXVp$0`TTdnO?Aek3nrEo>WX{mhDmo!dSKEMlU|tg#-tA>eKF~W zNqSD$!tu5FqwnNTukO!KK~1FQwuR!go$N^7UN!) zV6qgGWtc3-WCbQGF>Im^{Sf5hjl@!Mpdf@Xr0LXSmRFOkP+%|F3XUuQ7RpiDiY};$Gfi@*a~9n0&8MF-eC>dQ384k`a?km}JHz3np1H$%aXGOmbk76O&w+S6)KE-DS}B+Op0Mr9Fr25l*FVICZ#bcgGpIT%3)F-lM0wr z#H11?l`*M;NmWd$VN%`l`LBtas)b2yOe`x@2lrAJlX{rc$D{!!4KeY=q!A{KF=>K{ z7bZ41r4g?w=@9Wn94q!T8cG3kOy zS4_HL(jAi?nDoS?7bd+i>4QmMO!{HcACm!?48&v*CW9@X|Dm|4VVDfZ#Iiyoa4#b< z8HLGcOvYd`7L#$9jK^dGCKEB4gvn$~reHD^6MsymVKN<)8JGlMG822&|KWhJWS?evH+8Xm@L9%F(ykeS&GRrOqOG^0+W@Ptioh9CTlQRi^)1n)?=~( zla2rL{4X}oX_bEb4dCAu``!Qlzu&YC+>FVVpUKaE4>_mT55K?rKdt)TRkq?n+c4RV z$qr0*VzLX9-I(mbWG^QBFxijE0Za~JatM>dm>j|6C?>}M@zG}H#3UCc=ure!D35La z<7jg=^>#x0q^Hy?>pk@O`YHX3;bBxYdKn9iGsZVFjal97W2%|Ay=(b`=RU1j+FXhR&+N4Y*Pb1k+?Zb>nGr zo~GcbJ5N*cG!;)hc$%80X?U8Jr|Ec_o~IdjnvtiOc$zt6{#R+*D($KsUeBsG(1+@4 z)GL2PFtVyMe-1WQ8kfy5>b#$|&Hm<6^L+68dGdSA_mP#RGz{X`49do@nw_UPc$$-^ zxptGLV+DX&FSzIkcQh%Xze%Ps;_gTu94Bw)u~% zjn>rLM(ws9MbD`>Qs@6%D_;ZHZvW{TOK7>2mZ7ocGP?S5TCSkwN?NX>>^THd7PEn42D`Hq(FY59ScA8GlCmY-?)g_d7w`Hhy} zSs6qhn+NH(*Z+;94Obss!>CW2wEKEoy_nuXpQRsHj{&4LYO6iKwZ?5ThFQ>TV~#V| zn^$b_wjF?wKQ7Pt4XG^ZRY`w0JSzG_EB*W72HW=5VzoFwiaV9&$ML+<{761gnjXs_ z_0w^AhrhjkT|I*zeXzaAFfnzCt8Yr+Wu=M9v+Ea16Vn%>XNOaom_WNuqBJpucAZse zViN7Tw9>>h+I2&viHWpp+Y2WXQ)$;~$XvB#W|5zFWOIAAZ1?x8PEXPm(h*YMFINMh zTnd>8RkhvzJN)>cee(bNiMptIwQH^g72s(>o`%kg~L)>*@7cdVhVHe$gj*N$jiHC9$t&m&CrBT@w3hc1i53*(I^BW|zdinq3n6YIaHNtJx*7 zuV$CTzM5SU`)YRin4anp zE%VYcA1(9KvH&d$(y|aO3)8X)EsN5!7%hv_vIH$l(z28V^IwMUrYtQ(W6g4O_42f= zK+B4>tVGMow5&qQsE&J1Q04)d7au6*C({czc zhthIb$nF0kO)dKLBhAM^AR`bQ&$QNie9%r=e~Z%tRTjM>o)Ft?jG>>qE0 z)ChTkAzg0-El2(&fBI|dkeBND@ufxV+d2PxiQlg|impDImSbo+mX_maIi8jiXgQIV zlV~}amQ!dsm6raroJPy(w44E+y*u$60^b3cq}k>_kv3mbZwIsodPF^~UQTbLkJ6W` z>wp(VO!X=t)eJvllCj>nV0O{}h4TC- zMNPOM;EI3+C6b{Y+z?2PKneuh5lD$ZDg-|DxBt0O6L}EGi+}|s@}VB`BTxW=f(R5spfCbO5Gaa3F$9VuPy&IH z2$VvgGy-K1D2qTj1j-{&0fCALR6?LK0#z)S|7xg->Il?8z=9GrQ4h5csEt4!1nMGC z4}tm!G(eys0-gvoLZC4MO%U)xpeX|02sA^WIRY&ZXo)~81X?4|#)A28hni@QfDZx| zl<0tZ@I{~_0)7Z|LZCAOT@dJsKsN-sBhUkZo(S|ppf>`25a^3QKLq+CFaUvp2n<4C zFakp?nEzp@iQx#0K)`|$BT)~d5EzZX7zD;5Fb;w72uwg=A_9{Tn2f*_1g0Y3kH9np zrXzqh=O+cA6=otZ3xPlcW+M<}!TirfP0T}JJ^~h$Sb%z1h`=HQ79+3(fu#s6Ltr@q zD-c+Tz$ye*Bd`X6wFs<3U_AmG5ZH*oCImJkumypw2yC-p{&%1zb|SC~0Sij(Mm_97 zU@rpu5ZI5v0R#>ra0r3J2pmD+C<4b2IF7&x1WqDw3W3uIoI&6$0_PAokH7^4E?O}E zmr)Z}5V(qf1tqSb9p9RULY z6M--Yghe160^t#efIvh9A|VhNfhY(>MIf5(^?&1Qi`7Thr0UZN?TwyLFQ|K|vw$tr zPwVfEBt{XVnK4402ke~jNj(p^xY^PiZLT#h+uqfefj_S3M=@!rDvf>|ljhjU{JFJU z(T{i1c2y4jh$mfA2>qBRy-^7MsG} z>E&EwA#_xs*a+QMC=NhV)MeT=E<#Baiic2ch2kSrO`!w`wNoe|Lcnf%XXaAkYB;Uj#ZL;Dcm(j=%^6Mj|i@fzb$zL0~Kb;}95+zyt&)A~4B<`JaNC zn2LZu0v42*hI*KezzhTe5SWR;ECd1(n2kUX0&@_Ui@-bt<|D8GfrSVxLSQihOAuI! zz%m4uBd`L2l@`qZYShFU1lA&8L5X#!hxG_-Kwu*Rn-JKHz!n6yBCrjC?Fj5ZU?&2* z5ZH~t9t8Fxun&R#2pmA*AOeRFIE=s%3+DeAYT`HoClIip#7We{DFjXCzi7*I+MZkg*;ZP6Z5r}|5L3P!o9($cKOhCGw*l3LsDr zfkFrrMxY1+MG+{5Kyd_0AW#y4QV5hrpbP?K5h#a1c?2pTP!WMj2vkO(3IbIvnE&di zi5dvhM8JX)wNMYW5vYSeT?FbOP#=K?2sA{%6M;quG)ABa0$vC-MZg<@W(YJ#palXg z5om=#YXsUL(AI+aZ;zVrL7)Qy7L@QsJ#<9C4}neybVi^H0$ma4hCp`&dLYmffnEso zMxYM@eG%w~Kz{@VATSVtK?n>+U*^+Ec4{eb?!h-joW z${B5pQO0uPgz>_RWo9>PnqAFl=2r81$Vc1n<^J?X{nDW-iz*LCU<3jqEvxe1-^Xm( z&ePA=yMw2fHf0p*b2I{D5EzTVI1%`06F(vF83B1aTb20rcDC&oSH0RbSKp{4{3KUbJ@P}d=6w{%Y0YyN_{4dwE<=RQ@l^#dW zsn^!K>ofH2`c1Me(3uCyk)Hp8BKddwhia;o4Lt#yoAlSzoDCR;j4~qFvEP!Gm z6pNr(48;;CmO`-%isewOfMO*StDsm7#TqEqLa`2t^-yfEZ2mXFUN%Fq1qy4bY=wPn zgJL@rJD}JJ#V#mzL$L>ny-@6fVm}lIpg0J{At(+*aRiE^P#lBeI20$KI0?lm%jW+K z?By&J=b*5r%6Ztw1t=~;aS4jcP+WoHDiqhCxDLe)C~iV=3yRxN+=1dQ6n{Z+4~qLx zJb>aM6px^IY}x!jg}pq3;yD!7RCxjWcnQTTC|*PH28y>(yo2IB6d$1Y2*oETK11;Z zimy<7gW@|9Q#B}bC=4h}D8fJy)~flR8Xoo%0g8xFSW_hu>?1N1QJ{zlMKma)LlFat zm{7!mA~qCppoj}aJSgHrkpPN>P$YsPF%(IlND74u6t0%dzZ>i&ITR_Nu%?PT>?0)< zsi5$HA~h6gphycvIw;aZkpYT~P-KE4GZa~%$O=U^D6&J51B#qb0bD6FYc8}?BLin>tLgQ7kZ4WMWUg(nn^plA$56DYi(XbOcl z6wRP$4n+$nT0+qZiq=rHfgVgM8ap%?_kU?_sm|7*$o4}-l7hhhX2 z)>Ih@`xphqXeh=&F&2t(P>hFS0u&RWm;}XSD5gL$6$*bSra>_siWyJ@Krs`FSx^K* zG23?jpLp6<_0ctl`gB{5pl8&pt7iZP>ihL4Ml2(@(a;!ZEH+LW@604-QL}~p>_79& zGe11<*EMfyvx@y`vTCVh{}fh#bNT0Qo*jL>8@KlM^~~*Qdse3XIkZ#5Ddh@PvVX7a z8H!8)y3M?*BHm%Ft`y$Ow4D$J?`PUhj)Zp`gOtMiiRy>!iuV-HD~0zJUnrFZ{lNUy z!KEwQU-WlZ3hpub7gP%FGy2z73hp)f`zi(Z8~sNrl?nbE=PL#G9sPGI1@|8P)%mns z;r^q)?SxWr4{};GrQkl~wA7Xz|Ib0+$*FUpm z#d0WCK(P{vRZy&kVht2)p;!mSdMGwPu@Q<*P;7=`i)Hh_4fe7fiXBi`Q)MUYV;2;= zq1Xe(UMTiKu^);9P#lEf5EO@@I0D5{D2_pK9EuZAoP^>O6sMs$1I1Y=&RI797ho?J zp|}KvHB~OdKCVD<6^d(6T!-QY6gQ!`1;uSB?m%%Dioc+^2gQ9T9zgLBibqg9hT;hn zPoa1Q#dFK%|0V3@6%?#9 z3IhrgiZD=wg(4gj;h~5CMMSIS-#;?!B?=T#p|GY(G}uRUC}Kbn6N*?+#D*dc6mg-5 z2St1+5XiMWC>zN>SKHF(`^dQ38sRP?UnAG!$i^C<{e7D9S@o0g8%HRDz;16jh+8 z3Pm+2szXr&ikeW=vTXkAz+UP?Q4b1hs?>*lG=QQZ6rNBtf}$}LO`!0CqA3*KP&9+0 zITS6RXbD9tC|X0&28y;&w1c8O6h2UNux$Q2!e0EK=mdo|RXW2yxVgM8ap%?_kU?_$_F%*hnPz;A+gk|$T3idJ@iZM`FQ)Mjd zV;mIYp_l;0L?|XfF&T;}P)vowABt&EOow6y6ai4ogklyHfl$nbA_$5(P|Ss5o@MjD z0QRyFibYUZQ)MyiV+j;Xp;!jRawt|nu@Z_^P^^Yx4HRpkSO>*=C^kT`5sFPvY=&YB z6kDO#2E}$Lc33w5yI?Q7q1Xe3HC6V)KK4PeABqD|9E9Q!6o;WW0>x1%jzMu8iW5+r zgyIwwr=d6l#aSrML2(|63s78y;*w?ae+Bk(6^d(6SX1RX?BfO$H=(!%#ce3=Kyep} zzo57W#eFCqK=BZYM^HS5;t3Q_p?C(xb0}Uw@e+zxP`tKm{@=o0-a+vm3Tvu-fPH*~ z;u92~q4)yDS17(g@g0e28WcJd1{5X~VW0>LMK~zJLlFUrh)_g=A~FGi`48mQL{ z@b+rq>Eqkp%hR{3r~vqUB&(4xwf6`Tyc-Q#JLrTYI9%(+lgZ^oi>1Uk}u4f8;ls8Dor%#w|0Fna!+k z4lo7Z!eH;Wrk3C*kzqS?lcO*;cyUQQybuI=iA_yZw)=&C%4` zQSGhnqLY!=30VO$o*V_|$2CUDyPCt_Pn%)&pvViLA=QWm+g@ssHn1w}HSd@juSXlfI&wpx@ ztz43YrC9jqS1iqzF2lmIEG);u@+_>t!ip@c#KOuftir;oEUd=D>MX3m!kR3s#lqSw zti!^(A@e^@)5d9=wL5wgJ*Q6W{@afE)%_s0N_`eK2%RY(&e(v}{64FIqOGr8g~`(Xu%$ zThOv)$ox;#w29hw?SURk&#yPr$LgE)yGAti+TTr#k;Z!C=5O}@gU6b#)tZ&8n@+Dd zy$!u)TUxfGWqVrs(6R$9eQDW|mVUJCM9a>!>_W?~wCo0NqtrE^?JEX2p7_7(9F zt{vjzQ9H!Pqjs3x_WJ*^wUz3lYgzT_njT5dr8m{b={wY`|0gs`8Xb*5FX!o}H9KA~_47XPJi$zRWeZ)49aIXzppv!D2)L}f*PGd@4lW{Q^PR_&>1 z8IF$s!^i)`?_jO5%l!~ zeceD`FVNQs^z{LKT|i$C;Qc83HyrP9*&*JKvO~NdWrt;*Hvf3v%HAU0x3a@OzariV zvzNv@VRndj!t4<5gxMk93A01I6K02aC(I7DFfrY*-?8rht7ItD`XQ$17SGGlZW9HAV*q!aM2Mc?$uonw^v#<{f z`?9bf3;VNh01F4Qa1aXzvv3Fthq7=O3x~6C1PezxZT?5IEskN~pI>n-TY4M|$Fpz( z3n#L05(_7@a0&~jve2J}(^xp2g)>+fz`~g{SFvz43)ir4EeqGNa6Jn*uyCW(=6^HW;uaSE z`4zXarMIzgI}3NPa3>3Qv2ZsF_pop;3-_^bKMN1A@E{8hvG6bpkFfA43y-nzxYOqU zB-`RC7XJAaPqU@Zu<$Gk&#~}43oo$nA`36E@G=Xpu<$Aiud(nt3vaOSCJS$|@HPwY zu<&lk{4db71=>mNqn=zZr~Byv`hNYnk-#Wov@#|bTaCZWXl5?6kvYs>c#Rn{W$ihb~e9XcpEPTqsXDocq!WS%j$--AGe9gi) zEPTttcPxC*!VlaNdn$6QQpo%t)3jsS8$GdJRBx%C{kuWE_D@(Ny;05RZp=0g8qdvm zW&yLQIU;!WgFpWL?7v@qww30}SK(Myj#cBBQ;JsSdaJ>)njEXevDzG~!?C&?tH-hW z9BaU_h8*+cSR;-#=2#Psd2y^M$Gk&h{%zL@T>0i4Yr(OW9CJ$1R$OnbIo5__Z8_GC zW9>QS!?6w=^W|7aj`?w{6URDptP97wa;zK2x^t|DbLYPo*JW>x_2HOPiuUDt>&LPF z92>x~fgBsevB4Z0!m*(o8^*EW92>#0ksKSvvC$kG!?Cd(8|U2lpTKoFkzXSSV*wnS$+1}+3*^{rjs^R3xaO@<qvA;NW zk7M^a_JCs#ojd=Jxh|h@>?y~bQuGj(y?SSB`z-*mtMSe@UI{vZTQ=lVeUP8iwmFEXTreEIh{|a4aInB5^D-$D(j7 zD#xO6EIP+xa4aUrVsR`s$Kr4-u5;%U8jhvqSUTsdRV#1}JW>r* zq-aU?9dWJ1(Rhkh=4g6Ft8lcaqSZKBThZzqZKr4rjt*3`CP$|!T8pFV1!`Sub9BF= zbvSxe(YhRcrD#2hmWrTgeU7>)+JK|k6>Z4TvWj|g)c*QkfA;zRwyOoIe92-QE6%YJ z9CJ$1l3Z`4I98ftWjI!rW88IcN$y&`BzN6glDys}uXD-kTk^WLD))UOua3#9V)AO3 zyb7-6-24CJ^)z`M&0Rm2bV^a~2B9Q(V^EU2At=e+2$XEZU5*=btO>`wIM$S7-W+Sj zvF03W!LgPcYsInF9Bad|w$7dZ_FR`f9P7X_rxf+&dh5tBKaO?cSZ9uP;aFFWb>mof zj`iSJPmcBCSZ|K?;aFde_2XE7jty|`{14)~9L%vH9CJ$1pGnPXEpHkD)k&Yl11T$eLA7Qiv56rIWSHj86{9GlIt zAdb!9*j$dye&M6w>fr)V|O|B7su{#>^{dHaO@$+9&zk3$DVNPDaW31>^a9?aO|aX z=l?a=Iv2PsvPO(xN$8?Sv95Xoi46vDh4o!?Cy=i^s9}9818l zgd9u6vBVrp!m*^zoqt!Z%VZpL%un%dvbM%g?a_94pANLL4j1 zu_7ER%CTY`E6%YJ94pDOQXDJIu`#_;Qyg25RqD{HpygAm4W6e3% zf@3W?){0}TIo5__Z8_GCW9>QS!?6w=^W|7aj`?w{lXK_43)f{=j&&LPF92>x~fgBsevB4Z0!m*(o8^*EW92?=>`5(n~Ihtc*IOde1 zW4YeOacn%tCU9&b$0l)XGRLNHY%0h6IW~=B(>XSSV*wnS$+1}+3*^{r+x*AV=4M^Oj;-U^dX8=2*hc5h|7NbsEgbu^t8L|qZsXW?j_u&sPLA#3*lv#P;n-e| z?c>;fjve6GL5>~b*kO(x;n-1*9pl(>j-3dd`A=nX$Pl*ar(e|DEJiXdA z_w*{;J!JkTXxapAvvy05pl8-=>wWcw`bqtRk<2J<_!v`-oyG$*hMC)JWDYe~nip;F zf8Y1_kVpNWO5&E)KTK^|ah>z)RWdqzdA4oo<=N54yK!r8Ur+C@e!h)8v*h&rr)+Nz zvx><4e7!q(dX>6Iy8EPiK)Q#ddqld&qOLAsZudquj}qxzN%w_x&Z_&B?C%@tzH_d$Mmn8z2I)-F zg&|#7(uE^kc+y26T}0AFB3)$CMIl{O(nSk-{ohGyoLxI>leC@MV?CZ;L~o-{)%WTz zj3nwFfS(a)95p_e?q+4Pr@7EPYkRlPzbpA*`bf1t`6zynZRyZi*VRk9Z_%=yr~Oub zlWKr`!2YD7;)C}8+{fslXfy8TQtG3!%{f~-y0R@vn^M_Uq|K*nYtmLxwhd{UE8CW| zy_9W7T6HJZwLNJUDeFVp9m;kf?Kx$AN&8sYj+`x{E9*zv_{w%7Z3b&@|4YZ<`Y9cg zbg@Y1th%wu{^F1>F6rWtE5`BxDd}8D=SsR{q;n%(a?+(Box4Tz zpNj0qgLJ7$=d8ME$o|rjE*2i}U z59#t+H2?X@ehQGTAnBY{w-DK1VbT>LT~X2%BVBRQl^|V7(v>1zY0{M;U0KqVBVBpY zRUlnO(p4f|WsBy&D%npp(p4v&v+C9$`>RR1TBNH@x;mt*OS*cbt53QHq-#hzPtr9a zU1QQUA)OcLnv%|&bj>W9{}yCF>^>H|hvlrg?7kVhXU6WAv3q6gJ{h}5#_o^#l9vN= zU#v8_Csvx=4=df7?5_*yx{|IN>AI7y2kClRH2=NHe)^EEFX^0Bw;$PGf6@&g-9XX} zBHdup4I$l7(hVcsaMFz+-AK}nBHd`xjUnAw(v2hCc#GzLBH7O*(oH6vv+7PE`kbNn{+{>n?t&}q?<>&`J`Jwx`h_a|6;PAC8S$QI%m~g zM)tRybSp@=l60#`x0-ZoNVk@B>qxhrbQ?&wk#w6#x0!TXNVk=A+eo+FqWRxR_Opw0 zyGiG)x_ij}_L6QN>GqTE0O<~r?hxq?lkN!Vj*{*e>5h}`1nEwa?iA@xlkN=Z&RR78 z=gEF9knSSsoK^P{+23W-T_N37(p@9nb<*7+-A&TnBHeA$-67pw()~rcd!)Nhx(B3t zNV-QB&Hod!pQogIMmlHJeNOiGf^;uQ_lk6{N%w|yZ%Ox#bni*`fpi~9_lb0$N%w_x zUrG0kbl*8wMzd!A%NS%oCh5YE&RKQClKq7vU3k((AYDY#MIv2f(nTR%RMJHwU3AjL zAYDw-#Ufp7(#0WNT++p}X#NwB{Ujt^BGNglZep^(B&179Iv3Kpk}etP+(?(4bSX&Z zPP&w&OGP>l(xoO{8q%dDT{_aGw`l$|lKo^NU1ribt8NyuzpSLoM!M{z%R#!Fq{~IR z+@#Axy1b;zN4or^D?qw}q$@4@=S8}vr1K_SGtxCDT?^8+BwZ`gwI*E~(zPXBJB#MuhwP^V>3m7&thyb^ z{`^SSiFBPw*M)RlN!N{Z-AUJjbUjJei*&t7*N1d{N!O2b{Yf`~bOSA#|G{KGLr6E2 zbk3?fjO=eX=|+%lBqWPae z_7gz5nWS@8-C1ORfux&Fx**ccA>CZk%_H4>(k&p}LeecF-D1)$A>C5aEhF7>(ybuf zN{i-yHQCP^(yb+(v+AxR`&&=C4W!#hx=p0pOu8+k+e*4^q}xuq9i-byx?QB(O}ag# z+e^BAq}y-N{2wIyIYhd{q;po?BV>O^Nq3BN$4PgBbSFu7igc$*cZPIlNq3HP=Sg>g zbQei?iFB7qcZGCUZLj|uTbpWo$=wm^(_Za`oslT!tPIZ*EZ94rAUqZZof0_0_b@t0s0))H@ zaG62MvinujmHpx0|Lao?*wYB3bzSL`F$-Swv5tSwPr^>o2OYTvX z&7my0PgS;@vIDuxblJwr4kB$=Wd~<68~^sQqb?xcUM)O*eA|0@`gZkf>g!eRy!x6U z8BI_2YdU(DtDwGQsAFH!NPWpL$G)Va`jX*}eaT>pZvU@yKaVmuNOzNT&Z>Kh?C&<| z?vU;->HZ?!J<{DL-2>7+B;6y@Jto}~(mf^JGtxaL-3!vaB;6~E=Kl@Z&s);HBb~GA zz9;+pK)R2l`$W3Wr29g;ucZ4%y6>DTtC3D8ok2R2bYVyrmUQ7r7oKzxteO9^k;r}` zlP(JBoK-g}*1vX$7U^n}t`6zy zlCB=<>XWVk=^B#GlXQ)2^B+$etEo5s48ZFA-+w=5Le^GhhDb-hW~jC9RO z*Mf8{N!N;Wtx4C0bZtr3j&$uw=R>*8-?VsJxfA{wF^zQ2C z+t@QpPEXq@bweIYFZ(~Q|I77!O5LIA`jom$y1)Luo^0v$-{%DU^w_eOU)yr`9rOFXtF9 zA2R=|HEp$aOWpbx(%b0)>Y0C^jkHD`W2mvgxM#+d=l{p+f{_1qtc8k>@k);I&|ST< zW6e}?j8}DxS96S4cZ}C?jMsFG*K&;4c8u3?jMsIH*K>^5cZ@f1j5l@fMEpmX7gOj`7xx@iva}wvO?3j`8-6aUaKc2gkUt z^XK2sv5q@A#zS}Y&W<(H#WCL1G2YEF-rX_Y!!h2|G2Y8D-rF(W$1&d5G2YKH-rq4k zz%f41F+Rxo^Y7rVQaJc)6rsDigTJ8R;4f#4aO`I}(lI{DF+SQcKE^RV)-gWLF+Scg zKEW|Q(J?;BF+SNbKE*LU^^ebgMl+*hElhKaPj`%m?&>ofYbL-kKGQKi%P}747@zGJ z4|0spag5J(jL&n7&v%S3aEvc>j4yJGFLsPC37P*OO$*Xa>6)IId-U(0J-Sjq|q z{YnS@DhK^)2mKlc{aOe8ItTrF2mOYS`Jb(6v(^0TdKSI0{{NV}3xKGW#_!`N?Cw^u zMKMqmyBiVg78S7-1nlna?(XjH?(XjH?st~s^(q&B=Qqz^_PqB&ef0a`%owxF49o5) zb(i`|ORZJXdTFb)TY6l*nBG>O75eA@#CVcJZj$qI+FkPM?wcjAzeUn-mGs*r{dP&e zL(=b*^t&YeZb`pK((je@`y~B-Nq<1nAC&Zm*!x#;gB|EwzQa-KYG1^M^fmR~ z`cnP8?c2Ynf5!iFpg+D6&!8rr4Q;6yY#7|v2=Ldh`P&n@iGR_y!>5g67|9RbdWv_E z`~Yr@co)eJ;^vEYk^DezlXw^U^H#=+J}TZt@`JA%;$0*^0DCRoMef5S_lV+MPM_!|HtHJd|Zx)@6}JpP3EK=KPAUc%keXE{Hz>5C&$mr@e6YNq8z^@ z$1ltAD{}m*9KR;VuUo(VZ_3U1mK+b?tKXKJ%pEy?SB~G4bIUc@Oe77 z$?@-U{D%~GSLC=V$2B=FPU<8+`Q{$M^7Zc?Np8lG<#_mBJ&N39qRR1Tay+^mk0Hln z%JEooJhmKDdS@$kKRa=FQ*kmD)kcq%#W zAjci$cxpMGMvkYIW9M5c9|M8VRig;t50VI^?{|WioK*`7d zxI4?uSdwRzyLvV`o?VXTkmD|LJf|GbCC6Rmcy2kKM~=J6@w{?8pB&FG#|y~uf^xi& z94~BJ{|S^0ig>%PCR9tRf$D7al%|N!{nr=I|Fu{OWluApfbd*X@sSK3LNU2Pea-vl5{@;H0{}r66S!JbEHcHul z#O&0(a!|^JQaLG=i&CzX%1x;}lyaj~UP|SoRDMbopj1Ih6{1vON)@40QA!oF^ZkDb zYE~sFRfXfQMshW0P|Fx-E)uB{fO4)zJdepq?Q_7oC4Jg%+QjI9(L#f7;@}*Q0N;RcaGfFk5 zR0~SAq*Nwh3Mt3i|+Oey=1IE0$lP)ZG>)No3Tpwvi8 zjiS_ON{yk^SW1nf)ObowpwvW4O`_CfN=>2ER7y>=^ZK7b&1xp4W>L!iBhIGgHHT7j zDK(E$^C`7}QVS`yh*FCwwS-bjDYcAJ%PF;jQY$I7ic+g7wT4n_?Y#ciQ?uGYsg0Df z|A?EYd2OcD7D{cU)HX_Or_>Hg?WEK$O6{i99!l+{)ILh>r_=#T9i-GDN*$(D@Yny_ z@$-Mjs97DS)Co%2f5em2yiQT-G^Nf^>MW(sQR+OUE>P+sr7ltGGNrCi>MEtKQR+IS zZcyqbrEXE`ww>?)?^3h6N2&Xivj2z=sChl4)FVngrqmNkJ*Ct$Nm*U?Y})T2}$k2J#5cxNA1HsstZZ&#XVXJN$tly`U*+y$vvhBN$tx$#7kN`P94@P+?lu{|BQA(#&1WHAuR3u78rc@M4MWs|UN=2ts3`)hMR4huxrc@mJu78hs z)U4uDDgmYJKVm{^UWq7`m{Lh7m6TG+D3zR2DJYeaQmH8AKq*H`rKVIGN~NV#I!dLd zR0c|AwDbCRqGpwuQduZv{}G+3d1a+kHcDluR1QkHP%0;-a#6~aQn@LWhf;2o%1fzy zl*&)30+cF9sX~+r{`!CWo&S3jrDj!(QpG7{{}D@2^D0THQj{u9sWOx*OQ~{{Do-hQ zN>!kg2c;@f%9B!Fl&VCj%9N@?sj8H!X6O6=8q}<6QmPiE>_1{{YF>3HRhLrrC{>?Q z-jr%UsfLtlL@6IiHKvp=rJ7KxDW#fGsyU@vP^u-RTG@I1x1na`M=5_w*?+{g)Vu;H z6-cQdO0}a@drEbnR7Xm6qEu%}b)i&ON_C@DcS`l3R8LCvqEv56^|AB%??=t5Kcxmx z%Kjq`q~pwvZ5U82-wN?oDURZ3l>)OAYTu=D!AMa}9qrS4G5{v+O{=5>!!_bK&&QV%Kh zh*FO!^@LJSDfNs}&nfkSQZFg>ic+sB^@dV!DfNz0@9n()KT@;$M5)h|vj2!*sCj** z)Hh0fr_>KdRa7XYQc9zgPN@i#ib$zQl!{ELD3ppysc4jnPN^7_ifP~VUokc{t2mU3 zODX%07>}A)d`cytR6uI{MJQ$e5sOmuDn_Z|lqx}~l9Vb%snV1xL#eWqDo3gElyaw3 z1xk5Psv@O4Ddk0}N|dT>TmOlb@rrnpc?B@>N`T@W|M-s@uPUXgQR;7At2#Ae4NBFd zR4q!?rc@nD)umKDO4X;7H>Da-sv)HsQObu>jVa|zsV0<$5aD*o+3we~*Vt(*IJhxIa}{_Zb`dHK7)q|_^*{MrS1`?P85 z?NbRIPyMUV@zlQx9Z&tM(DBs2DoqC6Gps)^n+gi>ZR_n*aWKb*aBL{YhH-2-$3}2$ zB*#W^Y&6HlaBQq?{U=n8DdO#|np`ceHdjZg8^kkzMbw

    i^?I|4@Fy4L_b^6F4@J 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

    7d%g3MHcpppbVNl+<*o+79;L1hSfnxL`- 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

    v_gK)_>giG5H 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