Merci de votre visite. Cette page est disponible en anglais uniquement.
Appstore Blogs

Appstore Blogs

Want the latest?

appstore topics

Recent Posts

Archive

Showing posts tagged with Tips

November 27, 2018

Guest Blogger

Missile-Cards-Blog-Banner.png
Missile Cards may be my first commercially released card game, but I’ve created dozens of card game prototypes and am working on numerous card-based projects I plan to release in the future.

[Read More]

November 20, 2018

Guest Blogger

jupiterpost-secondpost.png

In this post, I'll talk about the variety of industry competitions and prizes to help your game stand out. There are many competitions within the industry that can provide financial prizes, marketing related prizes, or the invaluable opportunity to show off your game to a larger audience.

[Read More]

November 13, 2018

Guest Blogger

Opt3.png
In this article, I am going to talk about two different types of events and how to make the most of them. Going to events may seem like a particularly daunting task, but having a face-to-face connection with people in the industry is extremely important.

[Read More]

July 24, 2018

Guest Blogger

playtesting-NathanRanneyblogpost.jpg

As someone who has primarily made multiplayer games, playtesting has been an extremely important part of development. However it can be tricky to get helpful feedback under certain circumstances.

[Read More]

February 20, 2018

Mike Hines

Opt1.png
Here are my tips to get the most out of your next conference, broken down into three parts: prep work before you go, what to do while you’re there, and how to follow up effectively.

[Read More]

May 01, 2014

Peter Heinrich

As a mobile app developer, you are probably always on the lookout for ways to increase your app’s visibility. Sometimes a good, old-fashioned sale is all it takes, and Amazon’s Developer Promotions Console (DPC) now gives you the ability to specify when you want to discount your app or in-app items. As an added benefit, promotions set up through the DPC will be featured automatically on the Appstore Deals Section of Amazon Appstore in the US and Germany, if appropriate.

The DPC makes it quick and easy to discount the list price of your apps and in-app items, perfect for promoting an update, taking advantage of a holiday or special event, or conducting price elasticity tests. You can specify in the DPC when and where these discounts are available, activating them over time in one or more marketplaces, or at a single instant worldwide. For example, you might want Amazon to discount your app 50% to promote the most recent update, or offer certain in-app items for free during a limited time. These promotion “campaigns” are a snap to create.

Get Featured Merchandizing on Amazon Appstore Deals

Once your price drop promotion is live, it will automatically feature in merchandizing on the Appstore Deals section of the Amazon Appstore in the US (and Germany, when applicable) to help drive traffic to your app.

Create a Campaign

To set up a price drop campaign:

  1. Log on to the Amazon Developer Portal
  2. Click the APPS & SERVICES tab and select Promotions
  3. Click the Price Drop button, and
  4. Choose the type of campaign you would like to create

A single campaign can discount one or more mobile apps, mobile in-app purchase items, or PC and Mac apps at a time. Every campaign type allows you to set a start and end date, but you have even more control over mobile discounts.

Fine Tune Timing and Availability

For example, you might choose to discount an app only on Amazon’s main marketplace in the US, kicking off the promotion at one o’clock in the afternoon. You have the option of using fixed or relative start and end times. Fixed means the campaign will go live simultaneously across all marketplaces you select, measured in Pacific Time. Relative means start and end times will be adjusted to a reference time zone local to each marketplace (see below for the time zone used in each case).

To fix the campaign timing across all marketplaces, click the radio button labeled Start at a single global instant (relative to PDT). To stagger availability by marketplace, click Start at the same local time in each selected marketplace.

This setting applies to start and stop times both, which you can specify only once per campaign. If you want a promotion to be active at different times for different marketplaces (but not necessarily simultaneously, as with fixed), create a separate campaign for each marketplace.

