Merge "Show error when finding location time out."
diff --git a/assets/quantum/res/drawable/quantum_ic_error_outline_vd_theme_36.xml b/assets/quantum/res/drawable/quantum_ic_error_outline_vd_theme_36.xml
new file mode 100644
index 0000000..df4dc32
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_error_outline_vd_theme_36.xml
@@ -0,0 +1,33 @@
+<!--
+  ~ 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="36dp"
+    android:height="36dp"
+    android:viewportWidth="36.0"
+    android:viewportHeight="36.0"
+    android:tint="?attr/colorControlNormal">
+  <group
+      android:pivotX="12"
+      android:pivotY="12"
+      android:scaleX="1.5"
+      android:scaleY="1.5"
+      android:translateX="6"
+      android:translateY="6">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
+  </group>
+</vector>
\ No newline at end of file
diff --git a/java/com/android/incallui/calllocation/impl/LocationFragment.java b/java/com/android/incallui/calllocation/impl/LocationFragment.java
index 77e4f7f..6b2c876 100644
--- a/java/com/android/incallui/calllocation/impl/LocationFragment.java
+++ b/java/com/android/incallui/calllocation/impl/LocationFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -47,10 +47,12 @@
 
   private static final String ADDRESS_DELIMITER = ",";
 
-  // Indexes used to animate fading between views
-  private static final int LOADING_VIEW_INDEX = 0;
+  // Indexes used to animate fading between views, 0 for LOADING_VIEW_INDEX
   private static final int LOCATION_VIEW_INDEX = 1;
-  private static final long TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(5);
+  private static final int LOCATION_ERROR_INDEX = 2;
+
+  private static final long FIND_LOCATION_SPINNING_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(5);
+  private static final long LOAD_DATA_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(5);
 
   private ViewAnimator viewAnimator;
   private ImageView locationMap;
@@ -75,6 +77,14 @@
         showLocationNow();
       };
 
+  private final Runnable spinningTimeoutRunnable =
+      () -> {
+        if (!(isAddressSet || isLocationSet || isMapSet)) {
+          // No data received, show error
+          viewAnimator.setDisplayedChild(LOCATION_ERROR_INDEX);
+        }
+      };
+
   @Override
   public LocationPresenter createPresenter() {
     return new LocationPresenter();
@@ -100,9 +110,16 @@
   }
 
   @Override
+  public void onStart() {
+    super.onStart();
+    handler.postDelayed(spinningTimeoutRunnable, FIND_LOCATION_SPINNING_TIMEOUT_MILLIS);
+  }
+
+  @Override
   public void onDestroy() {
     super.onDestroy();
     handler.removeCallbacks(dataTimeoutRunnable);
+    handler.removeCallbacks(spinningTimeoutRunnable);
   }
 
   @Override
@@ -167,13 +184,14 @@
     if (isMapSet && isAddressSet && isLocationSet) {
       showLocationNow();
     } else if (!hasTimeoutStarted) {
-      handler.postDelayed(dataTimeoutRunnable, TIMEOUT_MILLIS);
+      handler.postDelayed(dataTimeoutRunnable, LOAD_DATA_TIMEOUT_MILLIS);
       hasTimeoutStarted = true;
     }
   }
 
   private void showLocationNow() {
     handler.removeCallbacks(dataTimeoutRunnable);
+    handler.removeCallbacks(spinningTimeoutRunnable);
     if (viewAnimator.getDisplayedChild() != LOCATION_VIEW_INDEX) {
       viewAnimator.setDisplayedChild(LOCATION_VIEW_INDEX);
       viewAnimator.setOnClickListener(v -> launchMap());
diff --git a/java/com/android/incallui/calllocation/impl/res/layout/location_fragment.xml b/java/com/android/incallui/calllocation/impl/res/layout/location_fragment.xml
index b1601f9..d20e32b 100644
--- a/java/com/android/incallui/calllocation/impl/res/layout/location_fragment.xml
+++ b/java/com/android/incallui/calllocation/impl/res/layout/location_fragment.xml
@@ -130,4 +130,34 @@
 
   </GridLayout>
 
+  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+      android:id="@+id/location_error_layout"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_gravity="center_vertical"
+      android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/location_error_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="32dp"
+        android:layout_marginBottom="12dp"
+        android:layout_gravity="center_horizontal"
+        android:src="@drawable/quantum_ic_error_outline_vd_theme_36"
+        android:tint="#C53929"/>
+
+    <TextView
+        android:id="@+id/location_error_text"
+        style="@style/LocationErrorTextStyle"
+        android:layout_width="match_parent"
+        android:layout_height="24sp"
+        android:layout_marginBottom="20dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:gravity="center"
+        android:text="@string/location_error"/>
+
+  </LinearLayout>
+
 </ViewAnimator>
diff --git a/java/com/android/incallui/calllocation/impl/res/values/strings.xml b/java/com/android/incallui/calllocation/impl/res/values/strings.xml
index 573f33c..732b4ef 100644
--- a/java/com/android/incallui/calllocation/impl/res/values/strings.xml
+++ b/java/com/android/incallui/calllocation/impl/res/values/strings.xml
@@ -29,4 +29,7 @@
   <!-- Progress indicator loading text. [CHAR LIMIT=20] -->
   <string name="location_loading">Finding your location&#8230;</string>
 
+  <!-- Error message shown when we can't get device location. [CHAR LIMIT=NONE] -->
+  <string name="location_error">Error, could not retrieve your location</string>
+
 </resources>
diff --git a/java/com/android/incallui/calllocation/impl/res/values/styles.xml b/java/com/android/incallui/calllocation/impl/res/values/styles.xml
index 866a4ed..45e9c98 100644
--- a/java/com/android/incallui/calllocation/impl/res/values/styles.xml
+++ b/java/com/android/incallui/calllocation/impl/res/values/styles.xml
@@ -1,5 +1,18 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2015 Google Inc. All Rights Reserved. -->
+<!--
+  ~ 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
+  -->
 <resources>
 
   <style name="LocationAddressTitleTextStyle">
@@ -25,4 +38,10 @@
     <item name="android:textColor">#dd000000</item>
     <item name="android:fontFamily">sans-serif</item>
   </style>
+
+  <style name="LocationErrorTextStyle">
+    <item name="android:textSize">14sp</item>
+    <item name="android:textColor">#dd000000</item>
+    <item name="android:fontFamily">sans-serif</item>
+  </style>
 </resources>