Deprecate Window and WindowData. (#1018)

* Deprecate Window and WindowType in Stats APIs

* Window and WindowData will continue to be NonNull

* Suppress warnings for impl, exporter and zpages.

* NoopStats should continue to use old method.
diff --git a/api/src/main/java/io/opencensus/stats/NoopStats.java b/api/src/main/java/io/opencensus/stats/NoopStats.java
index 74f8f66..97d2976 100644
--- a/api/src/main/java/io/opencensus/stats/NoopStats.java
+++ b/api/src/main/java/io/opencensus/stats/NoopStats.java
@@ -27,10 +27,6 @@
 import io.opencensus.common.Timestamp;
 import io.opencensus.stats.Measure.MeasureDouble;
 import io.opencensus.stats.Measure.MeasureLong;
-import io.opencensus.stats.View.AggregationWindow;
-import io.opencensus.stats.ViewData.AggregationWindowData;
-import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData;
-import io.opencensus.stats.ViewData.AggregationWindowData.IntervalData;
 import io.opencensus.tags.TagContext;
 import io.opencensus.tags.TagValue;
 import java.util.Collection;
@@ -176,6 +172,7 @@
 
     @Override
     @Nullable
+    @SuppressWarnings("deprecation")
     public ViewData getView(View.Name name) {
       checkNotNull(name, "name");
       synchronized (registeredViews) {
@@ -188,11 +185,12 @@
               Collections.<List<TagValue>, AggregationData>emptyMap(),
               view.getWindow()
                   .match(
-                      Functions.<AggregationWindowData>returnConstant(
-                          CumulativeData.create(ZERO_TIMESTAMP, ZERO_TIMESTAMP)),
-                      Functions.<AggregationWindowData>returnConstant(
-                          IntervalData.create(ZERO_TIMESTAMP)),
-                      Functions.<AggregationWindowData>throwAssertionError()));
+                      Functions.<ViewData.AggregationWindowData>returnConstant(
+                          ViewData.AggregationWindowData.CumulativeData.create(
+                              ZERO_TIMESTAMP, ZERO_TIMESTAMP)),
+                      Functions.<ViewData.AggregationWindowData>returnConstant(
+                          ViewData.AggregationWindowData.IntervalData.create(ZERO_TIMESTAMP)),
+                      Functions.<ViewData.AggregationWindowData>throwAssertionError()));
         }
       }
     }
@@ -209,12 +207,14 @@
     }
 
     // Returns the subset of the given views that should be exported
