正式备案了

一周的时间这里没法无正常登录,造成了Google下降到排名第二,哈哈,不过现在终于通过了工业与信息化部的备案.仅个人的博客的网站也要备案,网络都实行实名制的话,觉得有些违背网络最初的理念了吧.这次景安的处理还是不错的,提交修改后不久就开通了.
工作最近进入到了平稳发展期,时间管理讲的重要但不是那么紧急的事,这是最好的状态.接下来可能会做一个盲人机的项目,有盲人输入法和支持语音播放,GPS定位之类的功能.
 

通话记录与SMS中”同号删除”功能的实现

同号删除功能在VIA给的版本中没有提供,需要手工添加,实现是分别基于单条Erase,移植时需要添加新的Erase Same
Number项,这里不做讨论,可参照上一篇文档"消息分组,对话窗结构的结合-VIA 复杂消息的传递过程"

思路是首先提取当前记录,然后跟所有的记录比较,若一致则删除.程序实现复杂的地方是要遍历每个联系人的可能会有的五个号码,如其中任一一个匹配则删除此通话记录,若每个联系人都有五个号码,则两个记录比较需要遍历25轮.
程序中比较关键的几个地方用红色的标记了出来,其它的比较容易理解.
void
RecentCallAppC::OnDeleteSameNumberItem(uint32 RecId)
{
 RECENTCALL_TRACE_FUNC_ENTER(OnDeleteItem)
 RECENTCALL_TRACE_VAR(RecId)
 CallLogItemTimeC
ItemTime;
 GetRecentCallModel()->GetTimeOfCall(&ItemTime,
RecId); // To use the Title info
 GetRecentCallView()->CloseDialog(RECENT_CALL_DLG_ID_DELETE_ITEM_PROMPT,
FALSE, FALSE);
 GetRecentCallView()->CloseDialog(RECENT_CALL_DLG_ID_LIST_OPTIONS,
FALSE, FALSE);
 CallListItemT
RecIdItemInfo; //Get detail Item info from db by RecID
 GetRecentCallModel()->GetCallListItem(RecIdItemInfo,
RecId);
 uint16 Sum = 0;
 ValRcGetCountOfRecord((ValRcTypeT)VAL_RC_TYPE_ALL,
&Sum);// Get All RecID Number
 bool isAllRight;
 isAllRight=TRUE;
 for(uint16
id=0;id<=Sum;id++)
 {
    CallListItemT
ItemInfo; //Get detail Item info from db by RecID
GetRecentCallModel()->GetCallListItem(ItemInfo,
id);
    for(uint8 i=0;
i<RECENTCALL_NUM_MAX; i++)
    {
     
if(RecIdItemInfo.Other.Number[i].Len<1)
        break;
      for(uint8
j=0;j<RECENTCALL_NUM_MAX; j++)
      {
        
if(ItemInfo.Other.Number[j].Len<1)
           break;
     
if(StrCmp((char*)(RecIdItemInfo.Other.Number[i].Data),(char*)(ItemInfo.Other.Number[j].Data))==0)
        {
          
if(!GetRecentCallModel()->DeleteItem(id))
            {
              
isAllRight=FALSE;
            }
           break;
          }
        }
      }
 }
 if(isAllRight)
 {
   
GetRecentCallView()->OpenPopup(RECENT_CALL_POPUP_
ALL_CALLS_DELETED);
 }
 else
 {
    
GetRecentCallView()->OpenPopup(RECENT_CALL_POPUP_DELETE_RECORD_FAILED);
 }
 GetRecentCallView()->UpdateCallListDlg();
}
SMS中的处理整体思路是一样的,提取当前信息的号码,跟所有的信息中的号码相匹配,若一致则进行删除.要注意的是如何获取所有的短信息,包括收件箱,发件箱,草稿箱等.
int
SmsControllerC::HandleViewMsgOptionEraseALLSameNumberHintOk(uint32 MessageId,
uint32 Param)
{
 //get message
 SmsViewMsgManagerC
*ViewMsgManagerP = mModelP->GetViewMsgManager();
 UIASSERT(
!IsNull(ViewMsgManagerP) );
  SmsRecordC *SmsRecordP = ViewMsgManagerP->GetViewMsg();
     if( IsNull(SmsRecordP) )
      {
        return
-1;
  }
     AslSmsRecordIdT
RecordId = SmsRecordP->GetRecordId();
    SmsRecordC
SmsRecordPresent;
   
AslSmsReadMessage(SmsRecordPresent, RecordId);
    SmsAddressC
SmsAddressPresent;
   
SmsRecordPresent.GetSmsAddress(SmsAddressPresent);
    StringC
StrNumberPresent;
   
SmsAddressPresent.ToDigital(StrNumberPresent);
   //erase message
    AslSmsResultT Result
;
    for(int
typeI=0;typeI<5;typeI++)
    {
      SmsRecordListC *
smslist = NULL;
     
smslist=ViewMsgManagerP->GetRecordList((SmsRecordListTypeT)typeI);
//0~4
inbox,sentbox,outbox,draft…
      uint16 Count
=smslist->GetCount();
      //find a message to
delete
      for(uint16
i=Count;i>0;–i)
      {
        uint16
RecordId;
        if(
smslist->GetData(i-1, RecordId) )
        {
          //don’t delete
locked message
          if(
AslSmsIsMessageLocked(RecordId) )
          {
           
continue;
          }
            SmsRecordC
SmsRecord;
           
AslSmsReadMessage(SmsRecord, RecordId);
            SmsAddressC
SmsAddress;
           
SmsRecord.GetSmsAddress(SmsAddress);
                 StringC
StrNumber;
           
SmsAddress.ToDigital(StrNumber);
            
if(StrNumberPresent==StrNumber)
              {
                  Result =
AslSmsDeleteMessage(RecordId);
              }
        }
      }
    }
   if( Result !=
ASLSMS_RESULT_SUCCESS )
   {
    
OpenPopup(APPSMS_DIALOGID_POPUP_VIEW_MSG_MSG_ERASE_FAILED);
     return 0;
   }
  
OpenPopup(APPSMS_DIALOGID_POPUP_VIEW_MSG_MSG_ERASE_SUCCESS);
   //close view message
dialog
  
CloseDialog(APPSMS_DIALOGID_VIEW_MSG_DISPLAY);
   //update view
  
UpdateListMsgDialogAfterView();
   //update
softicon
  
GetView()->UpdateAlert();
 MessageId = 0;
 Param = 0;
 return 0;
}
这样删除有一个问题是,如通话记录或短信息很多,则这样遍历的的速度会不会令用户难以接受,还要进一步评估,若有更好的算法来实现,可以相互交流下:)

 