You can only activate a campaign in marketplaces where your app or in-app item is available. If the specific items you want to discount are not available in China, for example, you will not be able to select amazon.cn as a target marketplace for the campaign. Publish to any of these marketplaces and they become valid targets for your promotional campaigns:

  • amazon.com               time zone: America/Los_Angeles (PST/PDT)
  • amazon.co.uk              time zone: Europe/London (GMT/BST)
  • amazon.de                  time zone: Europe/Berlin (CET/CEST)
  • amazon.fr                    time zone: Europe/Paris (CET/CEST)
  • amazon.co.jp               time zone: Asia/Tokyo (JST)
  • amazon.ca                   time zone: America/Vancouver (PST/PDT)
  • amazon.cn                   time zone: Asia/Shanghai (CST)
  • amazon.es                   time zone: Europe/Madrid (CET/CEST)
  • amazon.it                    time zone: Europe/Rome (CET/CEST)
  • amazon.com.br           time zone: America/Sao_Paulo (BRT/BRST)
  • amazon.com.au          time zone: Australia/Sydney (AEST/AEDT)

Define Discount and Confirm Campaign Settings

After you have set start and stop times for your promotion, click Next to define the discount amount, then click Next again to preview the campaign settings. If everything looks good, click Submit to save the campaign and indicate it should be launched when the time comes.

Refine Your Mobile Promotional Campaigns

The Developer Promotions Console offers a self-service interface for scheduling temporary discounts on your mobile apps and in-app items sold through Amazon. It provides the ability to set up promotions to launch simultaneously around the world or at the same hour of the day in multiple marketplaces. These discounts can be made available everywhere or limited to specific geographic regions. Promotions you create are featured automatically on the Appstore Deals section of Amazon’s Appstore in the US and Germany, when appropriate.

Use this flexibility to refine your promotional campaigns and tailor them to your specific needs. Get more information about the Developer Promotions Console online, or simply log on to the console to look around and give it a try.

-peter (@peterdotgames)

 

April 17, 2014

David Isbitski

Amazon Fire TV offers your existing Android apps an entirely new set of potential customers to engage with. It also gives your customers the ability to experience your app across Kindle Fire Tablets, Android phones and tablets, and now Amazon Fire TV – all through the same Amazon Appstore. If a customer has already bought your app that you have made available for Fire TV, they can download it onto their new Amazon Fire TV instantly, without having to purchase an additional version. 

Adding Amazon Fire TV support to your existing Android App is as simple as following a few guidelines, compiling and uploading a new TV version of your apk, and then adding Amazon Fire TV as one of your app’s device targets inside the Developer Console.  

Amazon Fire TV opens up new discoverability possibilities for your app across many new customers. Most updates to your apps for Amazon Fire TV should be minor, and if you have been following the guidelines from Android on Designing for Multiple Screens all along, your app may already be ready for a large TV resolution. 

While you may be familiar with targeting Android tablets and phones, there are a few things you need to consider for your app to run correctly on Amazon Fire TV. This includes understanding the layout, dimensions and orientation of Amazon Fire TV views, changes to the user experience when interacting with a TV (10’ away on average), UI and navigation patterns, as well as some other TV-specific gotchas such as overscan and color reproduction.

Understanding Amazon Fire TV Video Output

You can think of the Amazon Fire TV screen as an Android device that is locked to landscape orientation, with a constant width of 960dp and with a height of 540dp. The rendering surface is always 1920x1080 with a screen density of 320dpi. Output is automatically scaled for 720p and 480p output resolutions.

The following table shows how the various video outputs of Amazon Fire TV map to their Android counterparts.

TV setting

Output resolution

(pixels)

Render surface

(pixels)

Density identifier

screen density

(dpi)

Display resolution

(dp)

Screen size identifier

1080p

1920 x 1080

1920 x 1080

xhdpi

320

960x540

large

720p

1280 x 720

1920 x 1080

xhdpi

320

960x540

large

480p

640 x 480

1920 x 1080

xhdpi

320

960x540

large



By following the Android best practices guide for Supporting Multiple Screens, you can create a different layout configuration just for Amazon Fire TV so that your existing layout adapts when it runs on the device. This is the same process you are most likely already using for generating different drawables and layouts and including them in your app’s /res directory. 

You can get a detailed overview of the resource configurations available for Amazon Fire TV here.

Thinking About the 10-Foot User Experience

TV interfaces in general are often referred to as 10-Foot User Interfaces (10-ft UI) because the user is viewing the screen from 10 or more feet away. Although the screen itself can be very large, the screen resolution is lower, and distance from the screen means a smaller angle of view.

The design choices you would make for an application or web page running on a desktop computer, tablet, or phone are fundamentally different from those of a TV, as users typically view those screens from much closer distances. In addition, as the television is used in a more relaxed fashion than a computer, a tablet or a phone, the UI on the TV should not require as much attention and precision. 10-ft UI may require you to rethink the design, layout, and navigation of an existing app.

