Reinstate "iOS - Add iceRegatherIntervalRange."

This reverts commit 93adc3209b5ff10adaba54d5eab6b53bc2780685.

Reverted originally because it depended on a CL which was reverted.
That CL has been reinstated in:

https: //chromium-review.googlesource.com/#/c/572070/
Bug: webrtc:7969
Change-Id: I608bbeaaba02e84908433c8260cf236df0307a97
Reviewed-on: https://chromium-review.googlesource.com/572405
Reviewed-by: Zeke Chin <tkchin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#19035}
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm
index ad11b30..24fcdef 100644
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm
@@ -13,6 +13,7 @@
 #include <memory>
 
 #import "RTCIceServer+Private.h"
+#import "RTCIntervalRange+Private.h"
 #import "WebRTC/RTCLogging.h"
 
 #include "webrtc/rtc_base/rtccertificategenerator.h"
@@ -38,6 +39,7 @@
 @synthesize shouldPresumeWritableWhenFullyRelayed =
     _shouldPresumeWritableWhenFullyRelayed;
 @synthesize iceCheckMinInterval = _iceCheckMinInterval;
+@synthesize iceRegatherIntervalRange = _iceRegatherIntervalRange;
 
 - (instancetype)init {
   // Copy defaults.
@@ -83,13 +85,18 @@
       _iceCheckMinInterval =
           [NSNumber numberWithInt:*config.ice_check_min_interval];
     }
+    if (config.ice_regather_interval_range) {
+      const rtc::IntervalRange &nativeIntervalRange = config.ice_regather_interval_range.value();
+      _iceRegatherIntervalRange =
+          [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeIntervalRange];
+    }
   }
   return self;
 }
 
 - (NSString *)description {
   return [NSString stringWithFormat:
-      @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n}\n",
+      @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n%@\n}\n",
       _iceServers,
       [[self class] stringForTransportPolicy:_iceTransportPolicy],
       [[self class] stringForBundlePolicy:_bundlePolicy],
@@ -105,7 +112,8 @@
       _iceCandidatePoolSize,
       _shouldPruneTurnPorts,
       _shouldPresumeWritableWhenFullyRelayed,
-      _iceCheckMinInterval];
+      _iceCheckMinInterval,
+      _iceRegatherIntervalRange];
 }
 
 #pragma mark - Private
@@ -159,6 +167,12 @@
     nativeConfig->ice_check_min_interval =
         rtc::Optional<int>(_iceCheckMinInterval.intValue);
   }
+  if (_iceRegatherIntervalRange != nil) {
+    std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
+        _iceRegatherIntervalRange.nativeIntervalRange);
+    nativeConfig->ice_regather_interval_range =
+        rtc::Optional<rtc::IntervalRange>(*nativeIntervalRange);
+  }
 
   return nativeConfig.release();
 }
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h
new file mode 100644
index 0000000..b958413
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h
@@ -0,0 +1,27 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import "WebRTC/RTCIntervalRange.h"
+
+#include "webrtc/rtc_base/timeutils.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RTCIntervalRange ()
+
+@property(nonatomic, readonly)
+    std::unique_ptr<rtc::IntervalRange> nativeIntervalRange;
+
+- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm
new file mode 100644
index 0000000..40f5eb5
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm
@@ -0,0 +1,50 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import "RTCIntervalRange+Private.h"
+
+#include "webrtc/rtc_base/checks.h"
+
+@implementation RTCIntervalRange
+
+@synthesize min = _min;
+@synthesize max = _max;
+
+- (instancetype)init {
+  return [self initWithMin:0 max:0];
+}
+
+- (instancetype)initWithMin:(NSInteger)min
+                        max:(NSInteger)max {
+  RTC_DCHECK_LE(min, max);
+  if (self = [super init]) {
+    _min = min;
+    _max = max;
+  }
+  return self;
+}
+
+- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config {
+  return [self initWithMin:config.min() max:config.max()];
+}
+
+- (NSString *)description {
+  return [NSString stringWithFormat:@"[%ld, %ld]", (long)_min, (long)_max];
+}
+
+#pragma mark - Private
+
+- (std::unique_ptr<rtc::IntervalRange>)nativeIntervalRange {
+  std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
+      new rtc::IntervalRange((int)_min, (int)_max));
+  return nativeIntervalRange;
+}
+
+@end
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h
index 862a01d..17d79b2 100644
--- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h
+++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h
@@ -13,6 +13,7 @@
 #import <WebRTC/RTCMacros.h>
 
 @class RTCIceServer;
+@class RTCIntervalRange;
 
 /**
  * Represents the ice transport policy. This exposes the same states in C++,
@@ -109,6 +110,13 @@
  */
 @property(nonatomic, copy, nullable) NSNumber *iceCheckMinInterval;
 
