소심한작은곰
13.07.29
조회 수 9061
추천 수 25
댓글 23

휴대폰마다 상황이 각각 다 다르기 때문에...강좌 식으로 쓰긴 힘들 것 같습니다.

어떤 흐름으로 진행했는지 써보려고 합니다.

 


이런 식으로 만들어집니다.

(상단바에 있는 숨기기 버튼 부분은 나중에 쓰도록 하겠습니다)

 

 

먼저 상단바에 토글 부분을 담당하는 부분은

com/android/systemui/statusbar/policy/quicksetting/QuickSettingButton*.smali 와

com/android/systemui/statusbar/policy/quicksetting/QuickSettingPanel*.smali 입니다.

(PhoneStatusBar에서는 그냥 그...애니메이션 부분만 담당하더군요. prepare어쩌고저쩌고 메서드였는데..)

실제로 layout 에서도

 

com.android.systemui.statusbar.policy.quicksetting.QuickSettingPanel android:orientation="horizontal" android:id="@id/quicksetting_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="@drawable/tw_black_bg" android:showDividers="middle" />

 

이렇게 나와있구요

마음 같았으면 QuickSettingPanel 파일을 수정해서 상황별로 다른 토글을 불러오도록 하고 싶었지만

java언어 상태라면 모를까..dalvik code 단계라서 수정하기도 어렵고 해서

저는 quicksetting 폴더 안에

QuickSettingTile*.smali 파일들과 QuickSettingTilePanel*.smali 파일을 새로 만들기로 하고

layout에서는

                GridLayout android:orientation="horizontal" android:id="@id/quicksetting_tile" android:layout_width="fill_parent" android:layout_height="wrap_content">
                    com.android.systemui.statusbar.policy.quicksetting.QuickSettingTilePanel android:orientation="horizontal" android:id="@id/quicksetting_tile_container" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="@drawable/tw_black_bg" android:showDividers="middle" />
                </GridLayout

이런식으로 배치해뒀습니다.

새로 QuickSettingTile*.smali 파일과 QuickSettingTilePanel*.smali 파일을 추가할 때는

QuickSettingButton*.smali 파일과 QuickSettingPanel*.smali 파일을 복사해서

이름도 바꾸고, 내용에 있는

QuickSettingButton이라는 글자는 QuickSettingTile로,

QuickSettingPanel이라는 글자는 QuickSettingTilePanel 로 바꿔준 뒤 quicksetting 폴더 안에 추가했습니다.

