contactscalllog

How to load call logs faster like other apps and display like attached image


call history should display like this is and delete on long-press according to its count

The Following query load call logs of current month from the device, for me, it's taking 2.5 to 3.5 seconds to load complete and store into sq-lite database

CallLogHelper Class

      public static Cursor getAllCallLogs(ContentResolver cr) {
          String[] PROJECTION = new String[]{
            CallLog.Calls.NUMBER,
            CallLog.Calls._ID,
            CallLog.Calls.CACHED_NAME,
            CallLog.Calls.DATE,
            CallLog.Calls.TYPE,
            CallLog.Calls.DURATION};
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MONTH, -1);
    Date weekBefore = calendar.getTime();
    String strClause = CallLog.Calls.DATE + " >= ?";
    String[] strValues = {String.valueOf(weekBefore.getTime())};
    String strOrder = CallLog.Calls.DATE + " DESC limit 500";
    Cursor curCalls = cr.query(CallLog.Calls.CONTENT_URI, PROJECTION, strClause,
            strValues, strOrder);
    return curCalls;  }

CallLogLoaderServicel class Here I am making some database operations with call logs, for the execution of code it's taking 7 s with PHOTO_URI which is loading from another cursor and without PHOTO_URI taking 2/3 seconds but still it taking 2/3 seconds and its more.

club_id is a common id for the sequential call made for particular number with the help of club_id I am making count while deleting on long-press I am taking grouped logs and its ID to delete from DB as well as from device.

private void setCallLogs(Cursor curLog) {
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
    logsqLiteDatabase.beginTransaction();
    for (curLog.moveToLast(); !curLog.isBeforeFirst(); curLog.moveToPrevious()) {
        String callNumber = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.NUMBER));
        callNumber = Utilities.correctNumber(callNumber);
        String ids = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls._ID));

        String name = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.CACHED_NAME));

        String callname = "Unknown";
        try {
            if (name != null)
                callname = name;

        } catch (Exception e) {
            e.printStackTrace();
        }


        String callType = curLog.getString(curLog
                .getColumnIndex(CallLog.Calls.TYPE));

        String duration = "";

        ***//with pic 7 second
        //withought pic uri 5/6 second***

        String photoUri = "";
      /*  if (callNumber != null) {
            photoUri = Utilities_dialer.getContactPhoto(this, callNumber);
        }*/

        String dateString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                .format(new Date(Long
                        .parseLong(curLog.getString(curLog.getColumnIndex(CallLog.Calls.DATE)))));

        if (log_db_Handler.getLogCount() == 0) {
            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                    , duration, String.valueOf(count), todayis, "1");

        } else {
            Cursor readContact = log_db_Handler.readLastCallLogs();
         //   if (readContact.moveToLast()) {
                String phone = readContact.getString(readContact.getColumnIndex(DatabaseHandler.KEY_PH_NO));

                if (phone.equals(callNumber.replace(" ", ""))) {
                    String type = readContact.getString(readContact.getColumnIndex(DatabaseHandler.KEY_TYPE));

                    club_id = readContact.getString(readContact.getColumnIndex(DialerDatabaseHandler.KEY_CLUB_ID));
                    int c_id = Integer.parseInt(club_id);
                    if (type.equals(callType)) {

                        log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                    } else {

                        if (type.equals("3") && (callType.equals("10") || callType.equals("2") || callType.equals("1"))) {

                            c_id = c_id + 1;

                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        } else if ((type.equals("10") || type.equals("2") || type.equals("1")) && callType.equals("3")) {

                            c_id = c_id + 1;

                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        } else {


                            log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                                    , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                        }
                    }

                } else {
                    club_id = readContact.getString(readContact.getColumnIndex(DialerDatabaseHandler.KEY_CLUB_ID));
                    int c_id = Integer.parseInt(club_id);
                    c_id = c_id + 1;
                    log_db_Handler.addDialerLog(callname, callNumber, callType, ids, photoUri, dateString
                            , duration, String.valueOf(count), todayis, String.valueOf(c_id));

                }
           // }
            readContact.close();

        }
    }
    logsqLiteDatabase.setTransactionSuccessful();
    logsqLiteDatabase.endTransaction();
    curLog.close();
    endTime = System.currentTimeMillis();
    long MethodeDuration = (endTime - startTime);
    Log.e("MethodeDuration", "-log-" + MethodeDuration);

    Intent intent = new Intent("log_updated");
    sendBroadcast(intent);
    smartCallPreference.setLogFirstTime("1");
}

