短信模块一些bug的修改

1、找到Mms的起始activity

短信模块的路径packages/apps/Mms包括短信和彩信。找到AndroidManifest.xml搜索“.MAIN”

找得到同时有

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.LAUNCHER" />

(包含这两个属性的activity都会在主菜单上创建快捷图标)

两个属性的filter,如:

<intent-filter>

                <actionandroid:name="android.intent.action.MAIN" />

                <categoryandroid:name="android.intent.category.DEFAULT" />

                <categoryandroid:name="android.intent.category.LAUNCHER" />

</intent-filter>

然后找到包含这个filter的 activity ”.ui.ConversationList”,按ctrl+shift+R搜索文件ConversationList.java这样就找到点击短信的第一个activity。

2、一些bug修改:

    短信列表条数超过一屏时,点击进入查看界面再退出时,列表显示的第一条重新变为了零。

修改用到的函数:

ListView:

getFirstVisiblePosition()获取第一项的位置;

getChildAt(0).getTop() 获取第一项的顶点坐标;

setSelectionFromTop(pos,topoffset) 设置listview的位置,第一个参数是列表中第一项的位置,第二个参数是第一项的顶点坐标。

通过这个三个函数可以在listview失去焦点后保存listview的位置状态,在获得焦点时还原。

 

代码中的实现:

首先定义两个变量用来保存离开列表界面时的第一项位置和偏移量(第一项y坐标相对与0的偏移量)

private intcurListPos = 0;

private inttopOffset = 0;

在点击选项的时候保存这两个值:

protected void onListItemClick(ListView l, View v, int position, long id){

        if (position == 0) {

…………………………

            curListPos = 0;

            topOffset = 0;

        } else {

            …………………………

            curListPos =listView.getFirstVisiblePosition();

            topOffset =listView.getChildAt(0).getTop();

        }

}

在重回列表的时候设置listview的值:

  这个函数会在异步查询线程mQueryHandler查询完成的时候调用

        protectedvoid onQueryComplete(int token, Object cookie, Cursor cursor) {

           switch (token) {

           case THREAD_LIST_QUERY_TOKEN:

               mListAdapter.changeCursor(cursor);

                if(listView != null &&curListPos < listView.getCount()){

                    listView.setSelectionFromTop(curListPos,topOffset);

                }

            ……………………

把短信上限数量改小,回到列表界面,显示的条数没有刷新(之前没超出上限的现在超出了但是列表没更新)

用到的函数:

         是否设置了自动删除

         Recycler.isAutoDeleteEnabled(ConversationList.this)

    删除多出的彩信

Recycler.getMmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));

删除多出的短信

Recycler.getSmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));

代码实现:

    定义变量用于保存短信和彩信的上限减少的状态

        private static int limitHasDecrescent = 0;

        public static final intSMS_HAS_DECRESCENT_FLAG = 1;

        public static final intMMS_HAS_DECRESCENT_FLAG = 2;

    定义设置状态的函数

        publicstatic void setLimitHasDecrescent(int smsFlag,int mmsFlag){

            limitHasDecrescent |= smsFlag | mmsFlag;

        }

    在设置上限是设置状态

    文件MessageingPreferenceActivity.java

NumberPickerDialog.OnNumberSetListenermSmsLimitListener =

       new NumberPickerDialog.OnNumberSetListener() {

           public void onNumberSet(int limit) {

if(limit<mSmsRecycler.getMessageLimit(MessagingPreferenceActivity.this))

{

ConversationList.setLimitHasDecrescent(ConversationList.SMS_HAS_DECRESCENT_FLAG,0);

               }

……………………

 

           }

    };

 

   NumberPickerDialog.OnNumberSetListener mMmsLimitListener =

       new NumberPickerDialog.OnNumberSetListener() {

           public void onNumberSet(intlimit)

{

if(limit<mMmsRecycler.getMessageLimit(MessagingPreferenceActivity.this)){

ConversationList.setLimitHasDecrescent(0,ConversationList.MMS_HAS_DECRESCENT_FLAG);

               }

            ……………………

            }

    };

    在回到列表时刷新:

这个函数会在异步查询线程mQueryHandler查询完成的时候调用

protected voidonQueryComplete(int token, Object cookie, Cursor cursor) {

switch (token) {

case THREAD_LIST_QUERY_TOKEN:

mListAdapter.changeCursor(cursor);

if(limitHasDecrescent> 0 && Recycler.isAutoDeleteEnabled(ConversationList.this)){

while(cursor.moveToNext()){

//获得会话在数据库中的ID

intthread_index = cursor.getColumnIndex(Threads._ID);

//是否含有附件 ,用来判断是否是彩信

inthas_att_index = cursor.getColumnIndex(Threads.HAS_ATTACHMENT);

if(-1 !=thread_index && -1 != has_att_index){

    //删除彩信

if(cursor.getInt(has_att_index)> 0 && (limitHasDecrescent & MMS_HAS_DECRESCENT_FLAG) != 0){

Recycler.getMmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));

}

//删除短信

if((limitHasDecrescent& SMS_HAS_DECRESCENT_FLAG) != 0){

Recycler.getSmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));

}

}

}

//状态置空

limitHasDecrescent =0;

}

…………………

你可能感兴趣的:(短信模块一些bug的修改)