| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.precache; | 5 package org.chromium.chrome.browser.precache; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 | 8 |
| 9 import org.chromium.base.Log; |
| 9 import org.chromium.base.ThreadUtils; | 10 import org.chromium.base.ThreadUtils; |
| 11 import org.chromium.base.VisibleForTesting; |
| 10 import org.chromium.base.annotations.CalledByNative; | 12 import org.chromium.base.annotations.CalledByNative; |
| 11 import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager
; | 13 import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager
; |
| 12 | 14 import org.chromium.chrome.browser.sync.ProfileSyncService; |
| 13 import java.util.concurrent.Callable; | |
| 14 | 15 |
| 15 /** Class that interacts with the PrecacheManager to control precache cycles. */ | 16 /** Class that interacts with the PrecacheManager to control precache cycles. */ |
| 16 public abstract class PrecacheLauncher { | 17 public abstract class PrecacheLauncher { |
| 18 private static final String TAG = "cr.Precache"; |
| 19 |
| 17 /** Pointer to the native PrecacheLauncher object. Set to 0 when uninitializ
ed. */ | 20 /** Pointer to the native PrecacheLauncher object. Set to 0 when uninitializ
ed. */ |
| 18 private long mNativePrecacheLauncher; | 21 private long mNativePrecacheLauncher; |
| 19 | 22 |
| 20 /** Destroy the native PrecacheLauncher, releasing the memory that it was us
ing. */ | 23 /** Destroy the native PrecacheLauncher, releasing the memory that it was us
ing. */ |
| 21 public void destroy() { | 24 public void destroy() { |
| 22 if (mNativePrecacheLauncher != 0) { | 25 if (mNativePrecacheLauncher != 0) { |
| 23 nativeDestroy(mNativePrecacheLauncher); | 26 nativeDestroy(mNativePrecacheLauncher); |
| 24 mNativePrecacheLauncher = 0; | 27 mNativePrecacheLauncher = 0; |
| 25 } | 28 } |
| 26 } | 29 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 49 /** | 52 /** |
| 50 * Called by native code when the precache cycle completes. This method exis
ts because an | 53 * Called by native code when the precache cycle completes. This method exis
ts because an |
| 51 * abstract method cannot be directly called from native. | 54 * abstract method cannot be directly called from native. |
| 52 */ | 55 */ |
| 53 @CalledByNative | 56 @CalledByNative |
| 54 private void onPrecacheCompletedCallback() { | 57 private void onPrecacheCompletedCallback() { |
| 55 onPrecacheCompleted(); | 58 onPrecacheCompleted(); |
| 56 } | 59 } |
| 57 | 60 |
| 58 /** | 61 /** |
| 59 * Returns true if precaching is enabled by either Finch or the command line
flag, and also by | 62 * Updates the PrecacheServiceLauncher with whether conditions are right for
precaching. All of |
| 60 * the predictive network actions preference and current network connection
type. | 63 * the following must be true: |
| 61 * | 64 * |
| 62 * @param privacyPreferencesManager Singleton that manages the prefetch band
width preference. | 65 * <ul> |
| 66 * <li>The predictive network actions preference is enabled.</li> |
| 67 * <li>The current network type is suitable for predictive network actions
.</li> |
| 68 * <li>Sync is enabled for sessions and it is not encrypted with a seconda
ry passphrase.</li> |
| 69 * <li>Either the Precache field trial or the precache commandline flag is
enabled.</li> |
| 70 * </ul> |
| 71 * |
| 72 * This should be called only after the sync backend has been initialized. M
ust be called on the |
| 73 * UI thread. |
| 74 * |
| 75 * @param context The application context. |
| 63 */ | 76 */ |
| 64 public static boolean isPrecachingEnabled( | 77 private void updateEnabledSync(Context context) { |
| 65 final PrivacyPreferencesManager privacyPreferencesManager) { | 78 PrivacyPreferencesManager privacyPreferencesManager = |
| 66 if (!nativeIsPrecachingEnabled()) return false; | 79 PrivacyPreferencesManager.getInstance(context); |
| 67 // privacyPreferencesManager.shouldPrerender() can only be executed on t
he UI thread. | 80 |
| 68 return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean
>() { | 81 // privacyPreferencesManager.shouldPrerender() and nativeShouldRun() can
only be executed on |
| 82 // the UI thread. |
| 83 PrecacheServiceLauncher.setIsPrecachingEnabled( |
| 84 context, privacyPreferencesManager.shouldPrerender() && nativeSh
ouldRun()); |
| 85 Log.v(TAG, "updateEnabledSync complete"); |
| 86 } |
| 87 |
| 88 /** |
| 89 * If precaching is enabled, then allow the PrecacheService to be launched a
nd signal Chrome |
| 90 * when conditions are right to start precaching. If precaching is disabled,
prevent the |
| 91 * PrecacheService from ever starting. |
| 92 * |
| 93 * @param context Any context within the application. |
| 94 */ |
| 95 @VisibleForTesting |
| 96 void updateEnabled(final Context context) { |
| 97 Log.v(TAG, "updateEnabled starting"); |
| 98 ThreadUtils.postOnUiThread(new Runnable() { |
| 69 @Override | 99 @Override |
| 70 public Boolean call() { | 100 public void run() { |
| 71 return privacyPreferencesManager.shouldPrerender(); | 101 final ProfileSyncService sync = ProfileSyncService.get(context); |
| 102 |
| 103 if (mListener == null) { |
| 104 mListener = new ProfileSyncService.SyncStateChangedListener(
) { |
| 105 public void syncStateChanged() { |
| 106 if (sync.isSyncInitialized()) { |
| 107 updateEnabledSync(context); |
| 108 } |
| 109 } |
| 110 }; |
| 111 sync.addSyncStateChangedListener(mListener); |
| 112 } |
| 113 |
| 114 // Call the listener once, in case the sync backend is already i
nitialized. |
| 115 mListener.syncStateChanged(); |
| 116 Log.v(TAG, "updateEnabled complete"); |
| 72 } | 117 } |
| 73 }); | 118 }); |
| 74 } | 119 } |
| 75 | 120 |
| 76 /** | 121 /** |
| 77 * If precaching is enabled, then allow the PrecacheService to be launched a
nd signal Chrome | 122 * If precaching is enabled, then allow the PrecacheService to be launched a
nd signal Chrome |
| 78 * when conditions are right to start precaching. If precaching is disabled,
prevent the | 123 * when conditions are right to start precaching. If precaching is disabled,
prevent the |
| 79 * PrecacheService from ever starting. | 124 * PrecacheService from ever starting. |
| 80 * | 125 * |
| 81 * @param privacyPreferencesManager Singleton that manages the prefetch band
width preference. | 126 * @param context Any context within the application. |
| 82 * @param context The context of the PrecacheServiceLauncher. | |
| 83 */ | 127 */ |
| 84 public static void updatePrecachingEnabled(PrivacyPreferencesManager privacy
PreferencesManager, | 128 public static void updatePrecachingEnabled(final Context context) { |
| 85 Context context) { | 129 sInstance.updateEnabled(context); |
| 86 PrecacheServiceLauncher.setIsPrecachingEnabled(context, | |
| 87 isPrecachingEnabled(privacyPreferencesManager)); | |
| 88 } | 130 } |
| 89 | 131 |
| 132 private static final PrecacheLauncher sInstance = new PrecacheLauncher() { |
| 133 @Override |
| 134 protected void onPrecacheCompleted() {} |
| 135 }; |
| 136 |
| 137 // Initialized by updateEnabled to call updateEnabledSync when the sync |
| 138 // backend is initialized. Only accessed on the UI thread. |
| 139 private ProfileSyncService.SyncStateChangedListener mListener = null; |
| 140 |
| 90 private native long nativeInit(); | 141 private native long nativeInit(); |
| 91 private native void nativeDestroy(long nativePrecacheLauncher); | 142 private native void nativeDestroy(long nativePrecacheLauncher); |
| 92 private native void nativeStart(long nativePrecacheLauncher); | 143 private native void nativeStart(long nativePrecacheLauncher); |
| 93 private native void nativeCancel(long nativePrecacheLauncher); | 144 private native void nativeCancel(long nativePrecacheLauncher); |
| 94 private static native boolean nativeIsPrecachingEnabled(); | 145 |
| 146 @VisibleForTesting native boolean nativeShouldRun(); |
| 95 } | 147 } |
| OLD | NEW |