(단, QuickSettingPanel 안에 한군데는 바꾸지 말아야 하는데 refreshView() 메서드 안의


    .line 294
    :try_start_61
    new-instance v6, Ljava/lang/StringBuilder;

    invoke-direct {v6}, Ljava/lang/StringBuilder;->()V

    const-string v7, "com.android.systemui.statusbar.policy.quicksetting."

    invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v6

    aget-object v7, v0, v5

    invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v6

    const-string v7, "QuickSettingButton"

    invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v6

요부분에서 큰따옴표안에있는 저 QuickSettingButton 부분은 바꾸면 안됩니다.

notification_panel_active_app_list 에서 String[] 값을 받아와서

(그 값) + (QuickSettingButton) 이라는 파일이 quicksetting 폴더 안에 있으면 그 토글을 띄우는거기 때문에..

(WifiQuickSettingButton 이라든지, FlashlightQuickSettingButton 이라든지요)

그리고 나서 띄워보니, 스크롤 가능한 토글목록 말고 방금 새로 만든 토글 목록이 뜨더군요

근데 처음 생각에는, GridLayout 으로 parent를 지정해줬으니 자동으로 한 줄을 넘으면 토글이 밑줄으로 넘어가지 않을까, 하고 생각했었는데 안넘어가더군요(소스에서 직접 addView로 추가해줘서 그런지, 아니면 child가 LinearLayout이라서 그런지)

그래서 인터넷에 찾아본 결과 어느정도 프로그래밍을 하신 분들도

소스 단계에서 addView할때마다 남은 width를 구해서 만약 width가 한계가 되면 새로운 layout을 밑에 만들어 거기에 배치하라는 대답이시더군요

제가 하고자 하는 토글은 딱 한줄에 5개가 들어가기에 width를 구할 필요는 없었고, 그냥 3줄을 GridLayout으로 다 한번에 해결하려 하지 말고 각각 LinearLayout를 하나씩 정해줬죠

 

그래서 위에 QuickSettingTile*.smali 파일과 QuickSettingTilePanel*.smali 파일을 새로 추가해주듯이

QuickSettingTile1*.smali QuickSettingTile2*.smali 파일과 QuickSettingTilePanel1*.smali QuickSettingTilePanel2*.smali 파일을 새로 추가시켜줬죠

 

그리고 layout에서는

 

                <LinearLayout android:orientation="horizontal" android:id="@id/quicksetting_tile" android:layout_width="fill_parent" android:layout_height="wrap_content"
                    <com.android.systemui.statusbar.policy.quicksetting.QuickSettingTilePanel android:orientation="horizontal" android:id="@id/quicksetting_tile_container" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="@drawable/tw_black_bg" android:showDividers="middle" /
                </LinearLayout
                <LinearLayout android:orientation="horizontal" android:id="@id/quicksetting_tile2" android:layout_width="fill_parent" android:layout_height="wrap_content"
                    <com.android.systemui.statusbar.policy.quicksetting.QuickSettingTilePanel1 android:orientation="horizontal" android:id="@id/quicksetting_tile_container2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="@drawable/tw_black_bg" android:showDividers="middle" /
                </LinearLayout
                <LinearLayout android:orientation="horizontal" android:id="@id/quicksetting_tile3" android:layout_width="fill_parent" android:layout_height="wrap_content"
                    <com.android.systemui.statusbar.policy.quicksetting.QuickSettingTilePanel2 android:orientation="horizontal" android:id="@id/quicksetting_tile_container3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="@drawable/tw_black_bg" android:showDividers="middle" /
                </LinearLayout

 

이런식으로 추가를 해줬습니다.

그런데 결과물을 보니...토글이 다 똑같이 앞에 5개만 나오는 겁니다

 

와이파이 GPS 소리 자동회전 블루투스

와이파이 GPS 소리 자동회전 블루투스

와이파이 GPS 소리 자동회전 블루투스

 

이런식으로 말이죠. 하긴 당연한 결과겠지요 QuickSettingTilePanel ~ QuickSettingTilePanel2 까지 전부다 같은 값인 notification_panel_active_app_list 값을 받아오니까 말이죠

그래서 저는 QuickSettingTilePanel ~ QuickSettingTilePanel2 는 notification_panel_active_app_list 말고 다른 값들(예를 들어 active_notification_list_tablet라든지, 아니면 candidate_notification_list_tablet라든지요.)을 사용하면 되지 않을까? 했는데

 

smali 에서 notification_panel_active_app_list 를 다른 걸로 교체하니(active_notification_list_tablet 같은걸로)

더이상 그 값에서 받아오지 않더군요..

예전 알림창 메뉴를 활성시키기 전에 불러왔던 SystemUI.apk 안의 QuickSettingButtonAttribute에서 받아오더군요

 

그래서 SystemUI.apk 안에 QuickSettingButtonAttribute도 역시 QuickSettingButtonAttribute1, QuickSettingButtonAttribute2 값을 새로 만들어주고 array값도 다 따로따로 지정을 해줬습니다.

 

    <string-array name="QuickSettingButtonAttribute"
        <item>Wifi</item
        <item>Location</item
        <item>SilentMode</item
        <item>AutoRotate</item
        <item>Bluetooth</item
    </string-array

    <string-array name="QuickSettingButtonAttribute1"
        <item>MobileData</item
        <item>DormantMode</ite
        <item>PowerSaving</item
        <item>AirplaneMode</item
        <item>MultiWindow</item
    </string-array
    <string-array name="QuickSettingButtonAttribute2"
        <item>DrivingMode</item
        <item>Flashlight</ite
        <item>WifiAp</item
        <item>NfcP2p</item
        <item>SmartStay</item
    </string-array
   

요렇게요. 그리고 QuickSettingTilePanel 안에 있는 QuickSettingButtonAttribute의 id 값은 각각

QuickSettingTilePanel1은 QuickSettingButtonAttribute1의 id값으로,

QuickSettingTilePanel2는 QuickSettingButtonAttribute2의 id값으로 수정했습니다.

 

완성!

 

제 기준으로 최대한 노력해봤지만...마음에 들지 않네요

smali 잘 다루시는 분은 QuickSettingPanel 파일 한 개로 다 해결했을 텐데...

 

 

아 그런데 한가지 버그는.....음악이 재생중이거나 이어폰을 꼽으면 상단바에 뭐가 뜨는데

그게 토글 첫번째 줄과 두번째 줄 사이에 뜹니다..수정해야 되는데 어딜 건드려야 할지 아직 감이 안오더군요

다음에 찾아내면 쓰도록 하겠습니다.


Extra Form
첨부
Screenshot_2013-07-29-01-05-18.png  [File Size:104.7KB/Download:0]
댓글을 남겨야 다운로드가 가능합니다. 감사의 댓글을 달고 오른쪽 확인버튼을 눌러주세요.
다운로드시 일주일에 한개 이상의 게시물 작성이 필요합니다. 지금 자유게시판에 회원님의 하루를 남겨보세요.
추천♡버튼을 잊지 마세요. 추천인과 회원님 모두 포인트가 적립됩니다.
댓글 23
댓글 쓰기 권한이 없습니다.
분류 정렬 목록 검색 쓰기
List of Articles
제목 글쓴이 추천 조회 날짜
< 디컴과 컴파일이 쉬운 프로그램! > 3 file Yolly 13 2899 2015.02.22
< 까먹은 WIFI 비밀번호 찾아내자! > 3 Yolly 9 6221 2015.02.09
강좌 < 기초 > 토스트를 바꾸어보자! 1 Yolly 3 2991 2015.02.09
강좌 < 기초 > 프로그래스 바를 바꾸어 보자! Yolly 2 2773 2015.02.09
강좌 < 기초 > 볼륨슬라이더 바를 바꾸어보자! 4 Yolly 5 3191 2015.02.09
9패치 이미지 미리보기 하는 방법 2 file 짱구삼촌 2 3799 2014.03.20
7독바 팁입니다. 심심한남 1 2433 2014.02.02
5분이면 이해완료 2편 : 프레임워크 이미지들이 어디에 쓰이는건지 알... 7 file 잉명 1 2145 2010.11.22
5분이면 이해완료 1편 : apk 안에 그림파일을 어떻게 바꾸나요? 14 file 잉명 4 3697 2010.11.22
강좌 5Way Reboot 삼성 스마트폰 for Marshmallow 펌웨어 13 file 라크루샤 15 2133 2016.05.08
강좌 5G에 관련해서 잘 정리된 자료 22 file 스틸하트 4 467 2018.08.21
4기가 이상파일 넣기 (외장메모리 최소8기가필요) 20 폰트크리 12579 2012.05.07
4k 모니터에서 원격데스크탑(mstsc) 연결 스틸하트 2 935 2019.03.15
4k HDR 모니터 쓰시는 분들은 반드시 DP 케이블로 연결 스틸하트 2 793 2019.01.13
45요금제라 데이터쉐어링은 하늘나라로... 4 잉어 2726 2011.03.08
45도로 과열된 폰 10초만에 20도만들기 76 file SuperUse 47 4022 2013.04.28
45 요금제 쓰시는분들 참고하세요.~ 19 보이 7 2632 2011.02.10
4.4 갤럭시 이어폰 연결시 상단바 오디오 어플리케이션 삭제하기 3 file 누엔 1 6395 2014.02.20
4.3에서 오딘 실패, 중지, 먹통일때 5 Godhand 4 22307 2014.01.15
4.3업그레이드후 루팅시 슈퍼수가 루트권한 얻는데 오류가 생길때 file Interlude 2 6089 2014.03.08
4.3부터 이어폰 꽂음 바로가기가 올래 나오는건가요? 4 file 정원이아 3363 2013.12.16
4.3버전 루팅후 생기는 문제점 해결방안 4 푸른구름 7 3502 2013.11.01
4.3OS 녹스 적용 기종인 갤럭시 노트3의 녹스 카운터 우회하여 루팅했... 3 운우wOOnOO 3 6505 2013.11.03
4.3 이후 잠금화면스샷방법 4 file 칼빵난푸 1 2846 2013.12.07
4.3 에서 4.3으로 오딘말고 Kies3로 복구 방법. 6 file 오잉우왕 4484 2013.10.28
4.3 업뎃 후 잠금화면에 날씨 표시하기 5 file 지누지눙 7 12627 2013.12.07
4.3 업데이트 후 메모리 상주 어플 알림 없애는 법(Xposed 활용이니 루... 2 dongyeol 5 8300 2013.11.02
4.3 드디어 루팅법 알아냈습니다ㅜ 71 file Jason K 184 32388 2013.10.25
4.3 SuperSU 설치(도움이 될지 모르겠습니다) 6 dksdawdw 2 4054 2013.11.20
4.2.2 AOKP / CM / PA 를 SK 노트2에 올리기 72 크램프 26 8818 2013.03.06
1 - 131 - 135