Grouping each listener's logic in an inner class in CallDetailsActivity.

Bug: 70218437
Test: Existing tests
PiperOrigin-RevId: 178029820
Change-Id: I60afe7c6d61a61ce4aa2fd2e30fbd5d869072930
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 06b6a10..b51d833 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -35,7 +35,6 @@
 import android.support.v7.widget.Toolbar;
 import android.widget.Toast;
 import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
-import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.Assert;
@@ -46,7 +45,7 @@
 import com.android.dialer.duo.Duo;
 import com.android.dialer.duo.DuoComponent;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
-import com.android.dialer.enrichedcall.EnrichedCallManager.HistoricalDataChangedListener;
+import com.android.dialer.enrichedcall.EnrichedCallManager;
 import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
@@ -55,17 +54,14 @@
 import com.android.dialer.postcall.PostCall;
 import com.android.dialer.precall.PreCall;
 import com.android.dialer.protos.ProtoParsers;
+import com.google.common.base.Preconditions;
 import java.lang.ref.WeakReference;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
 /** Displays the details of a specific call log entry. */
-public class CallDetailsActivity extends AppCompatActivity
-    implements CallDetailsHeaderViewHolder.CallbackActionListener,
-        CallDetailsFooterViewHolder.ReportCallIdListener,
-        DeleteCallDetailsListener,
-        HistoricalDataChangedListener {
+public class CallDetailsActivity extends AppCompatActivity {
 
   public static final String EXTRA_PHONE_NUMBER = "phone_number";
   public static final String EXTRA_HAS_ENRICHED_CALL_DATA = "has_enriched_call_data";
@@ -73,7 +69,16 @@
   public static final String EXTRA_CONTACT = "contact";
   public static final String EXTRA_CAN_REPORT_CALLER_ID = "can_report_caller_id";
   private static final String EXTRA_CAN_SUPPORT_ASSISTED_DIALING = "can_support_assisted_dialing";
-  private static final String TASK_DELETE = "task_delete";
+
+  private final CallDetailsHeaderViewHolder.CallbackActionListener callbackActionListener =
+      new CallbackActionListener(this);
+  private final CallDetailsFooterViewHolder.DeleteCallDetailsListener deleteCallDetailsListener =
+      new DeleteCallDetailsListener(this);
+  private final CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener =
+      new ReportCallIdListener(this);
+  private final EnrichedCallManager.HistoricalDataChangedListener
+      enrichedCallHistoricalDataChangedListener =
+          new EnrichedCallHistoricalDataChangedListener(this);
 
   private CallDetailsEntries entries;
   private DialerContact contact;
@@ -130,7 +135,7 @@
 
     EnrichedCallComponent.get(this)
         .getEnrichedCallManager()
-        .registerHistoricalDataChangedListener(this);
+        .registerHistoricalDataChangedListener(enrichedCallHistoricalDataChangedListener);
     EnrichedCallComponent.get(this)
         .getEnrichedCallManager()
         .requestAllHistoricalData(contact.getNumber(), entries);
@@ -142,7 +147,7 @@
 
     EnrichedCallComponent.get(this)
         .getEnrichedCallManager()
-        .unregisterHistoricalDataChangedListener(this);
+        .unregisterHistoricalDataChangedListener(enrichedCallHistoricalDataChangedListener);
   }
 
   @Override
@@ -161,9 +166,9 @@
             this /* context */,
             contact,
             entries.getEntriesList(),
-            this /* callbackListener */,
-            this /* reportCallIdListener */,
-            this /* callDetailDeletionListener */);
+            callbackActionListener,
+            reportCallIdListener,
+            deleteCallDetailsListener);
 
     RecyclerView recyclerView = findViewById(R.id.recycler_view);
     recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -177,113 +182,6 @@
     super.onBackPressed();
   }
 
