Merge changes from topic "Fixing CF Auto audiocontrol" into rvc-dev

* changes:
  Updating to audiocontrol@2.0
  Including default implementation of audiocontrol@1.0
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index a9e295f..c11852f 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -49,15 +49,15 @@
     }
   }
 
-  ssize_t SendAll(const std::vector<char>& packet) {
+  ssize_t SendAll(const char* packet, ssize_t length) {
     ssize_t written{};
-    while (written < static_cast<ssize_t>(packet.size())) {
+    while (written < length) {
       if (!socket_->IsOpen()) {
         return -1;
       }
       auto just_written =
-          socket_->Send(packet.data() + written,
-                        packet.size() - written, MSG_NOSIGNAL);
+          socket_->Send(packet + written,
+                        length - written, MSG_NOSIGNAL);
       if (just_written <= 0) {
         LOG(INFO) << "Couldn't write to client: "
                   << strerror(socket_->GetErrno());
@@ -82,13 +82,14 @@
   SocketReceiver(const SocketReceiver&&) = delete;
   SocketReceiver& operator=(const SocketReceiver&) = delete;
 
-  // *packet will be empty if Read returns 0 or error
-  void Recv(std::vector<char>* packet) {
-    auto size = socket_->Read(packet->data(), packet->size());
+  // return value will be 0 if Read returns 0 or error
+  ssize_t Recv(char* packet, ssize_t length) {
+    auto size = socket_->Read(packet, length);
     if (size < 0) {
       size = 0;
     }
-    packet->resize(size);
+
+    return size;
   }
 
  private:
@@ -97,10 +98,11 @@
 
 void SocketToVsock(SocketReceiver socket_receiver,
                    SocketSender vsock_sender) {
+  char packet[kMaxPacketSize] = {};
+
   while (true) {
-    std::vector<char> packet(kMaxPacketSize, '\0');
-    socket_receiver.Recv(&packet);
-    if (packet.empty() || vsock_sender.SendAll(packet) < 0) {
+    ssize_t length = socket_receiver.Recv(packet, kMaxPacketSize);
+    if (length == 0 || vsock_sender.SendAll(packet, length) < 0) {
       break;
     }
   }
@@ -109,13 +111,14 @@
 
 void VsockToSocket(SocketSender socket_sender,
                    SocketReceiver vsock_receiver) {
-  std::vector<char> packet(kMaxPacketSize, '\0');
+  char packet[kMaxPacketSize] = {};
+
   while (true) {
-    vsock_receiver.Recv(&packet);
-    if (packet.empty()) {
+    ssize_t length = vsock_receiver.Recv(packet, kMaxPacketSize);
+    if (length == 0) {
       break;
     }
-    if (socket_sender.SendAll(packet) < 0) {
+    if (socket_sender.SendAll(packet, length) < 0) {
       break;
     }
   }
diff --git a/guest/monitoring/cuttlefish_service/Android.mk b/guest/monitoring/cuttlefish_service/Android.mk
index 2540ef5..b08adaf 100644
--- a/guest/monitoring/cuttlefish_service/Android.mk
+++ b/guest/monitoring/cuttlefish_service/Android.mk
@@ -15,12 +15,12 @@
 LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
-LOCAL_CERTIFICATE := platform
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := $(call all-java-files-under, java)
 LOCAL_STATIC_JAVA_LIBRARIES := guava
 LOCAL_PACKAGE_NAME := CuttlefishService
 LOCAL_SDK_VERSION := 28
+LOCAL_PRIVILEGED_MODULE := true
 LOCAL_PROGUARD_FLAGS := -include build/core/proguard.flags
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 LOCAL_PROGUARD_ENABLED := obfuscation
diff --git a/guest/monitoring/cuttlefish_service/AndroidManifest.xml b/guest/monitoring/cuttlefish_service/AndroidManifest.xml
index 85abd09..428445a 100644
--- a/guest/monitoring/cuttlefish_service/AndroidManifest.xml
+++ b/guest/monitoring/cuttlefish_service/AndroidManifest.xml
@@ -1,21 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.google.gce.gceservice"
-    android:sharedUserId="android.uid.system">
+    package="com.android.google.gce.gceservice">
 
     <uses-sdk android:minSdkVersion="5" />
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
-    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
-    <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
-    <uses-permission android:name="android.permission.DUMP" />
 
     <application
         android:label="GceService"
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
index 754eb8f..7b8d864 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
@@ -20,10 +20,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
 import android.util.Log;
 
-import com.android.google.gce.gceservice.GceService;
 
 public class GceBroadcastReceiver extends BroadcastReceiver {
     private static final String LOG_TAG = "GceBroadcastReceiver";
@@ -32,7 +30,7 @@
     private void reportIntent(Context context, String intentType) {
         Intent intent = new Intent(context, GceService.class);
         intent.setAction(intentType);
-        context.startService(intent);
+        context.startForegroundService(intent);
     }
 
 
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
index b070377..34f3b1a 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
@@ -15,13 +15,16 @@
  */
 package com.android.google.gce.gceservice;
 
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.util.Log;
-import android.os.Binder;
 import android.os.IBinder;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -37,11 +40,12 @@
     public static final String INTENT_ACTION_CONFIGURE = "com.android.google.gce.gceservice.CONFIGURE";
     public static final String INTENT_ACTION_NETWORK_CHANGED = "com.android.google.gce.gceservice.NETWORK_CHANGED";
     public static final String INTENT_ACTION_BLUETOOTH_CHANGED = "com.android.google.gce.gceservice.BLUETOOTH_CHANGED";
-    private static final int NETWORK_OR_BOOT_TIMEOUT = 30;
+    private static final String NOTIFICATION_CHANNEL_ID = "cuttlefish-service";
+    private static final String NOTIFICATION_CHANNEL_NAME = "Cuttlefish Service";
+    private static final int NOTIFICATION_ID = 1;
 
     private final JobExecutor mExecutor = new JobExecutor();
     private final LocationServicesManager mLocationServices = new LocationServicesManager(this);
-    private final PackageVerifierManager mPackageVerifier = new PackageVerifierManager(this);
     private final PackageVerificationConsentEnforcer mConsentEnforcer = new PackageVerificationConsentEnforcer(this);
     private final BootReporter mBootReporter = new BootReporter();
     private final GceBroadcastReceiver mBroadcastReceiver = new GceBroadcastReceiver();
@@ -66,7 +70,6 @@
             mWifiManager = new GceWifiManager(this, mBootReporter, mExecutor);
 
             mExecutor.schedule(mLocationServices);
-            mExecutor.schedule(mPackageVerifier);
             mExecutor.schedule(mConsentEnforcer);
             mExecutor.schedule(mWifiManager);
             mExecutor.schedule(mBluetoothChecker);
@@ -77,10 +80,19 @@
 
             mExecutor.schedule(mBootReporter,
                     mLocationServices.getLocationServicesReady(),
-                    mPackageVerifier.getPackageVerifierReady(),
                     mBluetoothChecker.getEnabled()
                     // mTombstoneChecker.getTombstoneResult()
                     );
+
+            NotificationManager notificationManager =
+                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+            NotificationChannel channel =
+                    new NotificationChannel(
+                            NOTIFICATION_CHANNEL_ID,
+                            NOTIFICATION_CHANNEL_NAME,
+                            NotificationManager.IMPORTANCE_LOW);
+            notificationManager.createNotificationChannel(channel);
+
         } catch (Exception e) {
             Log.e(LOG_TAG, "Exception caught", e);
         }
@@ -120,6 +132,15 @@
             Log.e(LOG_TAG, "Missing intent action.");
         }
 
+        Notification notification =
+                new Notification.Builder(this, NOTIFICATION_CHANNEL_ID)
+                        .setAutoCancel(true)
+                        .setContentTitle("Cuttlefish service is running.")
+                        .setSmallIcon(android.R.drawable.ic_dialog_info)
+                        .setTimeoutAfter(10000)
+                        .build();
+        startForeground(NOTIFICATION_ID, notification);
+
         if (INTENT_ACTION_CONFIGURE.equals(mMostRecentAction)) {
             mExecutor.schedule(mConnChecker);
         } else if (INTENT_ACTION_NETWORK_CHANGED.equals(mMostRecentAction)) {
@@ -128,10 +149,17 @@
             mExecutor.schedule(mBluetoothChecker);
         }
 
+        stopForeground(Service.STOP_FOREGROUND_DETACH);
+
         /* If anything goes wrong, make sure we receive intent again. */
         return Service.START_STICKY;
     }
 
+    @Override
+    public void onDestroy() {
+        unregisterReceiver(mBroadcastReceiver);
+    }
+
     /** Dump the virtual device state
      */
     @Override
@@ -145,8 +173,6 @@
         pw.println("Current system service state:");
         pw.println("  Location service ready: "
             + mLocationServices.getLocationServicesReady().isDone());
-        pw.println("  Package verifier ready: "
-            + mPackageVerifier.getPackageVerifierReady().isDone());
         pw.println("  Network connected: " + mConnChecker.getConnected().isDone());
         pw.println("  WiFi configured: " + mWifiManager.getWifiReady().isDone());
         pw.println("  Bluetooth enabled: " + mBluetoothChecker.getEnabled().isDone());
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java
deleted file mode 100644
index e10845a..0000000
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2017 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.google.gce.gceservice;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.util.Log;
-
-/**
- * Disable package verifier.
- */
-public class PackageVerifierManager extends JobBase {
-    private static final String LOG_TAG = "GcePackageVerifierManager";
-    private static final String SETTING_PACKAGE_VERIFIER_ENABLE = "verifier_verify_adb_installs";
-    private final Context mContext;
-    private final GceFuture<Boolean> mResult =
-            new GceFuture<Boolean>("Package Verifier");
-
-
-    PackageVerifierManager(Context context) {
-        super(LOG_TAG);
-        mContext = context;
-    }
-
-
-    private boolean getAndLogPackageVerifierState() {
-        int package_verifier_state = 1;
-        try {
-            ContentResolver contentResolver = mContext.getContentResolver();
-            package_verifier_state = Settings.Secure.getInt(contentResolver, SETTING_PACKAGE_VERIFIER_ENABLE);
-        } catch (SettingNotFoundException e) {
-            Log.w(LOG_TAG, "Could not read package verifier state. Assuming it's enabled.");
-        }
-
-        return package_verifier_state != 0;
-    }
-
-
-    public int execute() {
-        if (getAndLogPackageVerifierState()) {
-            Settings.Secure.putInt(mContext.getContentResolver(), SETTING_PACKAGE_VERIFIER_ENABLE, 0);
-            // One more call, just to log the state.
-            getAndLogPackageVerifierState();
-        }
-
-        mResult.set(true);
-        return 0;
-    }
-
-
-    public void onDependencyFailed(Exception e) {
-        Log.e(LOG_TAG, "Could not disable Package Verifier.", e);
-        mResult.set(e);
-    }
-
-
-    public GceFuture<Boolean> getPackageVerifierReady() {
-        return mResult;
-    }
-}
diff --git a/shared/BoardConfig.mk b/shared/BoardConfig.mk
index eccf70c..fc71c01 100644
--- a/shared/BoardConfig.mk
+++ b/shared/BoardConfig.mk
@@ -21,9 +21,6 @@
 include build/make/target/board/BoardConfigMainlineCommon.mk
 
 # Reset CF unsupported settings
-TARGET_NO_RECOVERY := false
-BOARD_USES_SYSTEM_OTHER_ODEX :=
-WITH_DEXPREOPT := true
 BOARD_AVB_ENABLE := false
 
 
diff --git a/shared/config/init.vendor.rc b/shared/config/init.vendor.rc
index 2e5d3af..7c9be5d 100644
--- a/shared/config/init.vendor.rc
+++ b/shared/config/init.vendor.rc
@@ -9,6 +9,10 @@
 
     mount tracefs tracefs /sys/kernel/tracing
 
+    # For KCOV
+    mount debugfs debugfs /sys/kernel/debug
+    chmod 0755 /sys/kernel/debug
+
     setprop ro.sf.lcd_density ${ro.boot.lcd_density}
     setprop ro.hardware.egl ${ro.boot.hardware.egl}
     setprop ro.hardware.gralloc ${ro.boot.hardware.gralloc}
diff --git a/shared/device.mk b/shared/device.mk
index c23337c..3250c27 100644
--- a/shared/device.mk
+++ b/shared/device.mk
@@ -77,9 +77,15 @@
 PRODUCT_PROPERTY_OVERRIDES += \
     wlan.driver.status=ok
 
+# Enforce privapp-permissions whitelist.
+PRODUCT_PROPERTY_OVERRIDES += ro.control_privapp_permissions=enforce
+
 # aes-256-heh default is not supported in standard kernels.
 PRODUCT_PROPERTY_OVERRIDES += ro.crypto.volume.filenames_mode=aes-256-cts
 
+# Copy preopted files from system_b on first boot
+PRODUCT_PROPERTY_OVERRIDES += ro.cp_system_other_odex=1
+
 PRODUCT_SOONG_NAMESPACES += hardware/google/camera
 PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
 
@@ -174,6 +180,7 @@
     device/google/cuttlefish/shared/config/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \
     device/google/cuttlefish/shared/config/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml \
     device/google/cuttlefish/shared/config/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml \
+    device/google/cuttlefish/shared/permissions/privapp-permissions-cuttlefish.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/privapp-permissions-cuttlefish.xml \
     frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
     frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
     frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \
diff --git a/shared/permissions/privapp-permissions-cuttlefish.xml b/shared/permissions/privapp-permissions-cuttlefish.xml
new file mode 100644
index 0000000..7c3dcaa
--- /dev/null
+++ b/shared/permissions/privapp-permissions-cuttlefish.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<permissions>
+    <privapp-permissions package="com.android.google.gce.gceservice">
+        <permission name="android.permission.ACCESS_NETWORK_STATE" />
+        <permission name="android.permission.ACCESS_WIFI_STATE" />
+        <permission name="android.permission.CHANGE_WIFI_STATE" />
+        <permission name="android.permission.FOREGROUND_SERVICE" />
+        <permission name="android.permission.INTERNET" />
+        <permission name="android.permission.RECEIVE_BOOT_COMPLETED" />
+        <permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
+        <permission name="android.permission.WRITE_SETTINGS" />
+        <permission name="android.permission.BLUETOOTH" />
+    </privapp-permissions>
+</permissions>
diff --git a/shared/sepolicy/vendor/hal_camera_default.te b/shared/sepolicy/vendor/hal_camera_default.te
index 79bed26..67c0ddc 100644
--- a/shared/sepolicy/vendor/hal_camera_default.te
+++ b/shared/sepolicy/vendor/hal_camera_default.te
@@ -5,3 +5,7 @@
 hal_client_domain(hal_camera_default, hal_graphics_allocator)
 
 get_prop(hal_camera_default, hal_camera_prop)
+
+# For camera hal to talk with sensor service
+binder_call(hal_camera_default, sensor_service_server)
+binder_call(sensor_service_server, hal_camera_default)
diff --git a/shared/sepolicy/vendor/seapp_contexts b/shared/sepolicy/vendor/seapp_contexts
index e325c99..820c416 100644
--- a/shared/sepolicy/vendor/seapp_contexts
+++ b/shared/sepolicy/vendor/seapp_contexts
@@ -1,2 +1,2 @@
 # GceService app
-user=system seinfo=platform name=com.android.google.gce.gceservice domain=gceservice type=app_data_file
+user=_app isPrivApp=true seinfo=default name=com.android.google.gce.gceservice domain=gceservice type=app_data_file