Блог Сергея Байдачного

Мой блог о технологиях

Archive for Ноябрь 2011

Как разблокировать WP 7 для разработки – процедура имени Полховского

47 комментариев

 

Просил Полховского написать статью и выслать мне ссылку, но он так этого и не сделал. Все нужно делать самому. Итак, все мы знаем, что Windows Phone 7 Маркетплейса пока в Украине нет. Все мы знаем, что если бы у нас был Маркетплейс, то студенты/участники программы Dreamspark могли бы зарегистрироваться там абсолютно бесплатно. А это означает, что любой студент может разлочить до 3-х устройств. Проблема была только в том, что устройство можно было разлочить только после прохождения верификации (отправить паспорт страны регистрации). А для студентов верификация производилась только в момент публикации первого приложения (чтобы сэкономить бюджет). Сколько этих студентов зарегистрируется бесплатно, вот если они уже начинают публикацию….)

Таким образом, нашим студентам пользы от DreamSpark не было. Но время шло, а со временем появилось количество фидбеков о том, что студент не может публиковать приложение, не протестировав его на реальном устройстве. Именно поэтому (даже не знаю когда), теперь все студенты могут разблокировать устройства без прохождения верификации, а сразу же после регистрации в Маркетплейс.

Иными словами, регистрируемся, указываем страну, присутствующую в маркете, проходим верификацию в DreamSpark (нужен код), задаем какой-нибудь адрес и успешно завершаем регистрацию (если Вы выбрали Россия, то нужно, чтобы индекс был российский). Затем берем устройство и успешно его разблокируем.

Публиковать приложения таким образом нельзя, но ловить меня, чтобы разблокировать устройство, больше не обязательно.

По вопросу верификации в DreamSpark прошу писать мне – вышлю код.

Реклама

Written by Sergiy Baydachnyy

22.11.2011 at 16:30

Опубликовано в Windows Phone

Tagged with

Публикация приложений в Маркетплейс: язык ресурсов

leave a comment »

Только что столкнулись с небольшой проблемой при публикации приложения в маркетплейс, это необходимость присутствия атрибута NeutralResourcesLanguageAttribute в файле AssemblyInfo.cs. Раньше можно было публиковать приложения и без этого атрибута, а теперь – ни-ни. При этом язые должен быть установлен в тот же, что и язык интерфейса по умолчанию. Даже если Вы меняете культуру программно – это не является оправданием.

Таким образом, если язык Вашего интерфейса русский, то атрибут должен быть следующий:

[assembly: NeutralResourcesLanguageAttribute("ru-RU")]

Для английского нужно ru-RU заменить на en-US.

Written by Sergiy Baydachnyy

22.11.2011 at 16:08

Опубликовано в Windows Phone

Tagged with

Хоть и в ИТ, но те же «Новости»

with one comment

 

Опять не смог сдержаться.

Недавно, в некоторых онлайн ресурсах, опубликовали табличку, где показаны продажи устройств на различных платформах за третий квартал 2010 и 2011 года. Такие себе Майкрософт ненавистники развели тут же дебаты на тему, мол продажи WP 7 падают, все, настал конец, Андроид рулит и т. д. Еще рассказывают, что в Андроиде какой-то там версии возможностей больше, но конкретику не приводятSmile

Я бы этому не придал значения, если бы на это все не повелись и наши разработчики.

Ребята, Вы сначала посмотрите, что на рынке происходит, а потом делайте выводы. Кто-то из Вас пытался купить WP 7 в третьем квартале? Я — пытался. Хотел подарить три телефона студентам партнерам. Оказалось, что последний телефон в Украине купили еще в июне. Агентство смогло найти только одно устройство, и то, на черном рынкеSmile Причина простая: все производители ждали Манго. Киевляне в этом сейчас могут убедиться, так как весь Киев заклеен бигбордами с рекламой Титана, а 7-го декабря в Россию официально поступит в продажу Нокиа (я уже жду на hotlineSmile).

В третьем квартале WP 7 телефонов элементарно не было в продаже, поэтому не читайте советскую прессуSmile А вот что будет уже перед Рождеством и в первом квартале 2012 – очень интересно. Но у меня уже такое чувство, что дадим мы кому-то ногой под (черт, я же сотрудник Майкрософт и не могу ругаться даже в личном блогеSmile)….