VIA 冲突管理 (selle)

  VIA平台中,有很多冲突的情况,如电话时来短信,或闹钟;播放MP3或MP4时来电话或短信,此时就要处理其冲突事件的优先级,来达到希望的处理顺序.

以此为例:当像录像的时候,如果此时闹铃响起或来新短信,录像则会停止并且退出.现在想让它继续录像,只是有一声提示,录像结束后给出提示.
查看Camera的代码:
int32
CameraAppC::
OnSuspend()
{
 GetCameraMode()->CameraSuspend();
 return 0;
}
int32
CameraAppC::OnResume()
{
 GetCameraMode()->CameraResume();
 return 0;
}
void
CameraAppC::
OnEventSuspend(uint32 Event, int32 RunBackground)
{
 Event = Event;
 RunBackground =
RunBackground;
 GetCameraMode()->CameraExit();
}
void
CameraAppC::OnEventResume(uint32 Event, int32 Param)
{
 Event = Event;
 Param = Param;
 GetCameraMode()->CameraResume();
}
闹铃响起时,应该是触发了 OnEventSuspend () ,
即使我屏蔽掉了OnEventSuspend,闹铃依旧会响起,只是没有打断当前录相,并且退出后,闹铃己经响过.
后来资讯VIA的郑工(师傅:)
,VIA有自己的冲突管理优先级顺序,客户可调,在uiconflictmanager.cpp的ConflictTable中定义:如下
 CONFILICT_EVENT_CAMERA,        
