package org.osmdroid.tileprovider.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import org.osmdroid.api.IMapView;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.constants.OpenStreetMapTileProviderConstants;
/**
* Utility class for implementing Cloudmade authorization. See
* http://developers.cloudmade.com/projects/show/auth
*
* The CloudMade token is persisted because it doesn't change:
* http://support.cloudmade.com/answers/api-keys-and-authentication
* "you will always get the same token for the unique user id"
*
*/
public class CloudmadeUtil {
public static boolean DEBUGMODE=false;
/** the meta data key in the manifest */
private static final String CLOUDMADE_KEY = "CLOUDMADE_KEY";
/** the key for the id preference */
private static final String CLOUDMADE_ID = "CLOUDMADE_ID";
/** the key for the token preference */
private static final String CLOUDMADE_TOKEN = "CLOUDMADE_TOKEN";
private static String mAndroidId = Settings.Secure.ANDROID_ID; // will get real id later
/** the key retrieved from the manifest */
private static String mKey = "";
/** the token */
private static String mToken = "";
private static Editor mPreferenceEditor;
/**
* Retrieve the key from the manifest and store it for later use.
*/
public static void retrieveCloudmadeKey(final Context aContext) {
mAndroidId = Settings.Secure.getString(aContext.getContentResolver(), Settings.Secure.ANDROID_ID);
// get the key from the manifest
mKey = ManifestUtil.retrieveKey(aContext, CLOUDMADE_KEY);
// if the id hasn't changed then set the token to the previous token
final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(aContext);
mPreferenceEditor = pref.edit();
final String id = pref.getString(CLOUDMADE_ID, "");
if (id.equals(mAndroidId)) {
mToken = pref.getString(CLOUDMADE_TOKEN, "");
// if we've got a token we don't need the editor any more
if (mToken.length() > 0) {
mPreferenceEditor = null;
}
} else {
mPreferenceEditor.putString(CLOUDMADE_ID, mAndroidId);
mPreferenceEditor.commit();
}
}
/**
* Get the key that was previously retrieved from the manifest.
*
* @return the key, or empty string if not found
*/
public static String getCloudmadeKey() {
return mKey;
}
/**
* Get the key that was previously retrieved from the manifest.
*
* @return the key, or empty string if not found
*/
public static void setCloudmadeKey(String key) {
mKey=key;
}
/**
* Get the token from the Cloudmade server.
*
* @return the token returned from the server, or null if not found
*/
public static String getCloudmadeToken() {
if (mToken.length() == 0) {
synchronized (mToken) {
// check again because it may have been set while we were blocking
if (mToken.length() == 0) {
final String url = "http://auth.cloudmade.com/token/" + mKey + "?userid=" + mAndroidId;
HttpURLConnection urlConnection=null;
try {
final URL urlToRequest = new URL(url);
urlConnection = (HttpURLConnection) urlToRequest.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConnection.setRequestProperty(Configuration.getInstance().getUserAgentHttpHeader(), Configuration.getInstance().getUserAgentValue());
urlConnection.connect();
if (DEBUGMODE) {
Log.d(IMapView.LOGTAG,"Response from Cloudmade auth: " + urlConnection.getResponseMessage());
}
if (urlConnection.getResponseCode() == 200) {
final BufferedReader br =
new BufferedReader(
new InputStreamReader(urlConnection.getInputStream()),
StreamUtils.IO_BUFFER_SIZE);
final String line = br.readLine();
if (DEBUGMODE) {
Log.d(IMapView.LOGTAG,"First line from Cloudmade auth: " + line);
}
mToken = line.trim();
if (mToken.length() > 0) {
mPreferenceEditor.putString(CLOUDMADE_TOKEN, mToken);
mPreferenceEditor.commit();
// we don't need the editor any more
mPreferenceEditor = null;
} else {
Log.e(IMapView.LOGTAG,"No authorization token received from Cloudmade");
}
}
} catch (final IOException e) {
Log.e(IMapView.LOGTAG,"No authorization token received from Cloudmade: " + e);
} finally {
if (urlConnection!=null)
try {
urlConnection.disconnect();
}
catch (Exception ex){}
}
}
}
}
return mToken;
}
}