Added a dialog to confirm caller id reporting (1/2).

Database and call log are now updated when user confirms.

Bug: 11150383
Change-Id: Ic716e92bcb2280c1d352bd2232bda516e83349b2
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index 13d5f03..f743f7a 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -179,4 +179,4 @@
     public void onCallsFetched(Cursor statusCursor) {
         // Do nothing. Implemented to satisfy CallLogQueryHandler.Listener.
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index d70a40d..16be308 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -89,6 +89,11 @@
         public void fetchCalls();
     }
 
+    /** Implements onClickListener for the report button. */
+    public interface OnReportButtonClickListener {
+        public void onReportButtonClick(String number);
+    }
+
     /**
      * Stores a phone number of a call with the country code where it originally occurred.
      * <p>
@@ -133,6 +138,7 @@
     private final ContactInfoHelper mContactInfoHelper;
     private final CallFetcher mCallFetcher;
     private final Toast mReportedToast;
+    private final OnReportButtonClickListener mOnReportButtonClickListener;
     private ViewTreeObserver mViewTreeObserver = null;
 
     /**
@@ -344,7 +350,7 @@
 
     public CallLogAdapter(Context context, CallFetcher callFetcher,
             ContactInfoHelper contactInfoHelper, CallItemExpandedListener callItemExpandedListener,
-            boolean isCallLog) {
+            OnReportButtonClickListener onReportButtonClickListener, boolean isCallLog) {
         super(context);
 
         mContext = context;
@@ -353,6 +359,7 @@
         mIsCallLog = isCallLog;
         mCallItemExpandedListener = callItemExpandedListener;
 
+        mOnReportButtonClickListener = onReportButtonClickListener;
         mReportedToast = Toast.makeText(mContext, R.string.toast_caller_id_reported,
                 Toast.LENGTH_SHORT);
 
@@ -697,10 +704,6 @@
             // when the user expands the actions ViewStub.
         }
 
-        // Restore expansion state of the row on rebind.  Inflate the actions ViewStub if required,
-        // and set its visibility state accordingly.
-        expandOrCollapseActions(callLogItemView, isExpanded(rowId));
-
         // Lookup contacts with this number
         NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
         ExpirableCache.CachedValue<ContactInfo> cachedInfo =
@@ -759,6 +762,10 @@
         views.reported = info.isBadData;
         views.isExternal = mContactInfoHelper.isExternal(info.sourceType);
 
+        // Restore expansion state of the row on rebind.  Inflate the actions ViewStub if required,
+        // and set its visibility state accordingly.
+        expandOrCollapseActions(callLogItemView, isExpanded(rowId));
+
         if (TextUtils.isEmpty(name)) {
             details = new PhoneCallDetails(number, numberPresentation,
                     formattedNumber, countryIso, geocode, callTypes, date,
@@ -949,10 +956,9 @@
             views.reportButtonView.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    mReportedToast.show();
-                    ((CallLogListItemViews) callLogItem.getTag()).reported = true;
-                    v.setVisibility(View.GONE);
-                    // TODO: Set the entry as reported in the database.
+                    if (mOnReportButtonClickListener != null) {
+                        mOnReportButtonClickListener.onReportButtonClick(views.number);
+                    }
                 }
             });
         }
@@ -1014,6 +1020,8 @@
 
             if (views.isExternal && !views.reported) {
                 views.reportButtonView.setVisibility(View.VISIBLE);
+            } else {
+                views.reportButtonView.setVisibility(View.GONE);
             }
         }
 
@@ -1413,4 +1421,9 @@
            return mContext.getResources().getString(R.string.call_log_header_other);
        }
     }
+
+    public void onBadDataReported(String number) {
+        mContactInfoCache.expireAll();
+        mReportedToast.show();
+    }
 }
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index 1668895..8523705 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -20,6 +20,7 @@
 import android.animation.ValueAnimator;
 import android.animation.Animator.AnimatorListener;
 import android.app.Activity;
+import android.app.DialogFragment;
 import android.app.KeyguardManager;
 import android.app.ListFragment;
 import android.content.Context;
@@ -65,7 +66,7 @@
  * (all, missed or voicemails), specify it in the constructor.
  */
 public class CallLogFragment extends ListFragment