Keep the design of your screen in a 10-ft UI simple and clean, with low information density. Limit the number of design elements or UI components (menus, buttons, images) on the screen, and ensure that those elements are large enough and spaced far enough apart to be read from a distance. Present a clear set of actions or options for each screen. Minimize the amount of text, as users do not read a lot of text on a television screen. Avoid requiring the user to input a lot of information and provide reasonable defaults where possible.

In your existing Android app for a phone or tablet, you can assume that touch is always present, and your UI elements reflect that. For example, if I run the existing Android Snake Game from my AWS re:Invent 2013 demo on a Kindle Fire, tapping the menu button with my finger brings up the standard Android options menu.

Figure 1- Android Options Menu for Touch on Kindle Fire

However, running the same app on an Amazon Fire TV shows a slightly different experience when interacting with the options menu. Instead of tapping our finger on a screen, we press the Menu button on the Amazon Fire TV remote or game controller, which brings up the Android options menu with the first item in the ListView (“New Game”) automatically highlighted.

Figure 2- Android Options Menu on Amazon Fire TV automatically highlights currently selected item for the user

This allows your users to know exactly where they are in the options menu. Pressing the SELECT button on the remote (the A  button on a game controller) raises that UI element’s ItemSelected event . 

Note that all of this works automatically, and you do not have to wire up any of the on screen highlighting for any of your user interface elements – that is done for you by FireOS itself. This does, however, affect the flow of interaction your customer has with your app when using a remote or a controller. Thoroughly test your app running on a TV screen with a remote or controller and make changes to the interaction where appropriate. 

For more helpful tips on modifying your app to work with remote and controllers be sure to check out our post with helpful tips.

Updating Your Android Views for TV

The Amazon Fire TV screen is always displayed in landscape orientation, with a display resolution of 960dp wide and 540dp high. In terms of Android supported screen size configurations, you should target large. If you have not created any large-screen assets, you need to verify that your existing sizes scale well.

Depending on the orientation you are using for your existing Android app, you may see some inaccurate screen sizing when running against the TV screen for the first time. In the example below I am using the code from my previous Ad Mediation post, which was set to run in portrait. 

Figure 3- App scaling and running in forced landscape

The first time the app runs you can see the scaling that occurs to accommodate the device screen size for an app forced into portrait mode. To fix this, call setRotation on any View like so:

 
myView.setRotation(90f);

This rotates the current view 90 degrees and places it into landscape mode. Another way to do this is to set the orientation of your main view inside of its layout file so that all children are rotated as well.

In fact, simply updating the orientation of the View of my main activity to run horizontally instantly fixed all of my screen issues and my app ran perfectly.

Figure 4- App scaled correctly and set to landscape

When testing out the Snake Game from the above example, I encountered a similar scaling and rotation issue.

Figure 5- Snake Game Demo running incorrectly

Instead of setting the orientation of the entire View you can also change the orientation of your activity itself. For example, inside the androidmanifest.xml file for my game, I provided an attribute for the orientation of the SnakeGameActivity.

Setting the android:screenOrientation to be landscape fixed all scaling issues with the game and made it instantly playable.

Figure 6- Snake Game fixed and running in landscape

With just a few adjustments to your apps’ Android Views and updates to their associated resource images, your apps can be displayed on an Amazon Fire TV connected screen with minimal changes.

Understanding TV Overscan, Text and Color

Overscan is the physical space TV hardware manufactures reserve around the displayable area of a TV screen and something you should be aware of when targeting Amazon Fire TV with your app. This space can exist on TVs of any size and limits the area in which your app is able to render its user interface. 

Figure 7- TV Overscan examples.

To avoid any issues with overscan, I recommend that you avoid placing any of your app's UI elements within the outer 5% of any edge on the screen.

Any onscreen text or UI elements should be fully within the inner 90% (the safe zone) of your user interface. Your text should also use larger type sizes (at least 14sp) so that they are viewable on large screens. Amazon Fire TV uses Helvetica Neue Regular as the system font throughout all of the system’s interfaces.

