tiles and lock screen notifications

25
Tiles and Lock Screen Notifications Kevin Kurniawan Windows Phone

Upload: ahmad-arif

Post on 17-Sep-2015

234 views

Category:

Documents


6 download

DESCRIPTION

Pelatihan Windows Phone hari ke-4

TRANSCRIPT

  • Tiles and Lock Screen

    Notifications

    Kevin Kurniawan

    Windows Phone

  • Daftar Isi

    Tiles ........................................................................................................................................................... 1

    Cycle Tile Template ................................................................................................................................... 2

    Iconic Tile Template .................................................................................................................................. 5

    Flip Template ............................................................................................................................................ 9

    Updating Tiles From a Background Agent............................................................................................... 13

    Lock Screen Notifications ........................................................................................................................ 18

  • 1

    Tiles Setiap aplikasi di Windows Phone setidaknya memiliki satu buah tiles yang dapat disimpan di dalam start

    screen. Berikut ini adalah beberapa template tiles yang dapat disimpan di start screen.

    Flip Template

    Iconic Template

    Cycle Template

    Berikut adalah resolusi dari image yang akan dibuat menjadi tiles

  • 2

    Tile Size Flip and Cycle Images Iconic Images

    Small 159 x 159 pixels 159 x 159 pixels 110 x 110 pixels

    Medium 336 x 336 pixels 336 x 336 pixels 202 x 202 pixels

    Wide 691 x 336 pixels 691 x 336 pixels N/A

    Windows Phone memiliki 2 buah tipe tiles yaitu :

    Primary Tiles Primary Tiles adalah tiles utama yang disimpan di start screen yang didapatkan

    dari aplikasi utama. Misalnya seperti gambar berikut.

    Jadi user memilih aplikasi dari layar utama, menahan aplikasi yang akan dipilih dan menekan

    tombol pin to start

    Secondary Tiles - Sedangkan secondary Tiles adalah tiles yang disimpan di dalam start screen

    yang bukan dari aplikasi utama. Setelah ini semua contoh pembuatan tiles yang menggunakan

    kode porgram akan menjadi secondary tiles.

    Cycle Tile Template Berikut adalah gambaran mengenai cycle tile template

    Flip tempalate dapat menyimpan sampai 9 gambar. Berikut adalah cara untuk membuat cycle Tile

    Template. Pertama tama masuk ke bagian WMAppManifest.xml lalu pilih di bagian tile template

    pilihan TemplateCycle.

  • 3

    Setelah itu di bagian bawah kita dapat memasukkan list tile image seperti gambar di bawah ini. Gambar

    yang dibuat berukuran 691 x 336 pixels untuk ukuran besar dan 159 x 159 pixels untuk ukuran small dan

    kita pilih pilihan Support for Large Tile agar tile yang dibuat support 3 buah ukuran tile.

    Dan berikut ada hasil tampilan pada saat aplikasi dijalankan. Untuk ukuran small, cycle tile template

    tidak akan bergerak. Tiles hanya akan berganti pada saat saat ukuran tile medium atau wide.

  • 4

    Selain itu kita juga dapat membuat cycle tile template tersebut dari potongan kode program. Berikut

    kita buat button yang dapat digunakan untuk Pin To Start Icon. Yang akan menjadi secondary tiles.

    private void PinToStart(object sender, RoutedEventArgs e) { CycleTileData cycleTile = new CycleTileData(); cycleTile.Title = "Pemandangan"; cycleTile.Count = 5; cycleTile.SmallBackgroundImage = new Uri("/Assets/Tiles/small.png", UriKind.Relative); cycleTile.CycleImages = new Uri[] { new Uri("/Assets/Tiles/1.png", UriKind.Relative), new Uri("/Assets/Tiles/2.png", UriKind.Relative), new Uri("/Assets/Tiles/3.png", UriKind.Relative), new Uri("/Assets/Tiles/4.png", UriKind.Relative), new Uri("/Assets/Tiles/5.png", UriKind.Relative), new Uri("/Assets/Tiles/6.png", UriKind.Relative), new Uri("/Assets/Tiles/7.png", UriKind.Relative), new Uri("/Assets/Tiles/8.png", UriKind.Relative), new Uri("/Assets/Tiles/9.png", UriKind.Relative), }; ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("cycle".ToString())); if (TileToFind != null && TileToFind.NavigationUri.ToString().Contains("cycle")) { TileToFind.Delete(); ShellTile.Create(new Uri("/MainPage.xaml?id=cycle", UriKind.Relative), cycleTile, true);

  • 5

    } else { ShellTile.Create(new Uri("/MainPage.xaml?id=cycle", UriKind.Relative), cycleTile, true); } }

    Dan berikut adalah tampilan saat kode program dijalankan.

    Yang membedakan adalah adanya angka 5 yang didapat dari cycleTile.Count = 5; yang nanti nya dapat

    digunakan sebagai tiles notification untuk user.

    Iconic Tile Template

    Berikut adalah cara untuk membuat iconic tile template. Kita masuk ke WMAppManifest.xml dan pilih

    TemplateIconic di Tile Template seperti gambar berikut.

  • 6

    Setelah itu kita isikan picture yang akan digunakan sebagai icon di tiles untuk ukuran small ukuran 110 x

    110 pixels dan untuk ukuran medium ukuran 202 x 202 pixels.

    Dan berikut tampilan saat aplikasi dijalankan.

  • 7

    Selain itu kita juga dapat menambahkan iconic tile template menggunakan kode porgram. Berikut

    adalah potongan kode program yang untuk membuat iconic tile template. Yang akan menjadi secondary

    tiles.

    private void PinToStart(object sender, RoutedEventArgs e) { IconicTileData oIcontile = new IconicTileData(); oIcontile.Title = "Iconic Tile"; oIcontile.Count = 7; oIcontile.IconImage = new Uri("Assets/Tiles/iconic1.png", UriKind.Relative); oIcontile.SmallIconImage = new Uri("Assets/Tiles/iconic2.png", UriKind.Relative); oIcontile.WideContent1 = "Wide Content 1"; oIcontile.WideContent2 = "Wide Content 2"; oIcontile.WideContent3 = "Wide Content 3"; oIcontile.BackgroundColor = System.Windows.Media.Colors.Transparent; ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("Iconic".ToString())); if (TileToFind != null && TileToFind.NavigationUri.ToString().Contains("Iconic")) { TileToFind.Delete(); ShellTile.Create(new Uri("/MainPage.xaml?id=Iconic", UriKind.Relative), oIcontile, true); } else {

  • 8

    ShellTile.Create(new Uri("/MainPage.xaml?id=Iconic", UriKind.Relative), oIcontile, true); } }

    Dan berikut adalah tampilan saat kode program dijalankan.

    Walaupun anda tidak membuat menggunakan kode program namun anda masih dapat mengisi count

    dan content yang ada di dalam tiles melalui WMAppManifest.xml yang dibuka menggunakan text editor

    seperti gambar berikut. Disana terdapat tag tag seperti content dan count.

  • 9

    Flip Template

    Berikut adalah cara untuk membuat Flip Template. Kita masuk ke WMAppManifest.xml dan kita pilih

    TemplateFlip di bagian Tile Template lalu kita isi image dari tile yang telah dibuat. Untuk ukuran small

    menggunakan ukuran 159 x 159 pixels, untuk medium menggunakan ukuran 336 x 336 pixels dan untuk

    wide menggunakan ukuran 691 x 336 pixels.

    Dan berikut adalah tampilan saat aplikasi dijalankan.

  • 10

    Selain itu kita juga dapat menambahkan flip template menggunakan kode porgram. Berikut adalah

    potongan kode program untuk membuat flip template. Dalam kode program di bawah method

    CreateFlipTileData() adalah method yang digunakan untuk membuat tiles jika tiles tersebut belum ada di

    start screen. Berikut ini adalah beberapa property yang harus ada dalam pembuatan flip template icon

    agar icon terlihat lebih bagus.

    Title

    BackTitle

    BackContent

    WideBackContent

    Count

    SmallBackgroundImage

    BackgroundImage

    WideBackgroundImage

    BackBackgroundImage

    WideBackBackgroundImage

    Untuk lebih jelas nya penggunaan properti tersebut anda dapat melihat gambar berikut sebagai

    referensi. Tiles ini akan menjadi secondry tiles

  • 11

    private void PinToStart(object sender, RoutedEventArgs e) { ShellTile oTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("flip".ToString())); if (oTile != null && oTile.NavigationUri.ToString().Contains("flip")) { FlipTileData oFliptile = new FlipTileData(); oFliptile.Title = "Title"; oFliptile.Count = 11; oFliptile.BackTitle = "Back Title"; oFliptile.BackContent = "Back Content Medium"; oFliptile.WideBackContent = "Back Content Wide"; oFliptile.SmallBackgroundImage = new Uri("Assets/Tiles/small.png", UriKind.Relative); oFliptile.BackgroundImage = new Uri("Assets/Tiles/medium.png", UriKind.Relative); oFliptile.WideBackgroundImage = new Uri("Assets/Tiles/wide.png", UriKind.Relative); oFliptile.BackBackgroundImage = new Uri("/Assets/Tiles/medium1.png", UriKind.Relative); oFliptile.WideBackBackgroundImage = new Uri("/Assets/Tiles/wide1.png", UriKind.Relative); oTile.Update(oFliptile); MessageBox.Show("Flip Tile Data successfully update."); } else { // once it is created flip tile Uri tileUri = new Uri("/MainPage.xaml?tile=flip", UriKind.Relative);

  • 12

    ShellTileData tileData = this.CreateFlipTileData(); ShellTile.Create(tileUri, tileData, true); } } private ShellTileData CreateFlipTileData() { return new FlipTileData() { Title = "Title", BackTitle = "Back Title", BackContent = "Back Content Medium", WideBackContent = "Back Content Wide", Count = 8, SmallBackgroundImage = new Uri("Assets/Tiles/small.png", UriKind.Relative), BackgroundImage = new Uri("Assets/Tiles/medium.png", UriKind.Relative), WideBackgroundImage = new Uri("Assets/Tiles/wide.png", UriKind.Relative), BackBackgroundImage = new Uri("/Assets/Tiles/medium1.png", UriKind.Relative), WideBackBackgroundImage = new Uri("/Assets/Tiles/wide1.png", UriKind.Relative) }; }

    Dan berikut adalah tampilan pada saat kode program tersebut dijalankan.

  • 13

    Updating Tiles From a Background Agent Pada contoh kali ini akan dibahas cara mengupdate tiles melalui background agent. Jika ada diantara

    rekan yang masih belum familiar dengan background agent bisa melihat tutorial saja di bagian Windows

    Phone 8 Application Lifecycle. Pada kasus ini akan dibuat sebuah Flip Template yang memiliki content

    jumlah content yang akan selalu bertambah setiap 1 menit. Pertama tama kita tambahkan dahulu

    Windows Phone Scheduled Task Agent seperti gambar berikut.

  • 14

    Setelah itu tambahkan reference di project aplikasi kita yang mengacu pada ScheduledTaskAgent seperti

    gambar berikut.

  • 15

    Setelah itu kita tambahkan kode program berikut di bagian App.xaml.cs pada method

    Application_Closing.

    PeriodicTask periodicTask; string periodicTaskName = "PeriodicAgentTiles"; private void Application_Closing(object sender, ClosingEventArgs e) { if (!IsolatedStorageSettings.ApplicationSettings.Contains("counter")) { IsolatedStorageSettings.ApplicationSettings["counter"] = 1; IsolatedStorageSettings.ApplicationSettings.Save(); } periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask; if (periodicTask != null)

  • 16

    { RemoveAgent(periodicTaskName); } periodicTask = new PeriodicTask(periodicTaskName); periodicTask.ExpirationTime = DateTime.Now.AddDays(14); periodicTask.Description = "This demonstrates a periodic task."; ScheduledActionService.Add(periodicTask); #if(DEBUG_AGENT) ScheduledActionService.LaunchForTest(periodicTask.Name, TimeSpan.FromSeconds(60)); #endif if (!periodicTask.IsScheduled || periodicTask.ExpirationTime < DateTime.Now) { periodicTask.ExpirationTime = DateTime.Now.AddDays(14); #if(DEBUG_AGENT) ScheduledActionService.LaunchForTest(periodicTask.Name, TimeSpan.FromSeconds(60)); #endif } } private void RemoveAgent(string name) { try { ScheduledActionService.Remove(name); } catch (Exception) { } }

    Jangan lupa untuk menambahkan #define DEBUG_AGENT di bagian paling atas App.xaml.cs. Setelah itu

    tambahkan kode program berikut di bagian ScheduledAgent.cs

    protected override void OnInvoke(ScheduledTask task) { ShellToast toast = new ShellToast(); toast.Title = "App"; toast.Content = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; toast.Show(); ShellTile oTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("flip".ToString())); if (oTile != null && oTile.NavigationUri.ToString().Contains("flip")) {

  • 17

    FlipTileData oFliptile = new FlipTileData(); oFliptile.Title = "Tiles Workshop"; oFliptile.Count = 0; oFliptile.BackTitle = "Tiles Workshop"; oFliptile.BackContent = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; oFliptile.WideBackContent = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; oFliptile.SmallBackgroundImage = new Uri("Assets/Tiles/small.png", UriKind.Relative); oFliptile.BackgroundImage = new Uri("Assets/Tiles/medium.png", UriKind.Relative); oFliptile.WideBackgroundImage = new Uri("Assets/Tiles/wide.png", UriKind.Relative); oFliptile.BackBackgroundImage = new Uri("/Assets/Tiles/medium1.png", UriKind.Relative); oFliptile.WideBackBackgroundImage = new Uri("/Assets/Tiles/wide1.png", UriKind.Relative); oTile.Update(oFliptile); //MessageBox.Show("Flip Tile Data successfully update."); } IsolatedStorageSettings.ApplicationSettings["counter"] = (int)IsolatedStorageSettings.ApplicationSettings["counter"] + 1; IsolatedStorageSettings.ApplicationSettings.Save(); #if DEBUG_AGENT ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60)); #endif NotifyComplete(); }

    Pastikan di bagian atas kode program tersebut sudah terdapat #define DEBUG_AGENT. Setelah itu

    jangan lupa membuka WMAppManifest.xml dan menambahkan kode program berikut di bagian

    Dan berikut adalah tampilan pada saat kode program dijalankan.

  • 18

    Dari kode program tersebut bisa terlihat jika tiles mengalami perubahan content yang sudah diset

    berubah setiap 1 menit.

    Lock Screen Notifications Lock screen notification digunakan untuk menampilkan pemberitahuan kepada user tentang aplikasi kita

    di bagian lock screen.

    Untuk membuat lock screen notification kita membutuhkan icon sebesar 38 x 38 pixels. Pada contoh kali

    ini akan dibuat lanjutan dari Flip tempate di bagian sebelumnya yang akan membuat notifikasi di bagian

    lock screen akan bertambah setiap 1 menit. Pertama tama kita buka WMAppManifest.xml lalu kita

    tambahkan kode seperti ini.

  • 19

    Bagian tersebut diletakan setelah tag penutup token seperti gambar berikut.

    Dan jangan lupa di bagian atas terdapat tag yang digunakan untuk

    mendefinisikan icon yang akan kita pakai di halaman lock screen. Icon yang dipakai berukuran 38 x 38

    pixels. Berikut adalah potongan kode yang digunakan.

    Assets\LockIcon.png

    Berikut adalah peryataan untuk membuat lock screen notification

    Jumlah angka yang ditampilkan pada halaman lock screen sama dengan property Count di tiles primary

    kita. Jadi jumlah angka yang ditampilkan tidak akan dipengaruhi oleh jumlah Count di secondary tiles.

    Untuk itu dibuat kode program berikut di bagian Application_Launching untuk mendefinisikan

    notification lock screen yang diambil dari tiles primary akan dalam keadaan kosong atau property Count

    nya berjumlah 0 setiap aplikasi pertama kali dijalankan. Berikut adalah potongan kode program nya.

    private void Application_Launching(object sender, LaunchingEventArgs e) { var tile = ShellTile.ActiveTiles.First();

  • 20

    var data = new FlipTileData { Count = 0, WideBackContent = "Tidak ada notifikasi" }; tile.Update(data); IsolatedStorageSettings.ApplicationSettings["counter"] = 1; IsolatedStorageSettings.ApplicationSettings.Save(); }

    Count = 0 akan mereset notifikasi di dalam aplikasi kita agar menjadi kosong. Dan

    IsolatedStorageSettings.ApplicationSettings["counter"] = 1 syntak yang kita persiapkan jika aplikasi

    membutuhkan notifikasi. Kita menggunakan IsolatedStorage dikarenakan nilai counter tersebut

    nantinya akan dipanggil oleh Background Agent. Dan berikut adalah potongan kode program di bagian

    ScheduledAgent.cs yang telah dimodifikasi.

    protected override void OnInvoke(ScheduledTask task) { ShellToast toast = new ShellToast(); toast.Title = "App"; toast.Content = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; toast.Show(); ShellTile oTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("flip".ToString())); if (oTile != null && oTile.NavigationUri.ToString().Contains("flip")) { FlipTileData oFliptile = new FlipTileData(); oFliptile.Title = "Tiles Workshop"; oFliptile.Count = (int)IsolatedStorageSettings.ApplicationSettings["counter"]; oFliptile.BackTitle = "Tiles Workshop"; oFliptile.BackContent = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; oFliptile.WideBackContent = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification"; oFliptile.SmallBackgroundImage = new Uri("Assets/Tiles/small.png", UriKind.Relative); oFliptile.BackgroundImage = new Uri("Assets/Tiles/medium.png", UriKind.Relative); oFliptile.WideBackgroundImage = new Uri("Assets/Tiles/wide.png", UriKind.Relative); oFliptile.BackBackgroundImage = new Uri("/Assets/Tiles/medium1.png", UriKind.Relative); oFliptile.WideBackBackgroundImage = new Uri("/Assets/Tiles/wide1.png", UriKind.Relative); oTile.Update(oFliptile); }

  • 21

    var tile = ShellTile.ActiveTiles.First(); var data = new FlipTileData { Title = "Tiles Workshop", Count = (int)IsolatedStorageSettings.ApplicationSettings["counter"], BackTitle = "Tiles Workshop", BackContent = "You Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification", WideBackContent = "My App\nYou Have " + IsolatedStorageSettings.ApplicationSettings["counter"].ToString() + " Notification", SmallBackgroundImage = new Uri("Assets/Tiles/small.png", UriKind.Relative), BackgroundImage = new Uri("Assets/Tiles/medium.png", UriKind.Relative), WideBackgroundImage = new Uri("Assets/Tiles/wide.png", UriKind.Relative), BackBackgroundImage = new Uri("/Assets/Tiles/medium1.png", UriKind.Relative), WideBackBackgroundImage = new Uri("/Assets/Tiles/wide1.png", UriKind.Relative) }; tile.Update(data); IsolatedStorageSettings.ApplicationSettings["counter"] = (int)IsolatedStorageSettings.ApplicationSettings["counter"] + 1; IsolatedStorageSettings.ApplicationSettings.Save(); #if DEBUG_AGENT ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60)); #endif NotifyComplete(); }

    Bagian berwarna biru adalah bagian untuk menampilkan toast notification. Bagian kuning adalah bagian

    untuk mengupdate secondary tiles. Dan bagian hijau digunakan untuk mengupdate primary tiles. Yang

    membedakan antara primary tiles adalah cara pengakses an primary tiles menggunakan kode :

    var tile = ShellTile.ActiveTiles.First();

    Untuk bagian di Application_Closing masih menggunakan kode yang sama pada saat menggunakan Flip

    Template. Berikut adalah potongan kode program nya.

    PeriodicTask periodicTask; string periodicTaskName = "PeriodicAgentTiles"; private void Application_Closing(object sender, ClosingEventArgs e) { if (!IsolatedStorageSettings.ApplicationSettings.Contains("counter")) { IsolatedStorageSettings.ApplicationSettings["counter"] = 1; IsolatedStorageSettings.ApplicationSettings.Save(); } periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask;

  • 22

    if (periodicTask != null) { RemoveAgent(periodicTaskName); } periodicTask = new PeriodicTask(periodicTaskName); periodicTask.ExpirationTime = DateTime.Now.AddDays(14); periodicTask.Description = "This demonstrates a periodic task."; ScheduledActionService.Add(periodicTask); #if(DEBUG_AGENT) ScheduledActionService.LaunchForTest(periodicTask.Name, TimeSpan.FromSeconds(60)); #endif if (!periodicTask.IsScheduled || periodicTask.ExpirationTime < DateTime.Now) { periodicTask.ExpirationTime = DateTime.Now.AddDays(14); #if(DEBUG_AGENT) ScheduledActionService.LaunchForTest(periodicTask.Name, TimeSpan.FromSeconds(60)); #endif } }

    Dan berikut adalah tampilan pada saat kode program dijalankan. Kita akan melakukan pin to start ke dua

    buat tiles yaitu primary tiles dan secondary tiles. Primary tiles akan disimpan di atas dan secondry tiles di

    bagian bawah. Untuk kode program secondry tiles masih sama dengan potongan kode program saat

    membuat Flip Template.

    Dari gambar diatas bisa dilihat lock screen notification mengambil data dari primary tiles.

  • 23

    Selain itu kita juga bisa mengganti background dari device kita yang kita set di dalam aplikasi kita.

    Sebelumnya pastikan terlebih dahulu di WMAppManifest.xml di bagian extensions sudah terdapat item

    berikut.

    Jika sudah maka anda tinggal membuat button dan mengisikan kode program berikut.

    private async void SetBackgroundClicked(object sender, RoutedEventArgs e) { if (await LockScreenManager.RequestAccessAsync() == LockScreenRequestResult.Granted) { var uri = new Uri("ms-appx:///Assets/wallpaper.png", UriKind.Absolute); LockScreen.SetImageUri(uri); } else { MessageBox.Show("You said no, so I can't update your background."); } }