PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [اموزش] فعال کردن Swipe to Remove Notification بر روی رام های استوک



+POURYA
09-05-2012, 17:20
با سلام
همون طور که میدونید تو رام های ICS و سیانوژن برای پاک کردن اعلان ها میتونید علاوه بر استفاده از دکمه Clear گزینه مورد نظر رو به چپ و یا راست سویپ کنید تا پاک بشه .
با استفاده از این اموزش میتونید این قابلیت رو در رام های استوک شرکتی هم داشته باشید.
نکته مهم انجام قدم به قدم مراحل هست در صورت بروز کوچکترین اشتباه استاتوس شما FC خواهد داد.این مود از Xperia Ray پورت شده بنابراین ممکن است برخی کد ها متفاوت باشه شما فقط لازم هست که کد های معرفی شده رو کپی پیست کنید.

پیش نیاز ها :

Framework.jar دیکامپایل شده با Baksmalimanager
SystemUI.apk دیکامپایل شده با APK Manager و یا ابزارهای مشابه
کمی دانش درباره تغییر در کدها و ویرایش فایلهای xml
Winrar و یا سایر ابزارهای مشابه فشرده سازی
Notpad++

نکته :
نسخه پشتیبان از Framework.jar و SystemUI.apk داشته باشید.

شروع کار :

1. اصلاح SystemUI.apk
1.1 اصلاح res/anim

1- در پوشه res پوشه ای به نام anim درست کنید ( اگر نبود )
2- در همین پوشه که درست کردید دو فایل به نام slide_out_left_basic.xml و slide_out_right_basic.xml درست کنید.
3- فایل slide_out_left_basic.xml را با notpad++ باز کنید و کدهای زیر رو واردش کنید و اون رو ذخیره کنید.توجه کنید تمام ویرایش کد ها رو با همین نرم افزار انجام بدید.


<?xml version="1.0" encoding="utf-8"?>
<translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0.0" android:toXDelta="-100.0%p"
xmlns:android="http://schemas.android.com/apk/res/android" />

4- کد های زیر رو هم در فایل slide_out_right_basic.xml وارد کنید .

<?xml version="1.0" encoding="utf-8"?>
<translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0.0" android:toXDelta="100.0%p"
xmlns:android="http://schemas.android.com/apk/res/android" />


1.2 اصلاح res/layout/status_bar_latest_event.xml

فایل مذکور رو باز کنید و نواحی درشت شده رو جایگزین کنید .



<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.statusbar.LatestItemContainer android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="65.0sp"
xmlns:android="http://schemas.android.com/apk/res/android">
<com.android.systemui.statusbar.LatestItemView android:id="@id/content" android:background="@android:drawable/status_bar_item_background" android:paddingRight="6.0sp" android:focusable="true" android:clickable="true" android:layout_width="fill_parent" android:layout_height="64.0sp" android:shadowColor="#ff000000" android:shadowDx="0.0" android:shadowDy="1.0" android:shadowRadius="2.0" />
<View android:background="@drawable/divider_horizontal_light_opaque" android:layout_width="fill_parent" android:layout_height="wrap_content" />
</com.android.systemui.statusbar.LatestItemContainer>


1.3 اصلاح res/values/public.xml

در این مرحله انیمیشن هایی که ما در مرحله 1.1 تعریف کردیم فعال و ریجستر میشن.

1- systemUI.apk رو کامپایل کنید.
2- حالا مجددا فایل رو دیکامپایل کنید.
3- حالا در ادرس /res/values/public.xml فایل public.xml رو باز کنید. در اخر کد ها دو خط به شکل زیر میبینید . اونها رو به خاطر بسپارید ممکن است در مراحل بعدی به کد هگز داده شده نیاز پیدا کنید.



<resources>
.
.
.

<public type="anim" name="slide_out_left_basic" id="0x7f0c0000" />
<public type="anim" name="slide_out_right_basic" id="0x7f0c0001" />

</resources>


1.4 اضافه کردن smali/com/android/systemui/statusbar/LatestItemContainer$1.smali و smali/com/android/systemui/statusbar/LatestItemContainer.smali