-        implements CallLogQueryHandler.Listener,
+        implements CallLogQueryHandler.Listener, CallLogAdapter.OnReportButtonClickListener,
         CallLogAdapter.CallFetcher,
         CallLogAdapter.CallItemExpandedListener {
     private static final String TAG = "CallLogFragment";
@@ -178,7 +179,6 @@
     @Override
     public void onCreate(Bundle state) {
         super.onCreate(state);
-
         if (state != null) {
             mCallTypeFilter = state.getInt(KEY_FILTER_TYPE, mCallTypeFilter);
             mLogLimit = state.getInt(KEY_LOG_LIMIT, mLogLimit);
@@ -187,8 +187,8 @@
         }
 
         String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
-        mAdapter = ObjectFactory.newCallLogAdapter(getActivity(), this, new ContactInfoHelper(
-                getActivity(), currentCountryIso), this, true);
+        mAdapter = ObjectFactory.newCallLogAdapter(getActivity(), this,
+                new ContactInfoHelper(getActivity(), currentCountryIso), this, this, true);
         setListAdapter(mAdapter);
         mCallLogQueryHandler = new CallLogQueryHandler(getActivity().getContentResolver(),
                 this, mLogLimit);
@@ -666,4 +666,17 @@
 
         return null;
     }
+
+    public void onBadDataReported(String number) {
+        mAdapter.onBadDataReported(number);
+        mAdapter.notifyDataSetChanged();
+    }
+
+    public void onReportButtonClick(String number) {
+        DialogFragment df = ObjectFactory.getReportDialogFragment(number);
+        if (df != null) {
+            df.setTargetFragment(this, 0);
+            df.show(getActivity().getFragmentManager(), "report_dialog");
+        }
+    }
 }
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index e94555e..103eef7 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -220,7 +220,7 @@
                 this, 1);
         final String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
         mCallLogAdapter = ObjectFactory.newCallLogAdapter(getActivity(), this,
-                new ContactInfoHelper(getActivity(), currentCountryIso), null, false);
+                new ContactInfoHelper(getActivity(), currentCountryIso), null, null, false);
 
         mMergedAdapter = new ShortcutCardsAdapter(getActivity(), this, mCallLogAdapter);
     }
diff --git a/src/com/android/dialerbind/ObjectFactory.java b/src/com/android/dialerbind/ObjectFactory.java
index 9786311..54a5821 100644
--- a/src/com/android/dialerbind/ObjectFactory.java
+++ b/src/com/android/dialerbind/ObjectFactory.java
@@ -18,10 +18,12 @@
 
 import static com.android.dialer.calllog.CallLogAdapter.CallFetcher;
 
+import android.app.DialogFragment;
 import android.content.Context;
 
 import com.android.dialer.calllog.CallLogAdapter;
 import com.android.dialer.calllog.CallLogAdapter.CallItemExpandedListener;
+import com.android.dialer.calllog.CallLogAdapter.OnReportButtonClickListener;
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.service.CachedNumberLookupService;
 
@@ -43,10 +45,15 @@
      * @param isCallLog Is this call log adapter being used on the call log?
      * @return Instance of CallLogAdapter.
      */
-    public static CallLogAdapter newCallLogAdapter(Context context, CallFetcher callFetcher,
-            ContactInfoHelper contactInfoHelper, CallItemExpandedListener callItemExpandedListener,
-            boolean isCallLog) {
-        return new CallLogAdapter(context, callFetcher, contactInfoHelper, callItemExpandedListener,
-                isCallLog);
+    public static CallLogAdapter newCallLogAdapter(Context context,
+            CallFetcher callFetcher, ContactInfoHelper contactInfoHelper,
+            CallItemExpandedListener callItemExpandedListener,
+            OnReportButtonClickListener onReportButtonClickListener, boolean isCallLog) {
+        return new CallLogAdapter(context, callFetcher, contactInfoHelper,
+                callItemExpandedListener, onReportButtonClickListener, isCallLog);
+    }
+
+    public static DialogFragment getReportDialogFragment(String number) {
+        return null;
     }
 }
diff --git a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
index f3679d4..b7f06d3 100644
--- a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
@@ -212,7 +212,7 @@
 
         public TestCallLogAdapter(Context context, CallFetcher callFetcher,
                 ContactInfoHelper contactInfoHelper) {
-            super(context, callFetcher, contactInfoHelper, null, false);
+            super(context, callFetcher, contactInfoHelper, null, null, false);
         }
 
         @Override