LightBlog

lundi 8 août 2016

Quadrooter: the latest Android security flaw

Quadrooter scanner app

Welcome back for another episode of "Android malware daily". In today's episode, the sinister Quadrooter vulnerability puts a billion Android devices at risk and won't be fully patched until the September security release. The flaws appear in the drivers for Qualcomm chipsets – so, a vast majority of Android devices – and could potentially allow a hacker to take over your device completely. But don't go stockpiling canned goods and barricading the basement just yet.

smartphone privacy security 2See also: Best Android security practices3

What is Quadrooter?

Yet again it's a privilege escalation vulnerability, the kind that would allow a hacker that manages to dupe you into installing a dodgy app – say a side-loaded version of Pokémon Go or the new Nexus Launcher – to then gain root access and take control over all aspects of your phone, from GPS and data to camera and microphone.

As the researchers that uncovered the flaw report:

An attacker can exploit these vulnerabilities using a malicious app. Such an app would require no special permissions to take advantage of these vulnerabilities, alleviating any suspicion users may have when installing.

Qualcomm-1

Qualcomm's response

Qualcomm distributed fixes for its drivers to its various partners and the open source community between April and the end of July. While three of the four vulnerabilities were addressed in Google's August security update, one has been delayed until the September patch.

While some devices including the Nexus line receive these patches lickety split, other devices have to wait months to get the latest security fixes. It is possible that individual OEMs will issue their own patches for the Quadrooter flaws before Google's next security update, but I wouldn't hold your breath.

In the meantime, the security researchers that uncovered the vulnerability recommend a few general security measures including not installing apps from outside Google Play, being vigilant with permission requests and always installing the latest updates from your carrier or manufacturer.

Unknown Sources install blocked security notification

The real issue

So while the chances of being affected by Quadrooter are very slim, the risk is there, as it always is with these big attention-grabbing vulnerabilities. But remember that exploits like these very rarely generate any real-world victims.

Perhaps the more important part of these stories is not that your phone might be affected, but that they force the security discussion into the spotlight. As Check Point correctly surmises:

This situation highlights the inherent risks in the Android security model. Critical security updates must pass through the entire supply chain before they can be made available to end users. Once available, the end users must then be sure to install these updates to protect their devices and data.

The inevitable app

As always, there is an app available to see what Quadrooter flaws your device is vulnerable to. But other than arming yourself with knowledge there is not much the app or you can do until the patches roll in. If you're interested, you can also download the report on Quadrooter from Check Point if you want to know more.

Quadrooter Scanner app checker

While hoping that Android security will suddenly become watertight and universally supported is a bit of a chimera, we can all play our part. Support those manufacturers that take security updates seriously, adopt best practices when installing apps, pay attention to permissions and so on. Until we can all say we do our bit, Android will continue to be an easy target for bad actors.

INSTALL QUADROOTER SCANNER

What security patch are you running? Do you think the Android security model needs addressing?



from Android Authority http://ift.tt/2b7iJci
via IFTTT

Google bigs up Google Photos storage savings in this video ad

Google Photos shared albums

Many Android users have probably found Google Photos to be a pretty handy backup tool, especially as it comes pre-installed on new devices these days. Even so, there are good alternatives out there and Google wants to show off just how handy its photo storage app can be, with a new advertisement about one of its latest features – Free up Space.

I'm certainly not the most prolific selfie snapper out there, but I've managed to jam up my microSD card and phone storage with enough pictures over the years that I'm starting to run out. Fortunately, Google introduced a new "Free up Space" feature to the Google Photo app earlier in the year that can delete old photos from your device that have already been backed up to online storage. The feature wasn't really marketed by Google at the time, so that's what this is ad is all about.

If you have been looking to free up some space on your device, head on over to the Google Photos app and open up the menu by sliding from the left. Go into the Settings menu and select "Free up device storage". The same setting can be found on iOS devices too, if you like that sort of thing.

If you haven't given Google Photos a try yet, you can download the app for free from the Play Store via the button below.

Get it Now from Google Play


from Android Authority http://ift.tt/2b7Yr19
via IFTTT

Flipkart Freedom Sale starts August 10

