diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-07-19 23:15:01 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-07-19 23:15:01 +0000 |
commit | 408e00c407784b0edba484d8b3ad77aeb6090cff (patch) | |
tree | 9fbcdf514be25bfd168098b54c4c2c8a10c8cb58 | |
parent | 59fba3e446a4c6629df19fe9ab2e05dca0da2bac (diff) | |
parent | c29468777021f4970ab20b38601448fe81ecdcbb (diff) | |
download | base-408e00c407784b0edba484d8b3ad77aeb6090cff.tar.gz |
Snap for 6692658 from c29468777021f4970ab20b38601448fe81ecdcbb to rvc-release
Change-Id: I538293eb83bf3caf72bc986d7aad9f6a385c1f1b
12 files changed, 164 insertions, 17 deletions
diff --git a/media/java/android/media/MediaMetrics.java b/media/java/android/media/MediaMetrics.java index f6f482dd0cd3..eaf86bb3936c 100644 --- a/media/java/android/media/MediaMetrics.java +++ b/media/java/android/media/MediaMetrics.java @@ -53,6 +53,7 @@ public class MediaMetrics { public static final String AUDIO_SERVICE = AUDIO + SEPARATOR + "service"; public static final String AUDIO_VOLUME = AUDIO + SEPARATOR + "volume"; public static final String AUDIO_VOLUME_EVENT = AUDIO_VOLUME + SEPARATOR + "event"; + public static final String AUDIO_MODE = AUDIO + SEPARATOR + "mode"; } /** @@ -140,6 +141,10 @@ public class MediaMetrics { public static final Key<String> REQUEST = createKey("request", String.class); + // For audio mode + public static final Key<String> REQUESTED_MODE = + createKey("requestedMode", String.class); // audio_mode + // For Bluetooth public static final Key<String> SCO_AUDIO_MODE = createKey("scoAudioMode", String.class); diff --git a/packages/Shell/res/values-bn/strings.xml b/packages/Shell/res/values-bn/strings.xml index 39f62fe6a00a..ede125bce935 100644 --- a/packages/Shell/res/values-bn/strings.xml +++ b/packages/Shell/res/values-bn/strings.xml @@ -35,7 +35,7 @@ <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"জিপ ফাইলে ত্রুটি প্রতিবেদনের বিশদ বিবরণ যোগ করা যায়নি"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"বিশদ বিবরণ"</string> - <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্রিনশট"</string> + <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্রিনশট নিন"</string> <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্রিনশট সফলভাবে নেওয়া হয়েছে৷"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্রিনশট নেওয়া যায়নি৷"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ত্রুটির প্রতিবেদন <xliff:g id="ID">#%d</xliff:g> এর বিশদ বিবরণ"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index bb988350703f..08cf5d19d315 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -76,7 +76,7 @@ <string name="learn_more" msgid="4690632085667273811">"আরও জানুন"</string> <string name="compat_mode_on" msgid="4963711187149440884">"স্ক্রীণ পূরণ করতে জুম করুন"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ফুল স্ক্রিন করুন"</string> - <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্রিনশট"</string> + <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্রিনশট নিন"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"একটি ছবি পাঠানো হয়েছে"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"স্ক্রিনশট সেভ করা হচ্ছে..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্রিনশট সেভ করা হচ্ছে..."</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index be2637c6b5e2..f5330d3b2d6a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="4811759950673118541">"IU del sistema"</string> <string name="status_bar_clear_all_button" msgid="2491321682873657397">"Esborra"</string> - <string name="status_bar_no_notifications_title" msgid="7812479124981107507">"Cap notificació"</string> + <string name="status_bar_no_notifications_title" msgid="7812479124981107507">"No hi ha cap notificació"</string> <string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"Continu"</string> <string name="status_bar_latest_events_title" msgid="202755896454005436">"Notificacions"</string> <string name="battery_low_title" msgid="6891106956328275225">"És possible que la bateria s\'esgoti aviat"</string> @@ -517,7 +517,7 @@ <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string> - <string name="empty_shade_text" msgid="8935967157319717412">"Cap notificació"</string> + <string name="empty_shade_text" msgid="8935967157319717412">"No hi ha cap notificació"</string> <string name="profile_owned_footer" msgid="2756770645766113964">"El perfil es pot supervisar"</string> <string name="vpn_footer" msgid="3457155078010607471">"És possible que la xarxa estigui supervisada."</string> <string name="branded_vpn_footer" msgid="816930186313188514">"És possible que la xarxa estigui supervisada"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1f6000b4f49d..44c065672a6b 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -370,7 +370,7 @@ <string name="quick_settings_location_off_label" msgid="7923929131443915919">"जगह की जानकारी बंद है"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"मीडिया डिवाइस"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> - <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"केवल आपातकालीन कॉल"</string> + <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"सिर्फ़ आपातकालीन कॉल"</string> <string name="quick_settings_settings_label" msgid="2214639529565474534">"सेटिंग"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"समय"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"मुझे"</string> @@ -519,7 +519,7 @@ <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string> - <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं मिली"</string> + <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं है"</string> <string name="profile_owned_footer" msgid="2756770645766113964">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string> <string name="vpn_footer" msgid="3457155078010607471">"नेटवर्क को मॉनीटर किया जा सकता है"</string> <string name="branded_vpn_footer" msgid="816930186313188514">"नेटवर्क को मॉनिटर किया जा सकता है"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index cb4fade417f2..61a5d5d2f829 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -920,7 +920,7 @@ <string name="tuner_lock_screen" msgid="2267383813241144544">"מסך נעילה"</string> <string name="pip_phone_expand" msgid="1424988917240616212">"הרחב"</string> <string name="pip_phone_minimize" msgid="9057117033655996059">"מזער"</string> - <string name="pip_phone_close" msgid="8801864042095341824">"סגור"</string> + <string name="pip_phone_close" msgid="8801864042095341824">"סגירה"</string> <string name="pip_phone_settings" msgid="5687538631925004341">"הגדרות"</string> <string name="pip_phone_dismiss_hint" msgid="5825740708095316710">"גרור למטה כדי לסגור"</string> <string name="pip_menu_title" msgid="6365909306215631910">"תפריט"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 9b48c9bc3746..c804f22e296c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -294,7 +294,7 @@ <string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Vairāk laika."</string> <string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mazāk laika."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="7606563260714825190">"Apgaismojums ir izslēgts."</string> - <string name="accessibility_quick_settings_flashlight_unavailable" msgid="7458591827288347635">"Zibspuldze nav pieejama."</string> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="7458591827288347635">"Lukturītis nav pieejams."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"Apgaismojums ir ieslēgts."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Apgaismojums ir izslēgts."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Apgaismojums ir ieslēgts."</string> @@ -407,7 +407,7 @@ <item quantity="other">%d ierīces</item> </plurals> <string name="quick_settings_notifications_label" msgid="3379631363952582758">"Paziņojumi"</string> - <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Zibspuldze"</string> + <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lukturītis"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Kamera tiek lietota"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Mobilie dati"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="6105969068871138427">"Datu lietojums"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 14047c86eb6f..4449ca730245 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -992,7 +992,7 @@ <string name="slice_permission_deny" msgid="6870256451658176895">"Odmów"</string> <string name="auto_saver_title" msgid="6873691178754086596">"Kliknij, by zaplanować działanie oszczędzania baterii"</string> <string name="auto_saver_text" msgid="3214960308353838764">"Oszczędzanie baterii włącza się, jeśli bateria jest prawie wyczerpana"</string> - <string name="no_auto_saver_action" msgid="7467924389609773835">"Nie"</string> + <string name="no_auto_saver_action" msgid="7467924389609773835">"Nie, dziękuję"</string> <string name="auto_saver_enabled_title" msgid="4294726198280286333">"Harmonogram oszczędzania baterii jest aktywny"</string> <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Oszczędzanie baterii włączy się automatycznie, gdy poziom naładowania baterii spadnie poniżej <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"Ustawienia"</string> diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 5e908b26fafa..c4eca605206d 100755 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -283,6 +283,7 @@ public class AudioService extends IAudioService.Stub private static final int MSG_HDMI_VOLUME_CHECK = 28; private static final int MSG_PLAYBACK_CONFIG_CHANGE = 29; private static final int MSG_BROADCAST_MICROPHONE_MUTE = 30; + private static final int MSG_CHECK_MODE_FOR_UID = 31; // start of messages handled under wakelock // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) @@ -3679,12 +3680,14 @@ public class AudioService extends IAudioService.Stub private final IBinder mCb; // To be notified of client's death private final int mPid; private final int mUid; + private String mPackage; private int mMode = AudioSystem.MODE_NORMAL; // Current mode set by this client - SetModeDeathHandler(IBinder cb, int pid, int uid) { + SetModeDeathHandler(IBinder cb, int pid, int uid, String caller) { mCb = cb; mPid = pid; mUid = uid; + mPackage = caller; } public void binderDied() { @@ -3722,6 +3725,10 @@ public class AudioService extends IAudioService.Stub public int getUid() { return mUid; } + + public String getPackage() { + return mPackage; + } } /** @see AudioManager#setMode(int) */ @@ -3803,6 +3810,9 @@ public class AudioService extends IAudioService.Stub hdlr = h; // Remove from client list so that it is re-inserted at top of list iter.remove(); + if (hdlr.getMode() == AudioSystem.MODE_IN_COMMUNICATION) { + mAudioHandler.removeEqualMessages(MSG_CHECK_MODE_FOR_UID, hdlr); + } try { hdlr.getBinder().unlinkToDeath(hdlr, 0); if (cb != hdlr.getBinder()) { @@ -3833,7 +3843,7 @@ public class AudioService extends IAudioService.Stub } } else { if (hdlr == null) { - hdlr = new SetModeDeathHandler(cb, pid, uid); + hdlr = new SetModeDeathHandler(cb, pid, uid, caller); } // Register for client death notification try { @@ -3880,6 +3890,7 @@ public class AudioService extends IAudioService.Stub // Note: newModeOwnerPid is always 0 when actualMode is MODE_NORMAL mModeLogger.log( new PhoneStateEvent(caller, pid, mode, newModeOwnerPid, actualMode)); + int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE); int device = getDeviceForStream(streamType); int index = mStreamStates[mStreamVolumeAlias[streamType]].getIndex(device); @@ -3890,6 +3901,16 @@ public class AudioService extends IAudioService.Stub // change of mode may require volume to be re-applied on some devices updateAbsVolumeMultiModeDevices(oldMode, actualMode); + + if (actualMode == AudioSystem.MODE_IN_COMMUNICATION) { + sendMsg(mAudioHandler, + MSG_CHECK_MODE_FOR_UID, + SENDMSG_QUEUE, + 0, + 0, + hdlr, + CHECK_MODE_FOR_UID_PERIOD_MS); + } } return newModeOwnerPid; } @@ -6374,6 +6395,35 @@ public class AudioService extends IAudioService.Stub case MSG_BROADCAST_MICROPHONE_MUTE: mSystemServer.sendMicrophoneMuteChangedIntent(); break; + + case MSG_CHECK_MODE_FOR_UID: + synchronized (mDeviceBroker.mSetModeLock) { + if (msg.obj == null) { + break; + } + // If the app corresponding to this mode death handler object is not + // capturing or playing audio anymore after 3 seconds, remove it + // from the stack. Otherwise, check again in 3 seconds. + SetModeDeathHandler h = (SetModeDeathHandler) msg.obj; + if (mSetModeDeathHandlers.indexOf(h) < 0) { + break; + } + if (mRecordMonitor.isRecordingActiveForUid(h.getUid()) + || mPlaybackMonitor.isPlaybackActiveForUid(h.getUid())) { + sendMsg(mAudioHandler, + MSG_CHECK_MODE_FOR_UID, + SENDMSG_QUEUE, + 0, + 0, + h, + CHECK_MODE_FOR_UID_PERIOD_MS); + break; + } + // For now just log the fact that an app is hogging the audio mode. + // TODO(b/160260850): remove abusive app from audio mode stack. + mModeLogger.log(new PhoneStateEvent(h.getPackage(), h.getPid())); + } + break; } } } @@ -7017,6 +7067,8 @@ public class AudioService extends IAudioService.Stub private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000; // 1 minute polling interval private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; // 30s after boot completed + // check playback or record activity every 3 seconds for UIDs owning mode IN_COMMUNICATION + private static final int CHECK_MODE_FOR_UID_PERIOD_MS = 3000; private int safeMediaVolumeIndex(int device) { if (!mSafeMediaVolumeDevices.contains(device)) { diff --git a/services/core/java/com/android/server/audio/AudioServiceEvents.java b/services/core/java/com/android/server/audio/AudioServiceEvents.java index f3ff02f3aedc..0eb5a5d1fb48 100644 --- a/services/core/java/com/android/server/audio/AudioServiceEvents.java +++ b/services/core/java/com/android/server/audio/AudioServiceEvents.java @@ -27,28 +27,82 @@ import com.android.server.audio.AudioDeviceInventory.WiredDeviceConnectionState; public class AudioServiceEvents { final static class PhoneStateEvent extends AudioEventLogger.Event { + static final int MODE_SET = 0; + static final int MODE_IN_COMMUNICATION_TIMEOUT = 1; + + final int mOp; final String mPackage; final int mOwnerPid; final int mRequesterPid; final int mRequestedMode; final int mActualMode; + /** used for MODE_SET */ PhoneStateEvent(String callingPackage, int requesterPid, int requestedMode, int ownerPid, int actualMode) { + mOp = MODE_SET; mPackage = callingPackage; mRequesterPid = requesterPid; mRequestedMode = requestedMode; mOwnerPid = ownerPid; mActualMode = actualMode; + logMetricEvent(); + } + + /** used for MODE_IN_COMMUNICATION_TIMEOUT */ + PhoneStateEvent(String callingPackage, int ownerPid) { + mOp = MODE_IN_COMMUNICATION_TIMEOUT; + mPackage = callingPackage; + mOwnerPid = ownerPid; + mRequesterPid = 0; + mRequestedMode = 0; + mActualMode = 0; + logMetricEvent(); } @Override public String eventToString() { - return new StringBuilder("setMode(").append(AudioSystem.modeToString(mRequestedMode)) - .append(") from package=").append(mPackage) - .append(" pid=").append(mRequesterPid) - .append(" selected mode=").append(AudioSystem.modeToString(mActualMode)) - .append(" by pid=").append(mOwnerPid).toString(); + switch (mOp) { + case MODE_SET: + return new StringBuilder("setMode(") + .append(AudioSystem.modeToString(mRequestedMode)) + .append(") from package=").append(mPackage) + .append(" pid=").append(mRequesterPid) + .append(" selected mode=") + .append(AudioSystem.modeToString(mActualMode)) + .append(" by pid=").append(mOwnerPid).toString(); + case MODE_IN_COMMUNICATION_TIMEOUT: + return new StringBuilder("mode IN COMMUNICATION timeout") + .append(" for package=").append(mPackage) + .append(" pid=").append(mOwnerPid).toString(); + default: return new StringBuilder("FIXME invalid op:").append(mOp).toString(); + } + } + + /** + * Audio Analytics unique Id. + */ + private static final String mMetricsId = MediaMetrics.Name.AUDIO_MODE; + + private void logMetricEvent() { + switch (mOp) { + case MODE_SET: + new MediaMetrics.Item(mMetricsId) + .set(MediaMetrics.Property.EVENT, "set") + .set(MediaMetrics.Property.REQUESTED_MODE, + AudioSystem.modeToString(mRequestedMode)) + .set(MediaMetrics.Property.MODE, AudioSystem.modeToString(mActualMode)) + .set(MediaMetrics.Property.CALLING_PACKAGE, mPackage) + .record(); + return; + case MODE_IN_COMMUNICATION_TIMEOUT: + new MediaMetrics.Item(mMetricsId) + .set(MediaMetrics.Property.EVENT, "inCommunicationTimeout") + .set(MediaMetrics.Property.CALLING_PACKAGE, mPackage) + .record(); + return; + default: return; + } } } diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index 98f409ea98e7..a5778836aa6e 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -366,6 +366,23 @@ public final class PlaybackActivityMonitor releasePlayer(piid, 0); } + /** + * Returns true if a player belonging to the app with given uid is active. + * + * @param uid the app uid + * @return true if a player is active, false otherwise + */ + public boolean isPlaybackActiveForUid(int uid) { + synchronized (mPlayerLock) { + for (AudioPlaybackConfiguration apc : mPlayers.values()) { + if (apc.isActive() && apc.getClientUid() == uid) { + return true; + } + } + } + return false; + } + protected void dump(PrintWriter pw) { // players pw.println("\nPlaybackActivityMonitor dump time: " diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java index 32c6cc32a78d..ea0107ecfd23 100644 --- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java +++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java @@ -215,6 +215,25 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin dispatchCallbacks(updateSnapshot(AudioManager.RECORD_CONFIG_EVENT_RELEASE, riid, null)); } + /** + * Returns true if a recorder belonging to the app with given uid is active. + * + * @param uid the app uid + * @return true if a recorder is active, false otherwise + */ + public boolean isRecordingActiveForUid(int uid) { + synchronized (mRecordStates) { + for (RecordingState state : mRecordStates) { + // Note: isActiveConfiguration() == true => state.getConfig() != null + if (state.isActiveConfiguration() + && state.getConfig().getClientUid() == uid) { + return true; + } + } + } + return false; + } + private void dispatchCallbacks(List<AudioRecordingConfiguration> configs) { if (configs == null) { // null means "no changes" return; |