Written by Sergiy Baydachnyy

18.11.2011 at 13:29

Опубликовано в Windows Phone

Tagged with

WP 7.5: Расширение Pictures Hub

with one comment

 

Продолжу тему, связанную с расширениями функциональности встроенных в WP 7 приложений. В прошлой статье мы говорили о расширении функциональности поиска, а в этой поговорим и расширении стандартного приложения по работе с изображениями – Pictures Hub.

Итак, начнем с того, что можно расширять. Тут существуют три возможности:

1). Расширение списка приложений на вкладке Apps, которая доступна при загрузке Pictures Hub.

 

image

 

Данная вкладка появляется только тогда, когда у Вас есть хотя бы одно приложение (установленное, в отличие от поиска), декларирующее поддержку фото-приложения. Если таких приложений не установлено, то и вкладки нет.

При расширении основного приложения Pictures Hub нет никаких специальных возможностей, лишь вызов приложения, которое якобы должно уметь работать с изображениями.

2, 3). Следующая возможность появляется уже на уровне работы с конкретной фотографией и позволяет Вашему приложению получить доступ к самой фотографии из меню Application Bar приложения Picture Viewer, вызываемого из Pictures Hub для просмотра отдельной фотографии.

 

image

 

Как видно, при работе с отдельной фотографией доступны такие пункты меню, как apps… и share….

Первый позволяет вызвать приложение из списка, передав ему уникальный идентификатор изображения, по которому последнее можно загрузить.

Второй – использовать одно из приложений из списка, чтобы передать изображение по сети какой-либо веб-службе (например, опубликовать в facebook). Тут также можно получить идентификатор изображения, которое потом загрузить внутри приложения.

Давайте рассмотрим, как эти механизмы реализуются на практике.

На первом этапе необходимо в WMAppManifest.xml описать расширения. Для каждого из трех перечисленных случаев существует свое расширение. Ниже приведены примеры декларации поддержки всех трех расширений:

 

   1:  <Extensions>
   2:     <Extension ExtensionName="Photos_Extra_Viewer" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   3:     <Extension ExtensionName="Photos_Extra_Hub" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   4:     <Extension ExtensionName="Photos_Extra_Share" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   5:  </Extensions>

 

При работе с расширениями нет ничего нового по сравнению с расширением поисковой функциональности. В элементе Extension прописывается фиксированный (характерный для расширения приложения по работе с изображениями) ConsumerID, имя расширения позволяет указать, какую часть приложения мы будем расширять, а TaskID ссылается на запись в разделе Tasks.

Если Вы планируете расширять Puctures Hub (основное его окно), то кода выше полностью достаточно. Ведь приложение просто вызывается из галереи, не получая специальных параметров.

Если речь идет о расширении Picture Viewer, то тут необходимо еще реализовать и код логики, обрабатывающей изображение. Для этого нужно получить идентификатор из QueryString, загрузить фотографию и отобразить пользователю соответствующий интерфейс. Обычно первая часть этих действий выполняется в перегруженном методе OnNavigatedTo, который инициализируется при переходе на страницу. Вот пример кода, который может быть реализован внутри метода:

 

   1:  IDictionary<string, string> queryStrings = 
   2:     this.NavigationContext.QueryString;
   3:   
   4:  if (queryStrings.ContainsKey("token"))
   5:  {
   6:     MediaLibrary library = new MediaLibrary();
   7:   
   8:     Picture picture = 
   9:        library.GetPictureFromToken(queryStrings["token"]);
  10:   
  11:     BitmapImage bitmap = new BitmapImage();
  12:     bitmap.CreateOptions = BitmapCreateOptions.None;
  13:     bitmap.SetSource(picture.GetImage());
  14:     WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
  15:     . . . . .
  16:  }
  17:   

 

В данном коде мы обрабатываем ключ token, который присутствует, если мы расширяем пункт apps… В случае с share… пунктом следует обрабатывать ключ FileId.

Таким образом, расширить Pictures Hub – простая задача. Проблема только в отсутствии возможности протестировать все это на эмуляторе, так как в последнем Pictures Hub не активирован.