flipkart-freedom-sale
It's raining deals and discounts for Indian consumers! Amazon India kicked off the Great Indian Sale earlier today, and by the time it ends at midnight day after tomorrow, its closest rival Flipkart will have kicked off their Freedom Sale, which actually clashes with the last day of the Amazon sale, on August 10. If previous Flipkart Sales are any indication, we can expect huge offers huge discounts on smartphones, tablets, and electronic devices, among others.

Flipkart is offering you freedom from not just high prices, but also from your old smartphones. Flipkart always has great exchange offers with their smartphones, but during the sale period, you can expect to get even more out of an older handset, so if you are looking for an upgrade, a few days from now will certainly be the best time to do it. Also on offer will be a no cost EMI option, which will allow you to purchase new handsets via easy installments.

There's more savings in store if you own an HDFC credit card, with all purchases made during the Sale with this card allowing for an additional discount of 10%. Do be aware that in order to enjoy the additional discount, your minimum transaction must be Rs 4,999 (~US$75) and the maximum discount that you can get will be Rs 2,000 (~US$30).

If you've been wondering whether you should become a Flipkart First member, then the Freedom Sale gives you a good reason to go ahead and subscribe to this service, which offers fast free shipping and early access to deals. There will be a Sneak Peek Sale today, and an Early Access Sale tomorrow, for all Flipkart First members, before the Freedom Sale opens for the general public on August 10.

It's also worth mentioning that the Flipkart Freedom Sale is limited to its mobile app, and the discounted prices will not be visible on its website. If you are looking to take advantage of these offers, you'll need to first download the Flipkart mobile app if you haven't done so already.

We'll be sure to bring you a roundup of the best deals that Flipkart has on offer on August 10!



from Android Authority http://ift.tt/2bdQLaD
via IFTTT

Deal Alert: Sony Xperia XA Ultra price falls below $300

Xperia XA Ultra 300USD price drop

Sony hasn't had much luck in the US market historically, partly thanks to a lack of handset availability, but perhaps the new sub $300 price tag for the Xperia XA Ultra will help tip the scales.

Amazon is currently listing both the black and white 16GB Xperia XA Ultra handsets, complete with a bundled 64GB Class10 microSD card, for just $298.48. The smartphone originally launched in the US back in July of this year with a price tag set at $369.99. So there's more than a $70 saving with this offer, plus the value of the free memory card.

For hardware, the Xperia XA Ultra still offers some very decent specifications for its asking price. The handset comes with a 6-inch 1080p display, an octa-core MediaTek Helio P10 processor, 3GB of RAM, and 16GB of internal memory. There's also a 21 megapixel rear camera, a wide-angle 16 megapixel selfie camera, and a slightly disappointing 2,700mAh battery. Overall, that's a pretty potent combination for the cash, especially if you're looking for good smartphone camera that won't break the bank. Importantly, the XA Ultra supports all of the major carriers in the US.

YT thumb Grushie 2See also: Sony Xperia X series hands-on20

It's not clear if or when this offer will end. If you're interested, click one of the buttons below to quickly snag yourself the deal from Amazon.



from Android Authority http://ift.tt/2aTZmR4
via IFTTT

Developing Android apps with bottom sheets

bottom_sheets_featured

Bottom Sheets are a lesser known part of the Design support library. The Design support library is an Android library intended to help android developers implement the Google material design guidelines. We have covered some other design support library components and widgets in the past, including the coordinator layout.

Bottom sheets, according to Google's own definition, are views that slide up from the bottom of the screen to reveal more content. This content can be anything, depending on the individual application. Bottom sheets have been used for menus, the display of more data and information, in the place of dialogs, and can also be used to show deep linked content from other apps.

Consistent readers of these tutorials will know that I'm a big fan of the design support library's implementations of the material specs, and Bottom Sheets are another reason why.

Types of bottom sheets

There are two types of bottom sheets:

1. Persistent bottom sheets, which present bottom sheets as just another view on the displayed activity/fragment. These are usually used to show menus and other supporting content for an app. An app that uses persistent bottom sheets extensively is Google maps.

Persistent bottom sheet sample

2. Modal bottom sheets, which present a bottom sheet like a dialog, where pressing the back button dismisses the bottom sheet. This is excellent for presenting deep-linked content from other apps.

Modal bottom sheet sample

Persistent bottom sheets are displayed at the same elevation as an app, whereas modal bottom sheets are at a higher elevation than the app's content. When used the main app dims to indicate the shift of focus to the bottom sheet.