When testing your app you may also find that the colors are not represented the same when shown on a TV display as they are on a tablet. Because TV screens have a higher contrast, they have a tendency to make colors seem more saturated, brighter, and vibrant. The range of colors that can be displayed is also less than that of a PC or mobile device screen. Cool colors (blue, purple, grey) work better than warmer colors (red, orange) on a TV and a good rule to follow is to avoid using less saturated colors in your apps.

Figure 8- Color Saturation on TV Displays

Understanding Amazon Fire TV Navigation

If you choose to add an updated user interface to your app to better match that of Amazon Fire TV’s UI, there are a couple of guidelines you should follow. 

Figure 9- Navigation Screen Types on Amazon Fire TV

All navigation starts with the home screen which consists of a global navigation menu on the left and a set of content tiles on the right. 

Figure 10 - Home Screen

The global navigation menu is the primary system menu. It appears in a row on the left side of the screen. The global navigation menu allows the user to choose major content categories or other options including Search, Home, Movies, TV, Music, Games, Apps, and so on. Each item in the global navigation menu can be selected with the Up and Down directional buttons.

When the user focuses on any item in the global navigation menu, the home view for that node appears on the right side of the screen. Each node has its own home view with its own content. The overall system home view, sometimes called the launcher, is accessible with the Home key on the Amazon Fire TV remote, or by selecting Home from the global navigation menu.

Figure 11- Outer Space Has Been Focused on by User

Each home view contains multiple horizontal content rows. The title tile for the row indicates the type of content (for example, Most Popular, My Movies, Recommended for You). The remaining tiles show examples of that content. From these content rows, the user can:

  • Navigate between rows with the Up and Down directional buttons.
  • Move back to the navigation menu with the Left button.
  • Choose Select or Right to select a row and view a 1D list for that row.

Be sure to check out the Design and User Experience Guidelines for additional information on all of the screen types and important tips on creating an engaging user experience for Amazon Fire TV.

In addition to the global navigation, menu notifications are also displayed in a certain way within the base Amazon Fire TV user interface.

Figure 12- Informational Notification

Amazon Fire TV includes three kinds of notifications you can use inside of your own apps: Informational, Media and Modal. Informational Notifications can be used for general messages to the user, with optional actions. Media Notifications are used when the user is interacting with media inside your application (music with artist and title for example). Modal notifications are used for alerts that require user input. Modal notifications may appear at any time over your application. A modal notification takes the focus and the user must take actions to dismiss that notification.

Note: Modal notifications can only be generated by the Amazon Fire TV user interface in response to critical issues (such as an unavailable network connection). System-wide modal notifications cannot be generated by individual apps. You can use alert dialogs (AlertDialog) to create modal alerts within your app.

Figure 13- Modal Notification

Amazon Fire TV Notifications are slightly different from standard Android Notifications. Although the API for Android notifications is available in the Amazon Fire TV SDK, and apps that use that API will compile, standard Android notifications do not appear in any way on Fire TV. You must convert your app to use the Fire TV notifications API. 

One you have installed the Amazon Fire TV SDK Add-on, you will then need to import the Amazon device notification namespaces:

	import com.amazon.device.notification.AmazonNotification;
	import com.amazon.device.notification.AmazonNotificationManager;

Next, use AmazonNotification.Builder to create a notification object, as you would a standard Android Notification. The AmazonNotification.Builder class has a new required method, setType(), which indicates the type of notification. You have these notification types to choose from -- TYPE_INFO maps to Information Notifications and TYPE_MEDIA corresponds to Media Notifications.

Once you decide on the type of Notification to create you need to set up the Builder object like below:

 	AmazonNotification.Builder builder = new AmazonNotification.Builder(getApplicationContext());
	builder.setSmallIcon(R.drawable.notification_icon);
	builder.setContentTitle(title);
	builder.setContentText(text);
	builder.setType(AmazonNotification.Builder.TYPE_INFO);

Lastly, register the Notification object with the AmazonNotificationManager, as you would a standard Android Notification. You should also assign it an ID to update or cancel the Notification later.

 
        AmazonNotificationManager notificationManager = (AmazonNotificationManager)     
        getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(notificationId, builder.build())

Please note that unlike the Kindle Fire, there is currently no Notification Tray on Amazon Fire TV so if your customer is in an immersive mode app, they will not see the Notification.

For full details and more sample code on implementing notifications, check out our developer documentation here.

Handling Web Content