Written by Sergiy Baydachnyy

16.11.2011 at 15:04

Опубликовано в Windows Phone

Tagged with

WP 7.5: Расширение функциональности поиска

leave a comment »

 

Первая функциональность, с которой мне захотелось познакомиться в Windows Phone 7.5 – расширение возможностей стандартного поиска, результатами, которыми обладает Ваше собственное приложение. Решил это сделать, увидев подобную функциональность в Windows 8, ожидая увидеть что-то аналогичное. Скажу сразу, реализация в Windows Phone 7.5 меня разочаровала. Несмотря на это, механизм существует, поэтому я решил описать его возможности.

Начнем с того, что стандартный поиск в Bing теперь интегрирован с Windows Phone Marketplace. Иными словами, если пользователь выполняет поиск и вводит запрос, соответствующий названию приложения из Marketplace (или похожим критериям), то ссылка на приложение выдается в топе результатов поиска. При этом пользователь может установить приложение, используя результаты поиска, или запустить его на устройстве, если оно уже установлено. Ниже небольшой пример, который легко воспроизвести и в эмуляторе:

 

image

 

К сожалению, это поведение работает само собой и не оставляет разработчику возможность что-то поменять. Хотя приложение и может получить информацию о том запросе, который привел в Bing к его запуску. Для этого достаточно воспользоваться командой, похожей на эту:

string searchTerms = NavigationContext.QueryString["bing_query"];

Естественно, данные нужно выбирать на основной странице приложения сразу же после его загрузки. Другой вопрос, что с ними делать. По крайней мере информацию о том, что Ваше приложение кто-то устанавливает через поисковый запрос – Вы получите.

Если Вы все же решили попробовать получать запрос из Bing, положившись на Вашу удачу, то можете попробовать протестировать поведение приложения, эмулируя его запуск с поисковым запросом. Для этого в WMAppManifest.xml достаточно прописать следующий код, заменив элемент DefaultTask на следующий:

<DefaultTask Name ="_default" NavigationPage="MainPage.xaml?bing_query=Пятнашки"/>

В этом случае, приложение получит параметры и сможет обработать их так, будто бы запущено из окна поиска Bing.

Вторая возможность, напротив, предоставляет разработчику механизмы для перехода из результатов поиска прямо в приложение, с возможностью обработки поискового запроса. Давайте посмотрим, как это делается.

Возможность базируется на так называемых «Быстрых карточках». Так, обратите внимание на изображение ниже:

 

image

 

Тут, перед результатами поиска из Web (и после ссылки на приложение в Marketplace) появляется специальный раздел Products. Его появление объясняется тем, что Bing нашел несколько продуктов, соответствующих нашему запросу. Нажав на один из представленных продуктов, мы можем перейти к его описанию, состоящему из нескольких вкладок (это и есть быстрая карточка продукта):

 

image

 

Тут Вы сможете увидеть несколько вкладок, включая обзоры, цены и, самое интересное, список приложений:

 

image

 

Причем, обратите внимание, в списке приложений есть и те, которые уже установлены, а также те, которые можно загрузить. Идея состоит в том, чтобы пользователю показать именно те приложения, которые помогут ему работать с «Быстрыми карточками». Иными словами, если продукт продается на eBay, то пользователю было бы здорово загрузить приложение-клиент для eBay (кстати, он есть в списке) или выбрать приложение другого магазина.

А теперь то, что необходимо сделать разработчику, чтобы его приложение попало в такой же список:

1). Необходимо понимать, что существует всего (пока) три типа таких карточек: Продукты, Местоположения (отображающиеся на вкладке Local) и Фильмы (которые демонстрируются в кинотеатрах, недалеко от Вашего местоположения).

2). Каждый тип карточки поддерживает несколько расширений (категорий). Иными словами, если пользователь ищет новый лаптоп, а Вы продаете ювелирные украшения, то не имеет смысла показывать пользователю Ваше приложение. Список доступных расширений можно посмотреть тут: http://msdn.microsoft.com/en-us/library/hh202958(v=VS.92).aspx.