1- این دو فایل رو از ضمیمه دانلود کنید و در ادرس ذکر شده قرار بدید.
2- اگر در مرحله 1.3 بعد از دیکامپایل مجدد id هایی متفاوت از اونی که نوشته شده رو دارید لازم هست که اون id ها رو در فایل LatestItemContainer$1.smali وارد کنید.

به شکل زیر :


.line 53
:cond_0
const/high16 v1, 0x7f0c


و



.line 51
const v1, 0x7f0c0001


1.5 اضافه کردن smali/com/android/systemui/statusbar/StatusBarService$7.smali

این فایل رو از ضمیمه کنید و در ادرس مذکور کپی کنید . دقت کنید اگر این فایل از قبل موجود بود جایگزین نکنید و نام اون رو تغییر بدید .


مثلا اگه فایلی به نام StatusBarService$7.smali در ادرس smali/com/android/systemui/statusbar/ بود شما فایل دانلود شده رو به StatusBarService$8.smali تغییر نام بدید و اون وقت کپی کنید و به هیچ وجه با فایل های موجود جایگزین نکنید. سپس تمام کد های فایل StatusBarService$7.smali رو به شکل زیر تغییر بدید.



StatusBarService$7


به



StatusBarService$8


1.6 اصلاح smali/com/android/systemui/statusbar/StatusBarService.smali

StatusBarService.smali رو باز کنید و متد زیر رو پیدا کنید.