+    @SuppressWarnings("deprecation")
     private static Set<View> filterExportedViews(Collection<View> allViews) {
       Set<View> views = Sets.newHashSet();
       for (View view : allViews) {
-        if (view.getWindow() instanceof AggregationWindow.Cumulative) {
-          views.add(view);
+        if (view.getWindow() instanceof View.AggregationWindow.Interval) {
+          continue;
         }
+        views.add(view);
       }
       return Collections.unmodifiableSet(views);
     }
diff --git a/api/src/main/java/io/opencensus/stats/View.java b/api/src/main/java/io/opencensus/stats/View.java
index a26c777..3291591 100644
--- a/api/src/main/java/io/opencensus/stats/View.java
+++ b/api/src/main/java/io/opencensus/stats/View.java
@@ -40,7 +40,7 @@
 @AutoValue
 // Suppress Checker Framework warning about missing @Nullable in generated equals method.
 @AutoValue.CopyAnnotations
-@SuppressWarnings("nullness")
+@SuppressWarnings({"nullness", "deprecation"})
 public abstract class View {
 
   @VisibleForTesting static final int NAME_MAX_LENGTH = 255;
@@ -90,7 +90,9 @@
    *
    * @return the time {@link AggregationWindow}.
    * @since 0.8
+   * @deprecated since 0.13. In the future all {@link View}s will be cumulative.
    */
+  @Deprecated
   public abstract AggregationWindow getWindow();
 
   /**
@@ -105,7 +107,9 @@
    * @param window the {@link AggregationWindow} of view.
    * @return a new {@link View}.
    * @since 0.8
+   * @deprecated in favor of {@link #create(Name, String, Measure, Aggregation, List)}.
    */
+  @Deprecated
   public static View create(
       Name name,
       String description,
@@ -125,6 +129,35 @@
   }
 
   /**
+   * Constructs a new {@link View}.
+   *
+   * @param name the {@link Name} of view. Must be unique.
+   * @param description the description of view.
+   * @param measure the {@link Measure} to be aggregated by this view.
+   * @param aggregation the basic {@link Aggregation} that this view will support.
+   * @param columns the {@link TagKey}s that this view will aggregate on. Columns should not contain
+   *     duplicates.
+   * @return a new {@link View}.
+   * @since 0.13
+   */
+  public static View create(
+      Name name,
+      String description,
+      Measure measure,
+      Aggregation aggregation,
+      List<TagKey> columns) {
+    checkArgument(new HashSet<TagKey>(columns).size() == columns.size(), "Columns have duplicate.");
+
+    return new AutoValue_View(
+        name,
+        description,
+        measure,
+        aggregation,
+        Collections.unmodifiableList(new ArrayList<TagKey>(columns)),
+        AggregationWindow.Cumulative.create());
+  }
+
+  /**
    * The name of a {@code View}.
    *
    * @since 0.8
@@ -169,7 +202,9 @@
    * The time window for a {@code View}.
    *
    * @since 0.8
+   * @deprecated since 0.13. In the future all {@link View}s will be cumulative.
    */
+  @Deprecated
   @Immutable
   public abstract static class AggregationWindow {
 
@@ -189,7 +224,9 @@
      * Cumulative (infinite interval) time {@code AggregationWindow}.
      *
      * @since 0.8
+     * @deprecated since 0.13. In the future all {@link View}s will be cumulative.
      */
+    @Deprecated
     @Immutable
     @AutoValue
     // Suppress Checker Framework warning about missing @Nullable in generated equals method.
@@ -227,7 +264,9 @@
      * Interval (finite interval) time {@code AggregationWindow}.
      *
      * @since 0.8
+     * @deprecated since 0.13. In the future all {@link View}s will be cumulative.
      */
+    @Deprecated
     @Immutable
     @AutoValue
     // Suppress Checker Framework warning about missing @Nullable in generated equals method.
diff --git a/api/src/main/java/io/opencensus/stats/ViewData.java b/api/src/main/java/io/opencensus/stats/ViewData.java
index 951afb2..3ee67ca 100644
--- a/api/src/main/java/io/opencensus/stats/ViewData.java
+++ b/api/src/main/java/io/opencensus/stats/ViewData.java
@@ -20,6 +20,7 @@
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.Maps;
+import io.opencensus.common.Duration;
 import io.opencensus.common.Function;
 import io.opencensus.common.Functions;
 import io.opencensus.common.Timestamp;
@@ -34,7 +35,6 @@
 import io.opencensus.stats.AggregationData.SumDataLong;
 import io.opencensus.stats.Measure.MeasureDouble;
 import io.opencensus.stats.Measure.MeasureLong;
-import io.opencensus.stats.View.AggregationWindow;
 import io.opencensus.tags.TagValue;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -56,7 +56,7 @@
 @AutoValue
 // Suppress Checker Framework warning about missing @Nullable in generated equals method.
 @AutoValue.CopyAnnotations
-@SuppressWarnings("nullness")
+@SuppressWarnings({"nullness", "deprecation"})
 public abstract class ViewData {
 
   // Prevents this class from being subclassed anywhere else.
@@ -80,12 +80,33 @@
   /**
    * Returns the {@link AggregationWindowData} associated with this {@link ViewData}.
    *
+   * <p>{@link AggregationWindowData} is deprecated since 0.13, please avoid using this method. Use
+   * {@link #getStart()} and {@link #getEnd()} instead.
+   *
    * @return the {@code AggregationWindowData}.
    * @since 0.8
+   * @deprecated in favor of {@link #getStart()} and {@link #getEnd()}.
    */
+  @Deprecated
   public abstract AggregationWindowData getWindowData();
 
   /**
+   * Returns the start {@code Timestamp} for a {@link ViewData}.
+   *
+   * @return the start {@code Timestamp}.
+   * @since 0.13
+   */
+  public abstract Timestamp getStart();
+
+  /**
+   * Returns the end {@code Timestamp} for a {@link ViewData}.
+   *
+   * @return the end {@code Timestamp}.
+   * @since 0.13
+   */
+  public abstract Timestamp getEnd();
+
+  /**
    * Constructs a new {@link ViewData}.
    *
    * @param view the {@link View} associated with this {@link ViewData}.
@@ -96,12 +117,62 @@
    *     AggregationData} don't match, or the types of {@code Window} and {@code WindowData} don't
    *     match.
    * @since 0.8
+   * @deprecated in favor of {@link #create(View, Map, Timestamp, Timestamp)}.
+   */
+  @Deprecated
+  public static ViewData create(
+      final View view,
+      Map<? extends List</*@Nullable*/ TagValue>, ? extends AggregationData> map,
+      final AggregationWindowData windowData) {
+    checkWindow(view.getWindow(), windowData);
+    final Map<List<TagValue>, AggregationData> deepCopy = Maps.newHashMap();
+    for (Entry<? extends List<TagValue>, ? extends AggregationData> entry : map.entrySet()) {
+      checkAggregation(view.getAggregation(), entry.getValue(), view.getMeasure());
+      deepCopy.put(
+          Collections.unmodifiableList(new ArrayList</*@Nullable*/ TagValue>(entry.getKey())),
+          entry.getValue());
+    }
+    return windowData.match(
+        new Function<ViewData.AggregationWindowData.CumulativeData, ViewData>() {
+          @Override
+          public ViewData apply(ViewData.AggregationWindowData.CumulativeData arg) {
+            return new AutoValue_ViewData(
+                view, Collections.unmodifiableMap(deepCopy), arg, arg.getStart(), arg.getEnd());
+          }
+        },
+        new Function<ViewData.AggregationWindowData.IntervalData, ViewData>() {
+          @Override
+          public ViewData apply(ViewData.AggregationWindowData.IntervalData arg) {
+            Duration duration = ((View.AggregationWindow.Interval) view.getWindow()).getDuration();
+            return new AutoValue_ViewData(
+                view,
+                Collections.unmodifiableMap(deepCopy),
+                arg,
+                arg.getEnd()
+                    .addDuration(Duration.create(-duration.getSeconds(), -duration.getNanos())),
+                arg.getEnd());
+          }
+        },
+        Functions.<ViewData>throwAssertionError());
+  }
+
+  /**
+   * Constructs a new {@link ViewData}.
+   *
+   * @param view the {@link View} associated with this {@link ViewData}.
+   * @param map the mapping from {@link TagValue} list to {@link AggregationData}.
+   * @param start the start {@link Timestamp} for this {@link ViewData}.
+   * @param end the end {@link Timestamp} for this {@link ViewData}.
+   * @return a {@code ViewData}.
+   * @throws IllegalArgumentException if the types of {@code Aggregation} and {@code
+   *     AggregationData} don't match.
+   * @since 0.13
    */
   public static ViewData create(
       View view,
       Map<? extends List</*@Nullable*/ TagValue>, ? extends AggregationData> map,
-      final AggregationWindowData windowData) {
-    checkWindow(view.getWindow(), windowData);
+      Timestamp start,
+      Timestamp end) {
     Map<List<TagValue>, AggregationData> deepCopy = Maps.newHashMap();
     for (Entry<? extends List<TagValue>, ? extends AggregationData> entry : map.entrySet()) {
       checkAggregation(view.getAggregation(), entry.getValue(), view.getMeasure());
@@ -109,11 +180,16 @@
           Collections.unmodifiableList(new ArrayList</*@Nullable*/ TagValue>(entry.getKey())),
           entry.getValue());
     }
-    return new AutoValue_ViewData(view, Collections.unmodifiableMap(deepCopy), windowData);
+    return new AutoValue_ViewData(
+        view,
+        Collections.unmodifiableMap(deepCopy),
+        AggregationWindowData.CumulativeData.create(start, end),
+        start,
+        end);
   }
 
   private static void checkWindow(
-      AggregationWindow window, final AggregationWindowData windowData) {
+      View.AggregationWindow window, final AggregationWindowData windowData) {
     window.match(
         new Function<View.AggregationWindow.Cumulative, Void>() {
           @Override
@@ -133,11 +209,11 @@
             return null;
           }
         },
-        Functions.</*@Nullable*/ Void>throwIllegalArgumentException());
+        Functions.</*@Nullable*/ Void>throwAssertionError());
   }
 
   private static String createErrorMessageForWindow(
-      AggregationWindow window, AggregationWindowData windowData) {
+      View.AggregationWindow window, AggregationWindowData windowData) {
     return "AggregationWindow and AggregationWindowData types mismatch. "
         + "AggregationWindow: "
         + window
@@ -217,7 +293,9 @@
    * The {@code AggregationWindowData} for a {@link ViewData}.
    *
    * @since 0.8
+   * @deprecated since 0.13, please use start and end {@link Timestamp} instead.
    */
+  @Deprecated
   @Immutable
   public abstract static class AggregationWindowData {
 
@@ -237,7 +315,9 @@
      * Cumulative {@code AggregationWindowData}.
      *
      * @since 0.8
+     * @deprecated since 0.13, please use start and end {@link Timestamp} instead.
      */
+    @Deprecated
     @Immutable
     @AutoValue
     // Suppress Checker Framework warning about missing @Nullable in generated equals method.
@@ -288,7 +368,9 @@
      * Interval {@code AggregationWindowData}.
      *
      * @since 0.8
+     * @deprecated since 0.13, please use start and end {@link Timestamp} instead.
      */
+    @Deprecated
     @Immutable
     @AutoValue
     // Suppress Checker Framework warning about missing @Nullable in generated equals method.
diff --git a/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java b/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java
index 4aaa60d..44c7626 100644
--- a/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java
+++ b/api/src/test/java/io/opencensus/stats/NoopViewManagerTest.java
@@ -105,6 +105,8 @@
     ViewData viewData = viewManager.getView(VIEW_NAME);
     assertThat(viewData.getView()).isEqualTo(view);
     assertThat(viewData.getAggregationMap()).isEmpty();
+    assertThat(viewData.getStart()).isEqualTo(Timestamp.create(0, 0));
+    assertThat(viewData.getEnd()).isEqualTo(Timestamp.create(0, 0));
     assertThat(viewData.getWindowData())
         .isEqualTo(CumulativeData.create(Timestamp.create(0, 0), Timestamp.create(0, 0)));
   }
@@ -171,23 +173,13 @@
     ViewManager viewManager = NoopStats.newNoopViewManager();
     View view1 =
         View.create(
-            View.Name.create("View 1"),
-            VIEW_DESCRIPTION,
-            MEASURE,
-            AGGREGATION,
-            Arrays.asList(KEY),
-            CUMULATIVE);
+            View.Name.create("View 1"), VIEW_DESCRIPTION, MEASURE, AGGREGATION, Arrays.asList(KEY));
     viewManager.registerView(view1);
     Set<View> exported = viewManager.getAllExportedViews();
 
     View view2 =
         View.create(
-            View.Name.create("View 2"),
-            VIEW_DESCRIPTION,
-            MEASURE,
-            AGGREGATION,
-            Arrays.asList(KEY),
-            CUMULATIVE);
+            View.Name.create("View 2"), VIEW_DESCRIPTION, MEASURE, AGGREGATION, Arrays.asList(KEY));
     thrown.expect(UnsupportedOperationException.class);
     exported.add(view2);
   }