CONFLICT_EVENT_VOICE_CALL,      CONFLICT_ACTION_C,
 CONFILICT_EVENT_CAMERA,         CONFLICT_EVENT_ALARM,           CONFLICT_ACTION_C,
 CONFILICT_EVENT_CAMERA,        
CONFLICT_EVENT_CALENDAR,        CONFLICT_ACTION_C,
如第二行,当前是在CAMERA拍照或录像的时候,来了ALARM,则执行的测略为CONFLICT_ACTION_C,见其定义:
 CONFLICT_ACTION_A,         
// Continue processing FirstEvent,
                             
// notify and not process SecondEvent
 CONFLICT_ACTION_B,         
// Continue processing FirstEvent,
                             
// process SecondEvent in background
CONFLICT_ACTION_C,         
// Suspend FirstEvent,
                             
// process SecondEvent in foreground
不难看出,若改为CONFLICT_ACTION_A则出现预期的状态.
PS:Uiconflictmanager
是如何跟据这个表,来决定是否调用OnEventSuspend()VIA又是如何在中断后恢复操作OnEventResume()的,下回分解…

 

Application Architecture Guide 2.0

       "P&P(设计模式与最佳实践,patterns &
practices
)自2002年推出第一个.NET项目分层架构图至今已经6年多,面对服务化、移动及智能化、富浏览器客户端、P2P应用的需求,原有架构需要结合.NET最新的技术进一步细化,这样才能为架构师和开发人员提供更好的指导作用,近期微软P&P团队启动了应用架构指南(Application Architect
Guide
)V2.0项目。"

    在这里己经有CTP版的PDF格式下载。
       
在这里有更多介绍:
 http://msdn.microsoft.com/en-us/practices/default.aspx

     对于从事.net架构开发者一定会喜欢看的一本书吧,正在浏览中,以下转载一点介绍:
这是一本讲述在.NET Framework上设计应用架构时需要遵循的原则、模式及实践的书。其读者定位在解决方案架构师和开发经理。
  1. 第一部分“基本原则”介绍了理解架构设计技术和策略所需的基本原则。

     
  2. 第二部分“设计”介绍了可用于任何应用类型或应用层的拱形设计方案和最佳实践,包括如何为服务设计通信和计划。

     
  3. 第三部分“层”介绍了架构与设计方法以及每一层的最佳实践,包括展示层、业务层、服务层和数据访问层。

     
  4. 第四部分“质量品质”介绍了关于质量品质的详细指南,如安全、性能等。

     
  5. 第五部分“原型——设计与模式”介绍了针对每种应用类型原型的模式与设计框架,包括服务应用、Web应用、富客户端应用、富Internet应用及移动应用。
根据patterns & practices的首席程序经理及合作者J.D. Meyer所述,这本书通过以下内容为大家带来帮助
  1. 为应用选择正确的架构
  2. 选择正确的技术
  3. 为关键的工程决策作出更有效的选择
  4. 映射恰当的策略和模式
  5. 映射相关的模式&实践解决方案
该指南考虑到了如下因素:应用类型、架构风格、架构框架、场景、质量品质及需求/约束

 

请把关于VIA的问题发表在VIAET里

最近又认识很多做VIA上层的朋友们,真的很开心,但问题也随之而来,在公司工作很忙,上班时间跟大家讨论问题不是很方便,所以大家可以把自己的经验,问题发到VIAET里,把问题描述的越清楚越好,相信包括我在内的广大VIA志士同仁都会很乐意帮助你的:)