diff --git a/InCallUI/src/com/android/incallui/InCallContactInteractions.java b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
index 918d39b..21660cb 100644
--- a/InCallUI/src/com/android/incallui/InCallContactInteractions.java
+++ b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
@@ -139,23 +139,22 @@
         BusinessContextInfo hoursInfo = new BusinessContextInfo();
         hoursInfo.iconId = R.drawable.ic_schedule_white_24dp;
 
-        Calendar openTime = getCalendarFromTime(currentTime, openingHours.first);
-        Calendar closeTime = getCalendarFromTime(currentTime, openingHours.second);
+        // Note: the date of these {@link Date}s are set to January 1, 1970. The object is just
+        // used as a storage for the time.
+        Date openingDateTime = getSimpleDateTime(openingHours.first);
+        Date closingDateTime = getSimpleDateTime(openingHours.second);
 
-        if (openTime == null || closeTime == null) {
+        if (openingDateTime == null || closingDateTime == null) {
             return null;
         }
 
-        if (currentTime.after(openTime) && currentTime.before(closeTime)) {
-            hoursInfo.heading = mContext.getString(R.string.open_now);
-        } else {
-            hoursInfo.heading = mContext.getString(R.string.closed_now);
-        }
+        hoursInfo.heading = isOpen(openingDateTime, closingDateTime, currentTime)
+                ? mContext.getString(R.string.open_now) : mContext.getString(R.string.closed_now);
 
         hoursInfo.detail = mContext.getString(
                 R.string.opening_hours,
-                DateFormat.getTimeFormat(mContext).format(openTime.getTime()),
-                DateFormat.getTimeFormat(mContext).format(closeTime.getTime()));
+                DateFormat.getTimeFormat(mContext).format(openingDateTime),
+                DateFormat.getTimeFormat(mContext).format(closingDateTime));
         return hoursInfo;
     }
 
@@ -205,25 +204,57 @@
     }
 
     /**
-     * Get a calendar object set to the current calendar date and the time set to the "hhmm" string
-     * passed in.
+     * Get a {@link Date} object corresponding to a particular time.
+     *
+     * @param time A string containing a time in the format "hhmm".
+     * @return A {@link Date} object with the time set to the parsed value of the "time" parameter
+     * and the date set to January 1, 1970. Or {@code null} if the input string is not able to be
+     * parsed.
      */
-    private Calendar getCalendarFromTime(Calendar currentTime, String time) {
+    private Date getSimpleDateTime(String time) {
         try {
-            Calendar newCalendar = Calendar.getInstance();
-            newCalendar.setTime(new SimpleDateFormat("hhmm").parse(time));
-            newCalendar.set(
-                    currentTime.get(Calendar.YEAR),
-                    currentTime.get(Calendar.MONTH),
-                    currentTime.get(Calendar.DATE));
-            return newCalendar;
+            return new SimpleDateFormat("hhmm").parse(time);
         } catch (ParseException e) {
-            Log.w(TAG, "Could not parse time string" + time);
+            Log.w(TAG, "Could not parse time string " + time);
         }
         return null;
     }
 
     /**
+     * Check whether the current time falls between the opening time and the closing time.
+     *
+     * @param openingTime A {@link Date} object with the time set to the opening time and the date
+     * set to January 1, 1970.
+     * @param closingTime A {@link Date} object with the time set to the closing time and the date
+     * set to January 1, 1970.
+     * @param currentDateTime A {@link Calendar} object with the current date and time.
+     * @return {@code true} if the current time falls within the opening and closing time bounds and
+     * {@code false} otherwise.
+     */
+    private boolean isOpen(Date openingTime, Date closingTime, Calendar currentDateTime) {
+        Calendar openTimeCalendar = Calendar.getInstance();
+        openTimeCalendar.setTime(openingTime);
+
+        Calendar closeTimeCalendar = Calendar.getInstance();
+        closeTimeCalendar.setTime(closingTime);
+
+        if (openTimeCalendar.compareTo(closeTimeCalendar) >= 0) {
+            // If the open time is the same or after the close time, add a day to the close time
+            // calendar.
+            closeTimeCalendar.add(Calendar.DATE, 1);
+        }
+
+        // Since the date doesn't actually matter, it's easier to set the current date to the
+        // opening date rather than change both the calendars for the open time and the close time.
+        currentDateTime.set(
+                openTimeCalendar.get(Calendar.YEAR),
+                openTimeCalendar.get(Calendar.MONTH),
+                openTimeCalendar.get(Calendar.DATE));
+
+        return currentDateTime.after(openTimeCalendar) && currentDateTime.before(closeTimeCalendar);
+    }
+
+    /**
      * Get the appropriate title for the context.
      * @return The "Business info" title for a business contact and the "Recent messages" title for
      *         personal contacts.
diff --git a/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
index b97be01..50d0aaf 100644
--- a/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
+++ b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
@@ -44,6 +44,26 @@
         assertEquals(mContext.getString(R.string.open_now), info.heading);
     }
 
+    public void testIsOpenNow_ClosingAfterMidnight() {
+        Calendar currentTimeForTest = Calendar.getInstance();
+        currentTimeForTest.set(Calendar.HOUR_OF_DAY, 10);
+        BusinessContextInfo info =
+                mInCallContactInteractions.constructHoursInfo(
+                        currentTimeForTest,
+                        Pair.create("0800", "0100"));
+        assertEquals(mContext.getString(R.string.open_now), info.heading);
+    }
+
+    public void testIsOpenNow_Open24Hours() {
+        Calendar currentTimeForTest = Calendar.getInstance();
+        currentTimeForTest.set(Calendar.HOUR_OF_DAY, 10);
+        BusinessContextInfo info =
+                mInCallContactInteractions.constructHoursInfo(
+                        currentTimeForTest,
+                        Pair.create("0800", "0800"));
+        assertEquals(mContext.getString(R.string.open_now), info.heading);
+    }
+
     public void testIsClosedNow_BeforeOpen() {
         Calendar currentTimeForTest = Calendar.getInstance();
         currentTimeForTest.set(Calendar.HOUR_OF_DAY, 6);
