10a31202370581a91b3425e7b60757268d0f6b539Samuel Tan/* 20a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Copyright (C) 2015 The Android Open Source Project 30a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 40a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Licensed under the Apache License, Version 2.0 (the "License"); 50a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * you may not use this file except in compliance with the License. 60a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * You may obtain a copy of the License at 70a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 80a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * http://www.apache.org/licenses/LICENSE-2.0 90a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * 100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Unless required by applicable law or agreed to in writing, software 110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * distributed under the License is distributed on an "AS IS" BASIS, 120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * See the License for the specific language governing permissions and 140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * limitations under the License. 150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#ifndef ANDROID_PERSISTABLE_BUNDLE_H 180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#define ANDROID_PERSISTABLE_BUNDLE_H 190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 200a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <map> 210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <vector> 220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <binder/Parcelable.h> 240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <utils/String16.h> 250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <utils/StrongPointer.h> 260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 270a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace android { 280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 290a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace os { 300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan/* 320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * C++ implementation of PersistableBundle, a mapping from String values to 330a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * various types that can be saved to persistent and later restored. 340a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 350a31202370581a91b3425e7b60757268d0f6b539Samuel Tanclass PersistableBundle : public Parcelable { 360a31202370581a91b3425e7b60757268d0f6b539Samuel Tanpublic: 370a31202370581a91b3425e7b60757268d0f6b539Samuel Tan PersistableBundle() = default; 380a31202370581a91b3425e7b60757268d0f6b539Samuel Tan virtual ~PersistableBundle() = default; 390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan PersistableBundle(const PersistableBundle& bundle) = default; 400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 410a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t writeToParcel(Parcel* parcel) const override; 420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t readFromParcel(const Parcel* parcel) override; 430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool empty() const; 450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t size() const; 460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t erase(const String16& key); 470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Setters for PersistableBundle. Adds a a key-value pair instantiated with 500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * |key| and |value| into the member map appropriate for the type of |value|. 510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * If there is already an existing value for |key|, |value| will replace it. 520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putBoolean(const String16& key, bool value); 540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putInt(const String16& key, int32_t value); 550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putLong(const String16& key, int64_t value); 560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putDouble(const String16& key, double value); 570a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putString(const String16& key, const String16& value); 580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putBooleanVector(const String16& key, const std::vector<bool>& value); 590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putIntVector(const String16& key, const std::vector<int32_t>& value); 600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putLongVector(const String16& key, const std::vector<int64_t>& value); 610a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putDoubleVector(const String16& key, const std::vector<double>& value); 620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putStringVector(const String16& key, const std::vector<String16>& value); 630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putPersistableBundle(const String16& key, const PersistableBundle& value); 640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 660a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Getters for PersistableBundle. If |key| exists, these methods write the 670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * value associated with |key| into |out|, and return true. Otherwise, these 680a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * methods return false. 690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getBoolean(const String16& key, bool* out) const; 710a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getInt(const String16& key, int32_t* out) const; 720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getLong(const String16& key, int64_t* out) const; 730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getDouble(const String16& key, double* out) const; 740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getString(const String16& key, String16* out) const; 750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getBooleanVector(const String16& key, std::vector<bool>* out) const; 760a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getIntVector(const String16& key, std::vector<int32_t>* out) const; 770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getLongVector(const String16& key, std::vector<int64_t>* out) const; 780a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getDoubleVector(const String16& key, std::vector<double>* out) const; 790a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getStringVector(const String16& key, std::vector<String16>* out) const; 800a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getPersistableBundle(const String16& key, PersistableBundle* out) const; 810a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 820a31202370581a91b3425e7b60757268d0f6b539Samuel Tan friend bool operator==(const PersistableBundle& lhs, const PersistableBundle& rhs) { 830a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return (lhs.mBoolMap == rhs.mBoolMap && lhs.mIntMap == rhs.mIntMap && 840a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mLongMap == rhs.mLongMap && lhs.mDoubleMap == rhs.mDoubleMap && 850a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mStringMap == rhs.mStringMap && lhs.mBoolVectorMap == rhs.mBoolVectorMap && 860a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mIntVectorMap == rhs.mIntVectorMap && 870a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mLongVectorMap == rhs.mLongVectorMap && 880a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mDoubleVectorMap == rhs.mDoubleVectorMap && 890a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mStringVectorMap == rhs.mStringVectorMap && 900a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mPersistableBundleMap == rhs.mPersistableBundleMap); 910a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 920a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 930a31202370581a91b3425e7b60757268d0f6b539Samuel Tan friend bool operator!=(const PersistableBundle& lhs, const PersistableBundle& rhs) { 940a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return !(lhs == rhs); 950a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 960a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 970a31202370581a91b3425e7b60757268d0f6b539Samuel Tanprivate: 980a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t writeToParcelInner(Parcel* parcel) const; 990a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t readFromParcelInner(const Parcel* parcel, size_t length); 1000a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1010a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, bool> mBoolMap; 1020a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, int32_t> mIntMap; 1030a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, int64_t> mLongMap; 1040a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, double> mDoubleMap; 1050a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, String16> mStringMap; 1060a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<bool>> mBoolVectorMap; 1070a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<int32_t>> mIntVectorMap; 1080a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<int64_t>> mLongVectorMap; 1090a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<double>> mDoubleVectorMap; 1100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<String16>> mStringVectorMap; 1110a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, PersistableBundle> mPersistableBundleMap; 1120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan}; 1130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace os 1150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace android 1170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#endif // ANDROID_PERSISTABLE_BUNDLE_H 119