Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| index 045aef059bd1ec91fbbf1d01033d8bd8ceddde3f..0ca47ff9cd52c8c7df2bbee9e567dc8ff61c9fb3 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| @@ -21,10 +21,9 @@ import android.os.Build; |
| import android.os.Bundle; |
| import android.os.IBinder; |
| import android.os.Process; |
| -import android.os.RemoteException; |
| import android.os.SystemClock; |
| -import android.support.customtabs.ICustomTabsCallback; |
| -import android.support.customtabs.ICustomTabsService; |
| +import android.support.customtabs.CustomTabsCallback; |
| +import android.support.customtabs.CustomTabsSessionToken; |
| import android.text.TextUtils; |
| import android.util.SparseArray; |
| import android.view.WindowManager; |
| @@ -66,7 +65,7 @@ import java.util.concurrent.atomic.AtomicReference; |
| * Note: This class is meant to be package private, and is public to be |
| * accessible from {@link ChromeApplication}. |
| */ |
| -public class CustomTabsConnection extends ICustomTabsService.Stub { |
| +public class CustomTabsConnection { |
| private static final String TAG = "cr.ChromeConnection"; |
| private static final String NO_PRERENDERING_KEY = |
| "android.support.customtabs.maylaunchurl.NO_PRERENDERING"; |
| @@ -81,14 +80,14 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| new AtomicReference<CustomTabsConnection>(); |
| private static final class PrerenderedUrlParams { |
| - public final IBinder mSession; |
| + public final CustomTabsSessionToken mSession; |
| public final WebContents mWebContents; |
| public final String mUrl; |
| public final String mReferrer; |
| public final Bundle mExtras; |
| - PrerenderedUrlParams(IBinder session, WebContents webContents, String url, String referrer, |
| - Bundle extras) { |
| + PrerenderedUrlParams(CustomTabsSessionToken session, |
| + WebContents webContents, String url, String referrer, Bundle extras) { |
| mSession = session; |
| mWebContents = webContents; |
| mUrl = url; |
| @@ -141,12 +140,12 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| private static class SessionParams { |
| public final int mUid; |
| public final Referrer mReferrer; |
| - public final ICustomTabsCallback mCallback; |
| + public final CustomTabsCallback mCallback; |
| private ServiceConnection mServiceConnection; |
| private String mPredictedUrl; |
| private long mLastMayLaunchUrlTimestamp; |
| - public SessionParams(Context context, int uid, ICustomTabsCallback callback) { |
| + public SessionParams(Context context, int uid, CustomTabsCallback callback) { |
| mUid = uid; |
| mCallback = callback; |
| mServiceConnection = null; |
| @@ -185,7 +184,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| } |
| private final Object mLock = new Object(); |
| - private final Map<IBinder, SessionParams> mSessionParams = new HashMap<>(); |
| + private final Map<CustomTabsSessionToken, SessionParams> mSessionParams = new HashMap<>(); |
| // Prediction tracking is done by UID and not by session, since a |
| // mis-behaving application can create a large number of sessions. |
| private SparseArray<PredictionStats> mUidToPredictionsStats = new SparseArray<>(); |
| @@ -212,28 +211,15 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return sInstance.get(); |
| } |
| - @Override |
| - public boolean newSession(ICustomTabsCallback callback) { |
| - if (callback == null) return false; |
| + /** |
| + * See {@link CustomTabsConnectionService#newSession(CustomTabsSessionToken)}. |
| + */ |
| + public boolean newSession(CustomTabsSessionToken session) { |
| + if (session == null) return false; |
| final int uid = Binder.getCallingUid(); |
| - SessionParams sessionParams = new SessionParams(mApplication, uid, callback); |
| - final IBinder session = callback.asBinder(); |
| + SessionParams sessionParams = new SessionParams(mApplication, uid, session.getCallback()); |
| synchronized (mLock) { |
| if (mSessionParams.containsKey(session)) return false; |
| - try { |
| - callback.asBinder().linkToDeath(new IBinder.DeathRecipient() { |
| - @Override |
| - public void binderDied() { |
| - synchronized (mLock) { |
| - cleanupAlreadyLocked(session); |
| - } |
| - } |
| - }, 0); |
| - } catch (RemoteException e) { |
| - // The return code doesn't matter, because this executes when |
| - // the caller has died. |
| - return false; |
| - } |
| mSessionParams.put(session, sessionParams); |
| if (mUidToPredictionsStats.get(uid) == null) { |
| mUidToPredictionsStats.put(uid, new PredictionStats()); |
| @@ -242,7 +228,9 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return true; |
| } |
| - @Override |
| + /** |
| + * See {@link CustomTabsConnectionService#warmup(long)}. |
| + */ |
| public boolean warmup(long flags) { |
| // Here and in mayLaunchUrl(), don't do expensive work for background applications. |
| if (!isCallerForegroundOrSelf()) return false; |
| @@ -278,8 +266,11 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return true; |
| } |
| - @Override |
| - public boolean mayLaunchUrl(ICustomTabsCallback callback, Uri url, final Bundle extras, |
| + /** |
| + * See {@link CustomTabsConnectionService# |
| + * mayLaunchUrl(CustomTabsSessionToken, Uri, Bundle, List)}. |
| + */ |
| + public boolean mayLaunchUrl(final CustomTabsSessionToken session, Uri url, final Bundle extras, |
| List<Bundle> otherLikelyBundles) { |
| // Don't do anything for unknown schemes. Not having a scheme is |
| // allowed, as we allow "www.example.com". |
| @@ -287,7 +278,6 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| if (scheme != null && !scheme.equals("http") && !scheme.equals("https")) return false; |
| if (!isCallerForegroundOrSelf()) return false; |
| - final IBinder session = callback.asBinder(); |
| final String urlString = url.toString(); |
| final boolean noPrerendering = |
| extras != null ? extras.getBoolean(NO_PRERENDERING_KEY, false) : false; |
| @@ -315,7 +305,9 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return true; |
| } |
| - @Override |
| + /** |
| + * {@link CustomTabsConnectionService#extraCommand(String, Bundle)}. |
| + */ |
| public Bundle extraCommand(String commandName, Bundle args) { |
|
Benoit L
2015/08/21 11:20:47
This no longer overrides a method?
|
| return null; |
| } |
| @@ -325,7 +317,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| * |
| * This is used for accounting. |
| */ |
| - void registerLaunch(IBinder session, String url) { |
| + void registerLaunch(CustomTabsSessionToken session, String url) { |
| int outcome; |
| long elapsedTimeMs = -1; |
| synchronized (mLock) { |
| @@ -380,7 +372,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| * @param referrer The referrer to use for |url|. |
| * @return The prerendered WebContents, or null. |
| */ |
| - WebContents takePrerenderedUrl(IBinder session, String url, String referrer) { |
| + WebContents takePrerenderedUrl(CustomTabsSessionToken session, String url, String referrer) { |
| ThreadUtils.assertOnUiThread(); |
| if (mPrerender == null || session == null || !session.equals(mPrerender.mSession)) { |
| return null; |
| @@ -399,12 +391,12 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return null; |
| } |
| - public Referrer getReferrerForSession(IBinder session) { |
| + public Referrer getReferrerForSession(CustomTabsSessionToken session) { |
| if (!mSessionParams.containsKey(session)) return null; |
| return mSessionParams.get(session).mReferrer; |
| } |
| - private ICustomTabsCallback getCallbackForSession(IBinder session) { |
| + private CustomTabsCallback getCallbackForSession(CustomTabsSessionToken session) { |
| synchronized (mLock) { |
| SessionParams sessionParams = mSessionParams.get(session); |
| if (sessionParams == null) return null; |
| @@ -415,15 +407,15 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| /** |
| * Notifies the application of a navigation event. |
| * |
| - * Delivers the {@link ICustomTabsConnectionCallback#onNavigationEvent} |
| + * Delivers the {@link CustomTabsCallback#onNavigationEvent} |
| * callback to the aplication. |
| * |
| * @param session The Binder object identifying the session. |
| * @param navigationEvent The navigation event code, defined in {@link CustomTabsCallback} |
| * @return true for success. |
| */ |
| - boolean notifyNavigationEvent(IBinder session, int navigationEvent) { |
| - ICustomTabsCallback callback = getCallbackForSession(session); |
| + boolean notifyNavigationEvent(CustomTabsSessionToken session, int navigationEvent) { |
| + CustomTabsCallback callback = getCallbackForSession(session); |
| if (callback == null) return false; |
| try { |
| callback.onNavigationEvent(navigationEvent, null); |
| @@ -447,7 +439,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| * @param intent Intent describing the service to bind to. |
| * @return true for success. |
| */ |
| - boolean keepAliveForSession(IBinder session, Intent intent) { |
| + boolean keepAliveForSession(CustomTabsSessionToken session, Intent intent) { |
| // When an application is bound to a service, its priority is raised to |
| // be at least equal to the application's one. This binds to a dummy |
| // service (no calls to this service are made). |
| @@ -492,7 +484,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| * |
| * @param session The Binder object identifying the session. |
| */ |
| - void dontKeepAliveForSession(IBinder session) { |
| + void dontKeepAliveForSession(CustomTabsSessionToken session) { |
| SessionParams sessionParams; |
| synchronized (mLock) { |
| sessionParams = mSessionParams.get(session); |
| @@ -566,17 +558,17 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| @VisibleForTesting |
| void cleanupAll() { |
| - synchronized (mLock) { |
| - List<IBinder> sessions = new ArrayList<>(mSessionParams.keySet()); |
| - for (IBinder session : sessions) cleanupAlreadyLocked(session); |
| - } |
| + List<CustomTabsSessionToken> sessions = new ArrayList<>(mSessionParams.keySet()); |
| + for (CustomTabsSessionToken session : sessions) cleanupSession(session); |
| } |
| /** |
| * Called when a remote client has died. |
| */ |
| - private void cleanupAlreadyLocked(IBinder session) { |
| - mSessionParams.remove(session); |
| + void cleanupSession(CustomTabsSessionToken session) { |
| + synchronized (mLock) { |
| + mSessionParams.remove(session); |
| + } |
| if (mPrerender != null && session.equals(mPrerender.mSession)) { |
| prerenderUrl(session, null, null); // Cancels the pre-render. |
|
Benoit L
2015/08/21 11:20:47
Has we have discovered recently, this needs to be
|
| } |
| @@ -591,7 +583,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
| return !cm.isActiveNetworkMetered(); |
| } |
| - private void prerenderUrl(IBinder session, String url, Bundle extras) { |
| + private void prerenderUrl(CustomTabsSessionToken session, String url, Bundle extras) { |
| ThreadUtils.assertOnUiThread(); |
| // TODO(lizeb): Prerendering through ChromePrerenderService is |
| // incompatible with prerendering through this service. Remove this |