2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file PhnTabLogsItemProvider.cpp
19 * @brief Call log item provider
22 #include <FGraphics.h>
24 #include <FUiControl.h>
30 #include "PhnAppUtility.h"
31 #include "PhnCommonUtils.h"
32 #include "PhnSettingsConstants.h"
33 #include "PhnTabLogsItemProvider.h"
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::App;
39 using namespace Tizen::Graphics;
40 using namespace Tizen::Locales;
41 using namespace Tizen::Media;
42 using namespace Tizen::Social;
43 using namespace Tizen::System;
45 const int MAX_TWELVEHOUR_FORMAT = 12;
46 const int MAX_TWELVEHOUR_FORMAT_LENGTH = 8;
47 const int H_LOG_ITEM = 128;
48 const int H_LOG_ITEM_TEXT = 50;
49 const int W_LOG_ITEM_TEXT = 50;
50 const int LOG_ITEM_FONT_SIZE = 32;
52 const wchar_t* IDS_MSG_CONTEXT_ITEM = L"IDS_MSG_BTN_NAME";
53 const wchar_t* IDS_VIDEO_CALL_CONTEXT_ITEM = L"IDS_VIDEO_CALL_BTN_NAME";
54 const wchar_t* IDS_VOICE_CALL_CONTEXT_ITEM = L"IDS_VOICE_CALL_BTN_NAME";
56 CustomDataProvider::CustomDataProvider(void)
58 __isEditStyle = false;
60 __pAddressBook = new (std::nothrow) Addressbook();
61 __pAddressBook->Construct();
62 __pItemContext = new ListContextItem();
63 __pItemContext->Construct();
64 String voiceCallStr = AppUtility::GetResourceString(IDS_VOICE_CALL_CONTEXT_ITEM);
65 __pItemContext->AddElement(IDA_LIST_ELEMENT_CALL, voiceCallStr);
66 String messageStr = AppUtility::GetResourceString(IDS_MSG_CONTEXT_ITEM);
67 __pItemContext->AddElement(IDA_LIST_ELEMENT_MESSAGE, messageStr);
68 String videoCallStr = AppUtility::GetResourceString(IDS_VIDEO_CALL_CONTEXT_ITEM);
69 __pItemContext->AddElement(IDA_LIST_ELEMENT_VIDEO_CALL, videoCallStr);
70 String delStr = AppUtility::GetResourceString(IDS_DELETE_BTN_STRING);
71 __pItemContext->AddElement(IDA_LIST_ELEMENT_DELETE, delStr);
75 CustomDataProvider::~CustomDataProvider(void)
77 ArrayList* pCalllogList = null;
78 GroupItemClass* pGroupInfo = null;
80 if(__pGroupData != null)
82 for(int index = 0; index < __pGroupData->GetCount(); index++)
84 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(index));
86 if(pGroupInfo != null)
88 pCalllogList = pGroupInfo->GetLogData();
89 if(pCalllogList != null)
91 AppLog(" data cnt = %d", pCalllogList->GetCount());
92 pCalllogList->RemoveAll(true);
101 __pGroupData->RemoveAll(false);
105 if(__pAddressBook != null)
107 delete __pAddressBook;
109 if (__pItemContext != null)
111 delete __pItemContext;
112 __pItemContext = null;
116 GroupItemClass::GroupItemClass()
121 GroupItemClass::~GroupItemClass()
130 GroupItemClass::SetTitleText(String titleText)
132 __titleText = titleText;
136 GroupItemClass::SetLogData(ArrayList* pData)
142 GroupItemClass::GetTitleText(void)
148 GroupItemClass::GetLogData(void)
155 CustomDataProvider::GetItemAtGroupIndex(int groupIndex, int itemIndex, CallLogDetails** pCalllogDetails)
157 if(__pGroupData != null)
159 GroupItemClass* pGroupInfo = null;
160 ArrayList* list = null;
161 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(groupIndex));
162 if(pGroupInfo != null)
164 list = pGroupInfo->GetLogData();
165 *pCalllogDetails = static_cast<CallLogDetails*>(list->GetAt(itemIndex));
171 CustomDataProvider::DeleteItemAtGroupIndex(int groupIndex, int itemIndex)
173 if(__pGroupData != null)
175 GroupItemClass* pGroupInfo = null;
176 ArrayList* list = null;
177 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(groupIndex));
178 if(pGroupInfo != null)
180 list = pGroupInfo->GetLogData();
181 list->RemoveAt(itemIndex,true);
187 CustomDataProvider::DeleteAllItems(void)
189 ArrayList* pCalllogList = null;
190 GroupItemClass* pGroupInfo = null;
191 if(__pGroupData != null)
193 for(int index = 0; index < __pGroupData->GetCount(); index++)
195 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(index));
197 if(pGroupInfo != null)
199 pCalllogList = pGroupInfo->GetLogData();
200 if(pCalllogList != null)
202 AppLog(" data cnt = %d", pCalllogList->GetCount());
203 pCalllogList->RemoveAll(true);
212 __pGroupData->RemoveAll(false);
219 CustomDataProvider::GetCurrentDateTime(DateTime& dt)
222 LocaleManager localManager;
223 result r = E_FAILURE;
226 r = SystemTime::GetCurrentTime(UTC_TIME, dtNow);
231 localManager.Construct();
232 tz = localManager.GetSystemTimeZone();
233 dt = tz.UtcTimeToWallTime(dtNow);
239 CustomDataProvider::IsGroupPresent(GroupItemClass* group)
245 GroupItemClass* pGroupInfo = null;
246 for(int index = 0; index < __pGroupData->GetCount(); index++)
248 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(index));
249 if(pGroupInfo == null)
255 title1 = group->GetTitleText();
256 title2 = pGroupInfo->GetTitleText();
257 if( title1.CompareTo(title2) == 0)
266 CustomDataProvider::GetGroupWithTitle(String title)
268 GroupItemClass* pGroupInfo = null;
269 for(int index = 0; index < __pGroupData->GetCount(); index++)
271 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(index));
272 if(pGroupInfo == null)
276 String title1 = pGroupInfo->GetTitleText();
277 if( title.CompareTo(title1) == 0)
286 CustomDataProvider::GetDaysDifferenceBetweenDates(DateTime date1, DateTime date2)
288 if(date1.GetYear() == date2.GetYear())
290 if(date1.GetMonth() == date2.GetMonth())
292 int days = date2.GetDay() - date1.GetDay();
305 int daysDifference = 0;
306 for(;mIndex < date1.GetMonth(); mIndex++)
308 DateTime::GetDaysInMonth(date1.GetYear(), mIndex, daysInMonth);
309 days1 += daysInMonth;
311 days1 += date1.GetDay();
314 for(;mIndex < date2.GetMonth(); mIndex++)
316 DateTime::GetDaysInMonth(date2.GetYear(), mIndex, daysInMonth);
317 days2 += daysInMonth;
319 days2 += date2.GetDay();
320 daysDifference = days2 - days1;
321 AppLog(" days %d %d %d", days1, days2, daysDifference);
322 return daysDifference;
325 TimeSpan t1 = date1.GetTimeOfDay();
326 TimeSpan t2 = date2.GetTimeOfDay();
331 CustomDataProvider::CreateGroupItems(void)
333 result r = E_FAILURE;
334 DateTime currentTime;
336 GroupItemClass* pGroupItemClass = null;
337 CallLogManager* pManager = CallLogManager::GetInstance();
338 CallLogDetails* pCalllogInfo = null;
339 ArrayList* data = null;
342 if(__pGroupData != null)
344 ArrayList* pCalllogList = null;
345 GroupItemClass* pGroupInfo = null;
346 for(int index = 0; index < __pGroupData->GetCount(); index++)
348 pGroupInfo = static_cast<GroupItemClass*>(__pGroupData->GetAt(index));
350 if(pGroupInfo != null)
352 pCalllogList = pGroupInfo->GetLogData();
353 if(pCalllogList != null)
355 pCalllogList->RemoveAll();
363 __pGroupData->RemoveAll();
367 __pGroupData = new(std::nothrow) ArrayList();
368 if(__pGroupData == null)
372 r = __pGroupData->Construct();
381 int logCount = pManager->GetAllCalllogCount();
383 GetCurrentDateTime(todaysDate);
384 //todaysDate.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay());
386 DateTime calllogDate = todaysDate;
388 for(int index = 0; index < logCount; index++)
394 pCalllogInfo = new (std::nothrow) CallLogDetails();
395 pManager->GetCallLogItemAtIndex(index ,*pCalllogInfo);
396 pCalllogInfo->ConvertTimetoDateTime();
397 calllogDate = pCalllogInfo->GetDateTime();
398 AppLog(" info %d %d %d %s %d:%d:%d", key, pCalllogInfo->GetCalllogType(), pCalllogInfo->GetDuration(), pCalllogInfo->GetPhoneNumber(), calllogDate.GetYear(), calllogDate.GetMonth(), calllogDate.GetDay());
401 pGroupItemClass = new(std::nothrow) GroupItemClass();
402 if(pGroupItemClass == null)
407 int days = GetDaysDifferenceBetweenDates(calllogDate , todaysDate);
410 title.Append(L"Today");
414 title.Append(L"Yesterday");
418 title.Format(30,L"%d/%d/%d",calllogDate.GetDay(), calllogDate.GetMonth(), calllogDate.GetYear());
420 pGroupItemClass->SetTitleText(title);
422 //Group already present
423 if(IsGroupPresent(pGroupItemClass) == true)
425 //Delete the created temp group class. Use the already existing group class variable from __pGroupData.
426 if(pGroupItemClass != null)
428 delete pGroupItemClass;
429 pGroupItemClass = null;
431 GroupItemClass* pGroup = GetGroupWithTitle(title);
432 data = pGroup->GetLogData();
435 data = new ArrayList();
438 data->Add(*pCalllogInfo);
439 pGroup->SetLogData(data);
443 //Group not present in __pGroupData. So add this group
444 __pGroupData->Add(*pGroupItemClass);
445 data = pGroupItemClass->GetLogData();
448 data = new ArrayList();
451 data->Add(*pCalllogInfo);
452 pGroupItemClass->SetLogData(data);
458 CustomDataProvider::GetGroupCount(void)
461 if(__pGroupData != null)
463 return __pGroupData->GetCount();
469 CustomDataProvider::GetItemCount(int groupIndex)
471 GroupItemClass* group = null;
472 if(__pGroupData != null)
474 group = static_cast<GroupItemClass*>(__pGroupData->GetAt(groupIndex));
477 return (group->GetLogData())->GetCount();
484 CustomDataProvider::CreateGroupItem(int groupIndex, int itemWidth)
486 AppResource* pAppResource = App::GetInstance()->GetAppResource();
487 GroupItem* pItem = new GroupItem();
488 pItem->Construct(Dimension(itemWidth, 48));
490 String appPath = (Application::GetInstance())->GetAppRootPath();
491 Bitmap* pBitmap = null;
492 pBitmap = pAppResource->GetBitmapN(IDB_CALLOG_LIST_BG,BITMAP_PIXEL_FORMAT_ARGB8888);
494 GroupItemClass* group = null;
495 if(__pGroupData != null)
497 group = static_cast<GroupItemClass*>(__pGroupData->GetAt(groupIndex));
500 pItem->SetElement(group->GetTitleText(), pBitmap);
511 CustomDataProvider::CreateItem(int groupIndex, int itemIndex, int itemWidth)
513 GroupItemClass* pGroup = null;
514 ArrayList* pCalllogList = null;
515 CallLogDetails* pCalllogData = null;
516 String phoneNumber(AppUtility::GetResourceString(IDS_CALLLOG_NO_NUMBER));
517 String contactName(AppUtility::GetResourceString(IDS_CALLLOG_NO_NAME));
518 DateTime calllogDate;
519 String dateText(L"");
520 String key(L"24HourFormatSelected");
522 bool dateFormat24 = true;
523 Bitmap* pBitmap = null;
524 AppResource* pAppResource = App::GetInstance()->GetAppResource();
526 if(__pGroupData != null)
528 pGroup = static_cast<GroupItemClass*>(__pGroupData->GetAt(groupIndex));
531 pCalllogList = pGroup->GetLogData();
532 if(pCalllogList != null)
534 AppLog(" data cnt = %d", pCalllogList->GetCount());
535 pCalllogData = static_cast<CallLogDetails*>(pCalllogList->GetAt(itemIndex));
540 if(pCalllogData == null)
546 if(pCalllogData->GetPhoneNumber() != null)
548 phoneNumber = pCalllogData->GetPhoneNumber();
551 CallLogManager* pManager = CallLogManager::GetInstance();
552 pManager->GetCalllogContactName(phoneNumber,contactName);
553 pCalllogData->ConvertTimetoDateTime();
554 calllogDate = pCalllogData->GetDateTime();
555 int hour = calllogDate.GetHour();
556 SettingInfo::GetValue(key, dateFormat24);
558 if (dateFormat24 == false)
560 if (hour > MAX_TWELVEHOUR_FORMAT)
562 hour -= MAX_TWELVEHOUR_FORMAT;
563 amPm.Append(AppUtility::GetResourceString(IDS_PM_TIME));
565 else if (hour < MAX_TWELVEHOUR_FORMAT)
567 amPm.Append(AppUtility::GetResourceString(IDS_AM_TIME));
569 else if (hour == MAX_TWELVEHOUR_FORMAT)
571 amPm.Append(AppUtility::GetResourceString(IDS_PM_TIME));
573 dateText.Format(MAX_TWELVEHOUR_FORMAT_LENGTH,L"%02d:%02d%ls", hour, calllogDate.GetMinute(), amPm.GetPointer());
577 dateText.Format(MAX_TWELVEHOUR_FORMAT_LENGTH,L"%02d:02%d", calllogDate.GetHour(), calllogDate.GetMinute());
581 ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL;
582 EnrichedText* text = new (std::nothrow) EnrichedText();
583 TextElement* textElement = new (std::nothrow) TextElement();
585 String appPath = (Application::GetInstance())->GetAppRootPath();
587 CustomItem* pItem = new (std::nothrow) CustomItem();
589 if (__isEditStyle == true)
591 style = LIST_ANNEX_STYLE_MARK;
594 pItem->Construct(Dimension(itemWidth, H_LOG_ITEM), style);
595 pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, Color::GetColor(COLOR_ID_WHITE));
596 pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, Color::GetColor(COLOR_ID_WHITE));
597 pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, Color::GetColor(COLOR_ID_WHITE));
599 if (__isEditStyle == false)
601 pItem->AddElement(Rectangle(X_TEXT_LINE1_ITEM, Y_TEXT_LINE1_ITEM, W_TEXT_LINE1_ITEM, H_TEXT_LINE1_ITEM), ID_NAME_STRING, contactName,44, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true);
602 pItem->AddElement(Rectangle(X_TEXT_LINE2_ITEM, Y_TEXT_LINE2_ITEM, W_TEXT_LINE2_ITEM, H_TEXT_LINE2_ITEM), ID_NUMBER_STRING, phoneNumber, 32, Color::GetColor(COLOR_ID_GREY), Color::GetColor(COLOR_ID_GREY), Color::GetColor(COLOR_ID_GREY), true);
606 pItem->AddElement(Rectangle(X_TEXT_LINE1_ITEM, Y_TEXT_LINE1_ITEM, W_TEXT_LINE1_ITEM - 76, H_TEXT_LINE1_ITEM), ID_NAME_STRING, contactName, 44, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true);
607 pItem->AddElement(Rectangle(X_TEXT_LINE2_ITEM, Y_TEXT_LINE2_ITEM, W_TEXT_LINE2_ITEM - 76, H_TEXT_LINE2_ITEM), ID_NUMBER_STRING, phoneNumber, 32, Color::GetColor(COLOR_ID_GREY), Color::GetColor(COLOR_ID_GREY), Color::GetColor(COLOR_ID_GREY), true);
610 text->Construct(Dimension(W_LOG_ITEM_TEXT, H_LOG_ITEM_TEXT));
611 text->SetHorizontalAlignment(TEXT_ALIGNMENT_RIGHT);
612 text->SetVerticalAlignment(TEXT_ALIGNMENT_BOTTOM);
613 font.Construct(FONT_STYLE_PLAIN, LOG_ITEM_FONT_SIZE);
614 textElement->Construct(dateText);
615 textElement->SetFont(font);
616 textElement->SetTextColor(Color::GetColor(COLOR_ID_GREY));
617 text->Add(*textElement);
618 if (__isEditStyle == false)
620 pItem->AddElement(Rectangle(X_TEXT_TIME_ITEM, Y_TEXT_TIME_ITEM, W_TEXT_TIME_ITEM, H_TEXT_TIME_ITEM), ID_TIME_STRING, *text);
624 pItem->AddElement(Rectangle(X_TEXT_TIME_ITEM - 76, Y_TEXT_TIME_ITEM, W_TEXT_TIME_ITEM, H_TEXT_TIME_ITEM), ID_TIME_STRING, *text);
629 if (__isEditStyle == false)
631 pItem->AddElement(Rectangle(X_CONTACT_BITMAP_ITEM, Y_CONTACT_BITMAP_ITEM, W_CONTACT_BITMAP_ITEM, H_CONTACT_BITMAP_ITEM), ID_CONTACT_BITMAP, *pBitmap);
635 pItem->AddElement(Rectangle(X_CONTACT_BITMAP_ITEM - 76, Y_CONTACT_BITMAP_ITEM, W_CONTACT_BITMAP_ITEM, H_CONTACT_BITMAP_ITEM), ID_CONTACT_BITMAP, *pBitmap);
641 switch(pCalllogData->GetCalllogType())
643 case CALL_LOG_TYPE_VOICE_INCOMING:
645 pBitmap = pAppResource->GetBitmapN(IDB_LOG_RECEIVEDCALL_ICON ,BITMAP_PIXEL_FORMAT_ARGB8888);
649 case CALL_LOG_TYPE_VOICE_OUTGOING:
651 pBitmap = pAppResource->GetBitmapN(IDB_LOG_DIALEDCALL_ICON ,BITMAP_PIXEL_FORMAT_ARGB8888);
654 case CALL_LOG_TYPE_VOICE_REJECTED:
655 case CALL_LOG_TYPE_VOICE_MISSED:
657 pBitmap = pAppResource->GetBitmapN(IDB_LOG_MISSEDCALL_ICON ,BITMAP_PIXEL_FORMAT_ARGB8888);
660 case CALL_LOG_TYPE_VOICE_BLOCKED:
662 pBitmap = pAppResource->GetBitmapN(IDB_LOG_BLOCKEDCALL_ICON ,BITMAP_PIXEL_FORMAT_ARGB8888);
667 pBitmap = pAppResource->GetBitmapN(IDB_LOG_MISSEDCALL_ICON ,BITMAP_PIXEL_FORMAT_ARGB8888);
674 pItem->AddElement(Rectangle(X_CALLTYPE_BITMAP_ITEM, Y_CALLTYPE_BITMAP_ITEM, W_CALLTYPE_BITMAP_ITEM, H_CALLTYPE_BITMAP_ITEM), ID_CALLTYPE_BITMAP, *pBitmap);
678 if (__isEditStyle == false)
680 pItem->SetContextItem(__pItemContext);
688 CustomDataProvider::DeleteItem(int groupIndex, int itemIndex, ListItemBase* pItem, int itemWidth)
696 CustomDataProvider::DeleteGroupItem(int groupIndex, GroupItem* pItem, int itemWidth)
704 CustomDataProvider::SetListItemStyle(bool mode)
706 __isEditStyle = mode;