Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1749)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java

Issue 1321393002: Attempt to head off OmahaClient ANR (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java
index abe49ab3a4dbd1ce21a3898d2b3a07d5244365f1..5e0834414be555d043cb740883c9e40e3b2232dd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaClient.java
@@ -66,9 +66,6 @@ public class OmahaClient extends IntentService {
private static final String ACTION_POST_REQUEST =
"org.chromium.chrome.browser.omaha.ACTION_POST_REQUEST";
- // Strings for extras.
- private static final String EXTRA_FORCE_ACTION = "forceAction";
-
// Delays between events.
private static final long MS_PER_HOUR = 3600000;
private static final long MS_POST_BASE_DELAY = MS_PER_HOUR;
@@ -118,7 +115,6 @@ public class OmahaClient extends IntentService {
// Member fields not persisted to disk.
private boolean mStateHasBeenRestored;
- private Context mApplicationContext;
private ExponentialBackoffScheduler mBackoffScheduler;
private RequestGenerator mGenerator;
@@ -137,15 +133,6 @@ public class OmahaClient extends IntentService {
setIntentRedelivery(true);
}
- @Override
- public void onCreate() {
- super.onCreate();
- mApplicationContext = getApplicationContext();
- mBackoffScheduler = createBackoffScheduler(PREF_PACKAGE, mApplicationContext,
- MS_POST_BASE_DELAY, MS_POST_MAX_DELAY);
- mGenerator = createRequestGenerator(mApplicationContext);
- }
-
/**
* Sets whether Chrome should be communicating with the Omaha server.
* The alternative to using a static field within OmahaClient is using a member variable in
@@ -177,7 +164,7 @@ public class OmahaClient extends IntentService {
@VisibleForTesting
int getCumulativeFailedAttempts() {
- return mBackoffScheduler.getNumFailedAttempts();
+ return getBackoffScheduler().getNumFailedAttempts();
}
/**
@@ -194,7 +181,7 @@ public class OmahaClient extends IntentService {
*/
@VisibleForTesting
RequestGenerator createRequestGenerator(Context context) {
- return ((ChromeApplication) getApplicationContext()).createOmahaRequestGenerator();
+ return ((ChromeApplication) context.getApplicationContext()).createOmahaRequestGenerator();
}
/**
@@ -210,11 +197,6 @@ public class OmahaClient extends IntentService {
return;
}
- if (mGenerator == null) {
- Log.e(TAG, "No request generator set. Ignoring intent.");
- return;
- }
-
if (!mStateHasBeenRestored) {
restoreState();
}
@@ -243,16 +225,15 @@ public class OmahaClient extends IntentService {
scheduleRepeatingAlarm();
// If a request exists, fire a POST intent to restart its timer.
- if (hasRequest()) {
- Intent postIntent = createPostRequestIntent(mApplicationContext, false);
- startService(postIntent);
- }
+ if (hasRequest()) startService(createPostRequestIntent(this));
}
- public static Intent createRegisterRequestIntent(Context context, boolean force) {
+ /**
+ * Returns an Intent for registering a new request to send to the server.
+ */
+ static Intent createRegisterRequestIntent(Context context) {
Intent intent = new Intent(context, OmahaClient.class);
intent.setAction(ACTION_REGISTER_REQUEST);
- intent.putExtra(EXTRA_FORCE_ACTION, force);
return intent;
}
@@ -261,33 +242,32 @@ public class OmahaClient extends IntentService {
* time has passed between now and the last time a request was generated.
*/
private void handleRegisterRequest(Intent intent) {
- boolean force = intent.getBooleanExtra(EXTRA_FORCE_ACTION, false);
- if (!isChromeBeingUsed() && !force) {
+ if (!isChromeBeingUsed()) {
cancelRepeatingAlarm();
return;
}
// If the current request is too old, generate a new one.
- long currentTimestamp = mBackoffScheduler.getCurrentTime();
+ long currentTimestamp = getBackoffScheduler().getCurrentTime();
boolean isTooOld = hasRequest()
&& mCurrentRequest.getAgeInMilliseconds(currentTimestamp) >= MS_BETWEEN_REQUESTS;
boolean isOverdue = !hasRequest() && currentTimestamp >= mTimestampForNewRequest;
- if (isTooOld || isOverdue || force) {
+ if (isTooOld || isOverdue) {
registerNewRequest(currentTimestamp);
}
- // Create an intent to send the request. If we're forcing a registration, force the POST,
- // as well.
+ // Create an intent to send the request.
if (hasRequest()) {
- Intent postIntent = createPostRequestIntent(mApplicationContext, force);
- startService(postIntent);
+ startService(createPostRequestIntent(this));
}
}
- public static Intent createPostRequestIntent(Context context, boolean force) {
+ /**
+ * Returns an Intent for POSTing the current request to the Omaha server.
+ */
+ static Intent createPostRequestIntent(Context context) {
Intent intent = new Intent(context, OmahaClient.class);
intent.setAction(ACTION_POST_REQUEST);
- intent.putExtra(EXTRA_FORCE_ACTION, force);
return intent;
}
@@ -300,11 +280,9 @@ public class OmahaClient extends IntentService {
return;
}
- boolean force = intent.getBooleanExtra(EXTRA_FORCE_ACTION, false);
-
// If enough time has passed since the last attempt, try sending a request.
- long currentTimestamp = mBackoffScheduler.getCurrentTime();
- if (currentTimestamp >= mTimestampForNextPostAttempt || force) {
+ long currentTimestamp = getBackoffScheduler().getCurrentTime();
+ if (currentTimestamp >= mTimestampForNextPostAttempt) {
// All requests made during the same session should have the same ID.
String sessionID = generateRandomUUID();
boolean sendingInstallRequest = mSendInstallEvent;
@@ -316,20 +294,12 @@ public class OmahaClient extends IntentService {
// Create and immediately send another request for a ping and update check.
registerNewRequest(currentTimestamp);
- succeeded = generateAndPostRequest(currentTimestamp, sessionID);
- }
-
- if (force) {
- if (succeeded) {
- Log.v(TAG, "Requests successfully sent to Omaha server.");
- } else {
- Log.e(TAG, "Requests failed to reach Omaha server.");
- }
+ generateAndPostRequest(currentTimestamp, sessionID);
nyquist 2015/09/01 22:32:50 So this ignores the return value of the function n
gone 2015/09/01 22:36:12 There's a call right above this where the boolean
}
} else {
// Set an alarm to POST at the proper time. Previous alarms are destroyed.
- Intent postIntent = createPostRequestIntent(mApplicationContext, false);
- mBackoffScheduler.createAlarm(postIntent, mTimestampForNextPostAttempt);
+ Intent postIntent = createPostRequestIntent(this);
+ getBackoffScheduler().createAlarm(postIntent, mTimestampForNextPostAttempt);
}
// Write everything back out again to save our state.
@@ -337,13 +307,14 @@ public class OmahaClient extends IntentService {
}
private boolean generateAndPostRequest(long currentTimestamp, String sessionID) {
+ ExponentialBackoffScheduler scheduler = getBackoffScheduler();
try {
// Generate the XML for the current request.
long installAgeInDays = RequestGenerator.installAge(currentTimestamp,
mTimestampOfInstall, mCurrentRequest.isSendInstallEvent());
- String version = getVersionNumberGetter().getCurrentlyUsedVersion(mApplicationContext);
- String xml =
- mGenerator.generateXML(sessionID, version, installAgeInDays, mCurrentRequest);
+ String version = getVersionNumberGetter().getCurrentlyUsedVersion(this);
+ String xml = getRequestGenerator().generateXML(
+ sessionID, version, installAgeInDays, mCurrentRequest);
// Send the request to the server & wait for a response.
String response = postRequest(currentTimestamp, xml);
@@ -352,7 +323,7 @@ public class OmahaClient extends IntentService {
// If we've gotten this far, we've successfully sent a request.
mCurrentRequest = null;
mTimestampForNextPostAttempt = currentTimestamp + MS_POST_BASE_DELAY;
- mBackoffScheduler.resetFailedAttempts();
+ scheduler.resetFailedAttempts();
Log.i(TAG, "Request to Server Successful. Timestamp for next request:"
+ String.valueOf(mTimestampForNextPostAttempt));
@@ -360,9 +331,9 @@ public class OmahaClient extends IntentService {
} catch (RequestFailureException e) {
// Set the alarm to try again later.
Log.e(TAG, "Failed to contact server: ", e);
- Intent postIntent = createPostRequestIntent(mApplicationContext, false);
- mTimestampForNextPostAttempt = mBackoffScheduler.createAlarm(postIntent);
- mBackoffScheduler.increaseFailedAttempts();
+ Intent postIntent = createPostRequestIntent(this);
+ mTimestampForNextPostAttempt = scheduler.createAlarm(postIntent);
+ scheduler.increaseFailedAttempts();
return false;
}
}
@@ -373,11 +344,9 @@ public class OmahaClient extends IntentService {
* clears whatever alarms are currently set.
*/
private void scheduleRepeatingAlarm() {
- Intent registerIntent = createRegisterRequestIntent(mApplicationContext, false);
- PendingIntent pIntent =
- PendingIntent.getService(mApplicationContext, 0, registerIntent, 0);
- AlarmManager am =
- (AlarmManager) mApplicationContext.getSystemService(Context.ALARM_SERVICE);
+ Intent registerIntent = createRegisterRequestIntent(this);
+ PendingIntent pIntent = PendingIntent.getService(this, 0, registerIntent, 0);
+ AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
setAlarm(am, pIntent, AlarmManager.RTC, mTimestampForNewRequest);
}
@@ -399,15 +368,14 @@ public class OmahaClient extends IntentService {
* Cancels the alarm that launches this service. It will be replaced when Chrome next resumes.
*/
private void cancelRepeatingAlarm() {
- Intent requestIntent = createRegisterRequestIntent(mApplicationContext, false);
- PendingIntent pendingIntent = PendingIntent.getService(mApplicationContext, 0,
- requestIntent, PendingIntent.FLAG_NO_CREATE);
+ Intent requestIntent = createRegisterRequestIntent(this);
+ PendingIntent pendingIntent =
+ PendingIntent.getService(this, 0, requestIntent, PendingIntent.FLAG_NO_CREATE);
// Setting FLAG_NO_CREATE forces Android to return an already existing PendingIntent.
// Here it would be the one that was used to create the existing alarm (if it exists).
// If the pendingIntent is null, it is likely that no alarm was created.
if (pendingIntent != null) {
- AlarmManager am =
- (AlarmManager) mApplicationContext.getSystemService(Context.ALARM_SERVICE);
+ AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.cancel(pendingIntent);
pendingIntent.cancel();
}
@@ -419,7 +387,7 @@ public class OmahaClient extends IntentService {
@VisibleForTesting
protected boolean isChromeBeingUsed() {
boolean isChromeVisible = ApplicationStatus.hasVisibleActivities();
- boolean isScreenOn = ApiCompatibilityUtils.isInteractive(mApplicationContext);
+ boolean isScreenOn = ApiCompatibilityUtils.isInteractive(this);
return isChromeVisible && isScreenOn;
}
@@ -431,7 +399,7 @@ public class OmahaClient extends IntentService {
@VisibleForTesting
void registerNewRequest(long currentTimestamp) {
mCurrentRequest = createRequestData(currentTimestamp, null);
- mBackoffScheduler.resetFailedAttempts();
+ getBackoffScheduler().resetFailedAttempts();
mTimestampForNextPostAttempt = currentTimestamp;
// Tentatively set the timestamp for a new request. This will be updated when the server
@@ -486,12 +454,12 @@ public class OmahaClient extends IntentService {
* Parse the server's response and confirm that we received an OK response.
*/
private void parseServerResponse(String response) throws RequestFailureException {
- String appId = mGenerator.getAppId();
+ String appId = getRequestGenerator().getAppId();
boolean sentPingAndUpdate = !mSendInstallEvent;
ResponseParser parser =
new ResponseParser(appId, mSendInstallEvent, sentPingAndUpdate, sentPingAndUpdate);
parser.parseResponse(response);
- mTimestampForNewRequest = mBackoffScheduler.getCurrentTime() + MS_BETWEEN_REQUESTS;
+ mTimestampForNewRequest = getBackoffScheduler().getCurrentTime() + MS_BETWEEN_REQUESTS;
mLatestVersion = parser.getNewVersion();
mMarketURL = parser.getURL();
scheduleRepeatingAlarm();
@@ -503,7 +471,7 @@ public class OmahaClient extends IntentService {
@VisibleForTesting
protected HttpURLConnection createConnection() throws RequestFailureException {
try {
- URL url = new URL(mGenerator.getServerUrl());
+ URL url = new URL(getRequestGenerator().getServerUrl());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(MS_CONNECTION_TIMEOUT);
connection.setReadTimeout(MS_CONNECTION_TIMEOUT);
@@ -598,7 +566,7 @@ public class OmahaClient extends IntentService {
*
* NOTE: This function incurs I/O, so don't use it on the main thread.
*/
- public static boolean isNewerVersionAvailable(Context applicationContext) {
+ static boolean isNewerVersionAvailable(Context context) {
assert Looper.myLooper() != Looper.getMainLooper();
// This may be explicitly enabled for some channels and for unit tests.
@@ -608,15 +576,14 @@ public class OmahaClient extends IntentService {
// If the market link is bad, don't show an update to avoid frustrating users trying to
// hit the "Update" button.
- if ("".equals(getMarketURL(applicationContext))) {
+ if ("".equals(getMarketURL(context))) {
return false;
}
// Compare version numbers.
VersionNumberGetter getter = getVersionNumberGetter();
- String currentStr = getter.getCurrentlyUsedVersion(applicationContext);
- String latestStr =
- getter.getLatestKnownVersion(applicationContext, PREF_PACKAGE, PREF_LATEST_VERSION);
+ String currentStr = getter.getCurrentlyUsedVersion(context);
+ String latestStr = getter.getLatestKnownVersion(context, PREF_PACKAGE, PREF_LATEST_VERSION);
VersionNumber currentVersionNumber = VersionNumber.fromString(currentStr);
VersionNumber latestVersionNumber = VersionNumber.fromString(latestStr);
@@ -633,7 +600,7 @@ public class OmahaClient extends IntentService {
* @param context Context to pull resources from.
* @return A String indicating the install source.
*/
- String determineInstallSource(Context context) {
+ String determineInstallSource() {
boolean isInSystemImage = (getApplicationFlags() & ApplicationInfo.FLAG_SYSTEM) != 0;
return isInSystemImage ? INSTALL_SOURCE_SYSTEM : INSTALL_SOURCE_ORGANIC;
}
@@ -644,8 +611,8 @@ public class OmahaClient extends IntentService {
* @return The Application's flags.
*/
@VisibleForTesting
- public int getApplicationFlags() {
- return mApplicationContext.getApplicationInfo().flags;
+ int getApplicationFlags() {
+ return getApplicationInfo().flags;
}
/**
@@ -655,12 +622,11 @@ public class OmahaClient extends IntentService {
@VisibleForTesting
void restoreState() {
boolean mustRewriteState = false;
- SharedPreferences preferences =
- mApplicationContext.getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
+ SharedPreferences preferences = getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
Map<String, ?> items = preferences.getAll();
// Read out the recorded data.
- long currentTime = mBackoffScheduler.getCurrentTime();
+ long currentTime = getBackoffScheduler().getCurrentTime();
mTimestampForNewRequest =
getLongFromMap(items, PREF_TIMESTAMP_FOR_NEW_REQUEST, currentTime);
mTimestampForNextPostAttempt =
@@ -672,7 +638,7 @@ public class OmahaClient extends IntentService {
mSendInstallEvent = getBooleanFromMap(items, PREF_SEND_INSTALL_EVENT, true);
// Restore the install source.
- String defaultInstallSource = determineInstallSource(mApplicationContext);
+ String defaultInstallSource = determineInstallSource();
mInstallSource = getStringFromMap(items, PREF_INSTALL_SOURCE, defaultInstallSource);
// If we're not sending an install event, don't bother restoring the request ID:
@@ -701,9 +667,9 @@ public class OmahaClient extends IntentService {
// Confirm that the timestamp for the next POST is less than the current delay.
long delayToNextPost = mTimestampForNextPostAttempt - currentTime;
- if (delayToNextPost > mBackoffScheduler.getGeneratedDelay()) {
+ if (delayToNextPost > getBackoffScheduler().getGeneratedDelay()) {
Log.w(TAG, "Delay to next post attempt (" + delayToNextPost
- + ") is greater than expected (" + mBackoffScheduler.getGeneratedDelay()
+ + ") is greater than expected (" + getBackoffScheduler().getGeneratedDelay()
+ "). Resetting to now.");
mTimestampForNextPostAttempt = currentTime;
mustRewriteState = true;
@@ -720,11 +686,10 @@ public class OmahaClient extends IntentService {
* Writes out the current state to a file.
*/
private void saveState() {
- SharedPreferences prefs =
- mApplicationContext.getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
+ SharedPreferences prefs = getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(PREF_SEND_INSTALL_EVENT, mSendInstallEvent);
- setIsFreshInstallOrDataHasBeenCleared(mApplicationContext);
+ setIsFreshInstallOrDataHasBeenCleared(this);
editor.putLong(PREF_TIMESTAMP_OF_INSTALL, mTimestampOfInstall);
editor.putLong(PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, mTimestampForNextPostAttempt);
editor.putLong(PREF_TIMESTAMP_FOR_NEW_REQUEST, mTimestampForNewRequest);
@@ -818,20 +783,33 @@ public class OmahaClient extends IntentService {
* sIsFreshInstallOrDataCleared will be set to true if PREF_TIMESTAMP_OF_INSTALL has not
* been previously set. Else, it will be set to false. sIsFreshInstallOrDataCleared is
* guarded by sLock.
- * @param applicationContext The current application Context.
+ * @param context The current Context.
*/
- public static boolean isFreshInstallOrDataHasBeenCleared(Context applicationContext) {
- return setIsFreshInstallOrDataHasBeenCleared(applicationContext);
+ public static boolean isFreshInstallOrDataHasBeenCleared(Context context) {
+ return setIsFreshInstallOrDataHasBeenCleared(context);
}
- private static boolean setIsFreshInstallOrDataHasBeenCleared(Context applicationContext) {
+ private static boolean setIsFreshInstallOrDataHasBeenCleared(Context context) {
synchronized (sIsFreshInstallLock) {
if (sIsFreshInstallOrDataCleared == null) {
- SharedPreferences prefs = applicationContext.getSharedPreferences(
+ SharedPreferences prefs = context.getSharedPreferences(
PREF_PACKAGE, Context.MODE_PRIVATE);
sIsFreshInstallOrDataCleared = (prefs.getLong(PREF_TIMESTAMP_OF_INSTALL, -1) == -1);
}
return sIsFreshInstallOrDataCleared;
}
}
+
+ protected final RequestGenerator getRequestGenerator() {
+ if (mGenerator == null) mGenerator = createRequestGenerator(this);
+ return mGenerator;
+ }
+
+ protected final ExponentialBackoffScheduler getBackoffScheduler() {
+ if (mBackoffScheduler == null) {
+ mBackoffScheduler = createBackoffScheduler(
+ PREF_PACKAGE, this, MS_POST_BASE_DELAY, MS_POST_MAX_DELAY);
+ }
+ return mBackoffScheduler;
+ }
}
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698