| Index: chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
 | 
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
 | 
| index 7aaaff8b232e5d2bde0f2e777384bacd122d1203..93efec358a982997a198589d42005c9ae2f3ae0a 100644
 | 
| --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
 | 
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
 | 
| @@ -155,15 +155,37 @@ public class UmaSessionStats implements NetworkChangeNotifier.ConnectionTypeObse
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| -     * Updates the state of the MetricsService to account for the user's preferences.
 | 
| +     * Updates the metrics services based on a change of consent. This can happen during first-run
 | 
| +     * flow, and when the user changes their preferences.
 | 
|       */
 | 
| -    public void updateMetricsServiceState() {
 | 
| -        boolean mayRecordStats = !PrivacyPreferencesManager.getInstance()
 | 
| -                .isNeverUploadCrashDump();
 | 
| -        boolean mayUploadStats = mReportingPermissionManager.isUmaUploadPermitted();
 | 
| +    public static void changeMetricsReportingConsent(boolean consent) {
 | 
| +        PrivacyPreferencesManager privacyManager = PrivacyPreferencesManager.getInstance();
 | 
| +        // Update the new two-choice Android preference.
 | 
| +        privacyManager.setUsageAndCrashReporting(consent);
 | 
| +        // Update the old three-choice Android preference, and synchronize with Chrome local state
 | 
| +        // preferences. Note, this forces the three-choice preferences to be either never upload,
 | 
| +        // or only upload on WiFi.
 | 
| +        privacyManager.initCrashUploadPreference(consent);
 | 
| +
 | 
| +        // Perform native changes needed to reflect the new consent value.
 | 
| +        nativeChangeMetricsReportingConsent(consent);
 | 
|  
 | 
| -        // Re-start the MetricsService with the given parameters.
 | 
| -        nativeUpdateMetricsServiceState(mayRecordStats, mayUploadStats);
 | 
| +        updateMetricsServiceState();
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * Updates the state of MetricsService to account for the user's preferences.
 | 
| +     */
 | 
| +    public static void updateMetricsServiceState() {
 | 
| +        PrivacyPreferencesManager privacyManager = PrivacyPreferencesManager.getInstance();
 | 
| +
 | 
| +        // Ensure Android and Chrome local state prefs are in sync.
 | 
| +        privacyManager.syncUsageAndCrashReportingPrefs();
 | 
| +
 | 
| +        boolean mayUploadStats = privacyManager.isUmaUploadPermitted();
 | 
| +
 | 
| +        // Re-start the MetricsService with the given parameter, and current consent.
 | 
| +        nativeUpdateMetricsServiceState(mayUploadStats);
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -194,6 +216,10 @@ public class UmaSessionStats implements NetworkChangeNotifier.ConnectionTypeObse
 | 
|              prefManager.setUsageAndCrashReporting(prefBridge.isMetricsReportingEnabled());
 | 
|          }
 | 
|  
 | 
| +        // Update the metrics sampling state so it's available before the native feature list is
 | 
| +        // available.
 | 
| +        prefManager.setClientInMetricsSample(UmaUtils.isClientInMetricsReportingSample());
 | 
| +
 | 
|          // Make sure preferences are in sync.
 | 
|          prefManager.syncUsageAndCrashReportingPrefs();
 | 
|      }
 | 
| @@ -212,7 +238,8 @@ public class UmaSessionStats implements NetworkChangeNotifier.ConnectionTypeObse
 | 
|      }
 | 
|  
 | 
|      private static native long nativeInit();
 | 
| -    private native void nativeUpdateMetricsServiceState(boolean mayRecord, boolean mayUpload);
 | 
| +    private static native void nativeChangeMetricsReportingConsent(boolean consent);
 | 
| +    private static native void nativeUpdateMetricsServiceState(boolean mayUpload);
 | 
|      private native void nativeUmaResumeSession(long nativeUmaSessionStats);
 | 
|      private native void nativeUmaEndSession(long nativeUmaSessionStats);
 | 
|      private static native void nativeLogRendererCrash();
 | 
| 
 |