2012-07-05

Olá pessoal. Tudo certo!?

Contracts – para mim uma das grandes inovações do Windows 8. No post de hoje, você entende o porquê.

Se você está chegando agora, e deseja ver essa série desde o seu início, veja o índice de séries.

O que são “Contracts”?

Pegando a explicação do MSDN:

Metro style apps use contracts to declare the interactions that they support with other apps. These apps must include required declarations in the package manifest and call required Windows Runtime APIs to communicate with Windows and other contract participants.

A contract is like an agreement between one or more apps. Contracts define the requirements that apps must meet to participate in these unique Windows interactions.

For example, Windows lets users share content from one app to another. The app that shares content out supports a source contract by meeting specific requirements, while the app that receives the shared content supports a target contract by meeting a different set of requirements. Neither app needs to know anything about the other. Every app that participates in the sharing contract can be confident that the sharing workflow is completely supported, end-to-end, by Windows.

Pegou a idéia? Não? Considere os seguintes cenários:

Estamos desenvolvendo um aplicativo que deverá publicar fotos em álbuns do Facebook e/ou galerias do Picasa;

Desejamos capturar imagens de um scanner e/ou importar imagens do Flickr;

Desejamos enviar dados por email;

Como você implementaria esses recursos? Provavelmente precisaria desenvolver cada uma dessas integrações “na unha” dentro do seu programa. Entretanto, isso muda no Windows 8.

Considere o diagrama abaixo:



No Windows 8, podemos desenvolver aplicativos que conseguem “compartilhar” dados.

Nosso aplicativo pode ser sender e enviar dados através do Windows 8; Também pode ser receiver e receber dados do Windows 8. Assim, voltando aos exemplos indicados acima:

No Windows 8, se nosso aplicativo for “sender” de imagens, integrará automaticamente com qualquer aplicação receiver que consiga “receber imagens” – como apps para Facebook, Picasa (,email, photoshop [se a Adobe fizer], whatever!)

No Windows 8, se nosso aplicativo for “target” de imagens, integrará automaticamente com qualquer aplicação “sender” que consegue “enviar imagens” – como o aplicativo do scanner (, facebook, flickr, email)

No Windows 8, o aplicativo para emails aceita quase qualquer tipo de dados. Então, qualquer app consegue pode enviar dados por email.

Pegou a idéia!? Não é fantástico?!

Como o “compartilhar” funciona?!

Em qualquer momento, quando utilizamos uma aplicação “sender” (como o Internet Explorer), podemos acionar a opção “Compartilhar” da Charm bar (barra da direita) [Se você não conhece esse recurso, veja esse vídeo do Fernando Martin]



Ela abre uma lista de todas as aplicações “target” para o tipo de dado que o “sender” compartilha.



Abaixo veja como fica a interface se opto pela opção Email:

Entendeu?! São menos opções na interface de sua aplicação. Logo, ela fica mais simples de usar.

Pegou a idéia?

Qualquer aplicação Metro pode ser Sender e/ou Target

“Declarando” uma aplicação para ser “Share Target”

Qualquer aplicação Metro pode ser “Target” ou “Sender”. Para isso, começamos por alterar o manifesto da aplicação (arquivo Package.appxmanifest).

Perceba que o Visual Studio oferece um ótimo editor para esse arquivo (evitando que você precise trabalhar com XML). Nesse editor, na terceira aba, podemos adicionar uma “declaração” de que nosso aplicativo é “Share Target”. Além disso, podemos ajustar que tipo de informações nosso aplicativo aceita.

Abaixo, veja os ajustes que realizei para tornar a aplicação do post anterior “Share Target”, aceitando URIs.

Essa simples alteração, já relacionamos nossa aplicação como possível target para URIs.

Entendendo como o Windows entende as declarações

Quando executamos nosso aplicativo, estamos, de fato, executando um mecanismo chamado “Deploy Engine”. Ou seja:

Um pacote é montado;

O Windows interpreta o pacote, reconhecendo as configurações presentes no manifesto;

Deploy Engine faz alterações no “registro do Windows”, instalando nossa aplicação no ambiente Metro

A partir desse “deploy”, nosso aplicativo integra o ambiente Windows. Assim, sempre que o charm share for acionado para um dado compatível com o tipo que expressamos no manifesto, nossa aplicação será relacionada.

 

O “deploy” de aplicativos Metro é extremamente interessante. Entretanto, foge do escopo desse post. Mais tarde, voltamos a tratar desse assunto com mais profundidade.

Codificando o “recebimento” de informações em nosso aplicativo

Quando “share”  é acionado para nosso aplicativo como target, Windows 8 dispara uma chamada para o método OnShareTargetActivated que deverá estar em App.xaml.cs. Veja o código (está no gist e, eventualmente, não aparece no Google Reader).

Repare que este não é o único método nessa classe. Também está ali o método de inicialização. BTW, você talvez goste de saber que a “inicialização” do programa também é, por baixo do capô, um “contract” de nosso aplicativo com o Windows 8.

Repare que, ao receber um “share”, encaminho os dados para um “page” (Não se preocupe com os detalhes agora, apenas “pegue” a idéia).

A “Page” que apresentaremos quando nosso aplicativo for evocado como “Share Target”

Segue o Xaml que iremos apresentar quando nosso aplicativo for selecionado como “share target”:

Trata-se de um Xaml bem simples. Segue o code-behind:

Execuntando,

Repare que o objeto ShareOperation é o nosso ponto de comunicação com o Windows 8. Mais uma vez, não se apegue aos detalhes.

Minha recomendação, brinque um pouco com esse código. Experimente outros formatos e tente apresentar algo melhor na interface.

Há um excelente demo (bem mais complexo, também), desenvolvido pela Microsoft, disponível em: http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Source-App-d9bffd84

Divirta-se!

Era isso.

Tagged: Win8, WinRT

Show more