Loading services/core/java/com/android/server/hdmi/HdmiCecController.java +15 −1 Original line number Diff line number Diff line Loading @@ -99,6 +99,11 @@ final class HdmiCecController { // Stores the local CEC devices in the system. Device type is used for key. private final SparseArray<HdmiCecLocalDevice> mLocalDevices = new SparseArray<>(); @IoThreadOnly private final HdmiLogger mIoThreadLogger = new HdmiLogger(TAG); @ServiceThreadOnly private final HdmiLogger mServiceThreadLogger = new HdmiLogger(TAG); // Private constructor. Use HdmiCecController.create(). private HdmiCecController(HdmiControlService service) { mService = service; Loading Loading @@ -202,6 +207,9 @@ final class HdmiCecController { } final int assignedAddress = logicalAddress; mIoThreadLogger.debug( String.format("New logical address for device [%d]: [preferred:%d, assigned:%d]", deviceType, preferredAddress, assignedAddress)); if (callback != null) { runOnServiceThread(new Runnable() { @Override Loading Loading @@ -438,6 +446,7 @@ final class HdmiCecController { allocated.add(address); } } mIoThreadLogger.debug("DevicePollingResult:" + allocated); if (callback != null) { runOnServiceThread(new Runnable() { @Override Loading Loading @@ -539,6 +548,7 @@ final class HdmiCecController { runOnIoThread(new Runnable() { @Override public void run() { mIoThreadLogger.debug("SendCommand:" + cecMessage); byte[] body = buildBody(cecMessage.getOpcode(), cecMessage.getParams()); int i = 0; int errorCode = Constants.SEND_RESULT_SUCCESS; Loading Loading @@ -572,7 +582,9 @@ final class HdmiCecController { @ServiceThreadOnly private void handleIncomingCecCommand(int srcAddress, int dstAddress, byte[] body) { assertRunOnServiceThread(); onReceiveCommand(HdmiCecMessageBuilder.of(srcAddress, dstAddress, body)); HdmiCecMessage command = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body); mServiceThreadLogger.debug("ReceiveCommand:" + command); onReceiveCommand(command); } /** Loading @@ -581,6 +593,8 @@ final class HdmiCecController { @ServiceThreadOnly private void handleHotplug(int port, boolean connected) { assertRunOnServiceThread(); mServiceThreadLogger.debug( "Hotplug event:[port:" + port + " , connected:" + connected + "]"); mService.onHotplug(port, connected); } Loading services/core/java/com/android/server/hdmi/HdmiCecMessage.java +133 −13 Original line number Diff line number Diff line Loading @@ -103,26 +103,146 @@ public final class HdmiCecMessage { switch (opcode) { case Constants.MESSAGE_FEATURE_ABORT: return "Feature Abort"; case Constants.MESSAGE_CEC_VERSION: return "CEC Version"; case Constants.MESSAGE_REQUEST_ARC_INITIATION: return "Request ARC Initiation"; case Constants.MESSAGE_REQUEST_ARC_TERMINATION: return "Request ARC Termination"; case Constants.MESSAGE_REPORT_ARC_INITIATED: return "Report ARC Initiated"; case Constants.MESSAGE_REPORT_ARC_TERMINATED: return "Report ARC Terminated"; case Constants.MESSAGE_IMAGE_VIEW_ON: return "Image View On"; case Constants.MESSAGE_TUNER_STEP_INCREMENT: return "Tuner Step Increment"; case Constants.MESSAGE_TUNER_STEP_DECREMENT: return "Tuner Step Decrement"; case Constants.MESSAGE_TUNER_DEVICE_STATUS: return "Tuner Device Staus"; case Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS: return "Give Tuner Device Status"; case Constants.MESSAGE_RECORD_ON: return "Record On"; case Constants.MESSAGE_RECORD_STATUS: return "Record Status"; case Constants.MESSAGE_RECORD_OFF: return "Record Off"; case Constants.MESSAGE_TEXT_VIEW_ON: return "Text View On"; case Constants.MESSAGE_RECORD_TV_SCREEN: return "Record Tv Screen"; case Constants.MESSAGE_GIVE_DECK_STATUS: return "Give Deck Status"; case Constants.MESSAGE_DECK_STATUS: return "Deck Status"; case Constants.MESSAGE_SET_MENU_LANGUAGE: return "Set Menu Language"; case Constants.MESSAGE_CLEAR_ANALOG_TIMER: return "Clear Analog Timer"; case Constants.MESSAGE_SET_ANALOG_TIMER: return "Set Analog Timer"; case Constants.MESSAGE_TIMER_STATUS: return "Timer Status"; case Constants.MESSAGE_STANDBY: return "Standby"; case Constants.MESSAGE_PLAY: return "Play"; case Constants.MESSAGE_DECK_CONTROL: return "Deck Control"; case Constants.MESSAGE_TIMER_CLEARED_STATUS: return "Timer Cleared Status"; case Constants.MESSAGE_USER_CONTROL_PRESSED: return "User Control Pressed"; case Constants.MESSAGE_USER_CONTROL_RELEASED: return "User Control Release"; case Constants.MESSAGE_GIVE_OSD_NAME: return "Give Osd Name"; case Constants.MESSAGE_SET_OSD_NAME: return "Set Osd Name"; case Constants.MESSAGE_SET_OSD_STRING: return "Set Osd String"; case Constants.MESSAGE_SET_TIMER_PROGRAM_TITLE: return "Set Timer Program Title"; case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST: return "System Audio Mode Request"; case Constants.MESSAGE_GIVE_AUDIO_STATUS: return "Give Audio Status"; case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE: return "System Audio Mode"; case Constants.MESSAGE_REPORT_AUDIO_STATUS: return "Report Audio Status"; case Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS: return "Give System Audio Mode Status"; case Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS: return "System Audio Mode Status"; case Constants.MESSAGE_ROUTING_CHANGE: return "Routing Change"; case Constants.MESSAGE_ROUTING_INFORMATION: return "Routing Information"; case Constants.MESSAGE_ACTIVE_SOURCE: return "Active Source"; case Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS: return "Give Physical Address"; case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS: return "Report Physical Address"; case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE: return "Request Active Source"; case Constants.MESSAGE_SET_STREAM_PATH: return "Set Stream Path"; case Constants.MESSAGE_DEVICE_VENDOR_ID: return "Device Vendor Id"; case Constants.MESSAGE_VENDOR_COMMAND: return "Vendor Commandn"; case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN: return "Vendor Remote Button Down"; case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP: return "Vendor Remote Button Up"; case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID: return "Give Device Vendor Id"; case Constants.MESSAGE_MENU_REQUEST: return "Menu REquest"; case Constants.MESSAGE_MENU_STATUS: return "Menu Status"; case Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS: return "Give Device Power Status"; case Constants.MESSAGE_VENDOR_COMMAND: return "Vendor Command"; case Constants.MESSAGE_REPORT_POWER_STATUS: return "Report Power Status"; case Constants.MESSAGE_GET_MENU_LANGUAGE: return "Get Menu Language"; case Constants.MESSAGE_SELECT_ANALOG_SERVICE: return "Select Analog Service"; case Constants.MESSAGE_SELECT_DIGITAL_SERVICE: return "Select Digital Service"; case Constants.MESSAGE_SET_DIGITAL_TIMER: return "Set Digital Timer"; case Constants.MESSAGE_CLEAR_DIGITAL_TIMER: return "Clear Digital Timer"; case Constants.MESSAGE_SET_AUDIO_RATE: return "Set Audio Rate"; case Constants.MESSAGE_INACTIVE_SOURCE: return "InActive Source"; case Constants.MESSAGE_CEC_VERSION: return "Cec Version"; case Constants.MESSAGE_GET_CEC_VERSION: return "Get Cec Version"; case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID: return "Vendor Command With ID"; return "Vendor Command With Id"; case Constants.MESSAGE_CLEAR_EXTERNAL_TIMER: return "Clear External Timer"; case Constants.MESSAGE_SET_EXTERNAL_TIMER: return "Set External Timer"; case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR: return "Repot Short Audio Descriptor"; case Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR: return "Request Short Audio Descriptor"; case Constants.MESSAGE_INITIATE_ARC: return "Initiate ARC"; case Constants.MESSAGE_REPORT_ARC_INITIATED: return "Report ARC Initiated"; case Constants.MESSAGE_REPORT_ARC_TERMINATED: return "Report ARC Terminated"; case Constants.MESSAGE_REQUEST_ARC_INITIATION: return "Request ARC Initiation"; case Constants.MESSAGE_REQUEST_ARC_TERMINATION: return "Request ARC Termination"; case Constants.MESSAGE_TERMINATE_ARC: return "Terminate ARC"; case Constants.MESSAGE_CDC_MESSAGE: return "Cdc Message"; case Constants.MESSAGE_ABORT: return "Abort"; default: return String.format("Opcode: %02X", opcode); } Loading services/core/java/com/android/server/hdmi/HdmiLogger.java +31 −17 Original line number Diff line number Diff line Loading @@ -31,13 +31,14 @@ final class HdmiLogger { // Logging duration for same error message. private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s private static final boolean DEBUG = false; // Key (String): log message. // Value (Pair(Long, Integer)): a pair of last log time millis and the number of logMessage. // Cache for warning. private final HashMap<String, Pair<Long, Integer>> mWarningTimingCache = new HashMap<>(); // Cache for error. private final HashMap<String, Pair<Long, Integer>> mErrorTimingCache = new HashMap<>(); private final String mTag; HdmiLogger(String tag) { Loading @@ -45,41 +46,54 @@ final class HdmiLogger { } void warning(String logMessage) { long curTime = SystemClock.uptimeMillis(); Pair<Long, Integer> timing = mWarningTimingCache.get(logMessage); if (shouldLogNow(timing, curTime)) { Slog.w(mTag, buildMessage(logMessage, timing)); mWarningTimingCache.put(logMessage, new Pair<>(curTime, 1)); } else { increaseLogCount(mWarningTimingCache, logMessage); String log = updateLog(mWarningTimingCache, logMessage); if (!log.isEmpty()) { Slog.w(mTag, log); } } void error(String logMessage) { String log = updateLog(mErrorTimingCache, logMessage); if (!log.isEmpty()) { Slog.e(mTag, log); } } void debug(String logMessage) { if (!DEBUG) { return; } Slog.d(mTag, logMessage); } private static String updateLog(HashMap<String, Pair<Long, Integer>> cache, String logMessage) { long curTime = SystemClock.uptimeMillis(); Pair<Long, Integer> timing = mErrorTimingCache.get(logMessage); Pair<Long, Integer> timing = cache.get(logMessage); if (shouldLogNow(timing, curTime)) { Slog.e(mTag, buildMessage(logMessage, timing)); mErrorTimingCache.put(logMessage, new Pair<>(curTime, 1)); String log = buildMessage(logMessage, timing); cache.put(logMessage, new Pair<>(curTime, 1)); return log; } else { increaseLogCount(mErrorTimingCache, logMessage); increaseLogCount(cache, logMessage); } return ""; } private String buildMessage(String message, @Nullable Pair<Long, Integer> timing) { private static String buildMessage(String message, @Nullable Pair<Long, Integer> timing) { return new StringBuilder() .append("[").append(timing == null ? 1 : timing.second).append("]:") .append(message).toString(); } private void increaseLogCount(HashMap<String, Pair<Long, Integer>> cache, String message) { private static void increaseLogCount(HashMap<String, Pair<Long, Integer>> cache, String message) { Pair<Long, Integer> timing = cache.get(message); if (timing != null) { cache.put(message, new Pair<>(timing.first, timing.second + 1)); } } private boolean shouldLogNow(@Nullable Pair<Long, Integer> timing, long curTime) { private static boolean shouldLogNow(@Nullable Pair<Long, Integer> timing, long curTime) { return timing == null || curTime - timing.first > ERROR_LOG_DURATTION_MILLIS; } } services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java +1 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction { private void setArcStatus(boolean enabled) { boolean wasEnabled = tv().setArcStatus(enabled); Slog.i(TAG, "Change arc status [old:" + wasEnabled + " ,new:" + enabled); Slog.i(TAG, "Change arc status [old:" + wasEnabled + ", new:" + enabled + "]"); // If enabled before and set to "disabled" and send <Report Arc Terminated> to // av reciever. Loading Loading
services/core/java/com/android/server/hdmi/HdmiCecController.java +15 −1 Original line number Diff line number Diff line Loading @@ -99,6 +99,11 @@ final class HdmiCecController { // Stores the local CEC devices in the system. Device type is used for key. private final SparseArray<HdmiCecLocalDevice> mLocalDevices = new SparseArray<>(); @IoThreadOnly private final HdmiLogger mIoThreadLogger = new HdmiLogger(TAG); @ServiceThreadOnly private final HdmiLogger mServiceThreadLogger = new HdmiLogger(TAG); // Private constructor. Use HdmiCecController.create(). private HdmiCecController(HdmiControlService service) { mService = service; Loading Loading @@ -202,6 +207,9 @@ final class HdmiCecController { } final int assignedAddress = logicalAddress; mIoThreadLogger.debug( String.format("New logical address for device [%d]: [preferred:%d, assigned:%d]", deviceType, preferredAddress, assignedAddress)); if (callback != null) { runOnServiceThread(new Runnable() { @Override Loading Loading @@ -438,6 +446,7 @@ final class HdmiCecController { allocated.add(address); } } mIoThreadLogger.debug("DevicePollingResult:" + allocated); if (callback != null) { runOnServiceThread(new Runnable() { @Override Loading Loading @@ -539,6 +548,7 @@ final class HdmiCecController { runOnIoThread(new Runnable() { @Override public void run() { mIoThreadLogger.debug("SendCommand:" + cecMessage); byte[] body = buildBody(cecMessage.getOpcode(), cecMessage.getParams()); int i = 0; int errorCode = Constants.SEND_RESULT_SUCCESS; Loading Loading @@ -572,7 +582,9 @@ final class HdmiCecController { @ServiceThreadOnly private void handleIncomingCecCommand(int srcAddress, int dstAddress, byte[] body) { assertRunOnServiceThread(); onReceiveCommand(HdmiCecMessageBuilder.of(srcAddress, dstAddress, body)); HdmiCecMessage command = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body); mServiceThreadLogger.debug("ReceiveCommand:" + command); onReceiveCommand(command); } /** Loading @@ -581,6 +593,8 @@ final class HdmiCecController { @ServiceThreadOnly private void handleHotplug(int port, boolean connected) { assertRunOnServiceThread(); mServiceThreadLogger.debug( "Hotplug event:[port:" + port + " , connected:" + connected + "]"); mService.onHotplug(port, connected); } Loading
services/core/java/com/android/server/hdmi/HdmiCecMessage.java +133 −13 Original line number Diff line number Diff line Loading @@ -103,26 +103,146 @@ public final class HdmiCecMessage { switch (opcode) { case Constants.MESSAGE_FEATURE_ABORT: return "Feature Abort"; case Constants.MESSAGE_CEC_VERSION: return "CEC Version"; case Constants.MESSAGE_REQUEST_ARC_INITIATION: return "Request ARC Initiation"; case Constants.MESSAGE_REQUEST_ARC_TERMINATION: return "Request ARC Termination"; case Constants.MESSAGE_REPORT_ARC_INITIATED: return "Report ARC Initiated"; case Constants.MESSAGE_REPORT_ARC_TERMINATED: return "Report ARC Terminated"; case Constants.MESSAGE_IMAGE_VIEW_ON: return "Image View On"; case Constants.MESSAGE_TUNER_STEP_INCREMENT: return "Tuner Step Increment"; case Constants.MESSAGE_TUNER_STEP_DECREMENT: return "Tuner Step Decrement"; case Constants.MESSAGE_TUNER_DEVICE_STATUS: return "Tuner Device Staus"; case Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS: return "Give Tuner Device Status"; case Constants.MESSAGE_RECORD_ON: return "Record On"; case Constants.MESSAGE_RECORD_STATUS: return "Record Status"; case Constants.MESSAGE_RECORD_OFF: return "Record Off"; case Constants.MESSAGE_TEXT_VIEW_ON: return "Text View On"; case Constants.MESSAGE_RECORD_TV_SCREEN: return "Record Tv Screen"; case Constants.MESSAGE_GIVE_DECK_STATUS: return "Give Deck Status"; case Constants.MESSAGE_DECK_STATUS: return "Deck Status"; case Constants.MESSAGE_SET_MENU_LANGUAGE: return "Set Menu Language"; case Constants.MESSAGE_CLEAR_ANALOG_TIMER: return "Clear Analog Timer"; case Constants.MESSAGE_SET_ANALOG_TIMER: return "Set Analog Timer"; case Constants.MESSAGE_TIMER_STATUS: return "Timer Status"; case Constants.MESSAGE_STANDBY: return "Standby"; case Constants.MESSAGE_PLAY: return "Play"; case Constants.MESSAGE_DECK_CONTROL: return "Deck Control"; case Constants.MESSAGE_TIMER_CLEARED_STATUS: return "Timer Cleared Status"; case Constants.MESSAGE_USER_CONTROL_PRESSED: return "User Control Pressed"; case Constants.MESSAGE_USER_CONTROL_RELEASED: return "User Control Release"; case Constants.MESSAGE_GIVE_OSD_NAME: return "Give Osd Name"; case Constants.MESSAGE_SET_OSD_NAME: return "Set Osd Name"; case Constants.MESSAGE_SET_OSD_STRING: return "Set Osd String"; case Constants.MESSAGE_SET_TIMER_PROGRAM_TITLE: return "Set Timer Program Title"; case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST: return "System Audio Mode Request"; case Constants.MESSAGE_GIVE_AUDIO_STATUS: return "Give Audio Status"; case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE: return "System Audio Mode"; case Constants.MESSAGE_REPORT_AUDIO_STATUS: return "Report Audio Status"; case Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS: return "Give System Audio Mode Status"; case Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS: return "System Audio Mode Status"; case Constants.MESSAGE_ROUTING_CHANGE: return "Routing Change"; case Constants.MESSAGE_ROUTING_INFORMATION: return "Routing Information"; case Constants.MESSAGE_ACTIVE_SOURCE: return "Active Source"; case Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS: return "Give Physical Address"; case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS: return "Report Physical Address"; case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE: return "Request Active Source"; case Constants.MESSAGE_SET_STREAM_PATH: return "Set Stream Path"; case Constants.MESSAGE_DEVICE_VENDOR_ID: return "Device Vendor Id"; case Constants.MESSAGE_VENDOR_COMMAND: return "Vendor Commandn"; case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN: return "Vendor Remote Button Down"; case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP: return "Vendor Remote Button Up"; case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID: return "Give Device Vendor Id"; case Constants.MESSAGE_MENU_REQUEST: return "Menu REquest"; case Constants.MESSAGE_MENU_STATUS: return "Menu Status"; case Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS: return "Give Device Power Status"; case Constants.MESSAGE_VENDOR_COMMAND: return "Vendor Command"; case Constants.MESSAGE_REPORT_POWER_STATUS: return "Report Power Status"; case Constants.MESSAGE_GET_MENU_LANGUAGE: return "Get Menu Language"; case Constants.MESSAGE_SELECT_ANALOG_SERVICE: return "Select Analog Service"; case Constants.MESSAGE_SELECT_DIGITAL_SERVICE: return "Select Digital Service"; case Constants.MESSAGE_SET_DIGITAL_TIMER: return "Set Digital Timer"; case Constants.MESSAGE_CLEAR_DIGITAL_TIMER: return "Clear Digital Timer"; case Constants.MESSAGE_SET_AUDIO_RATE: return "Set Audio Rate"; case Constants.MESSAGE_INACTIVE_SOURCE: return "InActive Source"; case Constants.MESSAGE_CEC_VERSION: return "Cec Version"; case Constants.MESSAGE_GET_CEC_VERSION: return "Get Cec Version"; case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID: return "Vendor Command With ID"; return "Vendor Command With Id"; case Constants.MESSAGE_CLEAR_EXTERNAL_TIMER: return "Clear External Timer"; case Constants.MESSAGE_SET_EXTERNAL_TIMER: return "Set External Timer"; case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR: return "Repot Short Audio Descriptor"; case Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR: return "Request Short Audio Descriptor"; case Constants.MESSAGE_INITIATE_ARC: return "Initiate ARC"; case Constants.MESSAGE_REPORT_ARC_INITIATED: return "Report ARC Initiated"; case Constants.MESSAGE_REPORT_ARC_TERMINATED: return "Report ARC Terminated"; case Constants.MESSAGE_REQUEST_ARC_INITIATION: return "Request ARC Initiation"; case Constants.MESSAGE_REQUEST_ARC_TERMINATION: return "Request ARC Termination"; case Constants.MESSAGE_TERMINATE_ARC: return "Terminate ARC"; case Constants.MESSAGE_CDC_MESSAGE: return "Cdc Message"; case Constants.MESSAGE_ABORT: return "Abort"; default: return String.format("Opcode: %02X", opcode); } Loading
services/core/java/com/android/server/hdmi/HdmiLogger.java +31 −17 Original line number Diff line number Diff line Loading @@ -31,13 +31,14 @@ final class HdmiLogger { // Logging duration for same error message. private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s private static final boolean DEBUG = false; // Key (String): log message. // Value (Pair(Long, Integer)): a pair of last log time millis and the number of logMessage. // Cache for warning. private final HashMap<String, Pair<Long, Integer>> mWarningTimingCache = new HashMap<>(); // Cache for error. private final HashMap<String, Pair<Long, Integer>> mErrorTimingCache = new HashMap<>(); private final String mTag; HdmiLogger(String tag) { Loading @@ -45,41 +46,54 @@ final class HdmiLogger { } void warning(String logMessage) { long curTime = SystemClock.uptimeMillis(); Pair<Long, Integer> timing = mWarningTimingCache.get(logMessage); if (shouldLogNow(timing, curTime)) { Slog.w(mTag, buildMessage(logMessage, timing)); mWarningTimingCache.put(logMessage, new Pair<>(curTime, 1)); } else { increaseLogCount(mWarningTimingCache, logMessage); String log = updateLog(mWarningTimingCache, logMessage); if (!log.isEmpty()) { Slog.w(mTag, log); } } void error(String logMessage) { String log = updateLog(mErrorTimingCache, logMessage); if (!log.isEmpty()) { Slog.e(mTag, log); } } void debug(String logMessage) { if (!DEBUG) { return; } Slog.d(mTag, logMessage); } private static String updateLog(HashMap<String, Pair<Long, Integer>> cache, String logMessage) { long curTime = SystemClock.uptimeMillis(); Pair<Long, Integer> timing = mErrorTimingCache.get(logMessage); Pair<Long, Integer> timing = cache.get(logMessage); if (shouldLogNow(timing, curTime)) { Slog.e(mTag, buildMessage(logMessage, timing)); mErrorTimingCache.put(logMessage, new Pair<>(curTime, 1)); String log = buildMessage(logMessage, timing); cache.put(logMessage, new Pair<>(curTime, 1)); return log; } else { increaseLogCount(mErrorTimingCache, logMessage); increaseLogCount(cache, logMessage); } return ""; } private String buildMessage(String message, @Nullable Pair<Long, Integer> timing) { private static String buildMessage(String message, @Nullable Pair<Long, Integer> timing) { return new StringBuilder() .append("[").append(timing == null ? 1 : timing.second).append("]:") .append(message).toString(); } private void increaseLogCount(HashMap<String, Pair<Long, Integer>> cache, String message) { private static void increaseLogCount(HashMap<String, Pair<Long, Integer>> cache, String message) { Pair<Long, Integer> timing = cache.get(message); if (timing != null) { cache.put(message, new Pair<>(timing.first, timing.second + 1)); } } private boolean shouldLogNow(@Nullable Pair<Long, Integer> timing, long curTime) { private static boolean shouldLogNow(@Nullable Pair<Long, Integer> timing, long curTime) { return timing == null || curTime - timing.first > ERROR_LOG_DURATTION_MILLIS; } }
services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java +1 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction { private void setArcStatus(boolean enabled) { boolean wasEnabled = tv().setArcStatus(enabled); Slog.i(TAG, "Change arc status [old:" + wasEnabled + " ,new:" + enabled); Slog.i(TAG, "Change arc status [old:" + wasEnabled + ", new:" + enabled + "]"); // If enabled before and set to "disabled" and send <Report Arc Terminated> to // av reciever. Loading