Keep preferred address for HdmiControlService

Uses SystemProperties to store/retrieve preferred logical address

Bug: 15843075
Bug: 15844858
Change-Id: Ie1304805cbec4e11ef4b44a5cceb108121c60581
This commit is contained in:
Jinsuk Kim
2014-07-11 18:43:04 +09:00
parent 3ed145f4be
commit af2acf0447
5 changed files with 50 additions and 16 deletions

View File

@@ -203,5 +203,8 @@ final class Constants {
// in config.xml to allow customization.
static final int IRT_MS = 300;
static final String PROPERTY_PREFERRED_ADDRESS_PLAYBACK = "hdmi_cec.preferred_address.playback";
static final String PROPERTY_PREFERRED_ADDRESS_TV = "hdmi_cec.preferred_address.tv";
private Constants() { /* cannot be instantiated */ }
}

View File

@@ -265,8 +265,6 @@ final class HdmiCecController {
@ServiceThreadOnly
void clearLogicalAddress() {
assertRunOnServiceThread();
// TODO: consider to backup logical address so that new logical address
// allocation can use it as preferred address.
for (int i = 0; i < mLocalDevices.size(); ++i) {
mLocalDevices.valueAt(i).clearAddress();
}

View File

@@ -20,6 +20,7 @@ import android.hardware.hdmi.HdmiCecDeviceInfo;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemProperties;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -108,8 +109,7 @@ abstract class HdmiCecLocalDevice {
@ServiceThreadOnly
void init() {
assertRunOnServiceThread();
mPreferredAddress = Constants.ADDR_UNREGISTERED;
// TODO: load preferred address from permanent storage.
mPreferredAddress = getPreferredAddress();
}
/**
@@ -117,6 +117,16 @@ abstract class HdmiCecLocalDevice {
*/
protected abstract void onAddressAllocated(int logicalAddress, boolean fromBootup);
/**
* Get the preferred logical address from system properties.
*/
protected abstract int getPreferredAddress();
/**
* Set the preferred logical address to system properties.
*/
protected abstract void setPreferredAddress(int addr);
/**
* Dispatch incoming message.
*
@@ -398,6 +408,7 @@ abstract class HdmiCecLocalDevice {
assertRunOnServiceThread();
mAddress = mPreferredAddress = logicalAddress;
onAddressAllocated(logicalAddress, fromBootup);
setPreferredAddress(logicalAddress);
}
@ServiceThreadOnly
@@ -426,18 +437,6 @@ abstract class HdmiCecLocalDevice {
mAddress = Constants.ADDR_UNREGISTERED;
}
@ServiceThreadOnly
void setPreferredAddress(int addr) {
assertRunOnServiceThread();
mPreferredAddress = addr;
}
@ServiceThreadOnly
int getPreferredAddress() {
assertRunOnServiceThread();
return mPreferredAddress;
}
@ServiceThreadOnly
void addAndStartAction(final FeatureAction action) {
assertRunOnServiceThread();

View File

@@ -20,6 +20,7 @@ import android.hardware.hdmi.HdmiCecDeviceInfo;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.IHdmiControlCallback;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.util.Slog;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
@@ -44,6 +45,22 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
mAddress, mService.getPhysicalAddress(), mDeviceType));
}
@Override
@ServiceThreadOnly
protected int getPreferredAddress() {
assertRunOnServiceThread();
return SystemProperties.getInt(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK,
Constants.ADDR_UNREGISTERED);
}
@Override
@ServiceThreadOnly
protected void setPreferredAddress(int addr) {
assertRunOnServiceThread();
SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_PLAYBACK,
String.valueOf(addr));
}
@ServiceThreadOnly
void oneTouchPlay(IHdmiControlCallback callback) {
assertRunOnServiceThread();

View File

@@ -26,6 +26,7 @@ import android.media.AudioPatch;
import android.media.AudioPort;
import android.media.AudioSystem;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings.Global;
import android.util.Slog;
@@ -108,6 +109,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
// TODO: unregister audio port update listener if local device is released.
}
@Override
@ServiceThreadOnly
protected int getPreferredAddress() {
assertRunOnServiceThread();
return SystemProperties.getInt(Constants.PROPERTY_PREFERRED_ADDRESS_TV,
Constants.ADDR_UNREGISTERED);
}
@Override
@ServiceThreadOnly
protected void setPreferredAddress(int addr) {
assertRunOnServiceThread();
SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_TV,
String.valueOf(addr));
}
private void registerAudioPortUpdateListener() {
mService.getAudioManager().registerAudioPortUpdateListener(
new OnAudioPortUpdateListener() {