Preparation

As mentioned above, bottom sheets have been integrated into the Design support library from version 23.2. Make sure you have included the library in your project, by adding the following line to your app build.gradle file, note that 24.1.1 is the current version at the time of writing:

  dependencies {      ...      compile 'com.android.support:design:24.1.1'  }  

For our sample app, we are going to create three different bottom sheets in a single activity. Each bottom sheet will be activated by one of three buttons. The sheets are helpfully name P1 and P2 (for persistent sheets), and M1 for the modal sheet.

bottomsheets-activity_main-16x9

 

Main Activity design

The initial design for our activity_main.xml, before adding bottom sheet declarations, is shown below

  <?xml version="1.0" encoding="utf-8"?>  <android.support.design.widget.CoordinatorLayout      xmlns:android="http://ift.tt/nIICcg"      xmlns:tools="http://ift.tt/LrGmb4"      xmlns:app="http://ift.tt/GEGVYd"      android:id="@+id/bgLayout"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:paddingBottom="@dimen/activity_vertical_margin"      android:paddingLeft="@dimen/activity_horizontal_margin"      android:paddingRight="@dimen/activity_horizontal_margin"      android:paddingTop="@dimen/activity_vertical_margin"      tools:context="com.sample.foo.usingbottomsheets.MainActivity">        <ScrollView          android:layout_width="match_parent"          android:layout_height="match_parent"          app:layout_behavior="@string/appbar_scrolling_view_behavior">            <LinearLayout              android:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="vertical"              android:paddingTop="24dp">                <Button                  android:id="@+id/button_1"                  android:layout_width="match_parent"                  android:layout_height="wrap_content"                  android:text="@string/button1"                  android:padding="16dp"                  android:layout_margin="8dp"/>                <Button                  android:id="@+id/button_2"                  android:layout_width="match_parent"                  android:layout_height="wrap_content"                  android:padding="16dp"                  android:layout_margin="8dp"                  android:text="@string/button2"/>                <Button                  android:id="@+id/button_3"                  android:layout_width="match_parent"                  android:layout_height="wrap_content"                  android:padding="16dp"                  android:layout_margin="8dp"                  android:text="@string/button3"/>          </LinearLayout>      </ScrollView>  </android.support.design.widget.CoordinatorLayout>  

To use a persistent bottom sheet, you must use a CoordinatorLayout as it's parent container. Let's add the first persistent bottom sheet to the layout.

Designing the bottom sheet

A persistent bottom sheet is a part of the Activity view heirarchy. So, we add the component that we intend to represent our bottom sheet. For our sample, we want the bottom sheet to be scrollable, so we use a NestedScrollView. In the activity_main.xml layout file created above, add the following NestedScrollView to the file, between </ScrollView> and </android.support.design.widget.CoordinatorLayout>

      <android.support.v4.widget.NestedScrollView          android:id="@+id/bottom_sheet1"          android:layout_width="match_parent"          android:layout_height="250dp"          android:clipToPadding="true"          android:background="@android:color/holo_blue_bright"          app:layout_behavior="android.support.design.widget.BottomSheetBehavior">            <LinearLayout              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:orientation="vertical">                <TextView                  android:layout_width="match_parent"                  android:layout_height="match_parent"                  android:text="@string/sheet_p1"                  android:textSize="16sp"                  android:textAllCaps="true"                  android:padding="16dp"/>                <TextView                  android:layout_width="match_parent"                  android:layout_height="match_parent"                  android:text="@string/long_latin"                  android:padding="16dp"                  android:textSize="16sp"/>          </LinearLayout>      </android.support.v4.widget.NestedScrollView>  

This NestedScrollView represents our bottom sheet. We want the sheet to be scrollable if the content is longer than the height we specified (android:layout_height="250dp"). The most important line in the xml above is the app:layout_behavior line. It specifies the behavior attribute for the NestedScrollView, with a value of android.support.design.widget.BottomSheetBehavior which indicates to the Design support library that the component is intended to be used as a bottom sheet.

Showing the bottom sheet

 

bottomsheets-persistent_sheet1-16x9