.method makeNotificationView(Lcom/android/internal/statusbar/StatusBarNotification;Landroid/view/ViewGroup;)[Landroid/view/View;


کد زیر رو در متد بالا پیدا کنید.



invoke-virtual {v0, v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;

move-result-object v18

const v4, 0x7f0b0014

move-object/from16 v0, v18

move v1, v4

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v10


کد های درشت رو به کد بالا اضافه کنید .



invoke-virtual {v0, v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;

move-result-object v18

check-cast v18, Lcom/android/systemui/statusbar/LatestItemContainer;

.line 516
.local v18, row:Lcom/android/systemui/statusbar/LatestItemContainer;
move-object/from16 v0, v16

iget v0, v0, Landroid/app/Notification;->flags:I

move v4, v0

and-int/lit8 v4, v4, 0x2

if-nez v4, :cond_swno

move-object/from16 v0, v16

iget v0, v0, Landroid/app/Notification;->flags:I

move v4, v0

and-int/lit8 v4, v4, 0x20

if-nez v4, :cond_swno

new-instance v4, Lcom/android/systemui/statusbar/StatusBarService$7;

move-object v0, v4

move-object/from16 v1, p0

move-object/from16 v2, p1

invoke-direct {v0, v1, v2}, Lcom/android/systemui/statusbar/StatusBarService$7;-><init>(Lcom/android/systemui/statusbar/StatusBarService;Lcom/android/internal/statusbar/StatusBarNotification;)V

move-object/from16 v0, v18

move-object v1, v4

invoke-virtual {v0, v1}, Lcom/android/systemui/statusbar/LatestItemContainer;->setOnSwipeCallback(Ljava/lang/Runnable;)V

.line 735
:cond_swno

const v4, 0x7f0b0014

move-object/from16 v0, v18

move v1, v4

invoke-virtual {v0, v1}, Lcom/android/systemui/statusbar/LatestItemContainer;->findViewById(I)Landroid/view/View;

move-result-object v10



اگر درمرحله 1.4 فایل StatusBarService$7 رو به StatusBarService$8 تغییر داده اید در کد بالا هم StatusBarService$7 رو به StatusBarService$8 تغییر بدید.

کد زیر رو پیدا کنید



move v1, v4

invoke-virtual {v0, v1}, Landroid/view/View;->setDrawingCacheEnabled(Z)V

.line 542
const/4 v4, 0x3


کدهای درشت رو جایگزین کنید.



move v1, v4

invoke-virtual {v0, v1}, Lcom/android/systemui/statusbar/LatestItemContainer;->setDrawingCacheEnabled(Z)V

.line 542
const/4 v4, 0x3



ممکن است کدها در دیوایس های مختلف فرق کنه بنابراین شما کدها رو خودتون با کدهای دیوایستون انطباق بدید


2. اصلاح framework.jar

2.1 اصلاح smali/com/android/internal/statusbar/IStatusBarService$Stub.smali

1- کد درشت را در محل مشابه اضافه کنید.



.field static final TRANSACTION_onClearAllNotifications:I = 0xb

.field static final TRANSACTION_onNotificationClear:I = 0xc

.field static final TRANSACTION_onNotificationClick:I = 0x9

.field static final TRANSACTION_onNotificationError:I = 0xa



اگه کد 0xc موجود بود کد رو به کدی منحصر به فرد تغییر بدید.


2- این کد رو پیدا کنید .


.method public onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
.registers 14
.parameter "code"
.parameter "data"
.parameter "reply"
.parameter "flags"
.annotation system Ldalvik/annotation/Throws;
value = ..
Landroid/os/RemoteException;
}
.end annotation

.prologue
.line 39
sparse-switch p1, :sswitch_data_124


تغییر بدید به




.method public onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
.registers 14
.parameter "code"
.parameter "data"
.parameter "reply"
.parameter "flags"
.annotation system Ldalvik/annotation/Throws;
value = ..
Landroid/os/RemoteException;
}
.end annotation

.prologue
.line 39
sparse-switch p1, :sswitch_data_13e


4 - این کد رو در اخر فایل پیدا کنید.



.line 176
const/4 v0, 0x1

goto/16 :goto_7

.line 39
:sswitch_data_124
.sparse-switch
0x1 -> :sswitch_f
0x2 -> :sswitch_1c
0x3 -> :sswitch_29
0x4 -> :sswitch_42
0x5 -> :sswitch_5f
0x6 -> :sswitch_7b
0x7 -> :sswitch_8d
0x8 -> :sswitch_c7
0x9 -> :sswitch_d5
0xa -> :sswitch_ef
0xb -> :sswitch_116
0x5f4e5446 -> :sswitch_8
.end sparse-switch


اگه بود که به شکل زیر تغییر بدید و اگر نبود کد زیر رو واردش کنید.




.line 176
const/4 v0, 0x1

goto/16 :goto_7

.end local v1 #_arg0:Ljava/lang/String;
.end local v2 #_arg1:Ljava/lang/String;
.end local v3 #_arg2:I
:sswitch_124
const-string v0, "com.android.internal.statusbar.IStatusBarService"

invoke-virtual {p2, v0}, Landroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V

.line 177
invoke-virtual {p2}, Landroid/os/Parcel;->readString()Ljava/lang/String;

move-result-object v1

.line 178
.restart local v1 #_arg0:Ljava/lang/String;
invoke-virtual {p2}, Landroid/os/Parcel;->readString()Ljava/lang/String;

move-result-object v2

.line 179
.restart local v2 #_arg1:Ljava/lang/String;
invoke-virtual {p2}, Landroid/os/Parcel;->readInt()I

move-result v3

.line 180
.restart local v3 #_arg2:I
invoke-virtual {p0, v1, v2, v3}, Lcom/android/internal/statusbar/IStatusBarService$Stub;->onNotificationClear(Ljava/lang/String;Ljava/lang/String;I)V

.line 181
invoke-virtual {p3}, Landroid/os/Parcel;->writeNoException()V

.line 182
const/4 v0, 0x1

goto/16 :goto_7

.line 39
:sswitch_data_13e
.sparse-switch
0x1 -> :sswitch_f
0x2 -> :sswitch_1c
0x3 -> :sswitch_29
0x4 -> :sswitch_42
0x5 -> :sswitch_5f
0x6 -> :sswitch_7b
0x7 -> :sswitch_8d
0x8 -> :sswitch_c7
0x9 -> :sswitch_d5
0xa -> :sswitch_ef
0xb -> :sswitch_116
0xc -> :sswitch_124
0x5f4e5446 -> :sswitch_8
.end sparse-switch



5- اگه در مراحل قبل کد 0xc رو تغییر نام داده اید لازم هست که این تغییر نام رو در این مرحله نیز انجام بدید.



0xc -> :sswitch_124


2.2 اصلاح smali/com/android/internal/statusbar/IStatusBarService$Stub$......smali

1 - کدهای زیر رو در فایل مذکور وارد کنید .



.method public onNotificationClear(Ljava/lang/String;Ljava/lang/String;I)V
.registers 9
.parameter "pkg"
.parameter "tag"
.parameter "id"
.annotation system Ldalvik/annotation/Throws;
value = ..
Landroid/os/RemoteException;
}
.end annotation

