|
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'm not continuing to research Android Tile these days,
Thus I recommend you read Android docs and follow their steps. If the package or dependencies aren't met in Xamarin, you must import them as manually as this article does. Because some packages are in the alpha, Xamarin often doesn't port them to NuGet.