3). Чтобы приложение попало в список, ассоциированный с одной из карточек (в одну или несколько категорий), достаточно прописать набор параметров в его манифесте и обработать (хотя и не обязательно) возможный поисковый запрос. Как только Вы это делаете, то пользователь получает возможность видеть и Ваше приложение.

Давайте рассмотрим детальную реализацию третьего пункта.

Начнем с изменения WMAppManifest.xml, где в раздел App (в самый конец) записывают следующий блок:

 

   1:  <Extensions>
   2:     <Extension ExtensionName="Bing_Products_Arts_and_Crafts"
   3:        ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
   4:        TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
   5:        . . . . .
   6:  <Extensions>

 

Тут основным атрибутом является ExtensionName, описывающим с помощью элементов Extention категории, в ответ на которые Ваше приложение будет появляться в списке. Атрибут CunsumerID Вы просто копируете с его значением, так как значение этого атрибута является стандартным для данного типа расширений. Атрибут TaskID указывает на ту задачу, которая будет выполняться при запуске приложения (обычно это _default – запуск MainPage.xaml), наконец ExtraFile указывает путь к файлу, где записываются дополнительные детали к расширению (обычно он один для всех расширений).

На следующем этапе Вы можете создать файл, указанный в атрибуте ExtraFile. Тут может быть код, похож на этот:

 

   1:  <ExtrasInfo>
   2:    <AppTitle>
   3:       <default>Quick Card Sample</default>
   4:    </AppTitle>
   5:   
   6:    <Consumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}">
   7:       <ExtensionInfo>
   8:          <Extensions>
   9:            <ExtensionName>Bing_Products_Arts_and_Crafts</ExtensionName>
  10:            <ExtensionName>Bing_Products_Baby_and_Nursery</ExtensionName>
  11:          </Extensions>
  12:   
  13:          <CaptionString>
  14:            <default>Product URI Details</default>
  15:            <fr-FR> . . . </fr-FR>
  16:          </CaptionString>
  17:   
  18:       </ExtensionInfo>
  19:   
  20:       . . . . .
  21:   
  22:     </Consumer>
  23:  </ExtrasInfo>

 

Так, в этом файле поддерживаемые Вашим приложением расширения разбиваются на группы. Для каждой из групп задается заголовок, который будет отображаться вместе с Вашим приложением (причем для всех поддерживаемых Вами культур).

Последнее, что необходимо сделать, это обработать запрос, который отправляется Вашему приложению из Bing. Проблема в том, что несмотря на явное использование TaskID, Bing перенаправляет запрос приложению в следующем виде:

app://<AppID>/_default#/SearchExtras?ProductName=<product_name>&Category=<extension_names>

Тут параметры могут меняться, в зависимости от типа Быстрой карточки.

Так вот, чтобы это работало, нужно настроить mapping внутри Вашего приложения. Это можно сделать, прописав в ресурсах объекта App вот такой код (при этом запрос перенаправляется на другую страницу приложения):

 

   1:  <Application.Resources>
   2:     <nav:UriMapper x:Key="UriMapper">
   3:        <nav:UriMapper.UriMappings>
   4:           <nav:UriMapping Uri="/SearchExtras" MappedUri="/ItemPage.xaml"/>
   5:        </nav:UriMapper.UriMappings>
   6:     </nav:UriMapper>
   7:  </Application.Resources>

 

Далее, подключаем данный mapping внутри App.xaml.cs, при загрузке приложения:

RootFrame.UriMapper = Resources["UriMapper"] as UriMapper;

Вот и все. Теперь обрабатываем параметры запроса с помощью QueryString и реализуем нужную нам бизнес-логику.

Таким образом, добавить Ваше приложение в список, ассоциированный с одной или несколькими категориями в Быстрых карточках не так и сложно. Другое дело, что пользователю весьма нетривиально попасть на предлагаемый список, чтобы увидеть Ваше приложение. И самое интересное (возможно, с этого стоило начать), быстрые карточки работаю пока не везде. Точнее работают они всего в 4-х странах: США, Франция, Австралия и Англия. Причем в последних трех, работают только Продукты. Проверить работу карточек Вы можете, установив Browser&Search language в язык, соответствующей одной из стран.

Written by Sergiy Baydachnyy

16.11.2011 at 11:46

Опубликовано в Windows Phone

