레이블이 ICS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ICS인 게시물을 표시합니다. 모든 게시물 표시

2012년 3월 27일 화요일

ODROID(ICS) screenshot 찍기

android Honeycomb부터 iOS 처럼 screenshot이 가능합니다.

Volume Down + Power Key 조합입니다.

하지만 ODROID는 Volume Up/Down키와 Power Key가 동시에 눌러지지 않는 형태입니다.



Screenshot으로 검색해 보면 PhoneWindowManager.java에 관련 코드가 찾아 집니다.

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java


public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
...


    switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    if (down) {
                        if (isScreenOn && !mVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                            mVolumeDownKeyTriggered = true;
                            mVolumeDownKeyTime = event.getDownTime();
                            mVolumeDownKeyConsumedByScreenshotChord = false;
                            cancelPendingPowerKeyAction();
                            interceptScreenshotChord();
                        }
                    } else {

여기서 KEYCODE_VOLUME_DOWN -> KEYCODE_SEARCH으로 바꿉니다.



    switch (keyCode) {
            case KeyEvent.KEYCODE_SEARCH:
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                if (keyCode == KeyEvent.KEYCODE_SEARCH) {
                    if (down) {
                        if (isScreenOn && !mVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                            mVolumeDownKeyTriggered = true;
                            mVolumeDownKeyTime = event.getDownTime();
                            mVolumeDownKeyConsumedByScreenshotChord = false;
                            cancelPendingPowerKeyAction();
                            interceptScreenshotChord();
                        }
                    } else {

그럼 Power Key와 Search Key를 동시에 1초 누르면 screenshot이 찍힙니다.





2012년 3월 6일 화요일

android(ICS,JB)에서 Lock Screen 설정 None으로 만들기

JB에서부터는 아래 코드를 적용해서 default가 none으로 설정되지 않습니다.

def_lockscreen_disabled 값을 true로 주시면 코드 수정없이 됩니다.

overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml


<?xml version="1.0" encoding="utf-8"?>
<!--
/**
 * Copyright (c) 2009, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-->
<resources>
    <bool name="def_accelerometer_rotation">false</bool>
    <bool name="def_lockscreen_disabled">true</bool>
    <integer name="def_screen_off_timeout">604800000</integer>
    <bool name="def_install_non_market_apps">true</bool>
</resources>

---------------------------------------------------------------------------------------------------------


http://codewalkerster.blogspot.com/2011/11/android-lockscreen.html

gingerbread에서는 Screen lock을 PhoneWindowManager.java를 직접 수정하여 없앨 수 있었습니다.

ICS 부터는 아래와 같이 Screen lock - None이란 항목이 있습니다.



그런데 첫 부팅 후 default가 None으로 설정하려고 합니다.

framework/base/core/java/com/android/internal/widget/LockPatternUtils.java

    public boolean isLockScreenDisabled() {
        return !isSecure() && getLong(DISABLE_LOCKSCREEN_KEY, 1) != 0;
        //return !isSecure() && getLong(DISABLE_LOCKSCREEN_KEY, 0) != 0;
    }


    public int getKeyguardStoredPasswordQuality() {
        int quality =
                (int) getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
                //(int) getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
        // If the user has chosen to use weak biometric sensor, then return the backup locking
        // method and treat biometric as a special case.
        if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
            quality =
                (int) getLong(PASSWORD_TYPE_ALTERNATE_KEY,
                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
        }    
        return quality;
    }



2012년 2월 13일 월요일

android tablet ICS에서 Mass Storage UI가 나오지 않는 문제 해결

android tablet의 최초 OS는 Honeycomb이 였습니다.
Honeycomb은 MTP가 default입니다.
그래서 이전에 Mass Storage로 변경해도 USB Mass Storage connection Notification이 오지 않습니다.

그래서 Tablet인 경우 Mass Storage로 변경 시 PC와 연결하는 UMS를 사용할 수 없는 문제가 발생합니다.

원인을 찾아 보니 phone UI만 com.android.systemui.usb.StorageNotification에 대한 listener가 등록되어 있어서 tablet UI에서는 event를 받지 못하는 상황이 였습니다.

framework/base/packages/SystemUI/src/com/android/systemui/statusbar 폴더를 보시면
phone, tablet이란 폴더가 있습니다.

여기서 grep -nr mStorageManager를 검색하여 보시면 PhoneStatusBarPolicy class에서만 listener를 등록해 주도록 되어 있습니다.

tablet에서 적절한 위치에 mStorageManager.registerListener()를 추가해 주셔야 합니다.

아래 capture를 보시면 ui가 설렁합니다.
tablet UI에서 Mass Storage 연결에 대해 고민하지 않는 듯한 인상입니다.


2011년 12월 27일 화요일

android ICS 해상도, density에 따른 UI 변화

해상도 중 짧은 쪽이 600pixel 이상 일때 emulator의 화면입니다.




그리고 600pixel 미만일 때 emulator의 화면입니다.



동일한 AVD에서 해상도만 1024 x 600에서 800 x 480으로 변경한 것입니다.

해상도의 짧은 쪽이 600이상 일 때는 tablet의 UI를 보여 주고 600 미만 일 때는 phone의 UI를 보여 줍니다.

그리고 짧은 쪽이 600이상이 되면 자동으로 status bar가 하단에 위치 하고 screen buttons(Navigation Bar로 내부적으로 표현함)이 포함됩니다.

phone의 UI는 기본이 portrait이고 tablet의 UI는 landscape입니다.

600미만인 android에 landscape를 default로 주고 Screen Buttons(Navigation Bar)를 주면 제대로 그려지지 않습니다.

PhoneWindowManager.java를 보면 resolution, dpi를 가지고 판단하는 코드가 있습니다.


 870         // Determine whether the status bar can hide based on the size
 871         // of the screen.  We assume sizes > 600dp are tablets where we
 872         // will use the system bar.
 873         int shortSizeDp = shortSize
 874                 * DisplayMetrics.DENSITY_DEFAULT
 875                 / DisplayMetrics.DENSITY_DEVICE;
 876         mStatusBarCanHide = shortSizeDp < 600;
 877         mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
 878                 mStatusBarCanHide
 879                 ? com.android.internal.R.dimen.status_bar_height
 880                 : com.android.internal.R.dimen.system_bar_height);
 881


결론은 600미만의 device를 만드실 때는 반드시 portrait 타입에 LCD를 사용하시기 바랍니다.

그리고 odroid-7으로 테스트 한 것인데 ro.sf.lcd_density=120으로 주니 tablet UI로 동작은 합니다.





2011년 12월 24일 토요일

ODROID-7 ICS 복구 이미지

ODROID-7 ICS 복구 이미지 배포합니다.

기존 버전에는 kernel framebuffer가 landscape로 되어 있고 android를 270도 회전하여 화면 회전시 또는 멀티태스크 화면에 thumbnail 이미지 회전과 찌부러진 이미지 문제를 해결하였습니다.

터치 및 센서들도 Landscape mode로 수정하였습니다


http://dl.dropbox.com/u/4485660/odroid7_ics.zip





2011년 12월 23일 금요일

android screen button 사용하기

ICS에 Screen button이 가능하도록 수정해 보겠습니다.

frameworks/base/core/res/res/values/config.xml 에 보면 
   



config_showNavigationBar을 true가 되면 아래 보시는 것 처럼 screen button이 나옵니다.

보통 저 파일은 device 밑에 overlay폴더로 관리합니다.

device/hardkernel/odroid7/overlay/frameworks/base/core/res/res/values/config.xml
이 파일을 수정하시면 됩니다.





xda 사이트 참고하였습니다.
http://forum.xda-developers.com/showthread.php?t=1364757


2011년 11월 23일 수요일

ODROID-7에 android ICS(4.0.3_r1, IML74K) 올리기



odroid7 kernel을 준비 한다.


http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&bid=41

아래 경로에서 kernel 소스를 다운 받는다.

https://github.com/Kwiboo/kernel_samsung_crespo/tree/master/drivers/gpu

drivers/gpu 폴더을 odroid7 kernel에 덮어쓴다.

git로 부터 최신 android 소스를 받는다.


repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1.2


repo sync





아래 링크에서 odroid7으로 빌드가 가능한도록 수정한 폴더들을 받아 device와 vendor를 덮어쓴다.


http://dl.dropbox.com/u/4485660/ICS.tar.gz




vendor의 파일들은 아래 링크에서 받은 Nexus S의 ICS ROM에서 얻은 것 들이다.


http://www.multiupload.com/F0F156G363

crespo project를 지운다.

rm -rf device/samsung/crespo*

chmod u+x device/hardkerenl/odroid7/build_android.sh


안드로이드를 빌드한다.


device/hardkerenl/odroid7/build_android.sh


build가 완료되면 odroid-7 처럼 f-flash에 복사하고 zImage와 ramdisk-uboot.img를 fastboot로 write한다.














아래 소스를 고치면 마우스 없이 touch까지 가능합니다.

kernel/drivers/input/touchscreen/odroid7_MT_touch_portrait.c


169                 input_sync(hkc1xx_touch.driver);
170 
171 //codewalker
172                 input_mt_sync(hkc1xx_touch.driver);
173 
174                 input_sync(hkc1xx_touch.driver);
175 176 177 #if defined(DEBUG_HKC1XX_TOUCH_MSG) 178 printk("%s : Penup event send[x = %d, y = %d]\n", __FUNCTION__, hkc1xx_touch.x, hkc1xx_touch.y); 179 #endif




소리가 나오게 하는 방법은 ICS ROM에서 두 파일을 odroid7으로 이름을 바꿔서 넣어 주시면 됩니다.


/system/lib/hw/audio.primary.herring.so 를 audio.primary.odroid7.so
/system/lib/hw/audio_policy.herring.so 를 audio_policy.odroid7.so














wifi 가능 하도록 수정 방법



device/hardkernel/odroid7/BoardConfigCommon.mk


71 #WIFI_DRIVER_MODULE_ARG := "firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram_net.txt iface_name=wlan" 72 WIFI_DRIVER_MODULE_ARG := "iface_name=wlan firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram"

WIFI_DRIVER_MODULE_ARG를 수정하고 odroid7dml fw_bcm4329.bin, nvram을 해당 위치에 복사합니다.




hardware/libhardware_legacy/wifi/wifi.c


102 103 #define WIFI_WAKEUP_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_wakeup" // 1 -> wakeup on 104 #define WIFI_REG_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reg" // 1 -> reg on 105 #define WIFI_RESET_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reset" // 1 -> reset on 106 107 int wifi_set_module_status (char *ctl_fp, unsigned char status); 108 int wifi_get_module_status (char *ctl_fp); 109 110 111 static int insmod(const char *filename, const char *args) 112 {





206 int wifi_load_driver() 207 { 208 #ifdef WIFI_DRIVER_MODULE_PATH 209 char driver_status[PROPERTY_VALUE_MAX]; 210 int count = 100; /* wait at most 20 seconds for completion */ 211 212 if (is_wifi_driver_loaded()) { 213 return 0; 214 } 215 216 // Wifi power control & wakeup enable 217 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 1); usleep(10000); 218 wifi_set_module_status(WIFI_REG_CTL_FP, 1); usleep(10000); 219 wifi_set_module_status(WIFI_RESET_CTL_FP, 1); sleep(1); sync(); 220 221 222 if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) { 223 LOGE("insmod(DRIVER_MODULE_PATH = %s, DRIVER_MODULE_ARG = %s) FAIL!!!", DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); 224 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); 225 wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); 226 wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); 227 return -1; 228 } 229 230 if (strcmp(FIRMWARE_LOADER,"") == 0) {




259 int wifi_unload_driver() 260 { 261 usleep(200000); /* allow to finish interface down */ 262 #ifdef WIFI_DRIVER_MODULE_PATH 263 if (rmmod(DRIVER_MODULE_NAME) == 0) { 264 int count = 20; /* wait at most 10 seconds for completion */ 265 while (count-- > 0) { 266 if (!is_wifi_driver_loaded()) 267 break; 268 usleep(500000); 269 } 270 271 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); 272 wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); 273 wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); 274 275 276 usleep(500000); /* allow card removal */ 277 if (count) { 278 return 0;


int wifi_set_module_status(char *ctl_fp, unsigned char status) { int fd, ret, nwr; char buf[10]; if((fd = open(ctl_fp, O_RDWR)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); if(status) nwr = sprintf(buf, "%d\n", 1); else nwr = sprintf(buf, "%d\n", 0); ret = write(fd, buf, nwr); close(fd); if(ret == nwr) { LOGI("%s : write success (on = %d)", ctl_fp, status); return 0; } else { LOGE("%s : write fail (on = %d)", ctl_fp, status); return -1; } } //---------------------------------------------------------------------------------------------------------------- int wifi_get_module_status(char *ctl_fp) { int fd, ret, nrd; char buf[10]; if((fd = open(ctl_fp, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s : status == 1", ctl_fp); return 1; // wakeup } else { LOGI("%s : status == 0", ctl_fp); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wakeup_status() { int fd, ret, nrd; char buf[10]; if((fd = open(WIFI_WAKEUP_CTL_FP, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, WIFI_WAKEUP_CTL_FP); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s(%s) : module status == wakeup", __FILE__, __FUNCTION__); return 1; // wakeup } else { LOGI("%s(%s) : module status == suspend", __FILE__, __FUNCTION__); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wait_time(int waitTime) { LOGI("%s(%s) : module wait time = %d sec", __FILE__, __FUNCTION__, waitTime); sleep(waitTime); sync(); return 0; }



위와 같이 수정 하고 libhardware_legacy.so를 넣습니다.

bcm4329.ko는 kernel에서 make modules로 만들어 넣습니다.










market 사용




gapps는 아래 파일에서 받았습니다.

위에 system을 adb push로 밀어 넣으면 몇개 중복되는 apk가 존재하여 문제가 발생합니다.

그래서 중복되는 apk를 삭제하여 묶었습니다.

http://dl.dropbox.com/u/4485660/gapps-ics-20111122-full-blade_codewalker.tar.gz



android-4.0.3_r1(IML74k) 올려 봤습니다.


gps

odroid-7 gingerbread의 gps library를 드대로 사용하니 gps도 동작하네요.
int.rc에 gps 노드만 바꾸면 됩니다.

 29     chown gps root /sys/class/sec/gps/GPS_PWR_EN/value
 30     chmod 660 /sys/class/sec/gps/GPS_PWR_EN/value
 31                                                   
 32     #===================================================================
 33     #                                         
 34     # Odroid GPS Device name Setting                         
 35     #                                                       
 36     #===================================================================
 37     setprop ro.kernel.android.gps s3c2410_serial1            
 38     chmod 0666  /dev/s3c2410_serial1
 39                    
 40            
 41 on fs                
 42     mkdir /efs 0775 radio radio




가속 센서 역시 odroid7의 orientationd, geomagneticd, sensors.odroid7.so를 그대로 사용하니 동작 합니다.

지자기 센서는 역시 동작하지 않네요.









앞에서 추가적으로 수정된 내용은 ICS.tar.gz에 계속 반영 됩니다.