// // Copyright (C) 2016 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. // #include "update_engine/daemon_state_android.h" #include #include "update_engine/common/boot_control.h" #include "update_engine/common/boot_control_stub.h" #include "update_engine/common/hardware.h" #include "update_engine/common/prefs.h" #include "update_engine/update_attempter_android.h" namespace chromeos_update_engine { bool DaemonStateAndroid::Initialize() { boot_control_ = boot_control::CreateBootControl(); if (!boot_control_) { LOG(WARNING) << "Unable to create BootControl instance, using stub " << "instead. All update attempts will fail."; boot_control_.reset(new BootControlStub()); } hardware_ = hardware::CreateHardware(); if (!hardware_) { LOG(ERROR) << "Error intializing the HardwareInterface."; return false; } LOG_IF(INFO, !hardware_->IsNormalBootMode()) << "Booted in dev mode."; LOG_IF(INFO, !hardware_->IsOfficialBuild()) << "Booted non-official build."; // Initialize prefs. base::FilePath non_volatile_path; // TODO(deymo): Fall back to in-memory prefs if there's no physical directory // available. if (!hardware_->GetNonVolatileDirectory(&non_volatile_path)) { LOG(ERROR) << "Failed to get a non-volatile directory."; return false; } Prefs* prefs = new Prefs(); prefs_.reset(prefs); if (!prefs->Init(non_volatile_path.Append(kPrefsSubDirectory))) { LOG(ERROR) << "Failed to initialize preferences."; return false; } // Initialize the UpdateAttempter before the UpdateManager. update_attempter_.reset(new UpdateAttempterAndroid( this, prefs_.get(), boot_control_.get(), hardware_.get())); return true; } bool DaemonStateAndroid::StartUpdater() { // The DaemonState in Android is a passive daemon. It will only start applying // an update when instructed to do so from the exposed binder API. update_attempter_->Init(); return true; } void DaemonStateAndroid::AddObserver(ServiceObserverInterface* observer) { service_observers_.insert(observer); } void DaemonStateAndroid::RemoveObserver(ServiceObserverInterface* observer) { service_observers_.erase(observer); } ServiceDelegateAndroidInterface* DaemonStateAndroid::service_delegate() { return update_attempter_.get(); } } // namespace chromeos_update_engine