Wednesday, August 1, 2012

Use any credit or debit card with Google Wallet

(cross-posted from the Google Commerce Blog)



Since we released the first version of Google Wallet, the app that makes your phone your wallet, we’ve made it available on six phones from Sprint and Virgin Mobile, as well as the new Nexus 7 tablet. We’ve also partnered with more than 25 national retailers, and thanks to MasterCard PayPass, you can pay with your phone at more than 200,000 retail locations across the U.S.



Today we’re releasing a new, cloud-based version of the Google Wallet app that supports all credit and debit cards from Visa, MasterCard, American Express, and Discover. Now, you can use any card when you shop in-store or online with Google Wallet. With the new version, you can also remotely disable your mobile wallet app from your Google Wallet account on the web.



 








A wallet with all your credit and debit cards

To save a card to Google Wallet, just enter the number into the mobile app, online wallet, or Google Play when making purchases. When you shop in-store, you can use Google Wallet in conjunction with your selected credit or debit card for purchases (more info here). Shortly after making a payment, you’ll see a transaction record on the phone with the merchant name and dollar amount. You can now view a history of all your in-store and online purchases from the online wallet.
























To support all credit and debit cards, we changed our technical approach to storing payment cards. The Google Wallet app now stores your payment cards on highly secure Google servers, instead of in the secure storage area on your phone. A wallet ID (virtual card number) is stored in the secure storage area of the phone, and this is used to facilitate transactions at the point of sale. Google instantly charges your selected credit or debit card. This new approach speeds up the integration process for banks so they can add their cards to the Wallet app in just a few weeks. Banks that want to help their customers save cards to Google Wallet, including their custom card art, can apply here — there is no cost.





A wallet you can lock — and remotely disable
We take security very seriously and have always had a dedicated Google Wallet PIN to prevent others from making payments with your Google Wallet. And as always, we encourage Google Wallet customers to set up the phone’s screen lock -- as an extra layer of protection.



Today, we’re adding a Google Wallet security feature that makes it possible for you to remotely disable your mobile wallet on a lost phone. It’s easy. If you lose your phone, just visit the ‘Devices’ section in the online wallet and select the phone with the mobile wallet you wish to disable. When you successfully disable your wallet on a device, Google Wallet will not authorize any transactions attempted with that device*. If the Google Wallet online service can establish a connection to your device, it will remotely reset your mobile wallet, clearing it of card and transaction data. There is no way you can do that with your leather wallet.










The new Google Wallet app is available now on Google Play, and if you have a supported NFC device and are in the United States, we encourage you to give it a try.



Posted by Robin Dua, Head of Product Management, Google Wallet



* For now, Google Prepaid Cards and some Citi MasterCard cards will remain active until Google Wallet can remotely connect and reset your mobile wallet.

Use any credit or debit card with Google Wallet

(cross-posted from the Google Commerce Blog)



Since we released the first version of Google Wallet, the app that makes your phone your wallet, we’ve made it available on six phones from Sprint and Virgin Mobile, as well as the new Nexus 7 tablet. We’ve also partnered with more than 25 national retailers, and thanks to MasterCard PayPass, you can pay with your phone at more than 200,000 retail locations across the U.S.



Today we’re releasing a new, cloud-based version of the Google Wallet app that supports all credit and debit cards from Visa, MasterCard, American Express, and Discover. Now, you can use any card when you shop in-store or online with Google Wallet. With the new version, you can also remotely disable your mobile wallet app from your Google Wallet account on the web.



 








A wallet with all your credit and debit cards

To save a card to Google Wallet, just enter the number into the mobile app, online wallet, or Google Play when making purchases. When you shop in-store, you can use Google Wallet in conjunction with your selected credit or debit card for purchases (more info here). Shortly after making a payment, you’ll see a transaction record on the phone with the merchant name and dollar amount. You can now view a history of all your in-store and online purchases from the online wallet.
























