void CSearchManagerService::MyPackageMonitor::UpdateSearchables()
{
    Int32 changingUserId;
    GetChangingUserId(&changingUserId);
    {
        // Update list of searchable activities
        AutoLock lock(mHost->mLock);
        Iterator it = mHost->mSearchables.Begin();
        for(; it != mHost->mSearchables.End(); it++)
        {
            if(changingUserId == it->mFirst)
            {
                AutoPtr<ISearchables> searchable;
                mHost->GetSearchables(it->mFirst, (ISearchables**)&searchable);
                searchable->BuildSearchableList();
                break;
            }
        }
    }
    // Inform all listeners that the list of searchables has been updated.
    AutoPtr<IIntent> intent;
    CIntent::New(ISearchManager::INTENT_ACTION_SEARCHABLES_CHANGED, (IIntent**)&intent);
    intent->AddFlags(IIntent::FLAG_RECEIVER_REPLACE_PENDING
        | IIntent::FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
    AutoPtr<IUserHandle> handler;
    CUserHandle::New(changingUserId,(IUserHandle**)&handler);
    mHost->mContext->SendBroadcastAsUser(intent, handler);
}
ECode CRecognitionManagerService::MyPackageMonitor::OnSomePackagesChanged()
{
    Int32 userHandle;
    GetChangingUserId(&userHandle);
    if (CRecognitionManagerService::DEBUG) {
        Slogger::I(TAG, "onSomePackagesChanged user=%d", userHandle);
    }
    AutoPtr<IComponentName> componentName;
    FAIL_RETURN(mOwner->GetCurRecognizer(userHandle, (IComponentName**)&componentName));
    if (NULL == componentName) {
        Boolean result;
        AnyPackagesAppearing(&result);
        if (result) {
            FAIL_RETURN(mOwner->FindAvailRecognizer(String(NULL), userHandle, (IComponentName**)&componentName));
            if (NULL != componentName) {
                FAIL_RETURN(mOwner->SetCurRecognizer(componentName, userHandle));
            }
        }
    }
    return NOERROR;
}