Move unsolicited vold events to Binder.
Create IVoldListener and move most unsolicited vold events over to
this new interface. The remaining events will be routed through
method-specific listeners instead of a global one.
Move to upstream DISALLOW_COPY_AND_ASSIGN macro.
Test: cts-tradefed run commandAndExit cts-dev -m CtsAppSecurityHostTestCases -t android.appsecurity.cts.DirectBootHostTest
Test: cts-tradefed run commandAndExit cts-dev -m CtsAppSecurityHostTestCases -t android.appsecurity.cts.AdoptableHostTest
Test: cts-tradefed run commandAndExit cts-dev -m CtsOsTestCases -t android.os.storage.cts.StorageManagerTest
Bug: 13758960
Change-Id: Ib9293487db2d525a76b9b9c2e9ac18d98601c6cf
diff --git a/model/Disk.cpp b/model/Disk.cpp
index 9c22400..151937f 100644
--- a/model/Disk.cpp
+++ b/model/Disk.cpp
@@ -151,7 +151,12 @@
status_t Disk::create() {
CHECK(!mCreated);
mCreated = true;
+#if ENABLE_BINDER
+ auto listener = VolumeManager::Instance()->getListener();
+ if (listener) listener->onDiskCreated(getId(), mFlags);
+#else
notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags));
+#endif
readMetadata();
readPartitions();
return OK;
@@ -161,7 +166,12 @@
CHECK(mCreated);
destroyAllVolumes();
mCreated = false;
+#if ENABLE_BINDER
+ auto listener = VolumeManager::Instance()->getListener();
+ if (listener) listener->onDiskDestroyed(getId());
+#else
notifyEvent(ResponseCode::DiskDestroyed);
+#endif
return OK;
}
@@ -281,9 +291,15 @@
}
}
+#if ENABLE_BINDER
+ auto listener = VolumeManager::Instance()->getListener();
+ if (listener) listener->onDiskMetadataChanged(getId(),
+ mSize, mLabel, mSysPath);
+#else
notifyEvent(ResponseCode::DiskSizeChanged, StringPrintf("%" PRIu64, mSize));
notifyEvent(ResponseCode::DiskLabelChanged, mLabel);
notifyEvent(ResponseCode::DiskSysPathChanged, mSysPath);
+#endif
return OK;
}
@@ -306,7 +322,12 @@
status_t res = ForkExecvp(cmd, output);
if (res != OK) {
LOG(WARNING) << "sgdisk failed to scan " << mDevPath;
+#if ENABLE_BINDER
+ auto listener = VolumeManager::Instance()->getListener();
+ if (listener) listener->onDiskScanned(getId());
+#else
notifyEvent(ResponseCode::DiskScanned);
+#endif
mJustPartitioned = false;
return res;
}
@@ -372,7 +393,12 @@
}
}
+#if ENABLE_BINDER
+ auto listener = VolumeManager::Instance()->getListener();
+ if (listener) listener->onDiskScanned(getId());
+#else
notifyEvent(ResponseCode::DiskScanned);
+#endif
mJustPartitioned = false;
return OK;
}
diff --git a/model/PrivateVolume.cpp b/model/PrivateVolume.cpp
index e66e04d..9a96082 100644
--- a/model/PrivateVolume.cpp
+++ b/model/PrivateVolume.cpp
@@ -55,9 +55,14 @@
status_t PrivateVolume::readMetadata() {
status_t res = ReadMetadata(mDmDevPath, mFsType, mFsUuid, mFsLabel);
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeMetadataChanged(getId(), mFsType, mFsUuid, mFsLabel);
+#else
notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsType);
notifyEvent(ResponseCode::VolumeFsUuidChanged, mFsUuid);
notifyEvent(ResponseCode::VolumeFsLabelChanged, mFsLabel);
+#endif
return res;
}
diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp
index f976c4a..04bafed 100644
--- a/model/PublicVolume.cpp
+++ b/model/PublicVolume.cpp
@@ -53,9 +53,14 @@
status_t PublicVolume::readMetadata() {
status_t res = ReadMetadataUntrusted(mDevPath, mFsType, mFsUuid, mFsLabel);
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeMetadataChanged(getId(), mFsType, mFsUuid, mFsLabel);
+#else
notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsType);
notifyEvent(ResponseCode::VolumeFsUuidChanged, mFsUuid);
notifyEvent(ResponseCode::VolumeFsLabelChanged, mFsLabel);
+#endif
return res;
}
diff --git a/model/VolumeBase.cpp b/model/VolumeBase.cpp
index 3f27d87..b2eff3b 100644
--- a/model/VolumeBase.cpp
+++ b/model/VolumeBase.cpp
@@ -44,7 +44,12 @@
void VolumeBase::setState(State state) {
mState = state;
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeStateChanged(getId(), static_cast<int32_t>(mState));
+#else
notifyEvent(ResponseCode::VolumeStateChanged, StringPrintf("%d", mState));
+#endif
}
status_t VolumeBase::setDiskId(const std::string& diskId) {
@@ -114,7 +119,12 @@
}
mPath = path;
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumePathChanged(getId(), mPath);
+#else
notifyEvent(ResponseCode::VolumePathChanged, mPath);
+#endif
return OK;
}
@@ -125,7 +135,12 @@
}
mInternalPath = internalPath;
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeInternalPathChanged(getId(), mInternalPath);
+#else
notifyEvent(ResponseCode::VolumeInternalPathChanged, mInternalPath);
+#endif
return OK;
}
@@ -141,6 +156,14 @@
StringPrintf("%s %s", getId().c_str(), value.c_str()).c_str(), false);
}
+android::sp<android::os::IVoldListener> VolumeBase::getListener() {
+ if (mSilent) {
+ return nullptr;
+ } else {
+ return VolumeManager::Instance()->getListener();
+ }
+}
+
void VolumeBase::addVolume(const std::shared_ptr<VolumeBase>& volume) {
mVolumes.push_back(volume);
}
@@ -163,8 +186,14 @@
mCreated = true;
status_t res = doCreate();
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeCreated(getId(),
+ static_cast<int32_t>(mType), mDiskId, mPartGuid);
+#else
notifyEvent(ResponseCode::VolumeCreated,
StringPrintf("%d \"%s\" \"%s\"", mType, mDiskId.c_str(), mPartGuid.c_str()));
+#endif
setState(State::kUnmounted);
return res;
}
@@ -183,7 +212,12 @@
setState(State::kRemoved);
}
+#if ENABLE_BINDER
+ auto listener = getListener();
+ if (listener) listener->onVolumeDestroyed(getId());
+#else
notifyEvent(ResponseCode::VolumeDestroyed);
+#endif
status_t res = doDestroy();
mCreated = false;
return res;
diff --git a/model/VolumeBase.h b/model/VolumeBase.h
index d417019..ac111c2 100644
--- a/model/VolumeBase.h
+++ b/model/VolumeBase.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_VOLD_VOLUME_BASE_H
#define ANDROID_VOLD_VOLUME_BASE_H
+#include "android/os/IVoldListener.h"
#include "Utils.h"
#include <cutils/multiuser.h>
@@ -117,6 +118,8 @@
void notifyEvent(int msg);
void notifyEvent(int msg, const std::string& value);
+ android::sp<android::os::IVoldListener> getListener();
+
private:
/* ID that uniquely references volume while alive */
std::string mId;