/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.background.announcements;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import org.mozilla.gecko.sync.GlobalConstants;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.net.BaseResource;
public class AnnouncementsFetcher {
private static final String LOG_TAG = "AnnounceFetch";
private static final long MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
public static URI getSnippetURI(String base, String channel,
String version, String platform,
int idleDays)
throws URISyntaxException {
try {
final String c = URLEncoder.encode(channel, "UTF-8");
final String v = URLEncoder.encode(version, "UTF-8");
final String p = URLEncoder.encode(platform, "UTF-8");
final String s = base + c + "/" + v + "/" + p + ((idleDays == -1) ? "" : ("?idle=" + idleDays));
return new URI(s);
} catch (UnsupportedEncodingException e) {
// Nonsense.
return null;
}
}
public static URI getAnnounceURI(final String baseURL, final long lastLaunch) throws URISyntaxException {
final String channel = getChannel();
final String version = getVersion();
final String platform = getPlatform();
final int idleDays = getIdleDays(lastLaunch);
Logger.debug(LOG_TAG, "Fetch URI: idle for " + idleDays + " days.");
return getSnippetURI(baseURL, channel, version, platform, idleDays);
}
protected static String getChannel() {
return AnnouncementsConstants.ANNOUNCE_CHANNEL;
}
protected static String getVersion() {
return GlobalConstants.MOZ_APP_VERSION;
}
protected static String getPlatform() {
return GlobalConstants.ANDROID_CPU_ARCH;
}
protected static int getIdleDays(final long lastLaunch) {
if (lastLaunch == 0) {
return -1;
}
final long idleMillis = System.currentTimeMillis() - lastLaunch;
return (int) (idleMillis / MILLISECONDS_PER_DAY);
}
public static void fetchAnnouncements(URI uri, AnnouncementsFetchDelegate delegate) {
BaseResource r = new BaseResource(uri);
r.delegate = new AnnouncementsFetchResourceDelegate(r, delegate);
r.getBlocking();
}
/**
* Synchronous.
*/
public static void fetchAndProcessAnnouncements(long lastLaunch,
AnnouncementsFetchDelegate delegate) {
final long now = System.currentTimeMillis();
Logger.debug(LOG_TAG, "Fetching announcements. Last launch: " + lastLaunch + "; now: " + now);
try {
final String base = delegate.getServiceURL();
final URI uri = getAnnounceURI(base, lastLaunch);
Logger.info(LOG_TAG, "Fetching announcements from " + uri.toASCIIString());
fetchAnnouncements(uri, delegate);
} catch (URISyntaxException e) {
Logger.warn(LOG_TAG, "Couldn't create URL.", e);
return;
}
}
}