안녕하세요. (__)
저는 프로그래밍 언어는 전혀 모르는 상태로
단지 테마를 바꾸기 위해 부딪쳐보는 중입니다.
제가 필요한 것은 갤럭시S에서 상단바에 투명값을 준 후
삼성홈런처(터치위즈3.0)에서 배경화면이 상단바 밑으로 겹쳐 보이게 하는 것인데요.
systemUI.odex를 수정하여 상단바에 투명값을 적용하는건 성공하였는데
삼성홈런처에서 막히고 있습니다.
즉, 각종 앱 실행시는 상단바가 정상적으로 투명적용이 되는데요.
정작 홈런처에서는 상단바 바탕이 블랙으로만 나옵니다.
이렇게 저렇게 실험해보니
라이브월페이퍼를 적용하면 겹쳐지구요. 단일배경이미지를 적용하면 상단바 부분이 블랙으로 잘립니다.
ADW런처등 타 런처에서는 바탕화면해킹기능(old 랜더링 적용)을 해제하면 겹치게 보이더군요.
밑에 소스는 TouchWiz30Launcher.odex 를 undx.jar를 이용해 자바파일로 리버스시킨 소스에서
WallpaperCanvasView.class 만 붙여넣기 한 것입니다.
class파일들을 계속 보다보니 이 파일에서 관련 핵심이 있는 듯 하여 보는 중입니다.
package com.sec.android.app.twlauncher;
import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Rect; import android.os.SystemClock; import android.view.View; import android.view.Window; import android.view.WindowManager.LayoutParams;
public class WallpaperCanvasView extends View { private Rect mCanvasRect; private int mStatusBarHeight; private Workspace mWorkspace; private boolean undx_shameless_plug; private boolean generated_on_2012_1_17_19_24; private boolean for_info_on_the_undx_tool_contact_marc_schoenefeld_at_gmx_dot_org;
public WallpaperCanvasView(Context arg0) { super(arg0);
Object localObject = new android/graphics/Rect; ((Rect)localObject).<init>(); this.mCanvasRect = ((Rect)localObject);
localObject = arg0.getResources(); int j = 17104900; int i = ((Resources)localObject).getDimensionPixelSize(j); this.mStatusBarHeight = i; }
protected void onDraw(Canvas arg0) { int k = 0; super.onDraw(arg0);
Object localObject2 = this.mWorkspace; if (localObject2 == null); while (true) { return;
long l1 = SystemClock.uptimeMillis();
localObject2 = this.mCanvasRect; ((Rect)localObject2).left = k; localObject2 = this.mCanvasRect; ((Rect)localObject2).top = k; localObject2 = this.mCanvasRect; k = getWidth(); ((Rect)localObject2).right = k; localObject2 = this.mCanvasRect; k = getHeight(); ((Rect)localObject2).bottom = k;
Object localObject1 = getContext(); localObject1 = (Activity)localObject1;
int i = 0; localObject2 = ((Activity)localObject1).getWindow(); WindowManager.LayoutParams localLayoutParams = ((Window)localObject2).getAttributes(); int j = localLayoutParams.flags; j &= 1024;
if (j != 0) { i = 1; }
if (i == 0) { localObject3 = this.mCanvasRect; k = ((Rect)localObject3).top; int m = this.mStatusBarHeight; k -= m; ((Rect)localObject3).top = k; }
Object localObject3 = this.mWorkspace; Rect localRect = this.mCanvasRect; ((Workspace)localObject3).drawWallpaperImage(arg0, localRect);
long l2 = SystemClock.uptimeMillis(); } }
public void setWorkspace(Workspace arg0) { this.mWorkspace = arg0; } }
리버스라 문법이 꼬여서 무슨말인지 모르겠다는 프로그래머 친구의 말이 있었지만
저는 목표부분이 어디있는지만 찾으면 되기 때문에 그냥 보고 있습니다.
위 소스에서 하단쪽에 localObject3 변수가 사용되는 부분을 보시면
localObject3 = this.mCanvasRect; k = ((Rect)localObject3).top; int m = this.mStatusBarHeight; k -= m; ((Rect)localObject3).top = k;
라고 되어 있는데요.
제가 보기에는 k -= m 즉, 현재 캔버스 높이에서 상단바 높이 값을 뺀것을 Rect.top으로 설정하는 것 같았습니다.
고민하다가 smali파일에서 k -= m 만 삭제하여 봤으나 런처가 실행이 되지 않네요.ㅠㅠ
ADW런처 오픈 소스를 보니까
getWindow().setBackgroundDrawable(new ColorDrawable(0));
getWindow().setFormat(PixelFormat.TRANSPARENT);
이것처럼 시원하게 표현되어 있는데
삼성홈런처는 왜 이렇게 꼭꼭 숨어 있는지
정말 도움이 필요합니다. ㅠㅠ
※ 공지사항 다 읽었습니다.