-  @Override
-  public void reportCallId(String number) {
-    ReportDialogFragment.newInstance(number).show(getFragmentManager(), null);
-  }
-
-  @Override
-  public boolean canReportCallerId(String number) {
-    return getIntent().getExtras().getBoolean(EXTRA_CAN_REPORT_CALLER_ID, false);
-  }
-
-  @Override
-  public void onHistoricalDataChanged() {
-    Map<CallDetailsEntry, List<HistoryResult>> mappedResults =
-        getAllHistoricalData(contact.getNumber(), entries);
-
-    adapter.updateCallDetailsEntries(
-        generateAndMapNewCallDetailsEntriesHistoryResults(
-                contact.getNumber(), entries, mappedResults)
-            .getEntriesList());
-  }
-
-  @Override
-  public void placeImsVideoCall(String phoneNumber) {
-    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_IMS_VIDEO_CALL_BACK);
-    PreCall.start(
-        this,
-        new CallIntentBuilder(phoneNumber, CallInitiationType.Type.CALL_DETAILS)
-            .setIsVideoCall(true));
-  }
-
-  @Override
-  public void placeDuoVideoCall(String phoneNumber) {
-    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_LIGHTBRINGER_CALL_BACK);
-    Duo duo = DuoComponent.get(this).getDuo();
-    if (!duo.isReachable(this, phoneNumber)) {
-      placeImsVideoCall(phoneNumber);
-      return;
-    }
-
-    try {
-      startActivityForResult(duo.getIntent(this, phoneNumber), ActivityRequestCodes.DIALTACTS_DUO);
-    } catch (ActivityNotFoundException e) {
-      Toast.makeText(this, R.string.activity_not_available, Toast.LENGTH_SHORT).show();
-    }
-  }
-
-  @Override
-  public void placeVoiceCall(String phoneNumber, String postDialDigits) {
-    Logger.get(this).logImpression(DialerImpression.Type.CALL_DETAILS_VOICE_CALL_BACK);
-
-    boolean canSupportedAssistedDialing =
-        getIntent().getExtras().getBoolean(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, false);
-    CallIntentBuilder callIntentBuilder =
-        new CallIntentBuilder(phoneNumber + postDialDigits, CallInitiationType.Type.CALL_DETAILS);
-    if (canSupportedAssistedDialing) {
-      callIntentBuilder.setAllowAssistedDial(true);
-    }
-
-    PreCall.start(this, callIntentBuilder);
-  }
-
-  @Override
-  public void delete() {
-    AsyncTaskExecutors.createAsyncTaskExecutor()
-        .submit(TASK_DELETE, new DeleteCallsTask(this, contact, entries));
-  }
-
-  @NonNull
-  private Map<CallDetailsEntry, List<HistoryResult>> getAllHistoricalData(
-      @Nullable String number, @NonNull CallDetailsEntries entries) {
-    if (number == null) {
-      return Collections.emptyMap();
-    }
-
-    Map<CallDetailsEntry, List<HistoryResult>> historicalData =
-        EnrichedCallComponent.get(this)
-            .getEnrichedCallManager()
-            .getAllHistoricalData(number, entries);
-    if (historicalData == null) {
-      return Collections.emptyMap();
-    }
-    return historicalData;
-  }
-
-  private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults(
-      @Nullable String number,
-      @NonNull CallDetailsEntries callDetailsEntries,
-      @NonNull Map<CallDetailsEntry, List<HistoryResult>> mappedResults) {
-    if (number == null) {
-      return callDetailsEntries;
-    }
-    CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
-    for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
-      CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
-      List<HistoryResult> results = mappedResults.get(entry);
-      if (results != null) {
-        newEntry.addAllHistoryResults(mappedResults.get(entry));
-        LogUtil.v(
-            "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults",
-            "mapped %d results",
-            newEntry.getHistoryResultsList().size());
-      }
-      mutableCallDetailsEntries.addEntries(newEntry.build());
-    }
-    return mutableCallDetailsEntries.build();
-  }
-
   /** Delete specified calls from the call log. */
   private static class DeleteCallsTask extends AsyncTask<Void, Void, Void> {
     // Use a weak reference to hold the Activity so that there is no memory leak.
@@ -349,4 +247,176 @@
       activity.finish();
     }
   }
