javaandroidcalllog

How to populate numbers from call log into a onClick list?


I am building an app where I am suppose to view my call log in a list and make a call when pressing an item in the list. What is the best option for this? I wanna try to make a custom adapter but I am unsure if it is the right way to do or if there is an easier way?

Thanks for any help!

For the moment I am using a text view and a string buffer to populate the list with my call log.

public class LastCallActivity extends Activity {

    private List<LastCallModel> wlistCalls;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_last_call);

        if (ContextCompat.checkSelfPermission(LastCallActivity.this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(LastCallActivity.this, Manifest.permission.READ_CALL_LOG)) {
                ActivityCompat.requestPermissions(LastCallActivity.this, new String[]{Manifest.permission.READ_CALL_LOG}, 1);
            } else {
                ActivityCompat.requestPermissions(LastCallActivity.this, new String[]{Manifest.permission.READ_CALL_LOG}, 1);
            }
        } else {
            // do stuff
            TextView textView = (TextView) findViewById(R.id.textViewen);
            textView.setText(getCallDetails());
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ContextCompat.checkSelfPermission(LastCallActivity.this, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this, "Permission granted!", Toast.LENGTH_SHORT).show();
                        TextView textView = (TextView) findViewById(R.id.textViewen);
                        textView.setText(getCallDetails());

                    }
                } else {
                    Toast.makeText(this, "No permission GRANTED!", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }

    private String getCallDetails() {
        StringBuffer sb = new StringBuffer();
        Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, null);
        int name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
        int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
        int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
        int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
        int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);

        sb.append("Call Details:\n\n");

        while (managedCursor.moveToNext()) {
            String phName = managedCursor.getString(name);
            String phNumber = managedCursor.getString(number);
            String callType = managedCursor.getString(type);
            String callDate = managedCursor.getString(date);

            if (phName != null && phNumber != null) {
                wlistCalls.add(new LastCallModel(phName, phNumber));
            }

            Date callDayTime = new Date(Long.valueOf(callDate));
            SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yy HH:mm");
            String dateString = formatter.format(callDayTime);
            String callDuration = managedCursor.getString(duration);
            String dir = null;
            int dircode = Integer.parseInt(callType);

            switch (dircode) {
                case CallLog.Calls.OUTGOING_TYPE:
                    dir = "OUTGOING";
                    break;
                case CallLog.Calls.INCOMING_TYPE:
                    dir = "INCOMING";
                    break;
                case CallLog.Calls.MISSED_TYPE:
                    dir = "MISSED";
                    break;
            }

            sb.append("\nName: " + phName + "\nPhone Number: " + phNumber + " \nCallType: " + dir + "\nCall Date: " + dateString + "\nCall Duration: " + callDuration);

            sb.append("\n-------------");
            sb.append("\n*************");

            sb.append("\n*************");
        }

        managedCursor.close();
        return sb.toString();
    }
}

Solution

  • I solved it by using a RecyclerView with an custom adapter!

    This is my custom adapter.

    public class LastCallAdapter extends RecyclerView.Adapter<LastCallAdapter.ViewHolder> {
    
    private LayoutInflater layoutInflater;
    private Context mContext;
    private ArrayList<String> phoneNumber;
    
    public LastCallAdapter(Context mContext, ArrayList<String> phoneNumber) {
        this.mContext = mContext;
        this.phoneNumber = phoneNumber;
    }
    
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View view = layoutInflater.from(parent.getContext()).inflate(R.layout.items_contacts, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    
        holder.number.setText(phoneNumber.get(position));
    
        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent callDial = new Intent(Intent.ACTION_DIAL);
                callDial = callDial.setData(Uri.parse("tel:"+phoneNumber.get(position)));
                if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    mContext.startActivity(callDial);
                    return;
                }
                Toast.makeText(mContext, phoneNumber.get(position), Toast.LENGTH_SHORT).show();
            }
        });
    
    }
    
    @Override
    public int getItemCount() {
        return phoneNumber.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder{
    
        TextView number;
        LinearLayout parentLayout;
    
        public ViewHolder(View itemView) {
            super(itemView);
    
            number = itemView.findViewById(R.id.contact_number);
            parentLayout = itemView.findViewById(R.id.parent_layout);
    
        }
    }
    
    
    
    }
    

    And this method in the main activity for starting the adapter

     private void startAdapter(){
        RecyclerView recyclerView = findViewById(R.id.recyclerViewen);
        LastCallAdapter lastCallAdapter = new LastCallAdapter(this, phoneNumbers);
        recyclerView.setAdapter(lastCallAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
    }