.prologue
.line 359
invoke-static ..}, Landroid/os/Parcel;->obtain()Landroid/os/Parcel;

move-result-object v0

.line 360
.local v0, _data:Landroid/os/Parcel;
invoke-static ..}, Landroid/os/Parcel;->obtain()Landroid/os/Parcel;

move-result-object v1

.line 362
.local v1, _reply:Landroid/os/Parcel;
:try_start_8
const-string v2, "com.android.internal.statusbar.IStatusBarService"

invoke-virtual {v0, v2}, Landroid/os/Parcel;->writeInterfaceToken(Ljava/lang/String;)V

.line 363
invoke-virtual {v0, p1}, Landroid/os/Parcel;->writeString(Ljava/lang/String;)V

.line 364
invoke-virtual {v0, p2}, Landroid/os/Parcel;->writeString(Ljava/lang/String;)V

.line 365
invoke-virtual {v0, p3}, Landroid/os/Parcel;->writeInt(I)V

.line 366
iget-object v2, p0, Lcom/android/internal/statusbar/IStatusBarService$Stub$.....;->mRemote:Landroid/os/IBinder;

const/16 v3, 0xa

const/4 v4, 0x0

invoke-interface {v2, v3, v0, v1, v4}, Landroid/os/IBinder;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z

.line 367
invoke-virtual {v1}, Landroid/os/Parcel;->readException()V
:try_end_21
.catchall ..:try_start_8 .. :try_end_21} :catchall_28

.line 370
invoke-virtual {v1}, Landroid/os/Parcel;->recycle()V

.line 371
invoke-virtual {v0}, Landroid/os/Parcel;->recycle()V

.line 373
return-void

.line 370
:catchall_28
move-exception v2

invoke-virtual {v1}, Landroid/os/Parcel;->recycle()V

.line 371
invoke-virtual {v0}, Landroid/os/Parcel;->recycle()V

throw v2
.end method


به کد درشت توجه کنید .



const/16 v3, 0xa

const/4 v4, 0x0

invoke-interface {v2, v3, v0, v1, v4}, Landroid/os/IBinder;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z


در فایل IStatusBarService$Stub.smali کد هگز TRANSACTION_onNotificationError باید 0xa باشد
چک کنید اگر این کد نبود کد موجود رو در قسمت درشت شده وارد کنید.
یعنی اگر مثلا به جای کد 0xa کد 0xc بود شما باید کد 0xc رو در قسمت const/16 v3, 0xa وارد کنید.

2.3 اصلاح smali/com/android/internal/statusbar/IStatusBarService.smali

کد زیر رو در فایل مذکور وارد کنید .



.method public abstract onNotificationClear(Ljava/lang/String;Ljava/lang/String;I)V
.annotation system Ldalvik/annotation/Throws;
value = ..
Landroid/os/RemoteException;
}
.end annotation
.end method



تغییرات در فایل های زیر رو باید خودتون انجام بدید :
1- smali/com/android/systemui/statusbar/StatusBarService.smali
2- res/values/public.xml
بقیه فایل ها رو میتونید از فایل ضمیمه بردارید. البته کارکردن انها تضمین نمیشه .


کار شما تمام شد !
هر دو فایل رو کامپایل کنید و در رامتون جایگزین کنید. ( بکاپ رو که فراموش نکردین )