We want the sheet P1 to slide into view when the user clicks on the first button. Add the following code to your Activity.

      private BottomSheetBehavior mBottomSheetBehavior1;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);            View bottomSheet = findViewById(R.id.bottom_sheet1);          mBottomSheetBehavior1 = BottomSheetBehavior.from(bottomSheet);            mButton1 = (Button) findViewById(R.id.button_1);          mButton1.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View view) {                  if(mBottomSheetBehavior1.getState() != BottomSheetBehavior.STATE_EXPANDED) {                      mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_EXPANDED);                      mButton1.setText(R.string.collapse_button1);                  }                  else {                      mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_COLLAPSED);                      mButton1.setText(R.string.button1);                  }              }          });      }  

Recall that in the activity_main.xml, we set the NestedScrollView's app:layout_behavior to a BottomSheetBehavior. In the code above, we declare mBottomSheetBehavior1, and then assign mBottomSheetBehavior1 to the BottomSheetBehavior for the NestedScrollView using BottomSheetBehavior.from().

Bottom sheets can be in one of five different states, but the two we are concerned about at the moment are STATE_COLLAPSED and STATE_EXPANDED. As the name's imply, the sheet is in STATE_EXPANDED when it is expanded, and in STATE_COLLAPSED when collapsed.

On every button click, we check the state of the bottom sheet. If it is expanded, we collapse it, and if it is collapsed, we expand it. Note also that the bottom sheet can be collapsed by dragging it down.

Persistent bottom sheet 1

Persistent bottom sheet P2

 

bottomsheets-peek_persistent_bottomsheet-16x9

The second bottom sheet in our demo (P2) is completely identical to sheet P1 in xml. Add the markup below to the activity_main.xml, just before the </android.support.design.widget.CoordinatorLayout> tag

      <android.support.v4.widget.NestedScrollView          android:id="@+id/bottom_sheet2"          android:layout_width="match_parent"          android:layout_height="250dp"          android:clipToPadding="true"          android:background="@android:color/holo_green_light"          app:layout_behavior="android.support.design.widget.BottomSheetBehavior">            <LinearLayout              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:orientation="vertical">                <TextView                  android:layout_width="match_parent"                  android:layout_height="match_parent"                  android:text="@string/sheet_p2"                  android:textSize="16sp"                  android:textAllCaps="true"                  android:padding="16dp"/>                <TextView                  android:layout_width="match_parent"                  android:layout_height="match_parent"                  android:text="@string/long_latin"                  android:padding="16dp"                  android:textSize="16sp"/>          </LinearLayout>      </android.support.v4.widget.NestedScrollView>  

As you can see, it is exactly the same as the P1 layout above, except with a different background color. What we intend to achieve with this however, is a bottom sheet that is initially shown fully to the user, then slides down halfway out of the screen, and finally can be dismissed completely from the screen by either sliding it out or clicking the button.

The code to achieve all this is more involved than for P1, so we are going to discuss it in chunks.

Making bottom sheets peek

Persistent bottom sheet 2

Similar to the P1 sheet above, we create an mBottomSheetBehavior2 and assign it the same way. To achieve the effect where the sheet slides partially out of the screen, we set the BottomSheetBehavior's peekHeight. In the sample app, we set the peek height using mBottomSheetBehavior2.setPeekHeight(300);

When the peekHeight is set, the bottom sheet collapses to the defined peekHeight in pixels. Take note of that. The sheet would expand to it's target height, but on collapse, it collapses to the target height and remains on screen. To collapse the bottom sheet completely out of the screen, we would either need to set the peekHeight to 0 and then reset the state or, we could set the BottomSheetBehavior state to STATE_HIDDEN. For our demo app, we have elected to set the state to STATE_HIDDEN. Before setting the bottom sheet to that state, we must first set the behavior to be hideable using the setHideable(true) method.

          final View bottomSheet2 = findViewById(R.id.bottom_sheet2);          mBottomSheetBehavior2 = BottomSheetBehavior.from(bottomSheet2);          mBottomSheetBehavior2.setHideable(true);          mBottomSheetBehavior2.setPeekHeight(300);          mBottomSheetBehavior2.setState(BottomSheetBehavior.STATE_HIDDEN);            mButton2 = (Button) findViewById(R.id.button_2);          mButton2.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View view) {                  if(mBottomSheetBehavior2.getState() == BottomSheetBehavior.STATE_EXPANDED) {                      mBottomSheetBehavior2.setState(BottomSheetBehavior.STATE_COLLAPSED);                      mButton2.setText(R.string.button2_hide);                  }                  else if(mBottomSheetBehavior2.getState() == BottomSheetBehavior.STATE_COLLAPSED) {                      mBottomSheetBehavior2.setState(BottomSheetBehavior.STATE_HIDDEN);                      mButton2.setText(R.string.button2);                  }                  else if(mBottomSheetBehavior2.getState() == BottomSheetBehavior.STATE_HIDDEN) {                      mBottomSheetBehavior2.setState(BottomSheetBehavior.STATE_EXPANDED);                      mButton2.setText(R.string.button2_peek);                  }              }          });  

