[Media] Add logging to ResumeMediaBrowser for connections and
disconnections. I'm hoping this can tell us if SysUI has indeed not disconnected from some service. Bug: 225403871 Test: manual -- dumped log Change-Id: Iacb9b5b2df82759dc52d24311a063ec287460459
This commit is contained in:
@@ -218,6 +218,18 @@ public class LogModule {
|
||||
return factory.create("MediaTimeout", 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a buffer for our connections and disconnections to MediaBrowserService.
|
||||
*
|
||||
* See {@link com.android.systemui.media.ResumeMediaBrowser}.
|
||||
*/
|
||||
@Provides
|
||||
@SysUISingleton
|
||||
@MediaBrowserLog
|
||||
public static LogBuffer provideMediaBrowserBuffer(LogBufferFactory factory) {
|
||||
return factory.create("MediaBrowser", 100);
|
||||
}
|
||||
|
||||
/** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */
|
||||
@Provides
|
||||
@SysUISingleton
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.log.dagger;
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
|
||||
import com.android.systemui.log.LogBuffer;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.Retention;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* A {@link LogBuffer} for {@link com.android.systemui.media.ResumeMediaBrowser}
|
||||
*/
|
||||
@Qualifier
|
||||
@Documented
|
||||
@Retention(RUNTIME)
|
||||
public @interface MediaBrowserLog {
|
||||
}
|
||||
@@ -49,9 +49,11 @@ public class ResumeMediaBrowser {
|
||||
private static final String TAG = "ResumeMediaBrowser";
|
||||
private final Context mContext;
|
||||
@Nullable private final Callback mCallback;
|
||||
private MediaBrowserFactory mBrowserFactory;
|
||||
private final MediaBrowserFactory mBrowserFactory;
|
||||
private final ResumeMediaBrowserLogger mLogger;
|
||||
private final ComponentName mComponentName;
|
||||
|
||||
private MediaBrowser mMediaBrowser;
|
||||
private ComponentName mComponentName;
|
||||
|
||||
/**
|
||||
* Initialize a new media browser
|
||||
@@ -59,12 +61,17 @@ public class ResumeMediaBrowser {
|
||||
* @param callback used to report media items found
|
||||
* @param componentName Component name of the MediaBrowserService this browser will connect to
|
||||
*/
|
||||
public ResumeMediaBrowser(Context context, @Nullable Callback callback,
|
||||
ComponentName componentName, MediaBrowserFactory browserFactory) {
|
||||
public ResumeMediaBrowser(
|
||||
Context context,
|
||||
@Nullable Callback callback,
|
||||
ComponentName componentName,
|
||||
MediaBrowserFactory browserFactory,
|
||||
ResumeMediaBrowserLogger logger) {
|
||||
mContext = context;
|
||||
mCallback = callback;
|
||||
mComponentName = componentName;
|
||||
mBrowserFactory = browserFactory;
|
||||
mLogger = logger;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -76,7 +83,6 @@ public class ResumeMediaBrowser {
|
||||
* ResumeMediaBrowser#disconnect will be called automatically with this function.
|
||||
*/
|
||||
public void findRecentMedia() {
|
||||
Log.d(TAG, "Connecting to " + mComponentName);
|
||||
disconnect();
|
||||
Bundle rootHints = new Bundle();
|
||||
rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true);
|
||||
@@ -84,6 +90,7 @@ public class ResumeMediaBrowser {
|
||||
mComponentName,
|
||||
mConnectionCallback,
|
||||
rootHints);
|
||||
mLogger.logConnection(mComponentName, "findRecentMedia");
|
||||
mMediaBrowser.connect();
|
||||
}
|
||||
|
||||
@@ -196,6 +203,7 @@ public class ResumeMediaBrowser {
|
||||
*/
|
||||
protected void disconnect() {
|
||||
if (mMediaBrowser != null) {
|
||||
mLogger.logDisconnect(mComponentName);
|
||||
mMediaBrowser.disconnect();
|
||||
}
|
||||
mMediaBrowser = null;
|
||||
@@ -251,6 +259,7 @@ public class ResumeMediaBrowser {
|
||||
disconnect();
|
||||
}
|
||||
}, rootHints);
|
||||
mLogger.logConnection(mComponentName, "restart");
|
||||
mMediaBrowser.connect();
|
||||
}
|
||||
|
||||
@@ -296,6 +305,7 @@ public class ResumeMediaBrowser {
|
||||
mComponentName,
|
||||
mConnectionCallback,
|
||||
rootHints);
|
||||
mLogger.logConnection(mComponentName, "testConnection");
|
||||
mMediaBrowser.connect();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,14 @@ import javax.inject.Inject;
|
||||
public class ResumeMediaBrowserFactory {
|
||||
private final Context mContext;
|
||||
private final MediaBrowserFactory mBrowserFactory;
|
||||
private final ResumeMediaBrowserLogger mLogger;
|
||||
|
||||
@Inject
|
||||
public ResumeMediaBrowserFactory(Context context, MediaBrowserFactory browserFactory) {
|
||||
public ResumeMediaBrowserFactory(
|
||||
Context context, MediaBrowserFactory browserFactory, ResumeMediaBrowserLogger logger) {
|
||||
mContext = context;
|
||||
mBrowserFactory = browserFactory;
|
||||
mLogger = logger;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -43,6 +46,6 @@ public class ResumeMediaBrowserFactory {
|
||||
*/
|
||||
public ResumeMediaBrowser create(ResumeMediaBrowser.Callback callback,
|
||||
ComponentName componentName) {
|
||||
return new ResumeMediaBrowser(mContext, callback, componentName, mBrowserFactory);
|
||||
return new ResumeMediaBrowser(mContext, callback, componentName, mBrowserFactory, mLogger);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.media
|
||||
|
||||
import android.content.ComponentName
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.log.LogBuffer
|
||||
import com.android.systemui.log.LogLevel
|
||||
import com.android.systemui.log.dagger.MediaBrowserLog
|
||||
import javax.inject.Inject
|
||||
|
||||
/** A logger for events in [ResumeMediaBrowser]. */
|
||||
@SysUISingleton
|
||||
class ResumeMediaBrowserLogger @Inject constructor(
|
||||
@MediaBrowserLog private val buffer: LogBuffer
|
||||
) {
|
||||
/** Logs that we've initiated a connection to a [android.media.browse.MediaBrowser]. */
|
||||
fun logConnection(componentName: ComponentName, reason: String) = buffer.log(
|
||||
TAG,
|
||||
LogLevel.DEBUG,
|
||||
{
|
||||
str1 = componentName.toShortString()
|
||||
str2 = reason
|
||||
},
|
||||
{ "Connecting browser for component $str1 due to $str2" }
|
||||
)
|
||||
|
||||
/** Logs that we've disconnected from a [android.media.browse.MediaBrowser]. */
|
||||
fun logDisconnect(componentName: ComponentName) = buffer.log(
|
||||
TAG,
|
||||
LogLevel.DEBUG,
|
||||
{
|
||||
str1 = componentName.toShortString()
|
||||
},
|
||||
{ "Disconnecting browser for component $str1" }
|
||||
)
|
||||
}
|
||||
|
||||
private const val TAG = "MediaBrowser"
|
||||
@@ -63,6 +63,7 @@ public class ResumeMediaBrowserTest : SysuiTestCase() {
|
||||
@Mock lateinit var callback: ResumeMediaBrowser.Callback
|
||||
@Mock lateinit var listener: MediaResumeListener
|
||||
@Mock lateinit var service: MediaBrowserService
|
||||
@Mock lateinit var logger: ResumeMediaBrowserLogger
|
||||
@Mock lateinit var browserFactory: MediaBrowserFactory
|
||||
@Mock lateinit var browser: MediaBrowser
|
||||
@Mock lateinit var token: MediaSession.Token
|
||||
@@ -81,8 +82,14 @@ public class ResumeMediaBrowserTest : SysuiTestCase() {
|
||||
|
||||
whenever(mediaController.transportControls).thenReturn(transportControls)
|
||||
|
||||
resumeBrowser = TestableResumeMediaBrowser(context, callback, component, browserFactory,
|
||||
mediaController)
|
||||
resumeBrowser = TestableResumeMediaBrowser(
|
||||
context,
|
||||
callback,
|
||||
component,
|
||||
browserFactory,
|
||||
logger,
|
||||
mediaController
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -282,8 +289,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() {
|
||||
callback: Callback,
|
||||
componentName: ComponentName,
|
||||
browserFactory: MediaBrowserFactory,
|
||||
logger: ResumeMediaBrowserLogger,
|
||||
private val fakeController: MediaController
|
||||
) : ResumeMediaBrowser(context, callback, componentName, browserFactory) {
|
||||
) : ResumeMediaBrowser(context, callback, componentName, browserFactory, logger) {
|
||||
|
||||
override fun createMediaController(token: MediaSession.Token): MediaController {
|
||||
return fakeController
|
||||
|
||||
Reference in New Issue
Block a user