دانلود فایل های ضمیمه :
SystemUI-file (http://www.mediafire.com/?3c3e4y6hp61kae9)
Framework-file (http://www.mediafire.com/?eph4qhr3e84u68k)

منبع این مطلب سایت Xda میباشد ( لینک (http://forum.xda-developers.com/showthread.php?t=1483193) ) و توسط بنده Pourya-Man به فارسی ترجمه شده است . این مود بر روی رام من Pourya-Na (http://forum.mobilestan.net/showthread.php?t=211785) تست شده و در سه انجمن قرار داده شده است . کپی برداری از این مطلب بدون ذکر نام انجمن و کاربر (کپی رایت که نداریم ) شرعا حرام بوده و بند رضایتی در این مورد ندارم.

MEHRDAD_ts
13-05-2012, 08:21
انجامش دادم(3بار.دقیق دقیق!)
اما نمیدونم مشکل از کجاست ک تا گوشی رو روشن میکنم ارور fc میده برای statusbar!!!!!

GenomeX
13-05-2012, 08:54
انجامش دادم(3بار.دقیق دقیق!)
اما نمیدونم مشکل از کجاست ک تا گوشی رو روشن میکنم ارور fc میده برای statusbar!!!!!

anim ها به درستس تعریف شده؟
آیا فایل framework.jar رو درست ویرایش کردید؟
مورد دوم خیلی مهم هست.

MEHRDAD_ts
13-05-2012, 10:20
آره
بار اول رو اشتباه کرده بودم و استاتوس بار بود ولی سویپ کار نمیکرد.
ولی بار دوم و سوم ارور fc میداد!
منف کر میکنم ک این قسمت نیاز به ویرایش داره تو گوشی من!
ممکن است کدها در دیوایس های مختلف فرق کنه بنابراین شما کدها رو خودتون با کدهای دیوایستون انطباق بدید

GenomeX
13-05-2012, 10:53
قسمت زیر رو یکبار دیگه به سبک دیگه میگم ببین جواب میده:
1.6 اصلاح smali/com/android/systemui/statusbar/StatusBarService.smali
... کد زیر رو در متد بالا پیدا کنید

invoke-virtual {v0, v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;

move-result-object v18

const v4, 0x7f0b0014

move-object/from16 v0, v18

move v1, v4

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v10
من به این شکل ویرایش کردم این مدل رو هم تست کن (متد ایمان جان line تعریف شده و خوب احتمالاً با line فایلهای شما تداخل دارد ولی این مدل .line تعریف نشده.)

کد های درشت رو به کد بالا اضافه کنید .

invoke-virtual {v0, v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;

move-result-object v18

check-cast v18, Lcom/android/systemui/statusbar/LatestItemContainer;

move-object/from16 v0, v16

iget v0, v0, Landroid/app/Notification;->flags:I

move v4, v0

and-int/lit8 v4, v4, 0x2

if-nez v4, :cond_1

move-object/from16 v0, v16

iget v0, v0, Landroid/app/Notification;->flags:I

move v4, v0

and-int/lit8 v4, v4, 0x20

if-nez v4, :cond_1

new-instance v4, Lcom/android/systemui/statusbar/StatusBarService$7;

move-object v0, v4

move-object/from16 v1, p0

move-object/from16 v2, p1

invoke-direct {v0, v1, v2}, Lcom/android/systemui/statusbar/StatusBarService$7;-><init>(Lcom/android/systemui/statusbar/StatusBarService;Lcom/android/internal/statusbar/StatusBarNotification;)V

move-object/from16 v0, v18

move-object v1, v4

invoke-virtual {v0, v1}, Lcom/android/systemui/statusbar/LatestItemContainer;->setOnSwipeCallback(Ljava/lang/Runnable;)V

const v4, 0x7f0b0014

move-object/from16 v0, v18

move v1, v4

invoke-virtual {v0, v1}, Lcom/android/systemui/statusbar/LatestItemContainer;->findViewById(I)Landroid/view/View;

move-result-object v10


در بخش اصلاح framework.jar
بخش 4 برای ایمان line176 هست فرض میکنیم برای شما line168 بود در اون قسمت که گفته:

اگه بود که به شکل زیر تغییر بدید و اگر نبود کد زیر رو واردش کنید.
هر جا ایمان زده 177 (یعنی شماره لاین یکی رفته بالا) شما بزن 169 (یعنی به آخرین لاینت یکی اضافه کن )اگه زده 178 شما بزن 169 و الا آخر ...

تست کن ببین جواب میده. البته گوشی با گوشی فرق میکنه آموزشش که در xda بود برای htc و samsung فرق میکرد. آموزش اصلی در فروم sonyerricson بود

MEHRDAD_ts
16-05-2012, 13:36
این روش رو هم تست کردم.همچنان fc !!! :((((

+POURYA
16-05-2012, 17:15
شما انیمیشن ها رو تعریف کن مرحله 1.2 رو هم انجام بده بقیه رو از ضمیمه بردار ببین چی میشه
در ضمن فریمورک رو فعلا کاری ندارشته باش تا استاتوس راه بیوفته