+
+  private static final class CallbackActionListener
+      implements CallDetailsHeaderViewHolder.CallbackActionListener {
+    private final WeakReference<Activity> activityWeakReference;
+
+    CallbackActionListener(Activity activity) {
+      this.activityWeakReference = new WeakReference<>(activity);
+    }
+
+    @Override
+    public void placeImsVideoCall(String phoneNumber) {
+      Logger.get(getActivity())
+          .logImpression(DialerImpression.Type.CALL_DETAILS_IMS_VIDEO_CALL_BACK);
+      PreCall.start(
+          getActivity(),
+          new CallIntentBuilder(phoneNumber, CallInitiationType.Type.CALL_DETAILS)
+              .setIsVideoCall(true));
+    }
+
+    @Override
+    public void placeDuoVideoCall(String phoneNumber) {
+      Logger.get(getActivity())
+          .logImpression(DialerImpression.Type.CALL_DETAILS_LIGHTBRINGER_CALL_BACK);
+      Duo duo = DuoComponent.get(getActivity()).getDuo();
+      if (!duo.isReachable(getActivity(), phoneNumber)) {
+        placeImsVideoCall(phoneNumber);
+        return;
+      }
+
+      try {
+        getActivity()
+            .startActivityForResult(
+                duo.getIntent(getActivity(), phoneNumber), ActivityRequestCodes.DIALTACTS_DUO);
+      } catch (ActivityNotFoundException e) {
+        Toast.makeText(getActivity(), R.string.activity_not_available, Toast.LENGTH_SHORT).show();
+      }
+    }
+
+    @Override
+    public void placeVoiceCall(String phoneNumber, String postDialDigits) {
+      Logger.get(getActivity()).logImpression(DialerImpression.Type.CALL_DETAILS_VOICE_CALL_BACK);
+
+      boolean canSupportedAssistedDialing =
+          getActivity()
+              .getIntent()
+              .getExtras()
+              .getBoolean(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, false);
+      CallIntentBuilder callIntentBuilder =
+          new CallIntentBuilder(phoneNumber + postDialDigits, CallInitiationType.Type.CALL_DETAILS);
+      if (canSupportedAssistedDialing) {
+        callIntentBuilder.setAllowAssistedDial(true);
+      }
+
+      PreCall.start(getActivity(), callIntentBuilder);
+    }
+
+    private Activity getActivity() {
+      return Preconditions.checkNotNull(activityWeakReference.get());
+    }
+  }
+
+  private static final class DeleteCallDetailsListener
+      implements CallDetailsFooterViewHolder.DeleteCallDetailsListener {
+    private static final String ASYNC_TASK_ID = "task_delete";
+
+    private final WeakReference<CallDetailsActivity> activityWeakReference;
+
+    DeleteCallDetailsListener(CallDetailsActivity activity) {
+      this.activityWeakReference = new WeakReference<>(activity);
+    }
+
+    @Override
+    public void delete() {
+      AsyncTaskExecutors.createAsyncTaskExecutor()
+          .submit(
+              ASYNC_TASK_ID,
+              new DeleteCallsTask(getActivity(), getActivity().contact, getActivity().entries));
+    }
+
+    private CallDetailsActivity getActivity() {
+      return Preconditions.checkNotNull(activityWeakReference.get());
+    }
+  }
+
+  private static final class ReportCallIdListener
+      implements CallDetailsFooterViewHolder.ReportCallIdListener {
+    private final WeakReference<Activity> activityWeakReference;
+
+    ReportCallIdListener(Activity activity) {
+      this.activityWeakReference = new WeakReference<>(activity);
+    }
+
+    @Override
+    public void reportCallId(String number) {
+      ReportDialogFragment.newInstance(number)
+          .show(getActivity().getFragmentManager(), null /* tag */);
+    }
+
+    @Override
+    public boolean canReportCallerId(String number) {
+      return getActivity().getIntent().getExtras().getBoolean(EXTRA_CAN_REPORT_CALLER_ID, false);
+    }
+
+    private Activity getActivity() {
+      return Preconditions.checkNotNull(activityWeakReference.get());
+    }
+  }
+
+  private static final class EnrichedCallHistoricalDataChangedListener
+      implements EnrichedCallManager.HistoricalDataChangedListener {
+    private final WeakReference<CallDetailsActivity> activityWeakReference;
+
+    EnrichedCallHistoricalDataChangedListener(CallDetailsActivity activity) {
+      this.activityWeakReference = new WeakReference<>(activity);
+    }
+
+    @Override
+    public void onHistoricalDataChanged() {
+      CallDetailsActivity activity = getActivity();
+      Map<CallDetailsEntry, List<HistoryResult>> mappedResults =
+          getAllHistoricalData(activity.contact.getNumber(), activity.entries);
+
+      activity.adapter.updateCallDetailsEntries(
+          generateAndMapNewCallDetailsEntriesHistoryResults(
+                  activity.contact.getNumber(), activity.entries, mappedResults)
+              .getEntriesList());
+    }
+
+    private CallDetailsActivity getActivity() {
+      return Preconditions.checkNotNull(activityWeakReference.get());
+    }
+
+    @NonNull
+    private Map<CallDetailsEntry, List<HistoryResult>> getAllHistoricalData(
+        @Nullable String number, @NonNull CallDetailsEntries entries) {
+      if (number == null) {
+        return Collections.emptyMap();
+      }
+
+      Map<CallDetailsEntry, List<HistoryResult>> historicalData =
+          EnrichedCallComponent.get(getActivity())
+              .getEnrichedCallManager()
+              .getAllHistoricalData(number, entries);
+      if (historicalData == null) {
+        return Collections.emptyMap();
+      }
+      return historicalData;
+    }
+
+    private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults(
+        @Nullable String number,
+        @NonNull CallDetailsEntries callDetailsEntries,
+        @NonNull Map<CallDetailsEntry, List<HistoryResult>> mappedResults) {
+      if (number == null) {
+        return callDetailsEntries;
+      }
+      CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
+      for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
+        CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
+        List<HistoryResult> results = mappedResults.get(entry);
+        if (results != null) {
+          newEntry.addAllHistoryResults(mappedResults.get(entry));
+          LogUtil.v(
+              "CallDetailsActivity.generateAndMapNewCallDetailsEntriesHistoryResults",
+              "mapped %d results",
+              newEntry.getHistoryResultsList().size());
+        }
+        mutableCallDetailsEntries.addEntries(newEntry.build());
+      }
+      return mutableCallDetailsEntries.build();
+    }
+  }
 }