Solution

  • I have tried without using data base its working fine and more faster as compare to last uploaded check following answer.

    But I have issue with Name and photo uri of call log because Cached data may not be available or may not be updated after any contact changed. Is their any Other way to deal with it.

     private void setCallLogs(Cursor curLog) {
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
        int sr_id = 0;
        while (curLog.moveToNext()) {
            String callNumber = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.NUMBER));
            callNumber = Utilities.correctNumber(callNumber);
            String ids = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls._ID));
    
            String name = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.CACHED_NAME));
    
            String callname = "Unknown";
            String photoUri = "";
            if (name != null)
                callname = name;
    
    
            String callType = curLog.getString(curLog
                    .getColumnIndex(CallLog.Calls.TYPE));
    
            String dateString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                    .format(new Date(Long
                            .parseLong(curLog.getString(curLog.getColumnIndex(CallLog.Calls.DATE)))));
            //dateString = CallHistoryFragment.setdateToLog(dateString);
    
            sr_id = sr_id + 1;
            if (mainDialerhistory.size() == 0) {
    
                club_id = 1;
                count = 1;
    
                mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                        callType, "", "", count, photoUri, String.valueOf(club_id)));
    
            } else {
                count = 0;
                int mainArraySize = mainDialerhistory.size() - 1;
                if (mainDialerhistory.get(mainArraySize).getPhone().equals(callNumber.replace(" ", ""))) {
    
                    if (mainDialerhistory.get(mainArraySize).getcallType().equals(callType)) {
                        count = mainDialerhistory.get(mainArraySize).getCount() + 1;
                        club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id());
    
                        mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                callType, "", "", count, photoUri, String.valueOf(club_id)));
    
                    } else {
                        String lastType = mainDialerhistory.get(mainArraySize).getcallType();
    
                        if (lastType.equals("3") && (callType.equals("10") || callType.equals("2") || callType.equals("1"))) {
                            count = 0;
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", 1, photoUri, String.valueOf(club_id)));
    
                        } else if ((lastType.equals("10") || lastType.equals("2") || lastType.equals("1")) && callType.equals("3")) {
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", count + 1, photoUri, String.valueOf(club_id)));
    
                        } else {
                            count = 0;
                            count = mainDialerhistory.get(mainArraySize).getCount() + 1;
                            club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id());
    
                            mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                                    callType, "", "", count, photoUri, String.valueOf(club_id)));
    
                        }
                    }
                } else {
                    club_id = Integer.parseInt(mainDialerhistory.get(mainArraySize).getGr_id()) + 1;
                    mainDialerhistory.add(new HistoryController(ids, String.valueOf(sr_id), callname, callNumber.replace(" ", ""), dateString,
                            callType, "", "", 1, photoUri, String.valueOf(club_id)));
    
                }
            }
    
        }
        curLog.close();
        endTime = System.currentTimeMillis();
        long MethodeDuration = (endTime - startTime);
        Log.e("MethodeDuration", "-count-" + mainDialerhistory.size());
        Log.e("MethodeDuration", "-log-" + MethodeDuration);
        AccountController.getInstance().mAccountHistory.addAll(mainDialerhistory);
    
        sendBroadcast(new Intent("log_updated"));
    
    
        stopService(new Intent(this, CallLogIntentService.class));
    }