How to use the Android Keystore to store passwords and other sensitive information
A few months ago, Godfrey Nolan wrote an excellent article discussing how an Android app developer can store user passwords and sensitive/personal information. The Android keystore provides a secure system level credential storage. With the keystore, an app can create a new Private/Public key pair, and use this to encrypt application secrets before saving it in the private storage folders. In this article, we are going to show how to use the Android Keystore to create and delete keys, and how to use these keys to encrypt and decrypt user supplied text.
Preparation
Before we begin coding, it is helpful to understand a bit about the Android Keystore, and it’s capabilities. The Keystore is not used directly for storing application secrets such as password, however, it provides a secure container, which can be used by apps to store their private keys, in a way that’s pretty difficult for malicious (unauthorised) users and apps to retrieve.
As its name suggests, an app can store multiple keys in the Keystore, but an app can only view, and query, its own keys. Ideally, with the keystore, an app would generate/or receive a private/public key pair, which would be stored in the keystore. The public key can then be used to encrypt application secrets, before being stored in the app specific folders, with the private key used to decrypt the same information when needed.
Although the Android Keystore provider was introduced in API level 18 (Android 4.3), the Keystore itself has been available since API 1, restricted to use by VPN and WiFi systems.
The Keystore itself is encrypted using the user’s own lockscreen pin/password, hence, when the device screen is locked the Keystore is unavailable. Keep this in mind if you have a background service that could need to access your application secrets.
Layout
The main layout for our sample app is a ListView, with items made up of a list of all the keys (actually the key aliases/names) created by the app. This is saved as layout/activity_main.xml.
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
tools:context="com.sample.foo.simplekeystoreapp.MainActivity">
</ListView>
Each item on the list contains a TextView representing the key alias, a button to delete the key, and buttons each to encrypt and decrypt text. This layout/list_item.xml in our project.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cardBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
android:layout_margin="5dp">
<TextView
android:id="@+id/keyAlias"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textSize="30dp"/>
<Button
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/keyAlias"
android:layout_alignParentLeft="true"
android:layout_centerHorizontal="true"
android:text="@string/delete"
style="@style/Base.Widget.AppCompat.Button.Borderless" />
<Button
android:id="@+id/encryptButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/keyAlias"
android:layout_alignRight="@+id/keyAlias"
android:text="@string/encrypt"
style="@style/Base.Widget.AppCompat.Button.Borderless"/>
<Button
android:id="@+id/decryptButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/keyAlias"
android:layout_toLeftOf="@+id/encryptButton"
android:text="@string/decrypt"
style="@style/Base.Widget.AppCompat.Button.Borderless"/>
</RelativeLayout>
List Header
The List header is added to the ListView using the method
View listHeader = View.inflate(this, R.layout.activity_main_header, null); listView.addHeaderView(listHeader);

In the image above, the ListView is currently empty, so only the List header is visible. The List Header is pretty straightforward, with an EditText at the top, which expects a string to be used as an alias when creating a key. A button to generate new keys lies immediately below this. The button is followed by three EditTexts, one expecting a string input to be encrypted, another displays the result of the encryption, and the third shows the decrypted string (for a successful decryption). This file is saved in layout/activity_main_header.xml.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<EditText
android:id="@+id/aliasText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:hint="@string/key_alias"/>
<Button
android:id="@+id/generateKeyPair"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/aliasText"
android:layout_centerHorizontal="true"
android:layout_alignParentRight="true"
android:text="@string/generate"
android:onClick="createNewKeys" />
<EditText
android:id="@+id/startText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/generateKeyPair"
android:layout_centerHorizontal="true"
android:hint="@string/initial_text"/>
<EditText
android:id="@+id/encryptedText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/startText"
android:layout_centerHorizontal="true"
android:editable="false"
android:textIsSelectable="true"
android:hint="@string/final_text"/>
<EditText
android:id="@+id/decryptedText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/encryptedText"
android:layout_centerHorizontal="true"
android:editable="false"
android:textIsSelectable="true"
android:hint="@string/decrypt_result"/>
</RelativeLayout>
MainActivity
As with any Activity, we begin with the onCreate() method. The first thing we do is get a reference to the AndroidKeyStore, and then initialize it, using:
Keystore.getInstance("AndroidKeyStore");
keystore.load(null)
We then call our refreshKeys() method (discussed next) to list all the keys our app has stored in the Keystore. This ensures that any keys in the Keystore will be shown immediately when the ListView is initialized.
List all keys in the Keystore