diff --git a/contrib/grpc_metrics/src/main/java/io/opencensus/contrib/grpc/metrics/RpcViewConstants.java b/contrib/grpc_metrics/src/main/java/io/opencensus/contrib/grpc/metrics/RpcViewConstants.java
index b643c3d..093d55a 100644
--- a/contrib/grpc_metrics/src/main/java/io/opencensus/contrib/grpc/metrics/RpcViewConstants.java
+++ b/contrib/grpc_metrics/src/main/java/io/opencensus/contrib/grpc/metrics/RpcViewConstants.java
@@ -49,9 +49,6 @@
 import io.opencensus.stats.Aggregation.Mean;
 import io.opencensus.stats.BucketBoundaries;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow;
-import io.opencensus.stats.View.AggregationWindow.Cumulative;
-import io.opencensus.stats.View.AggregationWindow.Interval;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -61,6 +58,7 @@
  *
  * @since 0.8
  */
+@SuppressWarnings("deprecation")
 public final class RpcViewConstants {
 
   // Common histogram bucket boundaries for bytes received/sets Views.
@@ -118,9 +116,16 @@
 
   @VisibleForTesting static final Duration MINUTE = Duration.create(60, 0);
   @VisibleForTesting static final Duration HOUR = Duration.create(60 * 60, 0);
-  @VisibleForTesting static final AggregationWindow CUMULATIVE = Cumulative.create();
-  @VisibleForTesting static final AggregationWindow INTERVAL_MINUTE = Interval.create(MINUTE);
-  @VisibleForTesting static final AggregationWindow INTERVAL_HOUR = Interval.create(HOUR);
+
+  @VisibleForTesting
+  static final View.AggregationWindow CUMULATIVE = View.AggregationWindow.Cumulative.create();
+
+  @VisibleForTesting
+  static final View.AggregationWindow INTERVAL_MINUTE =
+      View.AggregationWindow.Interval.create(MINUTE);
+
+  @VisibleForTesting
+  static final View.AggregationWindow INTERVAL_HOUR = View.AggregationWindow.Interval.create(HOUR);
 
   // Rpc client cumulative views.
 
diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/RpczZPageHandler.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/RpczZPageHandler.java
index 1a2ebb8..56ccb73 100644
--- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/RpczZPageHandler.java
+++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/RpczZPageHandler.java
@@ -88,8 +88,6 @@
 import io.opencensus.stats.AggregationData.MeanData;
 import io.opencensus.stats.View;
 import io.opencensus.stats.ViewData;
-import io.opencensus.stats.ViewData.AggregationWindowData;
-import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData;
 import io.opencensus.stats.ViewManager;
 import io.opencensus.tags.TagValue;
 import java.io.BufferedWriter;
@@ -108,6 +106,7 @@
 */
 
 /** HTML page formatter for gRPC cumulative and interval stats. */
+@SuppressWarnings("deprecation")
 final class RpczZPageHandler extends ZPageHandler {
 
   private final ViewManager viewManager;
@@ -364,7 +363,10 @@
 
   // Gets RPC stats by its view definition, and set it to stats snapshot.
   private static void getStats(
-      StatsSnapshot snapshot, AggregationData data, View view, AggregationWindowData windowData) {
+      StatsSnapshot snapshot,
+      AggregationData data,
+      View view,
+      ViewData.AggregationWindowData windowData) {
     if (view == RPC_CLIENT_ROUNDTRIP_LATENCY_VIEW || view == RPC_SERVER_SERVER_LATENCY_VIEW) {
       snapshot.avgLatencyTotal = ((DistributionData) data).getMean();
     } else if (view == RPC_CLIENT_ROUNDTRIP_LATENCY_MINUTE_VIEW
@@ -387,7 +389,7 @@
           distributionData.getCount()
               * distributionData.getMean()
               / BYTES_PER_KB
-              / getDurationInSecs((CumulativeData) windowData);
+              / getDurationInSecs((ViewData.AggregationWindowData.CumulativeData) windowData);
     } else if (view == RPC_CLIENT_REQUEST_BYTES_MINUTE_VIEW
         || view == RPC_SERVER_REQUEST_BYTES_MINUTE_VIEW) {
       MeanData meanData = (MeanData) data;
@@ -404,7 +406,7 @@
           distributionData.getCount()
               * distributionData.getMean()
               / BYTES_PER_KB
-              / getDurationInSecs((CumulativeData) windowData);
+              / getDurationInSecs((ViewData.AggregationWindowData.CumulativeData) windowData);
     } else if (view == RPC_CLIENT_RESPONSE_BYTES_MINUTE_VIEW
         || view == RPC_SERVER_RESPONSE_BYTES_MINUTE_VIEW) {
       MeanData meanData = (MeanData) data;
@@ -426,12 +428,15 @@
     } else if (view == RPC_CLIENT_STARTED_COUNT_CUMULATIVE_VIEW
         || view == RPC_SERVER_STARTED_COUNT_CUMULATIVE_VIEW) {
       snapshot.countTotal = ((CountData) data).getCount();
-      snapshot.rpcRateTotal = snapshot.countTotal / getDurationInSecs((CumulativeData) windowData);
+      snapshot.rpcRateTotal =
+          snapshot.countTotal
+              / getDurationInSecs((ViewData.AggregationWindowData.CumulativeData) windowData);
     } // TODO(songya): compute and store latency percentiles.
   }
 
   // Calculates the duration of the given CumulativeData in seconds.
-  private static double getDurationInSecs(CumulativeData cumulativeData) {
+  private static double getDurationInSecs(
+      ViewData.AggregationWindowData.CumulativeData cumulativeData) {
     return toDoubleSeconds(cumulativeData.getEnd().subtractTimestamp(cumulativeData.getStart()));
   }
 
diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/StatszZPageHandler.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/StatszZPageHandler.java
index bcf87d5..bacdc29 100644
--- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/StatszZPageHandler.java
+++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/StatszZPageHandler.java
@@ -41,8 +41,6 @@
 import io.opencensus.stats.Measure;
 import io.opencensus.stats.View;
 import io.opencensus.stats.ViewData;
-import io.opencensus.stats.ViewData.AggregationWindowData;
-import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData;
 import io.opencensus.stats.ViewManager;
 import io.opencensus.tags.TagKey;
 import io.opencensus.tags.TagValue;
@@ -66,6 +64,7 @@
 */
 
 /** HTML page formatter for all exported {@link View}s. */
+@SuppressWarnings("deprecation")
 final class StatszZPageHandler extends ZPageHandler {
 
   private static final Object monitor = new Object();
@@ -305,7 +304,7 @@
   }
 
   private static void emitViewInfo(
-      View view, AggregationWindowData windowData, PrintWriter out, Formatter formatter) {
+      View view, ViewData.AggregationWindowData windowData, PrintWriter out, Formatter formatter) {
     formatter.format("<table width=100%% %s>", TABLE_BORDER);
     emitViewInfoHeader(out, formatter);
 
@@ -324,9 +323,9 @@
                 Functions.<String>throwAssertionError());
     formatter.format("<td>%s</td>", aggregationType);
     windowData.match(
-        new Function<CumulativeData, Void>() {
+        new Function<ViewData.AggregationWindowData.CumulativeData, Void>() {
           @Override
-          public Void apply(CumulativeData arg) {
+          public Void apply(ViewData.AggregationWindowData.CumulativeData arg) {
             formatter.format("<td>%s</td>", toDate(arg.getStart()));
             formatter.format("<td>%s</td>", toDate(arg.getEnd()));
             return null;
diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java
index fa581d1..710e9a2 100644
--- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java
+++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java
@@ -22,7 +22,6 @@
 import io.opencensus.stats.Measure;
 import io.opencensus.stats.Stats;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow.Cumulative;
 import io.opencensus.trace.Tracing;
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -128,7 +127,7 @@
   /**
    * Returns a {@code ZPageHandler} for all registered {@link View}s and {@link Measure}s.
    *
-   * <p>Only {@link Cumulative} views are exported. {@link View}s are grouped by directories.
+   * <p>Only {@code Cumulative} views are exported. {@link View}s are grouped by directories.
    *
    * @return a {@code ZPageHandler} for all registered {@code View}s and {@code Measure}s.
    * @since 0.12.0
diff --git a/exporters/stats/prometheus/src/main/java/io/opencensus/exporter/stats/prometheus/PrometheusExportUtils.java b/exporters/stats/prometheus/src/main/java/io/opencensus/exporter/stats/prometheus/PrometheusExportUtils.java
index 2e0dd23..4a650b9 100644
--- a/exporters/stats/prometheus/src/main/java/io/opencensus/exporter/stats/prometheus/PrometheusExportUtils.java
+++ b/exporters/stats/prometheus/src/main/java/io/opencensus/exporter/stats/prometheus/PrometheusExportUtils.java
@@ -33,8 +33,6 @@
 import io.opencensus.stats.AggregationData.SumDataDouble;
 import io.opencensus.stats.AggregationData.SumDataLong;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow;
-import io.opencensus.stats.View.AggregationWindow.Cumulative;
 import io.opencensus.stats.ViewData;
 import io.opencensus.tags.TagKey;
 import io.opencensus.tags.TagValue;
@@ -55,7 +53,7 @@
  * Util methods to convert OpenCensus Stats data models to Prometheus data models.
  *
  * <p>Each OpenCensus {@link View} will be converted to a Prometheus {@link MetricFamilySamples}
- * with no {@link Sample}s, and is used for registering Prometheus {@code Metric}s. Only {@link
+ * with no {@link Sample}s, and is used for registering Prometheus {@code Metric}s. Only {@code
  * Cumulative} views are supported. All views are under namespace "opencensus".
  *
  * <p>{@link Aggregation} will be converted to a corresponding Prometheus {@link Type}. {@link Sum}
@@ -78,6 +76,7 @@
  * <p>Please note that Prometheus Metric and Label name can only have alphanumeric characters and
  * underscore. All other characters will be sanitized by underscores.
  */
+@SuppressWarnings("deprecation")
 final class PrometheusExportUtils {
 
   @VisibleForTesting static final String OPENCENSUS_NAMESPACE = "opencensus";
@@ -112,8 +111,8 @@
   }
 
   @VisibleForTesting
-  static Type getType(Aggregation aggregation, AggregationWindow window) {
-    if (!(window instanceof Cumulative)) {
+  static Type getType(Aggregation aggregation, View.AggregationWindow window) {
+    if (!(window instanceof View.AggregationWindow.Cumulative)) {
       return Type.UNTYPED;
     }
     return aggregation.match(
diff --git a/exporters/stats/signalfx/src/main/java/io/opencensus/exporter/stats/signalfx/SignalFxSessionAdaptor.java b/exporters/stats/signalfx/src/main/java/io/opencensus/exporter/stats/signalfx/SignalFxSessionAdaptor.java
index 8fc74e9..67a6dfc 100644
--- a/exporters/stats/signalfx/src/main/java/io/opencensus/exporter/stats/signalfx/SignalFxSessionAdaptor.java
+++ b/exporters/stats/signalfx/src/main/java/io/opencensus/exporter/stats/signalfx/SignalFxSessionAdaptor.java
@@ -33,7 +33,6 @@
 import io.opencensus.stats.AggregationData.SumDataDouble;
 import io.opencensus.stats.AggregationData.SumDataLong;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow;
 import io.opencensus.stats.ViewData;
 import io.opencensus.tags.TagKey;
 import io.opencensus.tags.TagValue;
@@ -48,6 +47,7 @@
 */
 
 /** Adapter for a {@code ViewData}'s contents into SignalFx datapoints. */
+@SuppressWarnings("deprecation")
 final class SignalFxSessionAdaptor {
 
   private SignalFxSessionAdaptor() {}
@@ -87,11 +87,12 @@
 
   @VisibleForTesting
   @javax.annotation.Nullable
-  static MetricType getMetricTypeForAggregation(Aggregation aggregation, AggregationWindow window) {
+  static MetricType getMetricTypeForAggregation(
+      Aggregation aggregation, View.AggregationWindow window) {
     if (aggregation instanceof Aggregation.Mean) {
       return MetricType.GAUGE;
     } else if (aggregation instanceof Aggregation.Count || aggregation instanceof Aggregation.Sum) {
-      if (window instanceof AggregationWindow.Cumulative) {
+      if (window instanceof View.AggregationWindow.Cumulative) {
         return MetricType.CUMULATIVE_COUNTER;
       }
       // TODO(mpetazzoni): support incremental counters when AggregationWindow.Interval is ready
diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java
index fbd8d25..82216b6 100644
--- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java
+++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExportUtils.java
@@ -47,12 +47,7 @@
 import io.opencensus.stats.BucketBoundaries;
 import io.opencensus.stats.Measure;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow;
-import io.opencensus.stats.View.AggregationWindow.Cumulative;
 import io.opencensus.stats.ViewData;
-import io.opencensus.stats.ViewData.AggregationWindowData;
-import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData;
-import io.opencensus.stats.ViewData.AggregationWindowData.IntervalData;
 import io.opencensus.tags.TagKey;
 import io.opencensus.tags.TagValue;
 import java.lang.management.ManagementFactory;
@@ -70,6 +65,7 @@
 */
 
 /** Util methods to convert OpenCensus Stats data models to StackDriver monitoring data models. */
+@SuppressWarnings("deprecation")
 final class StackdriverExportUtils {
   // TODO(songya): do we want these constants to be customizable?
   @VisibleForTesting static final String LABEL_DESCRIPTION = "OpenCensus TagKey";
@@ -101,7 +97,7 @@
   // Construct a MetricDescriptor using a View.
   @javax.annotation.Nullable
   static MetricDescriptor createMetricDescriptor(View view, String projectId) {
-    if (!(view.getWindow() instanceof Cumulative)) {
+    if (!(view.getWindow() instanceof View.AggregationWindow.Cumulative)) {
       // TODO(songya): Only Cumulative view will be exported to Stackdriver in this version.
       return null;
     }
@@ -147,7 +143,7 @@
 
   // Construct a MetricKind from an AggregationWindow
   @VisibleForTesting
-  static MetricKind createMetricKind(AggregationWindow window) {
+  static MetricKind createMetricKind(View.AggregationWindow window) {
     return window.match(
         Functions.returnConstant(MetricKind.CUMULATIVE), // Cumulative
         // TODO(songya): We don't support exporting Interval stats to StackDriver in this version.
@@ -179,7 +175,7 @@
       return timeSeriesList;
     }
     View view = viewData.getView();
-    if (!(view.getWindow() instanceof Cumulative)) {
+    if (!(view.getWindow() instanceof View.AggregationWindow.Cumulative)) {
       // TODO(songya): Only Cumulative view will be exported to Stackdriver in this version.
       return timeSeriesList;
     }
@@ -229,7 +225,9 @@
   // Create Point from AggregationData, AggregationWindowData and Aggregation.
   @VisibleForTesting
   static Point createPoint(
-      AggregationData aggregationData, AggregationWindowData windowData, Aggregation aggregation) {
+      AggregationData aggregationData,
+      ViewData.AggregationWindowData windowData,
+      Aggregation aggregation) {
     Point.Builder builder = Point.newBuilder();
     builder.setInterval(createTimeInterval(windowData));
     builder.setValue(createTypedValue(aggregation, aggregationData));
@@ -238,24 +236,18 @@
 
   // Convert AggregationWindowData to TimeInterval, currently only support CumulativeData.
   @VisibleForTesting
-  static TimeInterval createTimeInterval(AggregationWindowData windowData) {
+  static TimeInterval createTimeInterval(ViewData.AggregationWindowData windowData) {
     final TimeInterval.Builder builder = TimeInterval.newBuilder();
     windowData.match(
-        new Function<CumulativeData, Void>() {
+        new Function<ViewData.AggregationWindowData.CumulativeData, Void>() {
           @Override
-          public Void apply(CumulativeData arg) {
+          public Void apply(ViewData.AggregationWindowData.CumulativeData arg) {
             builder.setStartTime(convertTimestamp(arg.getStart()));
             builder.setEndTime(convertTimestamp(arg.getEnd()));
             return null;
           }
         },
-        new Function<IntervalData, Void>() {
-          @Override
-          public Void apply(IntervalData arg) {
-            // TODO(songya): we don't export IntervalData in this version.
-            throw new IllegalArgumentException("IntervalData not supported");
-          }
-        },
+        Functions.</*@Nullable*/ Void>throwIllegalArgumentException(),
         Functions.</*@Nullable*/ Void>throwIllegalArgumentException());
     return builder.build();
   }
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
index 6417371..34341ba 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MeasureToViewMap.java
@@ -30,7 +30,6 @@
 import io.opencensus.stats.Measurement.MeasurementLong;
 import io.opencensus.stats.StatsCollectionState;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow;
 import io.opencensus.stats.ViewData;
 import io.opencensus.tags.TagContext;
 import java.util.Collection;
@@ -47,6 +46,7 @@
 */
 
 /** A class that stores a singleton map from {@code MeasureName}s to {@link MutableViewData}s. */
+@SuppressWarnings("deprecation")
 final class MeasureToViewMap {
 
   /*
@@ -89,7 +89,7 @@
   private static Set<View> filterExportedViews(Collection<View> allViews) {
     Set<View> views = Sets.newHashSet();
     for (View view : allViews) {
-      if (view.getWindow() instanceof AggregationWindow.Cumulative) {
+      if (view.getWindow() instanceof View.AggregationWindow.Cumulative) {
         views.add(view);
       }
     }
diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
index 8ecb7dc..b82136d 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java
@@ -46,11 +46,7 @@
 import io.opencensus.stats.Measure;
 import io.opencensus.stats.StatsCollectionState;
 import io.opencensus.stats.View;
-import io.opencensus.stats.View.AggregationWindow.Cumulative;
-import io.opencensus.stats.View.AggregationWindow.Interval;
 import io.opencensus.stats.ViewData;
-import io.opencensus.stats.ViewData.AggregationWindowData.CumulativeData;
-import io.opencensus.stats.ViewData.AggregationWindowData.IntervalData;
 import io.opencensus.tags.InternalUtils;
 import io.opencensus.tags.Tag;
 import io.opencensus.tags.TagContext;
@@ -69,6 +65,7 @@
 */
 
 /** A mutable version of {@link ViewData}, used for recording stats and start/end time. */
+@SuppressWarnings("deprecation")
 abstract class MutableViewData {
 
   private static final long MILLIS_PER_SECOND = 1000L;
@@ -230,13 +227,13 @@
         return ViewData.create(
             super.view,
             createAggregationMap(tagValueAggregationMap, super.view.getMeasure()),
-            CumulativeData.create(start, now));
+            ViewData.AggregationWindowData.CumulativeData.create(start, now));
       } else {
         // If Stats state is DISABLED, return an empty ViewData.
         return ViewData.create(
             super.view,
             Collections.<List<TagValue>, AggregationData>emptyMap(),
-            CumulativeData.create(ZERO_TIMESTAMP, ZERO_TIMESTAMP));
+            ViewData.AggregationWindowData.CumulativeData.create(ZERO_TIMESTAMP, ZERO_TIMESTAMP));
       }
     }
 
@@ -298,7 +295,7 @@
 
     private IntervalMutableViewData(View view, Timestamp start) {
       super(view);
-      Duration totalDuration = ((Interval) view.getWindow()).getDuration();
+      Duration totalDuration = ((View.AggregationWindow.Interval) view.getWindow()).getDuration();
       this.totalDuration = totalDuration;
       this.bucketDuration = Duration.fromMillis(toMillis(totalDuration) / N);
 
@@ -321,13 +318,15 @@
       refreshBucketList(now);
       if (state == StatsCollectionState.ENABLED) {
         return ViewData.create(
-            super.view, combineBucketsAndGetAggregationMap(now), IntervalData.create(now));
+            super.view,
+            combineBucketsAndGetAggregationMap(now),
+            ViewData.AggregationWindowData.IntervalData.create(now));
       } else {
         // If Stats state is DISABLED, return an empty ViewData.
         return ViewData.create(
             super.view,
             Collections.<List<TagValue>, AggregationData>emptyMap(),
-            IntervalData.create(ZERO_TIMESTAMP));
+            ViewData.AggregationWindowData.IntervalData.create(ZERO_TIMESTAMP));
       }
     }
 
@@ -576,9 +575,10 @@
     private static final CreateDistributionData INSTANCE = new CreateDistributionData();
   }
 
-  private static final class CreateCumulative implements Function<Cumulative, MutableViewData> {
+  private static final class CreateCumulative
+      implements Function<View.AggregationWindow.Cumulative, MutableViewData> {
     @Override
-    public MutableViewData apply(Cumulative arg) {
+    public MutableViewData apply(View.AggregationWindow.Cumulative arg) {
       return new CumulativeMutableViewData(view, start);
     }
 
@@ -591,9 +591,10 @@
     }
   }
 
-  private static final class CreateInterval implements Function<Interval, MutableViewData> {
+  private static final class CreateInterval
+      implements Function<View.AggregationWindow.Interval, MutableViewData> {
     @Override
-    public MutableViewData apply(Interval arg) {
+    public MutableViewData apply(View.AggregationWindow.Interval arg) {
       return new IntervalMutableViewData(view, start);
     }