Skip to content
This repository has been archived by the owner on Dec 4, 2024. It is now read-only.

update for 1.0.0-beta14 #5

Merged
merged 71 commits into from
Sep 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
e116f46
Remove old circle.yml file
ashanbrown Jul 11, 2018
a03fa0d
Send back flagVersion in events when it is present (#5)
ashanbrown Jul 12, 2018
56165a0
Send default feature flag event when flag.value is null (#6)
ashanbrown Jul 13, 2018
d0ca44e
Create License.txt
ashanbrown Jul 13, 2018
2644d7f
Add test that we return default value for off variation (#7)
ashanbrown Jul 13, 2018
7fdf036
misc cleanup of project files
eli-darkly Jul 13, 2018
8924b5c
rm usage that won't work in older target frameworks
eli-darkly Jul 13, 2018
24b9809
Merge pull request #8 from launchdarkly/eb/cleanup
eli-darkly Jul 13, 2018
b3287b6
version 1.0.0-beta8
eli-darkly Jul 13, 2018
dcc7f9f
version 1.0.0-beta9
eli-darkly Jul 13, 2018
c2f674a
clean up unnecessary static references and make tests stable
eli-darkly Jul 17, 2018
b64cd58
Merge pull request #9 from launchdarkly/eb/static-instance-cleanup
eli-darkly Jul 18, 2018
27c0a39
break out and simplify basic flag evaluation tests
eli-darkly Jul 18, 2018
e4f6109
get rid of test fixture files
eli-darkly Jul 18, 2018
5ef9ea2
fix default value logic
eli-darkly Jul 18, 2018
0fc8c34
Merge pull request #10 from launchdarkly/eb/evaluation-tests
eli-darkly Jul 18, 2018
c43c4bb
add tests for event generation
eli-darkly Jul 18, 2018
5ed0280
Merge pull request #11 from launchdarkly/eb/event-tests
eli-darkly Jul 18, 2018
537886f
throw exception if user is null; assign unique key if key is null or …
eli-darkly Jul 19, 2018
c59ce16
Merge pull request #12 from launchdarkly/eb/ch20411/null-user
eli-darkly Jul 19, 2018
8d299c7
don't use strong naming for LaunchDarkly.Xamarin
eli-darkly Jul 23, 2018
df9e61e
skip connectivity check in .NET Standard
eli-darkly Jul 23, 2018
3e4f4e1
fix name of config setter
eli-darkly Jul 23, 2018
fb5621a
use platform reference instead of package reference
eli-darkly Jul 23, 2018
52bc60a
skip using preferences API in .NET Standard
eli-darkly Jul 23, 2018
a9d5167
beta11
eli-darkly Jul 23, 2018
fca4ca0
fix test
eli-darkly Jul 23, 2018
a8ffc36
rm note about signing
eli-darkly Jul 23, 2018
f5fd89d
Merge branch 'eb/ch20841/no-strong-name' into eb/misc-fixes
eli-darkly Jul 23, 2018
d32bdf6
don't set updateProcessor to null
eli-darkly Jul 23, 2018
23c94c1
more cleanup/simplification of test code
eli-darkly Jul 23, 2018
c0cd164
make timeout a parameter instead of a config property
eli-darkly Jul 23, 2018
5305820
Remove @ashanbrown from codeowners
ashanbrown Jul 23, 2018
15b7052
Merge branch 'eb/test-cleanup' into eb/ch20546/timeout-param
eli-darkly Jul 24, 2018
77816f2
propagate exception if polling task fails permanently
eli-darkly Jul 24, 2018
7bd3af3
Merge pull request #13 from launchdarkly/eb/ch20841/no-strong-name
eli-darkly Jul 24, 2018
9815b7a
Merge pull request #14 from launchdarkly/eb/misc-fixes
eli-darkly Jul 24, 2018
f835bd4
Merge pull request #15 from launchdarkly/eb/test-cleanup
eli-darkly Jul 24, 2018
05ae673
validate maxWaitTime
eli-darkly Jul 24, 2018
f2ac11e
send an initial identify event when client is created
eli-darkly Jul 24, 2018
70abf94
Merge branch 'master' into eb/ch20546/timeout-param
eli-darkly Jul 24, 2018
6e1f386
Merge branch 'eb/ch20546/timeout-param' into eb/ch20906/first-identif…
eli-darkly Jul 24, 2018
2b43a05
Merge branch 'eb/ch20546/timeout-param' into eb/ch20545/init-errors
eli-darkly Jul 24, 2018
f9e3289
Merge pull request #16 from launchdarkly/eb/ch20546/timeout-param
eli-darkly Jul 24, 2018
4243a00
Merge pull request #17 from launchdarkly/eb/ch20545/init-errors
eli-darkly Jul 24, 2018
2770185
Merge branch 'master' into eb/ch20906/first-identify-event
eli-darkly Jul 24, 2018
f963743
Merge pull request #18 from launchdarkly/eb/ch20906/first-identify-event
eli-darkly Jul 24, 2018
3f2d0c0
misc project file & test cleanup
eli-darkly Jul 25, 2018
a25b8cc
beta12 release (fixes System.Runtime reference problem in LD.Common)
eli-darkly Jul 27, 2018
17b7585
provide callback mechanism for backgrounding
eli-darkly Jul 27, 2018
d7bc235
don't try to restart the update processor in background unless backgr…
eli-darkly Jul 27, 2018
7c023e2
always initialize platform adapter
eli-darkly Jul 27, 2018
a7376c0
doc comment typo
eli-darkly Jul 28, 2018
0de1c94
doc comment typo
eli-darkly Jul 28, 2018
a97dd0d
fix hang in synchronous Identify
eli-darkly Jul 30, 2018
d631156
rm debugging
eli-darkly Jul 30, 2018
44daaf5
Merge pull request #20 from launchdarkly/eb/ch21044/identify-hanging
eli-darkly Jul 30, 2018
7961435
Merge branch 'master' into eb/ch20389/backgrounding-interface
eli-darkly Jul 30, 2018
b8da2e0
need to pass polling interval to adapter
eli-darkly Jul 30, 2018
bb76380
fix method parameter
eli-darkly Jul 30, 2018
d6cd177
Merge pull request #19 from launchdarkly/eb/ch20389/backgrounding-int…
eli-darkly Jul 30, 2018
3342490
version 1.0.0-beta13
eli-darkly Jul 30, 2018
7a03409
don't allow null/empty mobile key
eli-darkly Jul 31, 2018
16ebef0
Merge pull request #21 from launchdarkly/eb/ch20409/missing-key
eli-darkly Jul 31, 2018
f73aaa6
make polling intervals consistent with other mobile SDKs
eli-darkly Jul 31, 2018
281502e
Merge pull request #22 from launchdarkly/eb/ch21362/polling-intervals
eli-darkly Jul 31, 2018
08e08f7
bump LD.Common to 1.0.5 to get fix for reconnection delay
eli-darkly Aug 14, 2018
3574e2f
Merge pull request #23 from launchdarkly/eb/ch21070/stream-reconnect
eli-darkly Aug 14, 2018
0b66a68
1.0.0-beta14
eli-darkly Aug 14, 2018
63ed5ba
fix sample code
eli-darkly Sep 10, 2018
9e35804
Merge branch 'master' of github.com:launchdarkly/xamarin-client into …
eli-darkly Sep 10, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,7 @@ jobs:
docker:
- image: microsoft/dotnet:2.0-sdk-jessie
steps:
- run:
name: install packages
command: apt-get -q update && apt-get install -qy awscli
- checkout
- run: aws s3 cp s3://launchdarkly-pastebin/ci/dotnet/LaunchDarkly.Xamarin.snk LaunchDarkly.Xamarin.snk
- run: dotnet restore
- run: dotnet build src/LaunchDarkly.Xamarin -f netstandard2.0
- run: dotnet test tests/LaunchDarkly.Xamarin.Tests/LaunchDarkly.Xamarin.Tests.csproj -f netcoreapp2.0
2 changes: 1 addition & 1 deletion CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1 +1 @@
* @ashanbrown

25 changes: 3 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ Quick setup

Install-Package LaunchDarkly.Xamarin

1. Import the LaunchDarkly package:
1. Import the LaunchDarkly packages:

using LaunchDarkly.Client;
using LaunchDarkly.Xamarin;

2. Initialize the LDClient with your Mobile key and user:

User user = User.WithKey(username);
LdClient ldClient = LdClient.Init("YOUR_MOBILE_KEY", username);
LdClient ldClient = LdClient.Init("YOUR_MOBILE_KEY", user);

Your first feature flag
-----------------------
Expand Down Expand Up @@ -49,26 +50,6 @@ Contributing

See [Contributing](https://github.com/launchdarkly/xamarin-client/blob/master/CONTRIBUTING.md).

Signing
-------
The artifacts generated from this repo are signed by LaunchDarkly. The public key file is in this repo at `LaunchDarkly.Xamarin.pk` as well as here:

```
Public Key:
00240000048000009400000006020000
00240000525341310004000001000100
058a1dbccbc342759dc98b1eaba4467b
fdea062629f212cf7c669ff26b4e2ff3
c408292487bc349b8a687d73033ff14d
bf861e1eea23303a5b5d13b1db034799
13bd120ba372cf961d27db9f65263156
5f4e8aff4a79e11cfe713833157ecb5d
cbc02d772967d919f8f06fbee227a664
dc591932d5b05f4da1c8439702ecfdb1

Public Key Token: 90b24964a3dfb906f86add69004e6885
```

About LaunchDarkly
-----------

Expand Down
83 changes: 51 additions & 32 deletions src/LaunchDarkly.Xamarin/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Net.Http;
using Common.Logging;
using LaunchDarkly.Client;

namespace LaunchDarkly.Xamarin
{
Expand Down Expand Up @@ -59,12 +60,6 @@ public class Configuration : IMobileConfiguration
/// </summary>
public TimeSpan PollingInterval { get; internal set; }
/// <summary>
/// How long the client constructor will block awaiting a successful connection to
/// LaunchDarkly. Setting this to 0 will not block and will cause the constructor to return
/// immediately. The default value is 5 seconds.
/// </summary>
public TimeSpan StartWaitTime { get; internal set; }
/// <summary>
/// The timeout when reading data from the EventSource API. The default value is 5 minutes.
/// </summary>
public TimeSpan ReadTimeout { get; internal set; }
Expand Down Expand Up @@ -125,15 +120,21 @@ public class Configuration : IMobileConfiguration

internal IFlagCacheManager FlagCacheManager { get; set; }
internal IConnectionManager ConnectionManager { get; set; }
internal IEventProcessor EventProcessor { get; set; }
internal IMobileUpdateProcessor MobileUpdateProcessor { get; set; }
internal ISimplePersistance Persister { get; set; }
internal IDeviceInfo DeviceInfo { get; set; }
internal IFeatureFlagListenerManager FeatureFlagListenerManager { get; set; }
internal IPlatformAdapter PlatformAdapter { get; set; }

/// <summary>
/// Default value for <see cref="PollingInterval"/>.
/// </summary>
public static TimeSpan DefaultPollingInterval = TimeSpan.FromSeconds(30);
public static TimeSpan DefaultPollingInterval = TimeSpan.FromMinutes(5);
/// <summary>
/// Minimum value for <see cref="PollingInterval"/>.
/// </summary>
public static TimeSpan MinimumPollingInterval = TimeSpan.FromMinutes(5);
/// <summary>
/// Default value for <see cref="BaseUri"/>.
/// </summary>
Expand All @@ -155,10 +156,6 @@ public class Configuration : IMobileConfiguration
/// </summary>
private static readonly TimeSpan DefaultEventQueueFrequency = TimeSpan.FromSeconds(5);
/// <summary>
/// Default value for <see cref="StartWaitTime"/>.
/// </summary>
private static readonly TimeSpan DefaultStartWaitTime = TimeSpan.FromSeconds(5);
/// <summary>
/// Default value for <see cref="ReadTimeout"/>.
/// </summary>
private static readonly TimeSpan DefaultReadTimeout = TimeSpan.FromMinutes(5);
Expand All @@ -181,7 +178,11 @@ public class Configuration : IMobileConfiguration
/// <summary>
/// The default value for <see cref="BackgroundPollingInterval"/>.
/// </summary>
private static readonly TimeSpan DefaultBackgroundPollingInterval = TimeSpan.FromMinutes(3600);
private static readonly TimeSpan DefaultBackgroundPollingInterval = TimeSpan.FromMinutes(60);
/// <summary>
/// The minimum value for <see cref="BackgroundPollingInterval"/>.
/// </summary>
public static readonly TimeSpan MinimumBackgroundPollingInterval = TimeSpan.FromMinutes(15);
/// <summary>
/// The default value for <see cref="ConnectionTimeout"/>.
/// </summary>
Expand All @@ -195,6 +196,10 @@ public class Configuration : IMobileConfiguration
/// <returns>a <c>Configuration</c> instance</returns>
public static Configuration Default(string mobileKey)
{
if (String.IsNullOrEmpty(mobileKey))
{
throw new ArgumentOutOfRangeException("mobileKey", "key is required");
}
var defaultConfiguration = new Configuration
{
BaseUri = DefaultUri,
Expand All @@ -203,7 +208,6 @@ public static Configuration Default(string mobileKey)
EventQueueCapacity = DefaultEventQueueCapacity,
EventQueueFrequency = DefaultEventQueueFrequency,
PollingInterval = DefaultPollingInterval,
StartWaitTime = DefaultStartWaitTime,
ReadTimeout = DefaultReadTimeout,
ReconnectTime = DefaultReconnectTime,
HttpClientTimeout = DefaultHttpClientTimeout,
Expand Down Expand Up @@ -237,7 +241,7 @@ public static class ConfigurationExtensions
/// <param name="configuration">the configuration</param>
/// <param name="uri">the base URI as a string</param>
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithUri(this Configuration configuration, string uri)
public static Configuration WithBaseUri(this Configuration configuration, string uri)
{
if (uri != null)
configuration.BaseUri = new Uri(uri);
Expand All @@ -251,7 +255,7 @@ public static Configuration WithUri(this Configuration configuration, string uri
/// <param name="configuration">the configuration</param>
/// <param name="uri">the base URI</param>
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithUri(this Configuration configuration, Uri uri)
public static Configuration WithBaseUri(this Configuration configuration, Uri uri)
{
if (uri != null)
configuration.BaseUri = uri;
Expand Down Expand Up @@ -371,29 +375,15 @@ public static Configuration WithEventSamplingInterval(this Configuration configu
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithPollingInterval(this Configuration configuration, TimeSpan pollingInterval)
{
if (pollingInterval.CompareTo(Configuration.DefaultPollingInterval) < 0)
if (pollingInterval.CompareTo(Configuration.MinimumPollingInterval) < 0)
{
Log.Warn("PollingInterval cannot be less than the default of 30 seconds.");
pollingInterval = Configuration.DefaultPollingInterval;
Log.WarnFormat("PollingInterval cannot be less than the default of {0}.");
pollingInterval = Configuration.MinimumPollingInterval;
}
configuration.PollingInterval = pollingInterval;
return configuration;
}

/// <summary>
/// Sets how long the client constructor will block awaiting a successful connection to
/// LaunchDarkly. Setting this to 0 will not block and will cause the constructor to return
/// immediately. The default value is 5 seconds.
/// </summary>
/// <param name="configuration">the configuration</param>
/// <param name="startWaitTime">the length of time to wait</param>
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithStartWaitTime(this Configuration configuration, TimeSpan startWaitTime)
{
configuration.StartWaitTime = startWaitTime;
return configuration;
}

/// <summary>
/// Sets whether or not this client is offline. If true, no calls to Launchdarkly will be made.
/// </summary>
Expand Down Expand Up @@ -567,6 +557,18 @@ public static Configuration WithConnectionManager(this Configuration configurati
return configuration;
}

/// <summary>
/// Sets the IEventProcessor instance, used internally for stubbing mock instances.
/// </summary>
/// <param name="configuration">Configuration.</param>
/// <param name="eventProcessor">Event processor.</param>
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithEventProcessor(this Configuration configuration, IEventProcessor eventProcessor)
{
configuration.EventProcessor = eventProcessor;
return configuration;
}

/// <summary>
/// Determines whether to use the Report method for networking requests
/// </summary>
Expand Down Expand Up @@ -659,8 +661,25 @@ public static Configuration WithEnableBackgroundUpdating(this Configuration conf
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithBackgroundPollingInterval(this Configuration configuration, TimeSpan backgroundPollingInternal)
{
if (backgroundPollingInternal.CompareTo(Configuration.MinimumBackgroundPollingInterval) < 0)
{
Log.WarnFormat("BackgroundPollingInterval cannot be less than the default of {0}.", Configuration.MinimumBackgroundPollingInterval);
backgroundPollingInternal = Configuration.MinimumBackgroundPollingInterval;
}
configuration.BackgroundPollingInterval = backgroundPollingInternal;
return configuration;
}

/// <summary>
/// Specifies a component that provides special functionality for the current mobile platform.
/// </summary>
/// <param name="configuration">Configuration.</param>
/// <param name="adapter">An implementation of <see cref="IPlatformAdapter"/>.</param>
/// <returns>the same <c>Configuration</c> instance</returns>
public static Configuration WithPlatformAdapter(this Configuration configuration, IPlatformAdapter adapter)
{
configuration.PlatformAdapter = adapter;
return configuration;
}
}
}
58 changes: 21 additions & 37 deletions src/LaunchDarkly.Xamarin/Factory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,21 @@ internal static IFlagCacheManager CreateFlagCacheManager(Configuration configura
IFlagListenerUpdater updater,
User user)
{
IFlagCacheManager flagCacheManager;

if (configuration.FlagCacheManager != null)
{
flagCacheManager = configuration.FlagCacheManager;
return configuration.FlagCacheManager;
}
else
{
var inMemoryCache = new UserFlagInMemoryCache();
var deviceCache = new UserFlagDeviceCache(persister);
flagCacheManager = new FlagCacheManager(inMemoryCache, deviceCache, updater, user);
return new FlagCacheManager(inMemoryCache, deviceCache, updater, user);
}

return flagCacheManager;
}

internal static IConnectionManager CreateConnectionManager(Configuration configuration)
{
IConnectionManager connectionManager;
connectionManager = configuration.ConnectionManager ?? new MobileConnectionManager();
return connectionManager;
return configuration.ConnectionManager ?? new MobileConnectionManager();
}

internal static IMobileUpdateProcessor CreateUpdateProcessor(Configuration configuration,
Expand All @@ -47,36 +41,36 @@ internal static IMobileUpdateProcessor CreateUpdateProcessor(Configuration confi
return configuration.MobileUpdateProcessor;
}

IMobileUpdateProcessor updateProcessor = null;
if (configuration.Offline)
{
Log.InfoFormat("Was configured to be offline, starting service with NullUpdateProcessor");
Log.InfoFormat("Starting LaunchDarkly client in offline mode");
return new NullUpdateProcessor();
}

if (configuration.IsStreamingEnabled)
{
updateProcessor = new MobileStreamingProcessor(configuration,
return new MobileStreamingProcessor(configuration,
flagCacheManager,
user, source);
}
else
{
var featureFlagRequestor = new FeatureFlagRequestor(configuration, user);
updateProcessor = new MobilePollingProcessor(featureFlagRequestor,
flagCacheManager,
user,
configuration.PollingInterval);
return new MobilePollingProcessor(featureFlagRequestor,
flagCacheManager,
user,
configuration.PollingInterval);
}

return updateProcessor;
}

internal static IEventProcessor CreateEventProcessor(IBaseConfiguration configuration)
internal static IEventProcessor CreateEventProcessor(Configuration configuration)
{
if (configuration.EventProcessor != null)
{
return configuration.EventProcessor;
}
if (configuration.Offline)
{
Log.InfoFormat("Was configured to be offline, starting service with NullEventProcessor");
return new NullEventProcessor();
}

Expand All @@ -86,32 +80,22 @@ internal static IEventProcessor CreateEventProcessor(IBaseConfiguration configur

internal static ISimplePersistance CreatePersister(Configuration configuration)
{
if (configuration.Persister != null)
{
return configuration.Persister;
}

return new SimpleMobileDevicePersistance();
return configuration.Persister ?? new SimpleMobileDevicePersistance();
}

internal static IDeviceInfo CreateDeviceInfo(Configuration configuration)
{
if (configuration.DeviceInfo != null)
{
return configuration.DeviceInfo;
}

return new DeviceInfo();
return configuration.DeviceInfo ?? new DeviceInfo();
}

internal static IFeatureFlagListenerManager CreateFeatureFlagListenerManager(Configuration configuration)
{
if (configuration.FeatureFlagListenerManager != null)
{
return configuration.FeatureFlagListenerManager;
}
return configuration.FeatureFlagListenerManager ?? new FeatureFlagListenerManager();
}

return new FeatureFlagListenerManager();
internal static IPlatformAdapter CreatePlatformAdapter(Configuration configuration)
{
return configuration.PlatformAdapter ?? new NullPlatformAdapter();
}
}
}
33 changes: 33 additions & 0 deletions src/LaunchDarkly.Xamarin/IBackgroundingState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace LaunchDarkly.Xamarin
{
/// <summary>
/// An interface that is used internally by implementations of <see cref="IBackgroundingManagerFactory"/>
/// to update the state of the LaunchDarkly client in background mode. Application code does not need
/// to interact with this interface.
/// </summary>
public interface IBackgroundingState
{
/// <summary>
/// Tells the LaunchDarkly client that the application is entering background mode. The client will
/// suspend the regular streaming or polling process, except when <see cref="BackgroundPollAsync"/>
/// is called.
/// </summary>
Task EnterBackgroundAsync();

/// <summary>
/// Tells the LaunchDarkly client that the application is exiting background mode. The client will
/// resume the regular streaming or polling process.
/// </summary>
Task ExitBackgroundAsync();

/// <summary>
/// Tells the LaunchDarkly client to initiate a request for feature flag updates while in background mode.
/// </summary>
Task BackgroundUpdateAsync();
}
}
Loading