To support all credit and debit cards, we changed our technical approach to storing payment cards. The Google Wallet app now stores your payment cards on highly secure Google servers, instead of in the secure storage area on your phone. A wallet ID (virtual card number) is stored in the secure storage area of the phone, and this is used to facilitate transactions at the point of sale. Google instantly charges your selected credit or debit card. This new approach speeds up the integration process for banks so they can add their cards to the Wallet app in just a few weeks. Banks that want to help their customers save cards to Google Wallet, including their custom card art, can apply here — there is no cost.





A wallet you can lock — and remotely disable
We take security very seriously and have always had a dedicated Google Wallet PIN to prevent others from making payments with your Google Wallet. And as always, we encourage Google Wallet customers to set up the phone’s screen lock -- as an extra layer of protection.



Today, we’re adding a Google Wallet security feature that makes it possible for you to remotely disable your mobile wallet on a lost phone. It’s easy. If you lose your phone, just visit the ‘Devices’ section in the online wallet and select the phone with the mobile wallet you wish to disable. When you successfully disable your wallet on a device, Google Wallet will not authorize any transactions attempted with that device*. If the Google Wallet online service can establish a connection to your device, it will remotely reset your mobile wallet, clearing it of card and transaction data. There is no way you can do that with your leather wallet.










The new Google Wallet app is available now on Google Play, and if you have a supported NFC device and are in the United States, we encourage you to give it a try.



Posted by Robin Dua, Head of Product Management, Google Wallet



* For now, Google Prepaid Cards and some Citi MasterCard cards will remain active until Google Wallet can remotely connect and reset your mobile wallet.

The power of places and big data for good: Google Places API Developer Challenge 2012

How would you make your community or local government run better? In our first Google Places API Developer Challenge, we’re inviting developers around the world to make something that improves their communities or governments by using the Google Places API and its database of places and tools. The developers of the winning applications will receive a VIP experience at Google I/O 2013.



You might create an app or site that solves health problems, understands crime patterns, or improves commerce. You can use any platform as long as you build with the Google Places API and it benefits your community or government. We’re looking for your best and most innovative ideas.







Built on the comprehensive global database of more than 95 million places that powers Google Maps, the Google Places API enables you to search for information about a variety of nearby places such as establishments, geographic locations and prominent points of interest. You can re-rank place results based on user check-ins, and create new places specific to your app.



To help you develop your ideas and build better apps, we’ve been working with local government officials in Austin, Boston, Chicago, London, Louisville, New York City, Philadelphia, Portland (Ore.), San Francisco, and Seattle along with the White House to surface a wide variety of data sets for your apps. You can find these data sets and more on the Google Places API Challenge site at http://developers.google.com/challenge and hear more about what cities have to say about the challenge here. You can also follow updates and hangouts about the challenge on +Google Maps API.



The submission window opens on August 15th and closes on October 31st, 2012.



We look forward to seeing what can happen when your imagination and the Google Places API come together!



Getting AdMob ads to work with cocos2D Part 2: Handling Autorotation

In the first part of this series, we talked about integrating AdMob ads in a cocos2d application without diminishing performance. However, we conveniently overlooked how you’d go about handling device reorientation. This blog post will outline the two steps necessary for getting autorotation to work using v0.99.5b3 or higher of the cocos2d framework.




Step One: Setting UIKit Autorotation

cocos2d allows you to handle autorotation in two different ways (UIKit and cocos2d). Since we’re working with both UIKit views as well as Open GL views, we want to rely on UIKit autorotation. If not, we’d have to transform our GADBannerView manually. To make sure you’re using UIKit autorotation, set the GAME_AUTOROTATION directive on your platform of choice to kGameAutorotationUIViewController.



Once you’ve done this, check RootViewController.m to make sure shouldAutorotateToInterfaceOrientation: returns YES for all of the orientations that you support. cocos2d produces skeleton code that handles this method differently depending on the autorotation method you’re using, so make sure that you modify the code block where GAME_AUTOROTATION == kGameAutorotationUIViewController.




Step Two: Modifying View Layout