Tagged with

Windows Phone Marketplace Test Kit

leave a comment »

 

Решил написать несколько статей, посвященных Windows Phone 7.5. А поскольку мы сейчас реализуем несколько программ, позволяющих студентам и разработчикам опубликовать свои приложений я Marketplace (вот пример: ссылка), то первую статью я решил посвятить публикации приложений. Даже не столько публикации, как подготовке к публикации приложений.

Итак, Ваше приложение полностью готово и Вы хотите его опубликовать в Windows Phone Marketplace. Проблема в том, что для удачной публикации Вам понадобиться пройти сертификацию на выполнение требований Marketplace, а также подготовить дополнительные материалы (иконки, описание и т. д.), которые понадобятся при публикации. Чтобы понять, что Вам понадобиться для публикации и готов ли Ваш пакет, существует два пути:

1). Прочитать все, что касается Marketplace в MSDN (http://msdn.microsoft.com/en-us/library/hh202930(v=VS.92).aspx), включая различные требования к сертификации (http://msdn.microsoft.com/en-us/library/hh184843(v=VS.92).aspx). При этом Вы не застрахованы от ошибок.

2). Использовать Windows Phone Marketplace Test Kit – специального пакета для разработчика, являющегося частью Windows Phone SDK 7.1. Пакет интегрируется с Visual Studio в виде расширения и позволяет выполнить все необходимые проверки на готовность пакета, не выходя из оболочки.

Внимание! Если Вы установили WP 7.1 SDK, а приложение продолжаете разрабатывать в режиме WP 7.0, то пакет активен не будет, и Вы не сможете увидеть соответствующие пункты меню в Visual Studio.

Поскольку я не могу помочь Вам с чтением технической документации, то перейду к рассмотрению второго пункта, это использование Windows Phone Marketplace Test Kit. Особенность данного подхода состоит в том, что задание по проверки готовности к сертификации можно поручить и тестеру в Вашей команде.

Итак, если у Вас установлен Windows Phone 7.1 SDK и Вы ведете разработку приложения в Visual Studio, то Вы без труда сможете найти пункт меню Project->Open Marketplace Test Kit. Открыв соответствующее окно, Вы сможете увидеть следующее окно, содержащее 4 закладки (я уже загрузил свои рисунки):

 

image

 

Обратите внимание, что внизу окна присутствует надпись, которая предлагает обновить входящий в состав Test Kit набор Test Cases. Если Вы увидели такую надпись, то нажмите Update, чтобы Ваше приложение удовлетворяло самым последним требованиям Marketplace.

Итак, открывшееся окно содержит 4 закладки:

Замечание. Чтобы работать с Test Kit, Вам необходимо создать Release версию Вашего приложения. Причем, исправляя ошибки по ходу прохождения тестов, выполняйте команду Build после каждого изменения.

Application Details – тут Вы вносите необходимые ресурсы для публикации Вашего приложения. Это три иконки различного размера. Эти иконки будут отображаться при выборе приложения в Marketplace, при установке приложения в обще меню и на основной экран. Также необходимо приложить скриншоты Вашего приложения. По требованиям необходимо приложить минимум один скриншот, но можно и больше (чтобы дать пользователю больше деталей во время знакомства с приложением). Если иконки (обычные изображения в формате png) помочь создать Вам сможет лишь дизайнер, то скриншоты приложения можно получить, используя стандартный эмулятор. Для этого запустите приложение в эмуляторе и откройте расширенную панель управления:

 

image

 

Как видите, тут не только можно снимать скрины, но и эмулировать работу GPS и акселерометра.

Подготовив все необходимые ресурсы, перейдем к следующей вкладке.

Automated Tests – тут проверяется корректность структуры xap-файла, и соответствие Вашего приложения заявленным в манифесте возможностям.

 

image

 

Если все иконки и скрины заданы верно, а размер пакета не превосходит требуемого, то приложение успешно пройдет все тесты. Просто нажмите Run Tests и посмотрите на результат. Особое внимание следует уделить тесту Capability Validation. С помощью этого теста Вы сможете однозначно определить, какие возможности необходимы Вашему приложению и отредактировать WMAppManifest, указав корректные значения.

