package org.xmlrpc.android;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.android.gcm.GCMRegistrar;
import com.google.gson.Gson;
import com.google.gson.internal.StringMap;
import org.wordpress.android.Constants;
import org.wordpress.android.WordPress;
import org.wordpress.android.WordPressDB;
import org.wordpress.android.util.DeviceUtils;
/**
* WordPress.com specific XML-RPC API calls
*
* @author Dan Roundhill
*/
public class WPComXMLRPCApi {
private XMLRPCClient client = new XMLRPCClient(Constants.wpcomXMLRPCURL,
"", "");
public void registerWPComToken(final Context ctx, String token) {
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(ctx);
String uuid = settings.getString("wp_pref_notifications_uuid", null);
if (uuid == null)
return;
String deviceName = DeviceUtils.getDeviceName(ctx);
Map<String, Object> contentStruct = new HashMap<String, Object>();
contentStruct.put("device_family", "android");
contentStruct.put("device_name", deviceName);
contentStruct.put("device_model", Build.MANUFACTURER + " "
+ Build.MODEL);
contentStruct.put("app_version", WordPress.versionName);
contentStruct.put("os_version", android.os.Build.VERSION.RELEASE);
contentStruct.put("device_uuid", uuid);
contentStruct.put("production", true); //production, NOT sandbox.
Object[] params = {
settings.getString(WordPress.WPCOM_USERNAME_PREFERENCE, ""),
WordPressDB.decryptPassword(settings.getString(
WordPress.WPCOM_PASSWORD_PREFERENCE, "")), token,
contentStruct };
XMLRPCClient client = new XMLRPCClient(
URI.create(Constants.wpcomXMLRPCURL), "", "");
/*client.setAuthorizationHeader(WordPress.getWPComAuthToken(ctx));*/
client.callAsync(new XMLRPCCallback() {
public void onSuccess(long id, Object result) {
Log.v("WORDPRESS", "Successfully registered device on WP.com");
getNotificationSettings(null, ctx);
}
public void onFailure(long id, XMLRPCException error) {
Log.e("WORDPRESS", error.getMessage());
}
}, "wpcom.mobile_push_register_token", params);
}
public void unregisterWPComToken(Context ctx, String token) {
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(ctx);
Object[] params = {
settings.getString(WordPress.WPCOM_USERNAME_PREFERENCE, ""),
WordPressDB.decryptPassword(settings.getString(
WordPress.WPCOM_PASSWORD_PREFERENCE, "")), token,
false, "android" };
XMLRPCClient client = new XMLRPCClient(
URI.create(Constants.wpcomXMLRPCURL), "", "");
/*client.setAuthorizationHeader(WordPress.getWPComAuthToken(ctx));*/
client.callAsync(new XMLRPCCallback() {
public void onSuccess(long id, Object result) {
Log.v("WORDPRESS", "Successfully unregistered device on WP.com");
}
public void onFailure(long id, XMLRPCException error) {
Log.e("WORDPRESS", error.getMessage());
}
}, "wpcom.mobile_push_unregister_token", params);
}
public void getNotificationSettings(final XMLRPCCallback callback,
Context context) {
final SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(context);
String gcmToken = GCMRegistrar.getRegistrationId(context);
if (gcmToken == null)
return;
if (!WordPress.hasValidWPComCredentials(context))
return;
/*client.setAuthorizationHeader(WordPress.getWPComAuthToken(context));*/
Object[] params = {
settings.getString(WordPress.WPCOM_USERNAME_PREFERENCE, ""),
WordPressDB.decryptPassword(settings.getString(
WordPress.WPCOM_PASSWORD_PREFERENCE, "")), gcmToken,
"android" };
client.callAsync(new XMLRPCCallback() {
public void onSuccess(long id, Object result) {
Log.v("WORDPRESS", "Push notification settings retrieved!");
if (callback != null) {
callback.onSuccess(id, result);
}
Gson gson = new Gson();
Editor editor = settings.edit();
editor.putString("wp_pref_notification_settings",
gson.toJson(result));
editor.commit();
}
public void onFailure(long id, XMLRPCException error) {
if (callback != null) {
callback.onFailure(id, error);
}
Log.e("WORDPRESS", error.getMessage());
}
}, "wpcom.get_mobile_push_notification_settings", params);
}
public void setNotificationSettings(Context context) {
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(context);
String settingsJson = settings.getString(
"wp_pref_notification_settings", null);
if (settingsJson == null)
return;
Gson gson = new Gson();
Map<String, StringMap<String>> notificationSettings = gson.fromJson(
settingsJson, HashMap.class);
Map<String, Object> updatedSettings = new HashMap<String, Object>();
if (notificationSettings == null)
return;
String gcmToken = GCMRegistrar.getRegistrationId(context);
if (gcmToken == null)
return;
if (!WordPress.hasValidWPComCredentials(context))
return;
// Build the settings object to send back to WP.com
StringMap<?> mutedBlogsMap = (StringMap<?>) notificationSettings
.get("muted_blogs");
StringMap<?> muteUntilMap = (StringMap<?>) notificationSettings
.get("mute_until");
ArrayList<StringMap<Double>> blogsList = (ArrayList<StringMap<Double>>) mutedBlogsMap
.get("value");
notificationSettings.remove("muted_blogs");
notificationSettings.remove("mute_until");
for (Map.Entry<String, StringMap<String>> entry : notificationSettings
.entrySet()) {
StringMap<String> setting = entry.getValue();
updatedSettings.put(entry.getKey(), setting.get("value"));
}
if (muteUntilMap != null && muteUntilMap.get("value") != null) {
updatedSettings.put("mute_until", muteUntilMap.get("value"));
}
ArrayList<StringMap<Double>> mutedBlogsList = new ArrayList<StringMap<Double>>();
for (int i = 0; i < blogsList.size(); i++) {
StringMap<Double> userBlog = blogsList.get(i);
if (Double.valueOf(userBlog.get("value")) == 1.0) {
mutedBlogsList.add(userBlog);
}
}
if (mutedBlogsList.size() > 0) {
updatedSettings.put("muted_blogs", mutedBlogsList);
}
/*client.setAuthorizationHeader(WordPress.getWPComAuthToken(context));*/
if (updatedSettings.size() == 0)
return;
Object[] params = {
settings.getString(WordPress.WPCOM_USERNAME_PREFERENCE, ""),
WordPressDB.decryptPassword(settings.getString(
WordPress.WPCOM_PASSWORD_PREFERENCE, "")),
updatedSettings, gcmToken, "android" };
client.callAsync(new XMLRPCCallback() {
public void onSuccess(long id, Object result) {
Log.v("WORDPRESS", "Notification settings updated successfully");
}
public void onFailure(long id, XMLRPCException error) {
Log.e("WORDPRESS", error.getMessage());
}
}, "wpcom.set_mobile_push_notification_settings", params);
}
}