The final step is to modify our resizeViews: method so that it takes the orientation of the device into account when laying out the views. Rewrite resizeViews: as resizeViewForOrientation:, using the orientation parameter to lay out your GADBannerView. The code below, similar to the first blog post, assumes you’re laying out your banner at the top of the screen.




- (void)resizeViewsForOrientation:(UIInterfaceOrientation)toInt {
// If the banner hasn't been created yet, no need for resizing views.
if (!bannerView_) {
return;
}

BOOL adIsShowing = [self.view.subviews containsObject:bannerView_];
if (!adIsShowing) {
return;
}

// Frame of the main RootViewController which we call the root view.
CGRect rootViewFrame = self.view.frame;
// Frame of the main RootViewController view that holds the cocos2d view.
CGRect glViewFrame = [[CCDirector sharedDirector] openGLView].frame;
CGRect bannerViewFrame = bannerView_.frame;
CGRect frame = bannerViewFrame;
// The updated x and y coordinates for the origin of the banner.
CGFloat yLocation = 0.0;
CGFloat xLocation = 0.0;

// Move the root view underneath the ad banner.
glViewFrame.origin.y = bannerViewFrame.size.height;
// Center the banner using the value of the origin.
if (UIInterfaceOrientationIsLandscape(toInt)) {
// The superView has not had its width and height updated yet so
// use those values for the x and y of the new origin respectively.
xLocation = (rootViewFrame.size.height -
bannerViewFrame.size.width) / 2.0;
} else {
xLocation = (rootViewFrame.size.width -
bannerViewFrame.size.width) / 2.0;
}

frame.origin = CGPointMake(xLocation, yLocation);
bannerView_.frame = frame;

if (UIInterfaceOrientationIsLandscape(toInt)) {
// The super view's frame hasn't been updated so use its width
// as the height.
glViewFrame.size.height = rootViewFrame.size.width -
bannerViewFrame.size.height;
glViewFrame.size.width = rootViewFrame.size.height;
} else {
glViewFrame.size.height = rootViewFrame.size.height -
bannerViewFrame.size.height;
}
[[CCDirector sharedDirector] openGLView].frame = glViewFrame;

}


Now that you’re handling rotation, you’re going to have to resize your views in two different places. We’ve already covered this in initGADBanner: in the first post (simply use the interfaceOrientation property of UIViewController to call resizeViewsForOrientation: instead of resizeViews:). Here, we also have to call resizeviewsForOrientation: in willRotateToInterfaceOrientation:duration: as well. You can add this call after the skeleton code that cocos2d provides.



Ads inside your cocos2d application should now stay docked in place whenever device rotations occur. You can check out a full example from this blog post here. As always, feel free to direct any questions you have to our forum or join us for our upcoming hangout.





Custom color picker in Google Calendar


Google Calendar users have had the ability to change the colors of specific events or calendars from a default color palette. Users can now choose a custom color if the default palette does not meet their needs.



Release track:


Rapid



Editions included:


Google Apps, Google Apps for Business, Government and Education



How to access what's new:


Click on "Choose custom color" on the bottom of the existing color picker.



For more information:


http://support.google.com/calendar/bin/answer.py?hl=en&answer=37227



whatsnew.googleapps.com


Get these product update alerts by email


Subscribe to the RSS feed of these updates

Scheduled Release track features update 7/31/12


- Documents: Users will have the ability to create documents offline. You must be running the latest version of Chrome or ChromeOS and install the Google Drive Chrome app to use this feature.



The following features are intended for release to these domains on August 7th:

No new features to announce.



Release track: 

Scheduled*



Editions included: 

Google Apps, Google Apps for Business, Government and Education



For more information:

http://googledocs.blogspot.com/2012/07/offline-updates-and-quick-look-back-at.html

http://support.google.com/docs/bin/answer.py?hl=en&hlrm=en&answer=1628469



*Scheduled Release track: Domains with ‘Scheduled Release’ option enabled in the administrator control panel. Learn more.



whatsnew.googleapps.com


Get these product update alerts by email