Monitored Tests – следующий набор тестов позволяет проверить Ваше приложение на производительность и корректность работы. К сожалению подобные тесты можно выполнить только на реальном устройстве. Поэтому, если Вы являетесь счастливым обладателем Windows Phone устройства, то подключите его через USB, выберите вариант развертывания Windows Phone Device и запустите приложение с помощью Start Application. Поиграйтесь с Вашим приложением, стараясь воспроизвести все ситуации, а затем выйдите из приложения, нажав кнопку Back на устройстве (находясь в основном окне приложения) или нажав Close Application в окне Visual Studio. В результате Вы получите набор данных, связанных со временем запуска приложения, используемой памятью, исключениями и реакцией на Back кнопку:

 

image

 

Manual Tests – не все тесты можно пройти в автоматическом режиме, поэтому последняя вкладка предлагает Вам несколько десятков тест-кейсов, которые следует пройти в «ручном» режиме, чтобы убедиться в том, что приложение работает хорошо.

 

image

 

Если у Вас и тут все хорошо, то смело приступайте к публикации приложения.

Written by Sergiy Baydachnyy

14.11.2011 at 11:39

Опубликовано в Windows Phone

Tagged with

Публикуем приложения через APPA Mundi: публикация

21 комментарий

 

Итак, зарегистрировавшись в APPA Mundi, начинаем публикацию своего приложения. Это можно делать, как только статус перешел в состояние Active, а на балансе появилось 36 фунтов.

Итак, нажимаем большую кнопку сверху Submit Application и переходим к первой странице мастера:

 

clip_image002

 

Несмотря на то, что тут нужно поставить всего одну галочку, рекомендую ознакомиться с документами, на которые ведут ссылки. Это ускорит процесс публикации, так как обо всех проблемах Вы будете знать заранее.

Теперь выбираем язык нашего приложения и загружаем XAP файл (последний откомпилируйте в Release версию).

 

clip_image004

Внимание! Если Ваше приложение поддерживает несколько языков (русский и английский), то Вам понадобиться подготовить отдельные скриншоты и описания для каждого из языков. На этом этапе загружайте только скриншоты для выбранного языка. Остальные сможете загрузить потом.

Внимание! Очень часто приложение не проходит сертификацию, так как имеет иконки, установленные по умолчанию. Проверьте, что приложение имеет уникальную иконку как в общем меню, так и при размещении на основной странице (иконка хаба) телефона.

На следующем этапе введите название и описание Вашего приложения, а также выберите категорию и подкатегорию. О рейтингах можете сейчас не думать. Это специальные параметры, необходимые для распространения приложения в таких странах как Бразилия. И чтобы заполнить эти поля, Вам также понадобиться сертификат.

 

clip_image006

 

Наконец, Вы загружаете иконки и скриншоты своего приложения. Необходимо заранее подготовить три иконки и хотя бы один скриншот.

 

clip_image008

 

На последнем этапе Вы выбираете стоимость приложения. Подозреваю, что на первом этапе это Ваши приложения будут распространятся бесплатно.

 

clip_image010

 

Просмотрите всю загруженную информацию и установите галочку, разрешающую опубликовать Ваше приложение в Marketplace сразу же после прохождения сертификации. Если не поставить эту галочку, то придётся вернуться и выполнить публикацию вручную.

 

clip_image012

 

В последнем окне Вас предупреждают о том, что с Вашего счета снимают 30 фунтов. Но поскольку эти деньги достались Вам даром, то смело жмем Next.

Внимание! Если с первого раза Ваше приложение не проходит сертификацию, Вы можете повторить процедуру любое количество раз – бесплатно. За оставшиеся 6 фунтов можно отправить апдейт для Вашего приложения.

 

clip_image014

 

Вернувшись в свою панель управления, Вы можете смотреть на статус Вашего приложения. Тут же Вы можете опубликовать скрины и описания на других языках, нажав Submit another language.

 

clip_image016

 

Вот и все. Остается только ждать результат. 3-5 дней и Ваше приложение станет доступно пользователям (если его не вернут на доработку).

Удачи Вам с публикацией!

Written by Sergiy Baydachnyy

09.11.2011 at 17:32

Опубликовано в Windows Phone

Tagged with