blob: e9a79cd6cb3097608634d3e739fa50abcfe09fc9 [file] [log] [blame]
// Copyright 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
#pragma once
#include "android/base/StringView.h"
#include "android/featurecontrol/Features.h"
namespace android {
namespace base { class IniFile; }
namespace featurecontrol {
// FeatureControlImpl is the implementation of feature control.
// Please access it through the API in android/featurecontrol/FeatureControl.h
// Features are controlled through ini files.
// There are two different types of features: host-only features that
// only need to be enabled in the emulator to take effect, and guest
// features that needs to simultaneously enabled in the host and the
// guest. Host-only features are defined in FeatureControlDefHost.h.
// Guest features are defined in FeatureControlDefGuest.
// User can override any feature options by providing a user ini.
// There are up to 3 ini files that would be loaded during
// initialization: defaultIniHost, defaultIniGuest and
// [optional] userIniHost. Each of them do the following:
//
// defaultIniHost specifies both host and guest features, the
// emulator ships with this file.
// defaultIniGuest specifies guest features only, the system image
// ships with this file. Guest features will only be default to ON
// when both defaultIniHost and defaultIniGuest set it on.
// If defaultIniGuest does not exist, all guest features will be
// default to OFF. If it does not specify a guest feature defined in
// defaultIniHost, it will also be default to OFF. It should not
// contain any host-only features. If it does, there is no effect.
// userIniHost specifies user override values. It can be manually
// created under the user's .android folder. It can override any
// features. This file is optional, and if a feature is not specified
// in userIniHost, it will use the default value from defaultIniHost
// and defaultIniGuest.
// There is a plan for a forth ini file which specifies per-avd
// override values. It is disabled due to lacking of use cases.
// The ini file paths are passed through calling
// FeatureControlImpl::init(). Calling FeatureControlImpl::get()
// will trigger FeatureControlImpl::init() with default paths. You
// can reinitialize it with different file paths by calling
// FeatureControlImpl::init() again.
// Please read FeatureControl_unittest.cpp for examples.
class FeatureControlImpl {
public:
bool isEnabled(Feature feature);
void setEnabledOverride(Feature feature, bool isEnabled);
void resetEnabledToDefault(Feature feature);
void init(android::base::StringView defaultIniHostPath,
android::base::StringView defaultIniGuestPath,
android::base::StringView userIniHostPath,
android::base::StringView userIniGuestPath);
static FeatureControlImpl& get();
FeatureControlImpl();
private:
struct FeatureOption {
Feature name = static_cast<Feature>(0);
bool defaultVal = false;
bool currentVal = false;
bool isOverridden = false;
};
FeatureOption mFeatures[Feature_n_items] = {};
void initEnabledDefault(Feature feature, bool isEnabled);
void initHostFeatureAndParseDefault(
android::base::IniFile& defaultIniHost,
Feature featureName,
const char* featureNameStr);
void initGuestFeatureAndParseDefault(
android::base::IniFile& defaultIniHost,
android::base::IniFile& defaultIniGuest,
Feature featureName,
const char* featureNameStr);
void loadUserOverrideFeature(
android::base::IniFile& defaultIni,
Feature featureName,
const char* featureNameStr);
};
} // namespace featurecontrol
} // namespace android