To fetch an Enumeration of all keys available to an app in the keystore, simply call the aliases() method. In our refreshKeys() method below, we fetch the keystore aliases, and put the returned Strings into an ArrayList (used by our ListView’s Adapter).
private void refreshKeys()
keyAliases = new ArrayList<>();
try
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements())
keyAliases.add(aliases.nextElement());
catch(Exception e)
if(listAdapter != null)
listAdapter.notifyDataSetChanged();
Add a new key to the Keystore

Each key created by an app must have a unique alias, which can be any String. We use a KeyPairGeneratorSpec object to build the specifications of our required key. You can set the validity period of the key (setStartDate() and setEndDate()), set the alias and the subject (for self signed keys) among others. The subject must be an X500Principal object that resolves to a String of the form “CN=Common Name, O=Organization, C=Country”.
To generate a Public/Private keypair, we need a KeyPairGenerator object. We get an instance of KeyPairGenerator set to use the RSA algorithm with the “AndroidKeyStore”. Calling generateKeyPair() creates the new pair of keys (Private and corresponding Public key), and adds it to the Keystore.
public void createNewKeys(View view)
String alias = aliasText.getText().toString();
try
// Create new key if needed
if (!keyStore.containsAlias(alias))
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 1);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(alias)
.setSubject(new X500Principal("CN=Sample Name, O=Android Authority"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
catch (Exception e)
Toast.makeText(this, "Exception " + e.getMessage() + " occured", Toast.LENGTH_LONG).show();
Log.e(TAG, Log.getStackTraceString(e));
refreshKeys();
Delete key from the Keystore

Deleting a key from the keystore is pretty straightforward. Armed with the key alias, call keystore.deleteEntry(keyAlias). There is no way to restore a deleted key, so you may want to be certain before using this.
public void deleteKey(final String alias)
AlertDialog alertDialog =new AlertDialog.Builder(this)
.setTitle("Delete Key")
.setMessage("Do you want to delete the key "" + alias + "" from the keystore?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
try
keyStore.deleteEntry(alias);
refreshKeys();
catch (KeyStoreException e)
Toast.makeText(MainActivity.this,
"Exception " + e.getMessage() + " occured",
Toast.LENGTH_LONG).show();
Log.e(TAG, Log.getStackTraceString(e));
dialog.dismiss();
)
.setNegativeButton("No", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
dialog.dismiss();
)
.create();
alertDialog.show();
Encrypt block of text

Encrypting a block of text is performed with the Public key of the Key Pair. We retrieve the Public Key, request for a Cipher using our preferred encryption/decryption transformation (“RSA/ECB/PKCS1Padding”), then initialize the cipher to perform encryption (Cipher.ENCRYPT_MODE) using the retrieved Public Key. Cipher operates on (and returns) a byte []. We wrap the Cipher in a CipherOutputStream, along with a ByteArrayOutputStream to handle the encryption complexities. The result of the encryption process is then converted to a Base64 string for display.
public void encryptString(String alias)
try
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
// Encrypt the text
String initialText = startText.getText().toString();
if(initialText.isEmpty())
Toast.makeText(this, "Enter text in the 'Initial Text' widget", Toast.LENGTH_LONG).show();
return;
Cipher input = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
input.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(
outputStream, input);
cipherOutputStream.write(initialText.getBytes("UTF-8"));
cipherOutputStream.close();
byte [] vals = outputStream.toByteArray();
encryptedText.setText(Base64.encodeToString(vals, Base64.DEFAULT));
catch (Exception e)
Toast.makeText(this, "Exception " + e.getMessage() + " occured", Toast.LENGTH_LONG).show();
Log.e(TAG, Log.getStackTraceString(e));
Decryption
Decryption is basically the Encryption process in reverse. Decryption is done using the Private Key of the key pair. We then initialize a Cipher with the same transformation algorithm used for encryption, but set to Cipher.DECRYPT_MODE. The Base64 string is decoded to a byte[], which is then placed in a ByteArrayInputStream. We then use a CipherInputStream to decrypt the data into a byte[]. This is then displayed as a String.
public void decryptString(String alias)
try
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
output.init(Cipher.DECRYPT_MODE, privateKey);
String cipherText = encryptedText.getText().toString();
CipherInputStream cipherInputStream = new CipherInputStream(
new ByteArrayInputStream(Base64.decode(cipherText, Base64.DEFAULT)), output);
ArrayList<Byte> values = new ArrayList<>();
int nextByte;
while ((nextByte = cipherInputStream.read()) != -1)
values.add((byte)nextByte);
byte[] bytes = new byte[values.size()];
for(int i = 0; i < bytes.length; i++)
bytes[i] = values.get(i).byteValue();
String finalText = new String(bytes, 0, bytes.length, "UTF-8");
decryptedText.setText(finalText);
catch (Exception e)
Toast.makeText(this, "Exception " + e.getMessage() + " occured", Toast.LENGTH_LONG).show();
Log.e(TAG, Log.getStackTraceString(e));
Android Developer Newsletter
Do you want to know more? Subscribe to our Android Developer Newsletter. Just type in your email address below to get all the top developer news, tips & links once a week in your inbox:
Email:
PS. No spam, ever. Your email address will only ever be used for Android Dev Weekly.
Round up
The Android Keystore makes creating and managing app keys a breeze, and provides a safe and relatively secure vault for applications to store encryption keys. Of course the Public key can also be sent to your server, and the server public key sent to your apps, to ensure secure communications between your application and your server. As usual, the complete source code is available on github for use as you please. For additions, corrections and/or discussions, leave a comment below, we are eager to hear from you.
Say hello to NASA’s first commercial flight astronauts
NASA has selected four veteran astronauts to work with both SpaceX and Boeing in preparation for commercial spaceflights. It’s a major step for both NASA and the US government towards returning space launches to the USA: in recent years it’s had to depend on Russia to get people (and things) into space. NASA Administrator Charles Bolden said that the four astronauts will be: “blazing a new trail — a trail that will one day land them in the history books and Americans on the surface of Mars.” Astronauts and test pilots Robert Behnken, Eric Boe, Douglas Hurley and Sunita Williams will help develop the commercial company’s crew transport systems, and help take astronauts to and from the International Space Station.
At the moment, contracts with both Boeing and SpaceX require at least one crewed flight test, with at least one NASA astronaut on-board to help verify the vehicle. At the same time, both companies also need to provide training to its commercial crew to get them ready in time. Once tests are passed, the companies will send between two and six crew rotation missions to the ISS, delivering four NASA crew members and at least 200.5 pounds of cargo in shuttle journeys.
Filed under: Transportation, Science
Source: NASA
Sky’s latest fibre broadband deal is free for an entire year
Broadband providers typically try to attract new customers by offering attractively low prices for an introductory period. Eventually, the monthly cost of these contracts shoot up to compensate for the discounted rate you’ve been paying up until then, but this is where Sky’s latest fibre broadband deal is a little bit different. As of today, Sky’s basic fibre package (usually £10 per month) is now free for an entire year; and, better yet, the minimum contract term is 12 months, which effectively means you pay nothing for broadband for the entire length of the contract. We know what you’re thinking: hang on a second, where’s the catch?
Well, there isn’t one — not one that’s likely to send you running, anyway. If you want to take Sky up on the offer, you’ll have to take out a Sky landline at £16.40 per month, and add-on one of Sky’s Talk packages that start at £4 per month for free evening and weekend calls. Broadband and landlines usually come as pair, though, so that’s not exactly unusual. One thing you’ll definitely need to keep in the back of your mind, however, is the up to 38Mbps line comes with a 25GB monthly usage cap, which you can remove if you plump for the unlimited tier that’s now £10 per month (normally £20). But, if you’re more of a browser than a chronic downloader, that’s still a fair few gigs to work with. Oh, and one last thing: you’ll need to pay £6.95 for router delivery.
All in all, it looks like a pretty sweet deal, especially since you can move on when your year is up having paid nothing for broadband during the entire contract. Sky would prefer you didn’t, of course, instead hoping to tempt you in with the offer, and make you stay with the quality of service. That’s the plan, anyway.
[Image Credit: Barta IV, Flickr]
Filed under: Internet
Source: Sky
Use IF by IFTTT to automate your Android
IF by IFTTT is a must have app for anyone who wants to take control of their phone and technology driven life. With a simple UI and a plethora of options, IF is the easiest way to make your device do just about whatever you want, without being complicated. Unlike Tasker, IF as easy as it’s name, IF This Then That. Here’s how it works.
Popular recipes include downloading every Google Doodle to changing the thermostat in your home from a distance.
It isn’t clear why they call it a “recipe” because it is basically just an “if statement” from a high level programming language like Java. The basic structure of an if statement (recipe) is simple yet very powerful. A boolean variable may be used to see if the condition is true or not. It may look something like: if(boolean var = true). This line of code checks to see if var is true, there would be more code to this for it to actually do anything about it, however. IF recipes use this logic. Recipes can be as simple or as complicated as you want.
To create a recipe simply open the sidebar on the right, click the “+” which opens a screen with four tabs – Collections, Featured, Recommended, and All Time. The Collections tab offers recipes for certain events and situations like “Photo Enthusiasts”. The Featured tab shows recipes from IF and the IF community. The Recommended tab suggests recipes that may be good for you based on the ones you already use, and the All Time tab lists the most used recipes. In the bottom right there is a button that you can press to create a custom recipe.

For example, say you want to be notified when a issue arises in one of your GitHub projects, all you have to do is select GitHub in the menu, choose the specific condition, in this case that an issue has arisen in one of your projects, then select the action IF will perform. If creating recipes yourself is not your thing, you can download pre-made recipes that can do pretty much anything you can think of. Popular recipes include downloading every Google Doodle to changing the thermostat in your home from a distance. You can also go as far as syncing your Dropbox to your OneDrive if you so choose.
IF is a must have for anyone who wants to make their life easier without having to jump through hoops. All you have to do is open the sidebar, click the “+” and choose your conditions.
Get the app HERE. Please let us know about your favorite recipes in the comments below!
DeNA West CEO thinks Nintendo partnership will “completely change the market”

When Nintendo and DeNA announced they would enter into a partnership for mobile game publishing, the news was big. Arguably even larger was the intense scrutiny that went into the very nature of the deal, something that was – apparently – wide-spread enough that Nintendo’s CEO felt the need to clarify things. The story the two sought to tell would basically amount to Nintendo creating the games and DeNA handling the distribution. Logically it makes sense, as Nintendo has no experience with mobile game development and given the sheer amount of complications associated with it (fragementation alone is a major one) means that expertise is needed to succeed.
Nintendo revealed it would release five new mobile titles by 2017, with the first one coming later this year. But what can we expect from these games?
At a recent gaming event, DeNA West’s CEO, Shintaro Asako, made a very bold statement: “I think this is potentially an opportunity for us to completely change the market.” He cites the Kim Kardashian: Hollywood game as an example of just how successful a working partnership can be, presumably referring to reports that the app pulls in over $200 million in revenue.
In some ways, his cheerful optimism echos that which Sony Mobile’s CEO offered just days ago (albeit for a different topic) though just as with Sony’s case, things aren’t so cut-and-dry. Nintendo is supplying the IP which means it will presumably have control over what products are developed. Nintendo has clear, long-reaching vested interests in its own hardware portfolio, and as such there has been a large amount of discussion and speculation as to just what kind of games it will be creating for the mobile ecosystem.
I think this is potentially an opportunity for us to completely change the market.
While many had initially taken for granted any decision made by Nintendo would entail endless adventures with Mario, Zelda, Link, Kirby, Donkey Kong, and a host of other cherished franchises coming along for the ride, it’s no longer assured that will be getting the full blown mobile games we were dreaming about.
In somewhat of a paradox, the more promising the Nintendo mobile apps are, the more damaging they will be for the sales of current – or future – dedicated portable hardware like the 3DS or its eventual successor. If gamers can get “full-blown” experiences on their existing mobile devices, how many would then go out and buy Nintendo’s hardware, especially with many established players migrating towards mobile as is.
The idea of “completely changing the market” seems rather ironic given that the very emergency of mobile apps has done just that: why else would Nintendo even be doing this?
While there is absolutely nothing to suggest Nintendo will create sub-par experiences for the mobile marketplace, given the more niche, IAP-centered nature of its own, existing 3DS freemium software, it could just as well follow suit down that avenue. Then again, perhaps Nintendo has finally realized that its old ways are no longer sustainable, and actually planning to put its best foot forward when it comes to mobile titles. On a final note, the idea of “completely changing the market” seems rather ironic given that the very emergency of mobile apps has done just that: why else would Nintendo even be doing this?
Sending pictures with Hangouts just became a whole lot easier
Earlier today, Google pushed out an update to Hangouts. This update applies to the Chrome version of the application only and works on PC, Mac or Chromebook.
The update brings a small but very useful tool that helps users send pictures in all different formats more easily. With this new tool, users will be able to drag and drop pictures of any size and/or resolution from their file explorer or desktop directly into the chat window. That’s pretty much it. You can use this feature when sending to multiple people in addition to just one. Cool, right?
To get this update it’s very easy. Make sure you are on the latest version then refresh your Gmail/inbox, restart the app and it is all set. It’s great to see Google consistently thinking about how to make the user experience more simple and enjoyable. Hopefully, the company will continue to push out updates like this in the future on a more frequent basis.
Come comment on this article: Sending pictures with Hangouts just became a whole lot easier
Smartphone ‘mode’ can speed up devices and lengthen battery life
Phones, tablets and other devices slow down over time, no matter how expensive or cutting edge they were when you bought them. Now, researchers from Hanyang University in Korea claim a technology they developed can delay the inevitable. It’s called Where’s WALDIO or Write Ahead Logging Direct IO, and according to team leader Professor You-jip Won, it’s a mode that extends battery life and speeds up phones by minimizing the amount of data a device records. “The core of the newly-developed technology is to record a small amount of data,” Won said. “This tech will make it possible to use low-priced flash memory for a long time, like expensive flash memory.”
Electronics’ flash memories get worn down the longer you use them from saving and deleting data over and over again. Won and his team claim that by running in this mode, which allows a device to keep only necessary data, you can make a used phone work up to 20 times faster and extend its battery life expectancy by up to 39 percent. It’s unclear at this point if WALDIO can be feasibly installed on existing devices, or if it will ever be released to the public. But, if you’re prepared to grapple with technical language this weekend, check out the group’s study (PDF) published on Usenix for an in-depth explanation of how it works. The team’s also at the Usenix Annual Technical Conference in Santa Clara, California until July 10th to present the study, if you want to ask them yourself.
[Image credit: PhotoAlto/Sigrid Olsson]
Filed under: Cellphones, Science, Mobile
Via: BusinessKorea, AsiaE
Source: Hanyang University
Blackberry and Google join forces in partnership to make business data secure
style=”display:block”
data-ad-client=”ca-pub-8150504804865896″
data-ad-slot=”8461248232″
data-ad-format=”auto”>
(adsbygoogle = window.adsbygoogle || []).push();
Blackberry is name that has been heard on the grapevine quite a lot the last few weeks, due to a rumoured Android-powered Blackberry handset that is supposedly currently in development. Interestingly, Blackberry has made the news again today, but for a decidedly different reason – Blackberry and Google have officially joined forces to make Android devices business secure, marrying Google’s Android Lollipop and Blackberry’s BES12. As Blackberry puts it:
“New features are now available through Android and BES12 that enable organizations to further secure enterprise and personal data on Android devices, set new levels of hardware based encryption, and ensure tight integration with Google Play for Work, for increased application management, while delivering a consistent end-user and management experience across their Android fleet.”
This is the move that Blackberry needed to make considering that they are struggling in hardware sales, and partnering their prowess in corporate data security with the world’s most common smartphone operating system is exactly what the doctor ordered. We do wonder whether Google had already inked this deal when Android for Work was released earlier this year, but there’s no point speculating now. Hopefully this is the real start of Android’s uptake in the corporate world, so we’ll have to see if this partnership has any legs.
What do you think about Blackberry and Google teaming up? Let us know your thoughts in the comments below.
Source: Blackberry via Phone Arena
The post Blackberry and Google join forces in partnership to make business data secure appeared first on AndroidSPIN.
OnePlus 2 will be using a 3300 mAh battery, not ditching the invite system
While we wait for the official announcement of the OnePlus 2, the company is slowly trickling out information about the device all over the internet. The OnePlus team took to Reddit for an AMA of their upcoming device, answering a few questions and raising others.
Some of the biggest takeaways from the AMA are about the battery and the camera. The OnePlus 2 will be using a 3,300 mAh battery, which is pretty decently sized. It’s roughly on par with what Samsung stuffs in their Note lineup, which typically get pretty great battery life. Hopefully that translates into great battery on the OnePlus 2 despite the overwhelming specs.
Specific details about the camera weren’t talked about, but the team did say that the camera was a high priority on the OnePlus 2. We won’t know just how good it’ll be until the phone is actually announced, but it sounds like something to look forward to.
The AMA did reveal something that I’m sure everyone wanted to see changed; OnePlus will be sticking to an invite system for the OnePlus 2. Yep, that horrible invite system with all of its dumb (and sometimes sexist) contests that make actually buying the device far more of a headache than its actually worth. Hopefully they’ll have some of the kinks worked out this time around.
You can check out the full AMA below.
source: Reddit
Come comment on this article: OnePlus 2 will be using a 3300 mAh battery, not ditching the invite system
NASA’s Mars Trek is Google Earth for the red planet
Yes, Google Earth and Street View are great for impromptu armchair traveling. But if you prefer taking a virtual jaunt somewhere literally out of this world, you might want to visit NASA’s Mars Trek website instead. It’s exactly what its name makes it sound like: an interactive map of the red planet’s surface made out of images taken by several missions, which you can explore in either 2D or 3D. You won’t see close-up views of its craters and volcanoes, of course, but it does allow you to zoom in and change views (global, north polar and south polar).
The planet’s known locations are clearly marked and can be clicked for additional info, such as their diameters, while a tool called “Layers” lets you layer images from various orbiter cameras on top of the landscape. Another tool called “Bookmarks” has pre-programmed locations with historical significance, like Curiosity’s landing site above. Even better, it has a download link for STL files that you can use to print out 3D models of those places. Mars Trek’s accessible on computers and mobile devices, though you’ll likely need a good connection to be able to thoroughly enjoy your virtual flyby.
Explore the surface of Mars right from your phone or browser http://t.co/lXcvMJ86bh #JourneyToMars #SDCC pic.twitter.com/7y8KWNyU5e
– NASA (@NASA) July 10, 2015
Filed under: Science
Source: NASA Mars Trek