Handling swipe events

At this point, we have built two bottom sheets that are expanded and collapsed on demand. However, if you have run the app at this point, you will notice that the button text do not change if you change the bottom sheet state by swiping. For example if you click to expand sheet P2, the button text changes to "PEEK SHEET P2". But if you then swipe the sheet down to it's collapsed state, the button text still shows "PEEK SHEET P2". To get notified whenever the bottom sheet state changes, we must set a callback on the BottomSheetBehavior. The code snippet to set a callback for mBottomSheetBehavior2 is shown below:

          mBottomSheetBehavior2.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {              @Override              public void onStateChanged(View bottomSheet, int newState) {                  if (newState == BottomSheetBehavior.STATE_EXPANDED) {                      mButton2.setText(R.string.button2_peek);                  }                  else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {                      mButton2.setText(R.string.button2_hide);                  }                  else if (newState == BottomSheetBehavior.STATE_HIDDEN) {                      mButton2.setText(R.string.button2);                  }              }                @Override              public void onSlide(View bottomSheet, float slideOffset) {              }          });  

For the demo, we simply change the button's text. Of course, you can perform more advanced tasks in the callback, if your app requires that.

Modal bottom sheets

Unlike both persistent bottom sheets discussed above, the modal bottom sheet is not a View that's hidden and shown within the activity_main.xml layout. Think of the modal bottom sheet like a dialog, that slides into view from, and is anchored to, the bottom of the screen. Because that is exactly what it is. To display a modal bottom sheet, we must define a class that inherits from BottomSheetDialogFragment, which also inherits from AppCompatDialogFragment.

bottomsheets-modal_bottomsheet-16x9

 

Before creating our BottomSheetDialogFragment however, let's create the layout for the dialog. We call this layout file fragment_bottomsheet3.xml.

  <?xml version="1.0" encoding="utf-8"?>  <LinearLayout      xmlns:android="http://ift.tt/nIICcg"      android:orientation="vertical"      android:layout_width="match_parent"      android:layout_height="wrap_content">        <TextView          android:layout_width="match_parent"          android:layout_height="match_parent"          android:text="@string/sheet_m1"          android:textSize="16sp"          android:textAllCaps="true"          android:padding="16dp"/>        <ImageView          android:id="@+id/imageView"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_weight="1"          android:src="@drawable/android_authority"/>        <TextView          android:id="@+id/textView"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_weight="1"          android:layout_gravity="center"          android:textAlignment="center"          android:text="This is a test string for the sample"          android:textSize="20sp"/>  </LinearLayout>  

Our demo layout is a simple layout with two TextViews and an ImageView.

Showing a modal bottom sheet

To show a modal bottom sheet, we need to create a class that inherits from BottomSheetDialogFragment, and call the show() method on that class.
For our sample app, which has no special actions, we simply extend BottomSheetDialogFragment, as shown below, and override the setupDialog method to set the dialog's content view.

  public class BottomSheet3DialogFragment extends BottomSheetDialogFragment {        @Override      public void setupDialog(final Dialog dialog, int style) {          super.setupDialog(dialog, style);          View contentView = View.inflate(getContext(), R.layout.fragment_bottomsheet3, null);          dialog.setContentView(contentView);      }  }  

In the MainActivity, we handle the final button click by requesting our BottomSheetDialogFragment show() itself.

          mButton3 = (Button) findViewById(R.id.button_3);          mButton3.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View view) {                  BottomSheetDialogFragment bottomSheetDialogFragment = new BottomSheet3DialogFragment();                  bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());              }          });  

Modal bottom sheets

Note that we did not set the behavior for the modal sheet to be hideable, nor did we set the peek height. The modal bottom sheet automatically computes appropriate values for both peek height and expanded height.

