• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 
17 package com.android.dialer.app.calllog;
18 
19 import android.content.Context;
20 import android.os.AsyncTask;
21 import android.provider.CallLog.Calls;
22 import com.android.dialer.common.Assert;
23 
24 /**
25  * Class to access the call log asynchronously to avoid carrying out database operations on the UI
26  * thread, using an {@link AsyncTask}.
27  *
28  * <pre class="prettyprint"> Typical usage: ==============
29  *
30  * // From an activity... String mLastNumber = "";
31  *
32  * CallLogAsync log = new CallLogAsync();
33  *
34  * CallLogAsync.GetLastOutgoingCallArgs lastCallArgs = new CallLogAsync.GetLastOutgoingCallArgs(
35  * this, new CallLogAsync.OnLastOutgoingCallComplete() { public void lastOutgoingCall(String number)
36  * { mLastNumber = number; } }); log.getLastOutgoingCall(lastCallArgs); </pre>
37  */
38 public class CallLogAsync {
39 
40   /** CallLog.getLastOutgoingCall(...) */
getLastOutgoingCall(GetLastOutgoingCallArgs args)41   public AsyncTask getLastOutgoingCall(GetLastOutgoingCallArgs args) {
42     Assert.isMainThread();
43     return new GetLastOutgoingCallTask(args.callback).execute(args);
44   }
45 
46   /** Interface to retrieve the last dialed number asynchronously. */
47   public interface OnLastOutgoingCallComplete {
48 
49     /** @param number The last dialed number or an empty string if none exists yet. */
lastOutgoingCall(String number)50     void lastOutgoingCall(String number);
51   }
52 
53   /** Parameter object to hold the args to get the last outgoing call from the call log DB. */
54   public static class GetLastOutgoingCallArgs {
55 
56     public final Context context;
57     public final OnLastOutgoingCallComplete callback;
58 
GetLastOutgoingCallArgs(Context context, OnLastOutgoingCallComplete callback)59     public GetLastOutgoingCallArgs(Context context, OnLastOutgoingCallComplete callback) {
60       this.context = context;
61       this.callback = callback;
62     }
63   }
64 
65   /** AsyncTask to get the last outgoing call from the DB. */
66   private class GetLastOutgoingCallTask extends AsyncTask<GetLastOutgoingCallArgs, Void, String> {
67 
68     private final OnLastOutgoingCallComplete mCallback;
69 
GetLastOutgoingCallTask(OnLastOutgoingCallComplete callback)70     public GetLastOutgoingCallTask(OnLastOutgoingCallComplete callback) {
71       mCallback = callback;
72     }
73 
74     // Happens on a background thread. We cannot run the callback
75     // here because only the UI thread can modify the view
76     // hierarchy (e.g enable/disable the dial button). The
77     // callback is ran rom the post execute method.
78     @Override
doInBackground(GetLastOutgoingCallArgs... list)79     protected String doInBackground(GetLastOutgoingCallArgs... list) {
80       String number = "";
81       for (GetLastOutgoingCallArgs args : list) {
82         // May block. Select only the last one.
83         number = Calls.getLastOutgoingCall(args.context);
84       }
85       return number; // passed to the onPostExecute method.
86     }
87 
88     // Happens on the UI thread, it is safe to run the callback
89     // that may do some work on the views.
90     @Override
onPostExecute(String number)91     protected void onPostExecute(String number) {
92       Assert.isMainThread();
93       mCallback.lastOutgoingCall(number);
94     }
95   }
96 }
97