If your app contains any web content, you will need to do some slight modifications. By default, Amazon Fire TV does not include a Web Browser, but web content is allowed using the Android’s WebView. To use web content, set the WebClient of the WebView and override url overloading. This can be done by calling the setWebViewClient method of the WebVew to a new WebViewClient whose shouldOverrideUrlLoading property has been set to return false. 

This code ensures that your app does not attempt to load an external browser with web content and instead loads it into the WebView. You can see the url being loaded successfully into the WebView below.

Figure 14- WebView HTML content loaded successfully

Note that if you attempt to do a direct call to WebView.loadUrl without setting a new WebViewClient whose shouldOverrideUrlLoading method returns false like above you will see an error like this one:

Figure 15- webview.loadUrl security message

If you would like to link to other apps on the Amazon Appstore, for example, to cross-promote your own offerings, you can also use Android Intents with amzn:// urls, just as you can on the Kindle Fire. If you “deep link” to an app that is not ready for Amazon Fire TV we still show the detail page for the app, but customers are not able to download it. Check out this post for more information.  

Conclusion

Once your app is updated for Amazon Fire TV, your app’s listing on the Amazon Appstore runs across all the available devices you chose when you submit your app. Customers pay for your app once and begin to engage across all of their Kindle Fire tablets, Android phones and tablets, and now Amazon Fire TV. The opportunities for your customers to discover and engage with your app continue to grow!

In addition to the tips I’ve included here, be sure to check out these additional resources:

Purchase an Amazon Fire TV

Amazon Fire TV SDK Frequently Asked Questions

Amazon Fire TV SDK

Device Specifications

Display and Layout

User Interface

Design and User Experience Guidelines

Android Developer Multiple Screen Guidance

Supporting Different Screen Sizes

Supporting Different Densities

-Dave (@TheDaveDev)

 

February 27, 2014

David Isbitski

About Kinetic Art

Kinetic Art, an Israeli startup established in 2010, is the publisher of the highly popular cooking app Look & Cook. Kinetic Art's core technology and intellectual property revolves around in-app ecommerce optimization.

Recently, Kinetic Art published Look & Cook to the Amazon Appstore (download here) their first ever-Android version. I had a chance to sit down with Dudu Mimran from Kinetic Art and talk about Kinetic Art’s experience publishing on the Amazon Appstore, what it was like implementing the Amazon Mobile Associates API, and what type of success they have seen so far.

“Look and Cook is a cooking and now a shopping app, thanks to Amazon’s Mobile Associates API. We are building a platform for building cooking apps.” - Dudu Mimran.

Why start with Amazon? A better user experience.

Having found early success on iOS, including an advertising campaign on Pinterest, the team decided it was time for an Android version. For Kinetic Art the most important thing for Look & Cook was ensuring a great user experience. They were confident they could achieve this vision on Kindle Fire as they only needed to target a single device vs a multiple of Android devices. “On Amazon, you can focus a lot on Kindle. With Google Play you have to make sure you having everything looking good on many, many devices. We decided it would be a much easier transition going from iOS to Amazon because of this.”

Look & Cook was able to leverage Amazon to create a culinary lifestyle experience by integrating ecommerce into the food and culinary world. The current version of Look & Cook now has numerous physical goods related to the cooking of the selected recipe. “We created a small shop within each recipe. The tools that are included in the app are recommended by the recipe creator to make the recipe perfectly. In general, this is what our investors have in mind. Our main business model in the future will be ecommerce. We are not there yet, but this is a great step. We are betting everything on ecommerce and we already have purchases. People are buying for sure,” declares Dudu.

“Look and Cook is a cooking and now a shopping app, thanks to Amazon’s Mobile Associates API. We are building a platform for building cooking apps. Amazon’s Mobile Associates API really excited us because we have always wanted to integrate ecommerce but it’s something very hard to do as a startup. Since Mobile Associates launched it has made it much easier for us. We are very happy working with Amazon,” says Dudu.

Amazon Customers: More Engaged

Even though the team has seen a smaller number of app downloads on Amazon vs. iOS people are definitely buying goods and they have already seen differences in the behavior of customers. “We have two types of users on Amazon: those that use it on an ongoing basis and those that love it for cooking. We also see those that love it for the very first time. They are more engaged on Amazon, and if I compare the amount and depth of reviews, then totally, people are much more engaged into the app itself,” says Dudu.