Subscribe to the RSS feed of these updates

Tuesday, July 31, 2012

Getting AdMob ads to work with cocos2D

cocos2d for iPhone is a popular framework for building 2D games for iOS. Integrating AdMob ads into cocos2d apps has gotten significantly easier with the latest version of the framework; This blog post will show you three things to keep in mind using v0.99.5b3 or higher of the cocos2d framework. It is assumed that you already have some familiarity with cocos2d.




Initialization

Create and initialize a GADBannerView in the RootViewController class. You can put this code into a new method knowing that it will be called from the AppDelegate after the view hierarchy has been set up. This code adds to the standard banner view example in the docs.




- (void)initGADBanner {

// NOTE:
// Add your publisher ID here and fill in the GADAdSize constant for
// the ad you would like to request.
bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView_.adUnitID = @"PUBLISHER_ID_HERE";
bannerView_.delegate = self;
[bannerView_ setRootViewController:self];

[self.view addSubview:bannerView_];
[bannerView_ loadRequest:[self createRequest]];
// Use the status bar orientation since we haven't signed up for
// orientation change notifications for this class.
[self resizeViews];
}



Performance Considerations

Notice the addSubview: in initGADBanner:. Why did we add the GADBannerView directly to the RootViewController’s hierarchy instead of the cocos2d scene’s hierarchy? cocos2d scenes are OpenGL views, whereas our GADBannerView is a UIWebView wrapped in a native UIView. OpenGL views will usually be refreshed often, whereas our GADBannerView will be mostly static. Placing our GADBannerView on top of the OpenGL view therefore can lead to a performance decrease as the device will have more drawing to do.



You can test if this performance decrease is significant for your specific project by logging the frame rate when you place the ad within the OpenGL view and outside of it. The performance cost is usually only significant when you are dealing with very complex hierarchies.




View Layout

Since we’ve decided to place our GADBannerView into the RootViewController’s view hierarchy, we also need to now make sure to resize our cocos2d view to make space for our GADBannerView. The resizeViews: in initGADBanner: is called for this purpose. The implementation for resizeViews: is below. The main OpenGL view which encompasses all of the cocos2d scenes can be grabbed using the +sharedDirector object. The code below assumes you’re going to display the ad at the top of your screen, and have a device that’s in landscape.





- (void)resizeViews: {
// If the banner hasn't been created yet, no need for resizing views.
if (!bannerView_) {
return;
}
// If ad is not showing, no need to resize views.
BOOL adIsShowing = [self.view.subviews containsObject:bannerView_];
if (!adIsShowing) {
return;
}

// Frame of the main RootViewController which we call the root view.
CGRect rootViewFrame = self.view.frame;
// Frame of the main RootViewController view that holds the cocos2d view.
CGRect glViewFrame = [[CCDirector sharedDirector] openGLView].frame;
CGRect bannerViewFrame = bannerView_.frame;
CGRect frame = bannerViewFrame;
// The updated x and y coordinates for the origin of the banner.
CGFloat yLocation = 0.0;
CGFloat xLocation = 0.0;

// Move the root view underneath the ad banner.
glViewFrame.origin.y = bannerViewFrame.size.height;
// The superView has not had its width and height updated yet so use those
// values for the x and y of the new origin respectively. The game is in
// landscape.
xLocation = (rootViewFrame.size.height -
bannerViewFrame.size.width) / 2.0;

frame.origin = CGPointMake(xLocation, yLocation);
bannerView_.frame = frame;


// The super view's frame hasn't been updated so use its width
// as the height. Assume device is in landscape.
glViewFrame.size.height = rootViewFrame.size.width -
bannerViewFrame.size.height;
glViewFrame.size.width = rootViewFrame.size.height;

[[CCDirector sharedDirector] openGLView].frame = glViewFrame;
}



With that, you should now see AdMob ads show up in your cocos2d application. Look out for a follow-up to this blog post where we will discuss how to handle autorotation. As always, feel free to direct any questions you have to our forum or join us for our upcoming hangout.