Fixed a number of issues with NetworkInfoDataItemBase

There are a couple of issues. NetworkInfoDataItemBase
objects might be from OsAgent or GnssLocationProvider.
The two sources actually have mTypes defined differently.
In addtion, when there are different types of connections
such as wifi / mobile, getting connected / disconnected
independently, clients need to be all notified correctly.

Right now, if mConnected hasn't changed, no updates are
send. For exmple, if mobile is connected, later wifi
gets connected too, clients won't know.

SystemStatus is also updated to get updated / colated
informtion. In the above example, SystemStatus's top
record would record as both mobile and wifi are connected.

Change-Id: I1825902247fe1d4e6363f5e24a75be7e984d0dc4
CRs-Fixed: 2221114
This commit is contained in:
Kevin Tang 2018-04-09 14:32:28 -07:00
parent 36da980fea
commit 80e09f69b6
5 changed files with 107 additions and 117 deletions

View file

@ -1250,8 +1250,7 @@ IOsObserver* SystemStatus::getOsObserver()
}
SystemStatus::SystemStatus(const MsgTask* msgTask) :
mSysStatusObsvr(this, msgTask),
mConnected(false)
mSysStatusObsvr(this, msgTask)
{
int result = 0;
ENTRY_LOG ();
@ -1301,17 +1300,10 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) :
/******************************************************************************
SystemStatus - storing dataitems
******************************************************************************/
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool SystemStatus::setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s)
{
TYPE_SYSTEMSTATUS_ITEM sout(s);
return setIteminReport(report, sout);
}
template <typename TYPE_REPORT, typename TYPE_ITEM>
bool SystemStatus::setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s)
bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s)
{
if (!report.empty() && report.back().equals(s)) {
if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) {
// there is no change - just update reported timestamp
report.back().mUtcReported = s.mUtcReported;
return false;
@ -1449,94 +1441,92 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
switch(dataitem->getId())
{
case AIRPLANEMODE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAirplaneMode>(mCache.mAirplaneMode,
*(static_cast<AirplaneModeDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mAirplaneMode,
SystemStatusAirplaneMode(*(static_cast<AirplaneModeDataItemBase*>(dataitem))));
break;
case ENH_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusENH>(mCache.mENH,
*(static_cast<ENHDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mENH,
SystemStatusENH(*(static_cast<ENHDataItemBase*>(dataitem))));
break;
case GPSSTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusGpsState>(mCache.mGPSState,
*(static_cast<GPSStateDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mGPSState,
SystemStatusGpsState(*(static_cast<GPSStateDataItemBase*>(dataitem))));
break;
case NLPSTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNLPStatus>(mCache.mNLPStatus,
*(static_cast<NLPStatusDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mNLPStatus,
SystemStatusNLPStatus(*(static_cast<NLPStatusDataItemBase*>(dataitem))));
break;
case WIFIHARDWARESTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiHardwareState>(mCache.mWifiHardwareState,
*(static_cast<WifiHardwareStateDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mWifiHardwareState,
SystemStatusWifiHardwareState(*(static_cast<WifiHardwareStateDataItemBase*>(dataitem))));
break;
case NETWORKINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNetworkInfo>(mCache.mNetworkInfo,
*(static_cast<NetworkInfoDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mNetworkInfo,
SystemStatusNetworkInfo(*(static_cast<NetworkInfoDataItemBase*>(dataitem))));
break;
case RILSERVICEINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceInfo>(mCache.mRilServiceInfo,
*(static_cast<RilServiceInfoDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mRilServiceInfo,
SystemStatusServiceInfo(*(static_cast<RilServiceInfoDataItemBase*>(dataitem))));
break;
case RILCELLINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusRilCellInfo>(mCache.mRilCellInfo,
*(static_cast<RilCellInfoDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mRilCellInfo,
SystemStatusRilCellInfo(*(static_cast<RilCellInfoDataItemBase*>(dataitem))));
break;
case SERVICESTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceStatus>(mCache.mServiceStatus,
*(static_cast<ServiceStatusDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mServiceStatus,
SystemStatusServiceStatus(*(static_cast<ServiceStatusDataItemBase*>(dataitem))));
break;
case MODEL_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusModel>(mCache.mModel,
*(static_cast<ModelDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mModel,
SystemStatusModel(*(static_cast<ModelDataItemBase*>(dataitem))));
break;
case MANUFACTURER_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusManufacturer>(mCache.mManufacturer,
*(static_cast<ManufacturerDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mManufacturer,
SystemStatusManufacturer(*(static_cast<ManufacturerDataItemBase*>(dataitem))));
break;
case ASSISTED_GPS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAssistedGps>(mCache.mAssistedGps,
*(static_cast<AssistedGpsDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mAssistedGps,
SystemStatusAssistedGps(*(static_cast<AssistedGpsDataItemBase*>(dataitem))));
break;
case SCREEN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusScreenState>(mCache.mScreenState,
*(static_cast<ScreenStateDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mScreenState,
SystemStatusScreenState(*(static_cast<ScreenStateDataItemBase*>(dataitem))));
break;
case POWER_CONNECTED_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusPowerConnectState>(mCache.mPowerConnectState,
*(static_cast<PowerConnectStateDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mPowerConnectState,
SystemStatusPowerConnectState(*(static_cast<PowerConnectStateDataItemBase*>(dataitem))));
break;
case TIMEZONE_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeZoneChange>(mCache.mTimeZoneChange,
*(static_cast<TimeZoneChangeDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mTimeZoneChange,
SystemStatusTimeZoneChange(*(static_cast<TimeZoneChangeDataItemBase*>(dataitem))));
break;
case TIME_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeChange>(mCache.mTimeChange,
*(static_cast<TimeChangeDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mTimeChange,
SystemStatusTimeChange(*(static_cast<TimeChangeDataItemBase*>(dataitem))));
break;
case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiSupplicantStatus>(
mCache.mWifiSupplicantStatus,
*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mWifiSupplicantStatus,
SystemStatusWifiSupplicantStatus(*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem))));
break;
case SHUTDOWN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusShutdownState>(mCache.mShutdownState,
*(static_cast<ShutdownStateDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mShutdownState,
SystemStatusShutdownState(*(static_cast<ShutdownStateDataItemBase*>(dataitem))));
break;
case TAC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTac>(mCache.mTac,
*(static_cast<TacDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mTac,
SystemStatusTac(*(static_cast<TacDataItemBase*>(dataitem))));
break;
case MCCMNC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusMccMnc>(mCache.mMccMnc,
*(static_cast<MccmncDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mMccMnc,
SystemStatusMccMnc(*(static_cast<MccmncDataItemBase*>(dataitem))));
break;
case BTLE_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtDeviceScanDetail>(mCache.mBtDeviceScanDetail,
*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mBtDeviceScanDetail,
SystemStatusBtDeviceScanDetail(*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem))));
break;
case BT_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtleDeviceScanDetail>(
mCache.mBtLeDeviceScanDetail,
*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem)));
ret = setIteminReport(mCache.mBtLeDeviceScanDetail,
SystemStatusBtleDeviceScanDetail(*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem))));
break;
default:
break;
@ -1689,13 +1679,10 @@ bool SystemStatus::setDefaultGnssEngineStates(void)
******************************************************************************/
bool SystemStatus::eventConnectionStatus(bool connected, int8_t type)
{
if (connected != mConnected) {
mConnected = connected;
// send networkinof dataitem to systemstatus observer clients
SystemStatusNetworkInfo s(type, "", "", false, connected, false);
mSysStatusObsvr.notify({&s});
// send networkinof dataitem to systemstatus observer clients
SystemStatusNetworkInfo s(type, "", "", false, connected, false);
mSysStatusObsvr.notify({&s});
}
return true;
}

View file

@ -77,8 +77,11 @@ public:
mUtcTime.tv_nsec = tv.tv_nsec;
mUtcReported = mUtcTime;
};
virtual ~SystemStatusItemBase() { };
virtual void dump(void) { };
virtual ~SystemStatusItemBase() {};
inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) {
return *this;
}
virtual void dump(void) {};
};
class SystemStatusLocation : public SystemStatusItemBase
@ -93,7 +96,7 @@ public:
const GpsLocationExtended& locationEx) :
mValid(true),
mLocation(location),
mLocationEx(locationEx) { }
mLocationEx(locationEx) {}
bool equals(const SystemStatusLocation& peer);
void dump(void);
};
@ -457,6 +460,7 @@ public:
class SystemStatusNetworkInfo : public SystemStatusItemBase,
public NetworkInfoDataItemBase
{
NetworkInfoDataItemBase* mSrcObjPtr;
public:
inline SystemStatusNetworkInfo(
int32_t type=0,
@ -466,18 +470,21 @@ public:
bool connected=false,
bool roaming=false) :
NetworkInfoDataItemBase(
(NetworkType)type,
type,
typeName,
subTypeName,
available,
connected,
roaming) {}
roaming),
mSrcObjPtr(nullptr) {}
inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) :
NetworkInfoDataItemBase(itemBase) {
NetworkInfoDataItemBase(itemBase),
mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) {
mType = itemBase.getType();
}
inline bool equals(const SystemStatusNetworkInfo& peer) {
if ((mType == peer.mType) &&
if ((mAllTypes == peer.mAllTypes) &&
(mTypeName == peer.mTypeName) &&
(mSubTypeName == peer.mSubTypeName) &&
(mAvailable == peer.mAvailable) &&
@ -487,8 +494,24 @@ public:
}
return false;
}
inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) {
uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
if (mConnected) {
mAllTypes |= allTypes;
} else if (0 != mAllTypes) {
mAllTypes = (allTypes & (~mAllTypes));
} // else (mConnected == false && mAllTypes == 0)
// we keep mAllTypes as 0, which means no more connections.
if (nullptr != mSrcObjPtr) {
// this is critical, changing mAllTypes of the original obj
mSrcObjPtr->mAllTypes = mAllTypes;
}
return *this;
}
inline void dump(void) override {
LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected);
LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x",
mAllTypes, mConnected, mType);
}
};
@ -783,13 +806,9 @@ private:
// Data members
static pthread_mutex_t mMutexSystemStatus;
SystemStatusReports mCache;
bool mConnected;
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s);
template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s);
bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s);
// set default dataitem derived item in report cache
template <typename TYPE_REPORT, typename TYPE_ITEM>

View file

@ -221,9 +221,23 @@ protected:
class NetworkInfoDataItemBase : public IDataItemCore {
public:
enum NetworkType {
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX,
TYPE_UNKNOWN,
};
NetworkInfoDataItemBase(
int32_t type, string typeName, string subTypeName,
NetworkType initialType, int32_t type, string typeName, string subTypeName,
bool available, bool connected, bool roaming ):
mAllTypes((initialType >= TYPE_UNKNOWN || initialType < TYPE_MOBILE) ?
0 : (1<<initialType)),
mType(type),
mTypeName(typeName),
mSubTypeName(subTypeName),
@ -235,22 +249,12 @@ public:
inline virtual DataItemId getId() { return mId; }
virtual void stringify(string& /*valueStr*/) {}
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
enum NetworkType {
TYPE_UNKNOWN,
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX
};
inline virtual NetworkType getType(void) const {
return (NetworkType)mType;
}
// Data members
inline uint64_t getAllTypes() { return mAllTypes; }
// Data members
uint64_t mAllTypes;
int32_t mType;
string mTypeName;
string mSubTypeName;

View file

@ -69,18 +69,9 @@ bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) {
return ( send(LOC_IPC_XTRA, ss.str()) );
}
bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, int32_t type) {
bool XtraSystemStatusObserver::updateConnections(uint64_t allConnections) {
mIsConnectivityStatusKnown = true;
if (connected) {
mConnections.insert(type);
} else {
if (-1 == type) { // -1 for disconnecting all connections
mConnections.clear();
} else {
mConnections.erase(type);
}
}
mConnections = allConnections;
if (!mReqStatusReceived) {
return true;
@ -88,8 +79,7 @@ bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, int32_t ty
stringstream ss;
ss << "connection";
ss << " " << (connected ? "1" : "0");
ss << " " << type;
ss << " " << mConnections;
return ( send(LOC_IPC_XTRA, ss.str()) );
}
@ -132,13 +122,6 @@ bool XtraSystemStatusObserver::updateXtraThrottle(const bool enabled) {
return ( send(LOC_IPC_XTRA, ss.str()) );
}
static inline ostream& operator<<(ostream& os, CONNECTIONS& data) {
for (auto elem : data) {
os << elem << ' ';
}
return os;
}
inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) {
mReqStatusReceived = true;
@ -248,8 +231,7 @@ void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
{
NetworkInfoDataItemBase* networkInfo =
static_cast<NetworkInfoDataItemBase*>(each);
mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected,
networkInfo->mType);
mXtraSysStatObj->updateConnections(networkInfo->getAllTypes());
}
break;

View file

@ -33,22 +33,20 @@
#include <MsgTask.h>
#include <LocIpc.h>
#include <LocTimer.h>
#include <set>
using namespace std;
using loc_core::IOsObserver;
using loc_core::IDataItemObserver;
using loc_core::IDataItemCore;
using loc_util::LocIpc;
using CONNECTIONS = set<int32_t>;
class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{
public :
// constructor & destructor
inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask):
mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask),
mGpsLock(-1), mXtraThrottle(true), mReqStatusReceived(false),
mIsConnectivityStatusKnown (false), mDelayLocTimer(*this) {
mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false),
mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) {
subscribe(true);
startListeningNonBlocking(LOC_IPC_HAL);
mDelayLocTimer.start(100 /*.1 sec*/, false);
@ -63,7 +61,7 @@ public :
virtual void notify(const list<IDataItemCore*>& dlist);
bool updateLockStatus(uint32_t lock);
bool updateConnectionStatus(bool connected, int32_t type);
bool updateConnections(uint64_t allConnections);
bool updateTac(const string& tac);
bool updateMccMnc(const string& mccmnc);
bool updateXtraThrottle(const bool enabled);
@ -77,7 +75,7 @@ private:
IOsObserver* mSystemStatusObsrvr;
const MsgTask* mMsgTask;
int32_t mGpsLock;
CONNECTIONS mConnections;
uint64_t mConnections;
string mTac;
string mMccmnc;
bool mXtraThrottle;