According to the team, once they understood the basics of integrating the API for Amazon Mobile Associates, things progressed quickly. “It was very easy, and it just works!” says Dudu.

“Our main business model in the future will be ecommerce. We are not there yet, but this is a great step. We are betting everything on ecommerce and we already have purchases. “

Figure 1- Look & Cook running on a Kindle Fire HDX 7”

Figure 2- Tapping on Shop will bring up a physical good for that recipe you can buy with the Buy Now button.

Figure 3- Clicking Buy Now takes you right to the product from Amazon without leaving Look & Cook

Figure 4- Look & Cook’s category of recipes

Kinetic Art projecting 8-10x growth

To measure success the team built a detailed level of conversion measurement. For example, they know how many people download the app, navigate through the app, navigated to an extended view, and buy products. In the future, one of the improvements will be creating greater exposure to other random products and not forcing people into the ones the app recommended.

It’s too early to tell how much money the team will be making but already they are seeing purchases. “It’s less important for the number at the moment, behavior is what is very important. Really getting customers used to the behavior is important. They are not accustomed to buying within the app. Now we are working on several angles: distribution, volume of users, exposure of more products, and then quality of product and selection,” says Dudu. 

When asked about potential growth, the team projects as much as 8-10x growth once they start really marketing to users. Their favorite part about working with Amazon? “I would say the personal touch. This is very, very important to us and a huge differentiator. From a user perspective, Amazon customers are much more engaged and seem to be people that buy.”

You can check out Look & Cook in the Amazon Appstore here and find out more about the Amazon Mobile Associates API here.

-Dave (@TheDaveDev)

 

February 11, 2014

Mike Hines

There is still plenty of room for more great mobile apps. That is, if you’re thorough and obsessed with quality. Recently, I was reminded of the importance of doing a solid job of testing all aspects of an app when reviewing geography bee apps.  

For the last two years, my son has competed in his middle school geography bee, and rather than suggest that he spend his time buried in an atlas, I suggested a handful of apps designed to help students prepare for geography bees. Of the apps that we found, not one app was rated 5-star by customers.

The shortcomings of these apps generally fell into one of three categories:

  • The app was different than described
  • Poor UI/workflow impeded use
  • Deal-Breaker Bugs

Description should match the apps

Sometimes an app might be useful but just doesn’t deliver what a customer expected based on the description. Imagine an app that purports to be a Geography Bee study app, yet quizzes for dates of events and asks for definitions of sedimentary rocks. Some of the apps we tried were like this, being better suited to geology or history quizzes than to a geography bee.

What can you do?

Make sure the product title and app description accurately reflects what the app actually does. The apps that I was disappointed in were not bad apps, just a bad fit for my needs.

Streamlined User Experience

Sometimes an app had solid content, but the navigation was too confusing or it took too many steps. I’m in the business of apps, so I’ll give any app a thorough review. But many users won’t bother to enter their name and age every single time the app launches. And if a customer loses their user state in the middle of a series of questions, you can bet they’ll be frustrated. 

What can you do?

Think more like a user. For example, when a student uses a geography bee app, more than likely they’ll be interrupted. The app not only needs to go from start to finish cleanly, but it also needs to tolerate interruptions, be fast to re-enter, and avoid re-doing completed work. Have someone else try the app and see what he or she tries to do. If they seem frustrated, then it’s probably worth considering whether the experience needs to be re-designed in some way.

Squash the Bugs

Strangely enough, some bugs were easier to live with than problems with UX or failure to deliver on value. Bugs, like truncated buttons, pixelated graphics or having to tap twice on an answer, might cost a star in the rating, but they still leave the app usable. Other bugs, like text entry boxes hidden under keyboards, were considerably more problematic. The app whose UX I liked the best contained outstanding educational content, but it didn’t get much use because it kept crashing on both iOS and Android tablets.

What can you do?

Be maniacal about your QA. If your resources are constrained, there are solid testing services out there. The services have apps that they can refer you to, so you can get a sense of how well the testing works. Check out the referral apps, and if the quality seems top notch, consider using them to help with your QA. This attention to detail can go a long way to help you get the app rating you’re looking for.

 

Want the latest?

appstore topics

Recent Posts

Archive