+/** ICE Periodic Regathering
+ *  If set, WebRTC will periodically create and propose candidates without
+ *  starting a new ICE generation. The regathering happens continuously with
+ *  interval specified in milliseconds by the uniform distribution [a, b].
+ */
+@property(nonatomic, strong, nullable) RTCIntervalRange *iceRegatherIntervalRange;
+
 - (instancetype)init;
 
 @end
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h
new file mode 100644
index 0000000..9384b15
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h
@@ -0,0 +1,28 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RTCIntervalRange : NSObject
+
+@property(nonatomic, readonly) NSInteger min;
+@property(nonatomic, readonly) NSInteger max;
+
+- (instancetype)init;
+- (instancetype)initWithMin:(NSInteger)min
+                        max:(NSInteger)max
+    NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h
index 772cea1..17019a2 100644
--- a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h
+++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h
@@ -27,6 +27,7 @@
 #import <WebRTC/RTCFileLogger.h>
 #import <WebRTC/RTCIceCandidate.h>
 #import <WebRTC/RTCIceServer.h>
+#import <WebRTC/RTCIntervalRange.h>
 #import <WebRTC/RTCLegacyStatsReport.h>
 #import <WebRTC/RTCLogging.h>
 #import <WebRTC/RTCMacros.h>
diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm
index df94d4f..4b44fb1 100644
--- a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm
+++ b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm
@@ -18,6 +18,7 @@
 #import "RTCConfiguration+Private.h"
 #import "WebRTC/RTCConfiguration.h"
 #import "WebRTC/RTCIceServer.h"
+#import "WebRTC/RTCIntervalRange.h"
 
 @interface RTCConfigurationTest : NSObject
 - (void)testConversionToNativeConfiguration;
@@ -29,6 +30,7 @@
 - (void)testConversionToNativeConfiguration {
   NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
   RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings];
+  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100];
 
   RTCConfiguration *config = [[RTCConfiguration alloc] init];
   config.iceServers = @[ server ];
@@ -47,6 +49,7 @@
   config.continualGatheringPolicy =
       RTCContinualGatheringPolicyGatherContinually;
   config.shouldPruneTurnPorts = YES;
+  config.iceRegatherIntervalRange = range;
 
   std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration>
       nativeConfig([config createNativeConfiguration]);
@@ -73,11 +76,14 @@
   EXPECT_EQ(webrtc::PeerConnectionInterface::GATHER_CONTINUALLY,
             nativeConfig->continual_gathering_policy);
   EXPECT_EQ(true, nativeConfig->prune_turn_ports);
+  EXPECT_EQ(range.min, nativeConfig->ice_regather_interval_range->min());
+  EXPECT_EQ(range.max, nativeConfig->ice_regather_interval_range->max());
 }
 
 - (void)testNativeConversionToConfiguration {
   NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
   RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings];
+  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100];
 
   RTCConfiguration *config = [[RTCConfiguration alloc] init];
   config.iceServers = @[ server ];
@@ -96,6 +102,7 @@
   config.continualGatheringPolicy =
       RTCContinualGatheringPolicyGatherContinually;
   config.shouldPruneTurnPorts = YES;
+  config.iceRegatherIntervalRange = range;
 
   webrtc::PeerConnectionInterface::RTCConfiguration *nativeConfig =
       [config createNativeConfiguration];
@@ -121,6 +128,8 @@
             newConfig.iceBackupCandidatePairPingInterval);
   EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy);
   EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts);
+  EXPECT_EQ(config.iceRegatherIntervalRange.min, newConfig.iceRegatherIntervalRange.min);
+  EXPECT_EQ(config.iceRegatherIntervalRange.max, newConfig.iceRegatherIntervalRange.max);
 }
 
 @end
diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm
new file mode 100644
index 0000000..b995221
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm
@@ -0,0 +1,54 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+#include "webrtc/rtc_base/gunit.h"
+
+#import "RTCIntervalRange+Private.h"
+#import "WebRTC/RTCIntervalRange.h"
+
+@interface RTCIntervalRangeTest : NSObject
+- (void)testConversionToNativeConfiguration;
+- (void)testNativeConversionToConfiguration;
+@end
+
+@implementation RTCIntervalRangeTest
+
+- (void)testConversionToNativeConfiguration {
+  NSInteger min = 0;
+  NSInteger max = 100;
+  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:min max:max];
+  EXPECT_EQ(min, range.min);
+  EXPECT_EQ(max, range.max);
+  std::unique_ptr<rtc::IntervalRange> nativeRange = range.nativeIntervalRange;
+  EXPECT_EQ(min, nativeRange->min());
+  EXPECT_EQ(max, nativeRange->max());
+}
+
+- (void)testNativeConversionToConfiguration {
+  NSInteger min = 0;
+  NSInteger max = 100;
+  rtc::IntervalRange nativeRange((int)min, (int)max);
+  RTCIntervalRange *range =
+      [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeRange];
+  EXPECT_EQ(min, range.min);
+  EXPECT_EQ(max, range.max);
+}
+
+@end
+
+TEST(RTCIntervalRangeTest, NativeConfigurationConversionTest) {
+  @autoreleasepool {
+    RTCIntervalRangeTest *test = [[RTCIntervalRangeTest alloc] init];
+    [test testConversionToNativeConfiguration];
+    [test testNativeConversionToConfiguration];
+  }
+}