2016년 11월 10일 목요일

플래쉬가 없지만 Quick Settings icon에 flashlight를 표시하는 방법

안드로이드 개발보드에 플래쉬가 없긴하지만 Quick Settings에 Flashlight 아이콘이 나오게 하고 싶다.


결론:
Quick settings에 표시하는 아이콘의 리스트는
/data/data/com.android.providers.settings/databases/settings.db의 secure 테이블에서 sysui_qs_tiles컬럼으로 관리된다.
없을경우 R.string.quick_settings_tiles 에서 표시할 리스트를 가져온다. 여기에 필요한 리스트를 추가하면 된다.
확인 결과 quick settings tile list에 기본값으로 flashlight는 포함된다.
하지만 FlashlightController에서 비활성화 플래그로 인해 표시를 하지않는다. 이 값을 강제로 설정하면 표시는 가능하다.

과정:
Flashlight는 카메라 서비스에서 제공되는 기능으로 카메라 API를 통해서 제어를 할 수있다.
Quick settings icon의 경우 SystemUI에서 관리한다.


//SystemUI 설정 (QSTileHost.java 참조)
1) settings.db 업데이트
   adb shell settings get secure sysui_qs_tiles
   adb shell settings put secure sysui_qs_tiles wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot

settings put을 하면 바로 화면에 적용된다.
위 명령에서 설정값이 없으면 R.string.quick_settings_tiles 에서 리스트를 가져온다.

2)SystemUI/res/values/config.xml
 - R.string.quick_settings_tiles
 - R.string.quick_settings_tiles_default
 - quick settings의 행과 열 설정값.
 - 각종 UI 타이밍 설정값

settings.db의 sysui_qs_tiles의 기본값은 flashlight가 포함되어 있는데, 안나온다.
flashlight 타일의 소스를 보면 HAL포팅이 되어있어야 온/오프 표시가 된다는 것을 알수 있다.

* SystemUI 소스확인
소스위치 : android/frameworks/base/packages/SystemUI
Quick settings 소스 위치: SystemUI/src/com/android/systemui/qs
Status Bar의 명칭 : http://minuhome.tistory.com/13

//타이틀 리스트 생성
 ../systemui/statusbar/phone/QSTileHost.java :
 QSTileHost : recreateTiles()
  { final List<String> tileSpecs = loadTileSpecs();
    createTile(titleSpec)); }

//타이틀 리스트에 따라 퀵세팅 인스턴스생성
 QSTileHost : createTile() { else if (tileSpec.equals("flashlight")) return new FlashlightTile(this); }

//플래쉬 라이트 초기화
src/com/android/systemui/qs/tiles/FlashlightTile.java

//플래쉬상태표시
아래 FlsahController가 활성화 되어 있을경우 표시가된다.
강제로 state.visible=true로 하면 퀵세팅패털에서 플래쉬아이콘을 볼 수 있다.:

handleUpdateState()
state.visible = mWasLastOn != 0 || mFlashlightController.isAvailable();

//개발보드 HAL 로깅메시지
10-06 04:08:22.790 2468-2468/? D/ExynosCameraParameters: [CAM_ID(1)][ParametersFront]-DEBUG(setParameters):strNewFlashMode off


*플래쉬 HAL
각 보드별 특성 설정: android/device/company/products
컴파일 결과물: android/out

HAL Module : out/target/product/mv7420/obj/lib/*.so
HAL Module은 커널의 장치를 제어하는 인터페이스 라이브러리이다.
아래 링크정보를 보고 어떤파일이 컴파일되는 지 확인해 볼수 있다.
HAL Module link 정보:
out/target/product/mv7420/obj/SHARED_LIBRARIES/module_namexxx_intermediates/module_namexxx.P


백라이트 HAL:
Nexus: android/device/lge/liblight
HTC: android/device/htc/flounder/lights
mv7420: device/samsung/smdk_common/liblight/lights.c
센서 HAL
Nexus: android/device/lge/libsensor
HTC: android/device/htc/flounder/sensor_hub/libsensors
mv7420: vendor/invensense/libsensors_HAL_1_1/sensors_mpl.cpp

오디오 HAL
       android/device/samsung/mv7420/audio

카메라 HAL
  libexynoscamera.so  : hardware/samsung_slsi/exynos7420/libcamera/ExynosCameraSensorInfo.cpp
        libcamera_client.so : frameworks/av/camera/*.c
libcamera_metadata.so : system/media/camera/src/*.c
        libcameraservice.so : frameworks/av/services/camera/libcameraservice/*.cpp


1. 카메라 매니져 접근:
 SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java :
 mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
2. 카메라 장치 오픈
 SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java :
 mCameraManager.openCamera(getCameraId(), mCameraListener, mHandler);:0:
3. 플래시 명령 전달
 builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);




*특정 태크 로깅 설정

Dalvik property 설정:setprop log.tag.<your_log_tag> <level>

$ ./adb shell stop
$ ./adb shell setprop log.tag.QSTileHost DEBUG
$ ./adb shell setprop log.tag.FlashlightController DEBUG
$ ./adb shell start



*파워버튼 두번 누르면 카메라켜기
android/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

powerMultiPressAction(..) {
 ...
 case MULTI_PRESS_POWER_LAUNCH_CAMERA:
    Slog.i(TAG, "Launching camera by power button.");
    if (!mCameraLensCoverState != CAMERA_LENS_COVERED) {
        if (!interactive) {
            wakeUpFromPowerKey(eventTime);
        }
        launchCamera();
    }
    break;
...
}

댓글 없음:

댓글 쓰기