summaryrefslogtreecommitdiff
path: root/java/com/android/incallui
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui')
-rw-r--r--java/com/android/incallui/ActiveCallsCallListListener.java73
-rw-r--r--java/com/android/incallui/ConferenceParticipantListAdapter.java2
-rw-r--r--java/com/android/incallui/ContactInfoCache.java12
-rw-r--r--java/com/android/incallui/InCallActivity.java182
-rw-r--r--java/com/android/incallui/InCallPresenter.java20
-rw-r--r--java/com/android/incallui/call/DialerCall.java2
-rw-r--r--java/com/android/incallui/res/layout/caller_in_conference.xml2
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatFragment.java5
-rw-r--r--java/com/android/incallui/telecomeventui/AndroidManifest.xml13
-rw-r--r--java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogActivity.java101
-rw-r--r--java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogFragment.java82
11 files changed, 350 insertions, 144 deletions
diff --git a/java/com/android/incallui/ActiveCallsCallListListener.java b/java/com/android/incallui/ActiveCallsCallListListener.java
new file mode 100644
index 000000000..ce9f9a36d
--- /dev/null
+++ b/java/com/android/incallui/ActiveCallsCallListListener.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import com.android.dialer.activecalls.ActiveCallInfo;
+import com.android.dialer.activecalls.ActiveCallsComponent;
+import com.android.incallui.call.CallList;
+import com.android.incallui.call.DialerCall;
+import com.android.incallui.call.DialerCall.State;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+
+/** Updates {@link com.android.dialer.activecalls.ActiveCalls} */
+@SuppressWarnings("Guava")
+public class ActiveCallsCallListListener implements CallList.Listener {
+
+ private final Context appContext;
+
+ ActiveCallsCallListListener(Context appContext) {
+ this.appContext = appContext;
+ }
+
+ @Override
+ public void onIncomingCall(DialerCall call) {}
+
+ @Override
+ public void onUpgradeToVideo(DialerCall call) {}
+
+ @Override
+ public void onSessionModificationStateChange(DialerCall call) {}
+
+ @Override
+ public void onCallListChange(CallList callList) {
+ ImmutableList.Builder<ActiveCallInfo> activeCalls = ImmutableList.builder();
+ for (DialerCall call : callList.getAllCalls()) {
+ if (call.getState() != State.DISCONNECTED) {
+ activeCalls.add(
+ ActiveCallInfo.builder()
+ .setPhoneAccountHandle(Optional.fromNullable(call.getAccountHandle()))
+ .build());
+ }
+ }
+ ActiveCallsComponent.get(appContext).activeCalls().setActiveCalls(activeCalls.build());
+ }
+
+ @Override
+ public void onDisconnect(DialerCall call) {}
+
+ @Override
+ public void onWiFiToLteHandover(DialerCall call) {}
+
+ @Override
+ public void onHandoverToWifiFailed(DialerCall call) {}
+
+ @Override
+ public void onInternationalCallOnWifi(@NonNull DialerCall call) {}
+}
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index 4780974ef..dc793f7f8 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -356,7 +356,7 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
statusTextView.setText(onHoldText);
statusTextView.setVisibility(View.VISIBLE);
- int onHoldColor = getContext().getColor(R.color.dialer_secondary_text_color_hiden);
+ int onHoldColor = getContext().getColor(R.color.dialer_disabled_text_color);
nameTextView.setTextColor(onHoldColor);
numberTextView.setTextColor(onHoldColor);
diff --git a/java/com/android/incallui/ContactInfoCache.java b/java/com/android/incallui/ContactInfoCache.java
index 165ec13bf..eefd4833c 100644
--- a/java/com/android/incallui/ContactInfoCache.java
+++ b/java/com/android/incallui/ContactInfoCache.java
@@ -522,20 +522,20 @@ public class ContactInfoCache implements OnImageLoadCompleteListener {
}
boolean hasUpdate = false;
- if (TextUtils.isEmpty(callerInfo.name) && !TextUtils.isEmpty(cequintCallerIdContact.name)) {
- callerInfo.name = cequintCallerIdContact.name;
+ if (TextUtils.isEmpty(callerInfo.name) && !TextUtils.isEmpty(cequintCallerIdContact.name())) {
+ callerInfo.name = cequintCallerIdContact.name();
hasUpdate = true;
}
- if (!TextUtils.isEmpty(cequintCallerIdContact.geoDescription)) {
- callerInfo.geoDescription = cequintCallerIdContact.geoDescription;
+ if (!TextUtils.isEmpty(cequintCallerIdContact.geolocation())) {
+ callerInfo.geoDescription = cequintCallerIdContact.geolocation();
callerInfo.shouldShowGeoDescription = true;
hasUpdate = true;
}
// Don't overwrite photo in local contacts.
if (!callerInfo.contactExists
&& callerInfo.contactDisplayPhotoUri == null
- && cequintCallerIdContact.imageUrl != null) {
- callerInfo.contactDisplayPhotoUri = Uri.parse(cequintCallerIdContact.imageUrl);
+ && cequintCallerIdContact.photoUri() != null) {
+ callerInfo.contactDisplayPhotoUri = Uri.parse(cequintCallerIdContact.photoUri());
hasUpdate = true;
}
// Set contact to exist to avoid phone number service lookup.
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 91f557bd5..2b6c2b49d 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -55,12 +55,15 @@ import android.view.animation.AnimationUtils;
import android.widget.CheckBox;
import android.widget.Toast;
import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogOptions;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogOptionsUtil;
import com.android.dialer.animation.AnimUtils;
import com.android.dialer.animation.AnimationListenerAdapter;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.common.concurrent.UiListener;
import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.dialer.logging.DialerImpression.Type;
import com.android.dialer.logging.Logger;
@@ -69,6 +72,7 @@ import com.android.dialer.metrics.Metrics;
import com.android.dialer.metrics.MetricsComponent;
import com.android.dialer.preferredsim.PreferredAccountRecorder;
import com.android.dialer.preferredsim.PreferredAccountWorker;
+import com.android.dialer.preferredsim.PreferredAccountWorker.Result;
import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
import com.android.dialer.util.ViewUtil;
import com.android.incallui.answer.bindings.AnswerBindings;
@@ -101,6 +105,7 @@ import com.android.incallui.video.protocol.VideoCallScreen;
import com.android.incallui.video.protocol.VideoCallScreenDelegate;
import com.android.incallui.video.protocol.VideoCallScreenDelegateFactory;
import com.google.common.base.Optional;
+import com.google.common.util.concurrent.ListenableFuture;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -129,10 +134,8 @@ public class InCallActivity extends TransactionSafeFragmentActivity
private static Optional<Integer> audioRouteForTesting = Optional.absent();
- private final InternationalCallOnWifiCallback internationalCallOnWifiCallback =
- new InternationalCallOnWifiCallback();
-
private SelectPhoneAccountListener selectPhoneAccountListener;
+ private UiListener<Result> preferredAccountWorkerResultListener;
private Animation dialpadSlideInAnimation;
private Animation dialpadSlideOutAnimation;
@@ -189,6 +192,10 @@ public class InCallActivity extends TransactionSafeFragmentActivity
Trace.beginSection("InCallActivity.onCreate");
super.onCreate(bundle);
+ preferredAccountWorkerResultListener =
+ DialerExecutorComponent.get(this)
+ .createUiListener(getFragmentManager(), "preferredAccountWorkerResultListener");
+
selectPhoneAccountListener = new SelectPhoneAccountListener(getApplicationContext());
if (bundle != null) {
@@ -245,13 +252,6 @@ public class InCallActivity extends TransactionSafeFragmentActivity
}
}
- InternationalCallOnWifiDialogFragment existingInternationalCallOnWifiDialogFragment =
- (InternationalCallOnWifiDialogFragment)
- getSupportFragmentManager().findFragmentByTag(Tags.INTERNATIONAL_CALL_ON_WIFI);
- if (existingInternationalCallOnWifiDialogFragment != null) {
- existingInternationalCallOnWifiDialogFragment.setCallback(internationalCallOnWifiCallback);
- }
-
inCallOrientationEventListener = new InCallOrientationEventListener(this);
getWindow()
@@ -368,58 +368,84 @@ public class InCallActivity extends TransactionSafeFragmentActivity
return false;
}
- DialerExecutorComponent.get(this)
- .dialerExecutorFactory()
- .createNonUiTaskBuilder(new PreferredAccountWorker(waitingForAccountCall.getNumber()))
- .onSuccess(
- (result -> {
- if (result.getPhoneAccountHandle().isPresent()) {
- Logger.get(this).logImpression(Type.DUAL_SIM_SELECTION_PREFERRED_USED);
- selectPhoneAccountListener.onPhoneAccountSelected(
- result.getPhoneAccountHandle().get(), false, waitingForAccountCall.getId());
- return;
- }
- if (result.getSuggestion().isPresent()) {
- LogUtil.i(
- "CallingAccountSelector.processPreferredAccount",
- "SIM suggested: " + result.getSuggestion().get().reason);
- if (result.getSuggestion().get().shouldAutoSelect) {
- Logger.get(this).logImpression(Type.DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED);
- LogUtil.i(
- "CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
- selectPhoneAccountListener.onPhoneAccountSelected(
- result.getSuggestion().get().phoneAccountHandle,
- false,
- waitingForAccountCall.getId());
- return;
- }
- }
- Bundle extras = waitingForAccountCall.getIntentExtras();
- List<PhoneAccountHandle> phoneAccountHandles =
- extras == null
- ? new ArrayList<>()
- : extras.getParcelableArrayList(Call.AVAILABLE_PHONE_ACCOUNTS);
-
- waitingForAccountCall.setPreferredAccountRecorder(
- new PreferredAccountRecorder(
- waitingForAccountCall.getNumber(),
- result.getSuggestion().orNull(),
- result.getDataId().orNull()));
- selectPhoneAccountDialogFragment =
- SelectPhoneAccountDialogFragment.newInstance(
- R.string.select_phone_account_for_calls,
- result.getDataId().isPresent() /* canSetDefault */,
- R.string.select_phone_account_for_calls_remember /* setDefaultResId */,
- phoneAccountHandles,
- selectPhoneAccountListener,
- waitingForAccountCall.getId(),
- SuggestionProvider.buildHint(
- this, phoneAccountHandles, result.getSuggestion().orNull() /* hints */));
- selectPhoneAccountDialogFragment.show(
- getFragmentManager(), Tags.SELECT_ACCOUNT_FRAGMENT);
- }))
- .build()
- .executeParallel(this);
+ ListenableFuture<PreferredAccountWorker.Result> preferredAccountFuture =
+ DialerExecutorComponent.get(this)
+ .backgroundExecutor()
+ .submit(
+ () -> {
+ try {
+ return new PreferredAccountWorker(waitingForAccountCall.getNumber())
+ .doInBackground(getApplicationContext());
+ } catch (Throwable throwable) {
+ throw new Exception(throwable);
+ }
+ });
+
+ preferredAccountWorkerResultListener.listen(
+ this,
+ preferredAccountFuture,
+ result -> {
+ if (result.getPhoneAccountHandle().isPresent()) {
+ Logger.get(this).logImpression(Type.DUAL_SIM_SELECTION_PREFERRED_USED);
+ selectPhoneAccountListener.onPhoneAccountSelected(
+ result.getPhoneAccountHandle().get(), false, waitingForAccountCall.getId());
+ return;
+ }
+ if (result.getSuggestion().isPresent()) {
+ LogUtil.i(
+ "CallingAccountSelector.processPreferredAccount",
+ "SIM suggested: " + result.getSuggestion().get().reason);
+ if (result.getSuggestion().get().shouldAutoSelect) {
+ Logger.get(this).logImpression(Type.DUAL_SIM_SELECTION_SUGGESTION_AUTO_SELECTED);
+ LogUtil.i(
+ "CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
+ selectPhoneAccountListener.onPhoneAccountSelected(
+ result.getSuggestion().get().phoneAccountHandle,
+ false,
+ waitingForAccountCall.getId());
+ return;
+ }
+ }
+ Bundle extras = waitingForAccountCall.getIntentExtras();
+ List<PhoneAccountHandle> phoneAccountHandles =
+ extras == null
+ ? new ArrayList<>()
+ : extras.getParcelableArrayList(Call.AVAILABLE_PHONE_ACCOUNTS);
+
+ waitingForAccountCall.setPreferredAccountRecorder(
+ new PreferredAccountRecorder(
+ waitingForAccountCall.getNumber(),
+ result.getSuggestion().orNull(),
+ result.getDataId().orNull()));
+ SelectPhoneAccountDialogOptions.Builder optionsBuilder =
+ SelectPhoneAccountDialogOptions.newBuilder()
+ .setTitle(R.string.select_phone_account_for_calls)
+ .setCanSetDefault(result.getDataId().isPresent())
+ .setSetDefaultLabel(R.string.select_phone_account_for_calls_remember)
+ .setCallId(waitingForAccountCall.getId());
+
+ for (PhoneAccountHandle phoneAccountHandle : phoneAccountHandles) {
+ SelectPhoneAccountDialogOptions.Entry.Builder entryBuilder =
+ SelectPhoneAccountDialogOptions.Entry.newBuilder();
+ SelectPhoneAccountDialogOptionsUtil.setPhoneAccountHandle(
+ entryBuilder, phoneAccountHandle);
+ Optional<String> hint =
+ SuggestionProvider.getHint(
+ this, phoneAccountHandle, result.getSuggestion().orNull());
+ if (hint.isPresent()) {
+ entryBuilder.setHint(hint.get());
+ }
+ optionsBuilder.addEntries(entryBuilder);
+ }
+
+ selectPhoneAccountDialogFragment =
+ SelectPhoneAccountDialogFragment.newInstance(
+ optionsBuilder.build(), selectPhoneAccountListener);
+ selectPhoneAccountDialogFragment.show(getFragmentManager(), Tags.SELECT_ACCOUNT_FRAGMENT);
+ },
+ throwable -> {
+ throw new RuntimeException(throwable);
+ });
return true;
}
@@ -1201,16 +1227,8 @@ public class InCallActivity extends TransactionSafeFragmentActivity
}
public void showDialogForInternationalCallOnWifi(@NonNull DialerCall call) {
- if (!InternationalCallOnWifiDialogFragment.shouldShow(this)) {
- LogUtil.i(
- "InCallActivity.showDialogForInternationalCallOnWifi",
- "InternationalCallOnWifiDialogFragment.shouldShow returned false");
- return;
- }
-
InternationalCallOnWifiDialogFragment fragment =
- InternationalCallOnWifiDialogFragment.newInstance(
- call.getId(), internationalCallOnWifiCallback);
+ InternationalCallOnWifiDialogFragment.newInstance(call.getId());
fragment.show(getSupportFragmentManager(), Tags.INTERNATIONAL_CALL_ON_WIFI);
}
@@ -1785,28 +1803,6 @@ public class InCallActivity extends TransactionSafeFragmentActivity
static final String ANSWER_AND_RELEASE_ENABLED = "answer_and_release_enabled";
}
- private static final class InternationalCallOnWifiCallback
- implements InternationalCallOnWifiDialogFragment.Callback {
- private static final String TAG = InternationalCallOnWifiCallback.class.getCanonicalName();
-
- @Override
- public void continueCall(@NonNull String callId) {
- LogUtil.i(TAG, "Continuing call with ID: %s", callId);
- }
-
- @Override
- public void cancelCall(@NonNull String callId) {
- DialerCall call = CallList.getInstance().getCallById(callId);
- if (call == null) {
- LogUtil.i(TAG, "Call destroyed before the dialog is closed");
- return;
- }
-
- LogUtil.i(TAG, "Disconnecting international call on WiFi");
- call.disconnect();
- }
- }
-
private static final class SelectPhoneAccountListener
extends SelectPhoneAccountDialogFragment.SelectPhoneAccountListener {
private static final String TAG = SelectPhoneAccountListener.class.getCanonicalName();
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 5e08c6969..526cc64d3 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -71,6 +71,8 @@ import com.android.incallui.latencyreport.LatencyReport;
import com.android.incallui.legacyblocking.BlockedNumberContentObserver;
import com.android.incallui.spam.SpamCallListListener;
import com.android.incallui.speakeasy.SpeakEasyCallManager;
+import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogActivity;
+import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogFragment;
import com.android.incallui.videosurface.bindings.VideoSurfaceBindings;
import com.android.incallui.videosurface.protocol.VideoSurfaceTexture;
import com.android.incallui.videotech.utils.VideoUtils;
@@ -197,6 +199,7 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
private InCallCameraManager inCallCameraManager;
private FilteredNumberAsyncQueryHandler filteredQueryHandler;
private CallList.Listener spamCallListListener;
+ private CallList.Listener activeCallsListener;
/** Whether or not we are currently bound and waiting for Telecom to send us a new call. */
private boolean boundAndWaitingForOutgoingCall;
/** Determines if the InCall UI is in fullscreen mode or not. */
@@ -383,6 +386,8 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
new SpamCallListListener(
context, DialerExecutorComponent.get(context).dialerExecutorFactory());
this.callList.addListener(spamCallListListener);
+ activeCallsListener = new ActiveCallsCallListListener(context);
+ this.callList.addListener(activeCallsListener);
VideoPauseController.getInstance().setUp(this);
@@ -772,8 +777,22 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
@Override
public void onInternationalCallOnWifi(@NonNull DialerCall call) {
LogUtil.enterBlock("InCallPresenter.onInternationalCallOnWifi");
+
+ if (!InternationalCallOnWifiDialogFragment.shouldShow(context)) {
+ LogUtil.i(
+ "InCallPresenter.onInternationalCallOnWifi",
+ "InternationalCallOnWifiDialogFragment.shouldShow returned false");
+ return;
+ }
+
if (inCallActivity != null) {
inCallActivity.showDialogForInternationalCallOnWifi(call);
+ } else {
+ Intent intent = new Intent(context, InternationalCallOnWifiDialogActivity.class);
+ // Prevent showing MainActivity with InternationalCallOnWifiDialogActivity on above
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+ intent.putExtra(InternationalCallOnWifiDialogActivity.EXTRA_CALL_ID, call.getId());
+ context.startActivity(intent);
}
}
@@ -858,6 +877,7 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
callList.getActiveOrBackgroundCall() != null || callList.getOutgoingCall() != null;
inCallActivity.dismissKeyguard(hasCall);
}
+
Trace.endSection();
}
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index c153503ac..9dfe7abcb 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -157,7 +157,7 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
private String lastForwardedNumber;
private boolean isCallForwarded;
private String callSubject;
- private PhoneAccountHandle phoneAccountHandle;
+ @Nullable private PhoneAccountHandle phoneAccountHandle;
@CallHistoryStatus private int callHistoryStatus = CALL_HISTORY_STATUS_UNKNOWN;
private boolean isSpam;
private boolean isBlocked;
diff --git a/java/com/android/incallui/res/layout/caller_in_conference.xml b/java/com/android/incallui/res/layout/caller_in_conference.xml
index be4eca5f6..23bb28512 100644
--- a/java/com/android/incallui/res/layout/caller_in_conference.xml
+++ b/java/com/android/incallui/res/layout/caller_in_conference.xml
@@ -68,7 +68,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/SecondaryText"
- android:textColor="@color/dialer_secondary_text_color_hiden"
+ android:textColor="@color/dialer_disabled_text_color"
android:visibility="gone"/>
<!-- Number -->
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 2d70b6b12..7bfa100ea 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -49,6 +49,8 @@ import com.android.dialer.common.FragmentUtils;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.UiUtil;
import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
import com.android.dialer.rtt.RttTranscript;
import com.android.dialer.rtt.RttTranscriptMessage;
import com.android.dialer.util.DrawableConverter;
@@ -219,6 +221,7 @@ public class RttChatFragment extends Fragment
submitButton = view.findViewById(R.id.rtt_chat_submit_button);
submitButton.setOnClickListener(
v -> {
+ Logger.get(getContext()).logImpression(DialerImpression.Type.RTT_SEND_BUTTON_CLICKED);
adapter.submitLocalMessage();
resumeInput("");
rttCallScreenDelegate.onLocalMessage(Constants.BUBBLE_BREAKER);
@@ -254,6 +257,8 @@ public class RttChatFragment extends Fragment
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
if (!TextUtils.isEmpty(editText.getText())) {
+ Logger.get(getContext())
+ .logImpression(DialerImpression.Type.RTT_KEYBOARD_SEND_BUTTON_CLICKED);
submitButton.performClick();
}
return true;
diff --git a/java/com/android/incallui/telecomeventui/AndroidManifest.xml b/java/com/android/incallui/telecomeventui/AndroidManifest.xml
index 861b9368a..a2134a3bd 100644
--- a/java/com/android/incallui/telecomeventui/AndroidManifest.xml
+++ b/java/com/android/incallui/telecomeventui/AndroidManifest.xml
@@ -12,4 +12,15 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest package="com.android.incallui.telecomeventui"/> \ No newline at end of file
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.incallui.telecomeventui">
+ <application>
+ <activity
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:name="com.android.incallui.telecomeventui.InternationalCallOnWifiDialogActivity"
+ android:noHistory="true"
+ android:theme="@style/Theme.Incall.DialogHolder"/>
+ </application>
+</manifest>
diff --git a/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogActivity.java b/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogActivity.java
new file mode 100644
index 000000000..192c1603a
--- /dev/null
+++ b/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogActivity.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.telecomeventui;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import com.android.incallui.call.CallList;
+import com.android.incallui.call.DialerCall;
+
+/**
+ * Activity containing dialog that may be shown when users place an outgoing call to an
+ * international number while on Wifi.
+ */
+public class InternationalCallOnWifiDialogActivity extends AppCompatActivity
+ implements CallList.Listener {
+
+ public static final String EXTRA_CALL_ID = "extra_call_id";
+ private static final String TAG_INTERNATIONAL_CALL_ON_WIFI = "tag_international_call_on_wifi";
+
+ private String callId;
+
+ @Override
+ protected void onCreate(@Nullable Bundle bundle) {
+ super.onCreate(bundle);
+
+ callId = getIntent().getStringExtra(EXTRA_CALL_ID);
+ if (TextUtils.isEmpty(callId)) {
+ finish();
+ return;
+ }
+
+ InternationalCallOnWifiDialogFragment fragment =
+ InternationalCallOnWifiDialogFragment.newInstance(callId);
+ fragment.show(getSupportFragmentManager(), TAG_INTERNATIONAL_CALL_ON_WIFI);
+
+ CallList.getInstance().addListener(this);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ CallList.getInstance().removeListener(this);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ // We don't expect the activity to resume, except for orientation change.
+ if (!isChangingConfigurations()) {
+ finish();
+ }
+ }
+
+ @Override
+ public void onDisconnect(DialerCall call) {
+ if (callId.equals(call.getId())) {
+ finish();
+ }
+ }
+
+ @Override
+ public void onIncomingCall(DialerCall call) {}
+
+ @Override
+ public void onUpgradeToVideo(DialerCall call) {}
+
+ @Override
+ public void onUpgradeToRtt(DialerCall call, int rttRequestId) {}
+
+ @Override
+ public void onSessionModificationStateChange(DialerCall call) {}
+
+ @Override
+ public void onCallListChange(CallList callList) {}
+
+ @Override
+ public void onWiFiToLteHandover(DialerCall call) {}
+
+ @Override
+ public void onHandoverToWifiFailed(DialerCall call) {}
+
+ @Override
+ public void onInternationalCallOnWifi(@NonNull DialerCall call) {}
+}
diff --git a/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogFragment.java b/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogFragment.java
index 2b602f876..71a8be483 100644
--- a/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogFragment.java
+++ b/java/com/android/incallui/telecomeventui/InternationalCallOnWifiDialogFragment.java
@@ -21,16 +21,18 @@ import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.v4.app.DialogFragment;
import android.support.v4.os.UserManagerCompat;
import android.view.View;
import android.widget.CheckBox;
import com.android.dialer.common.Assert;
+import com.android.dialer.common.FragmentUtils;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.storage.StorageComponent;
+import com.android.incallui.call.CallList;
+import com.android.incallui.call.DialerCall;
/**
* Dialog that may be shown when users place an outgoing call to an international number while on
@@ -53,7 +55,7 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
return false;
}
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences preferences = StorageComponent.get(context).unencryptedSharedPrefs();
boolean shouldShow = preferences.getBoolean(ALWAYS_SHOW_WARNING_PREFERENCE_KEY, true);
LogUtil.i("InternationalCallOnWifiDialogFragment.shouldShow", "result: %b", shouldShow);
@@ -61,27 +63,13 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
}
/**
- * Called in response to user interaction with the {@link InternationalCallOnWifiDialogFragment}.
- */
- public interface Callback {
-
- /** Indicates that the user wishes to proceed with the call represented by the given call id. */
- void continueCall(@NonNull String callId);
-
- /** Indicates that the user wishes to cancel the call represented by the given call id. */
- void cancelCall(@NonNull String callId);
- }
-
- /**
* Returns a new instance of {@link InternationalCallOnWifiDialogFragment} with the given
* callback.
*
* <p>Prefer this method over the default constructor.
*/
- public static InternationalCallOnWifiDialogFragment newInstance(
- @NonNull String callId, @NonNull Callback callback) {
+ public static InternationalCallOnWifiDialogFragment newInstance(@NonNull String callId) {
InternationalCallOnWifiDialogFragment fragment = new InternationalCallOnWifiDialogFragment();
- fragment.setCallback(callback);
Bundle args = new Bundle();
args.putString(ARG_CALL_ID, Assert.isNotNull(callId));
fragment.setArguments(args);
@@ -93,31 +81,12 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
* InternationalCallOnWifiDialogFragment InternationalCallOnWifiDialogFragments}.
*/
@VisibleForTesting
- static final String ALWAYS_SHOW_WARNING_PREFERENCE_KEY =
+ public static final String ALWAYS_SHOW_WARNING_PREFERENCE_KEY =
"ALWAYS_SHOW_INTERNATIONAL_CALL_ON_WIFI_WARNING";
/** Key in the arguments bundle for call id. */
private static final String ARG_CALL_ID = "call_id";
- /**
- * Callback which will receive information about user interactions with this dialog.
- *
- * <p>This is Nullable in the event that the dialog is destroyed by the framework, but doesn't
- * have a callback reattached. Ideally, the InCallActivity would implement the callback and we
- * would use FragmentUtils.getParentUnsafe instead of holding onto the callback here, but that's
- * not possible with the existing InCallActivity/InCallActivityCommon implementation.
- */
- @Nullable private Callback callback;
-
- /**
- * Sets the callback for this dialog.
- *
- * <p>Used to reset the callback after state changes.
- */
- public void setCallback(@NonNull Callback callback) {
- this.callback = Assert.isNotNull(callback);
- }
-
@NonNull
@Override
public Dialog onCreateDialog(Bundle bundle) {
@@ -134,7 +103,7 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
CheckBox alwaysWarn = dialogView.findViewById(R.id.always_warn);
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ SharedPreferences preferences = StorageComponent.get(getActivity()).unencryptedSharedPrefs();
// The default is set to false in this case to ensure that the first time the dialog opens,
// the checkbox is unchecked.
alwaysWarn.setChecked(preferences.getBoolean(ALWAYS_SHOW_WARNING_PREFERENCE_KEY, false));
@@ -163,7 +132,7 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
preferences.edit().putBoolean(ALWAYS_SHOW_WARNING_PREFERENCE_KEY, alwaysWarn).apply();
// Neither callback nor callId are null in normal circumstances. See comments on callback
- callback.continueCall(getArguments().getString(ARG_CALL_ID));
+ continueCall(getArguments().getString(ARG_CALL_ID));
}
private void onNegativeButtonClick(@NonNull SharedPreferences preferences, boolean alwaysWarn) {
@@ -174,6 +143,37 @@ public class InternationalCallOnWifiDialogFragment extends DialogFragment {
preferences.edit().putBoolean(ALWAYS_SHOW_WARNING_PREFERENCE_KEY, alwaysWarn).apply();
// Neither callback nor callId are null in normal circumstances. See comments on callback
- callback.cancelCall(getArguments().getString(ARG_CALL_ID));
+ cancelCall(getArguments().getString(ARG_CALL_ID));
+ }
+
+ private void continueCall(@NonNull String callId) {
+ LogUtil.i(
+ "InternationalCallOnWifiDialogFragment.continueCall",
+ "Continuing call with ID: %s",
+ callId);
+ InternationalCallOnWifiDialogActivity activity =
+ FragmentUtils.getParent(this, InternationalCallOnWifiDialogActivity.class);
+ if (activity != null) {
+ activity.finish();
+ }
+ }
+
+ private void cancelCall(@NonNull String callId) {
+ DialerCall call = CallList.getInstance().getCallById(callId);
+ if (call == null) {
+ LogUtil.i(
+ "InternationalCallOnWifiDialogFragment.cancelCall",
+ "Call destroyed before the dialog is closed");
+ } else {
+ LogUtil.i(
+ "InternationalCallOnWifiDialogFragment.cancelCall",
+ "Disconnecting international call on WiFi");
+ call.disconnect();
+ }
+ InternationalCallOnWifiDialogActivity activity =
+ FragmentUtils.getParent(this, InternationalCallOnWifiDialogActivity.class);
+ if (activity != null) {
+ activity.finish();
+ }
}
}