|
using Android.App; |
|
using Android.Content; |
|
using Android.Util; |
|
using Androidx.Wear.Tiles; |
|
using Google.Common.Util.Concurrent; |
|
using Java.Lang; |
|
using Java.Util.Concurrent; |
|
|
|
namespace App.Services |
|
{ |
|
[Service(Name = "com.companyname.app.MyTileService", Enabled = true, Exported = true, |
|
Permission = "com.google.android.wearable.permission.BIND_TILE_PROVIDER")] |
|
[IntentFilter(new[] { "androidx.wear.tiles.action.BIND_TILE_PROVIDER" })] |
|
public class MyTileService : TileService |
|
{ |
|
private const string ResourcesVersion = "1"; |
|
protected override IListenableFuture OnTileRequest |
|
(RequestBuilders.TileRequest p0) |
|
{ |
|
Log.Debug("App", "Called OnTileRequest"); |
|
|
|
// Create text view |
|
var text = new LayoutElementBuilders.Text.Builder(); |
|
{ |
|
text.SetText("Hello world!"); |
|
} |
|
|
|
// Create layout |
|
var layout = new LayoutElementBuilders |
|
.Layout.Builder(); |
|
{ |
|
layout.SetRoot(text.Build()); |
|
} |
|
|
|
// Create timeline |
|
var timeline = new TimelineBuilders.Timeline.Builder(); |
|
{ |
|
var entry = new TimelineBuilders.TimelineEntry.Builder(); |
|
{ |
|
entry.SetLayout(layout.Build()); |
|
} |
|
timeline.AddTimelineEntry(entry.Build()); |
|
} |
|
|
|
// Create tile |
|
var tile = new TileBuilders.Tile.Builder(); |
|
{ |
|
tile.SetTimeline(timeline.Build()); |
|
tile.SetResourcesVersion(ResourcesVersion); |
|
return Futures.ImmediateFuture(tile.Build()); |
|
} |
|
} |
|
|
|
protected override IListenableFuture OnResourcesRequest |
|
(RequestBuilders.ResourcesRequest p0) |
|
{ |
|
Log.Debug("App", "Called OnResourcesRequest"); |
|
|
|
var resource = new ResourceBuilders.Resources.Builder(); |
|
{ |
|
resource.SetVersion(ResourcesVersion); |
|
return Futures.ImmediateFuture(resource.Build()); |
|
} |
|
} |
|
} |
|
|
|
public static class Futures |
|
{ |
|
public static ImmediateFuture ImmediateFuture(Java.Lang.Object value) |
|
=> new ImmediateFuture(value); |
|
} |
|
|
|
public class ImmediateFuture : Java.Lang.Object, IListenableFuture |
|
{ |
|
public bool IsDone => true; |
|
|
|
public bool IsCancelled => false; |
|
|
|
private Java.Lang.Object _obj; |
|
|
|
public ImmediateFuture(Java.Lang.Object o) |
|
=> _obj = o; |
|
|
|
public void AddListener(IRunnable p0, IExecutor p1) |
|
=> p1.Execute(p0); |
|
|
|
public bool Cancel(bool mayInterruptIfRunning) => false; |
|
|
|
public Java.Lang.Object Get() => _obj; |
|
|
|
public Java.Lang.Object Get(long timeout, TimeUnit unit) => Get(); |
|
} |
|
} |
I PRed to Xamarin's official example repository on GitHub 2 yrs ago, but got no reply for now.
dotnet/android-samples#326