안녕하세요. (__)

저는 프로그래밍 언어는 전혀 모르는 상태로

단지 테마를 바꾸기 위해 부딪쳐보는 중입니다.

 

제가 필요한 것은 갤럭시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);

이것처럼 시원하게 표현되어 있는데

삼성홈런처는 왜 이렇게 꼭꼭 숨어 있는지

 

정말 도움이 필요합니다. ㅠㅠ  

 

 

 

※ 공지사항 다 읽었습니다.