Conclusion

Bottom sheets have their uses, and in some situations, they provide the most elegant solution to presenting users with additional information or actions. However, in other cases, they can be a particularly poor design choice. For example, on larger screens which have more screen estate, dialogs and menus could be more useful and intuitive, compared to smaller screen devices, where apps have to make the most use of each precious pixel.

There are other methods that affect your bottom sheets behavior, which we have not covered here. Explore the BottomSheetBehavior APIs to find out more. As always, the complete source for the sample app is available on github. Live long and code hard.



from Android Authority http://ift.tt/2b7MRmG
via IFTTT

Samsung might do away with the flat-screen Galaxy S

Galaxy S7 Edge home button

Samsung's curved "edge" display has certainly given a new lease of life to the company's Galaxy S series of flagships. Not only does it produce a unique and sleek looking design, but Samsung has also managed to create a selection of useful software features that make the most of the hardware. Now the company is hinting that it may ditch the regular flat-screen option for its flagship smartphones in the future, in order to focus on its edge technology.

Demand for the Galaxy S6 Edge initially caught Samsung a little by surprise a couple of years ago, leaving the company scrambling to produce enough units and resulting in unsold stock of the regular flat-screen Galaxy S6. This time around, Samsung has been able to ramp up production of its dual-edge curved display for the Galaxy S7 Edge, and the Note 7 now comes exclusively with the curved display and has even dropped the edge moniker.

Samsung-Galaxy-Note-7-hands-on-first-batch-AA-(26-of-47)

The Galaxy Note 7 was Samsung's first smartphone launch that only featured an edge display option. Perhaps the Galaxy S8 will follow suit.

A similar situation could be heading to the company's main Galaxy S range in the next year or so. Samsung has indicated that it will put more focus on curved Galaxy S models in the future and that it may eventually eliminate flat-screen Galaxy S handsets further down the line. Production yields for Samsung's edge display are now high enough to keep up with demand, enough so that the company has been selling excess panels to rival smartphone manufacturers.

"Samsung has considered that it would make the edge display as the identity of the Galaxy S smartphone lineup if the company can provide consumers differentiated user experience through software and user-friendly functions"  – Koh Dong-jin, head of Samsung's mobile business

Although this might not happen in time for the Galaxy S8 next year, the current theory is that the Galaxy Note 7 is acting a gauge to see how well consumers react to only having the single display option to pick from. This may then influence the company's decision to issue a single curved S flagship, although Koh's comment is far from confirmation that the flat-screen display model will be eliminated any time soon.

  • Samsung Galaxy Note7 vs S7 E...
  • Samsung Galaxy S7 Vs S7 Edge
  • Samsung Galaxy S7 Edge vs Ga...

Where do you stand on the topic? Is Samsung's curved display technology the future of the Galaxy flagship line, or does a regular flat-screen variant still appeal to you?



from Android Authority http://ift.tt/2au2p47
via IFTTT

Free Spotify Premium and Google Play Music subscriptions for Chromecast owners

Chromecast Spotify subscription

Google is currently offering Chromecast owners a nice little bonus: two months of Spotify Premium and three months of Google Play Music access for free. The offer is good for existing owners of Chromecast or Chromecast Audio as well as those that buy a new device and sign up for the free subscription services.

best chromecast apps for androidSee also: The best Chromecast apps for Android58

You can only sign up for the two free months of Spotify Premium until September 15 but you've got until December 31 to register for three months of free Google Play Music access. The Spotify Premium offer is only available for U.S. citizens and you have to sign up with an email address that hasn't been used for a Spotify Premium subscription already.

The two free months of Spotify Premium will save you roughly $20 and three months of GPM will save you around $30. If you want to buy a Chromecast in order to take advantage of this deal you'll need $30 for a Chromecast or Chromecast Audio (both of which are currently discounted from $35).

Google sold 8 million Chromecast units between May 2016 and May this year (with 17 million sold prior to that), making Chromecast Google's most popular hardware product. Building on this success, and in part to popular streaming services and the rise of YouTube Red, Google has shipped a further five million Chromecasts just in the couple of months since May.

SEE THE OFFERSBUY CHROMECAST

Don't miss: Apple Music vs Spotify vs Google Play Music



from Android Authority http://ift.tt/2bdGviJ
via IFTTT