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> 2152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan#include <set> 220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <vector> 230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <binder/Parcelable.h> 250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <utils/String16.h> 260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#include <utils/StrongPointer.h> 270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 280a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace android { 290a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 300a31202370581a91b3425e7b60757268d0f6b539Samuel Tannamespace os { 310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan/* 330a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * C++ implementation of PersistableBundle, a mapping from String values to 340a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * various types that can be saved to persistent and later restored. 350a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 360a31202370581a91b3425e7b60757268d0f6b539Samuel Tanclass PersistableBundle : public Parcelable { 370a31202370581a91b3425e7b60757268d0f6b539Samuel Tanpublic: 380a31202370581a91b3425e7b60757268d0f6b539Samuel Tan PersistableBundle() = default; 390a31202370581a91b3425e7b60757268d0f6b539Samuel Tan virtual ~PersistableBundle() = default; 400a31202370581a91b3425e7b60757268d0f6b539Samuel Tan PersistableBundle(const PersistableBundle& bundle) = default; 410a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 420a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t writeToParcel(Parcel* parcel) const override; 430a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t readFromParcel(const Parcel* parcel) override; 440a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 450a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool empty() const; 460a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t size() const; 470a31202370581a91b3425e7b60757268d0f6b539Samuel Tan size_t erase(const String16& key); 480a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 490a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 500a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Setters for PersistableBundle. Adds a a key-value pair instantiated with 510a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * |key| and |value| into the member map appropriate for the type of |value|. 520a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * If there is already an existing value for |key|, |value| will replace it. 530a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 540a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putBoolean(const String16& key, bool value); 550a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putInt(const String16& key, int32_t value); 560a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putLong(const String16& key, int64_t value); 570a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putDouble(const String16& key, double value); 580a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putString(const String16& key, const String16& value); 590a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putBooleanVector(const String16& key, const std::vector<bool>& value); 600a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putIntVector(const String16& key, const std::vector<int32_t>& value); 610a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putLongVector(const String16& key, const std::vector<int64_t>& value); 620a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putDoubleVector(const String16& key, const std::vector<double>& value); 630a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putStringVector(const String16& key, const std::vector<String16>& value); 640a31202370581a91b3425e7b60757268d0f6b539Samuel Tan void putPersistableBundle(const String16& key, const PersistableBundle& value); 650a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 660a31202370581a91b3425e7b60757268d0f6b539Samuel Tan /* 670a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * Getters for PersistableBundle. If |key| exists, these methods write the 680a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * value associated with |key| into |out|, and return true. Otherwise, these 690a31202370581a91b3425e7b60757268d0f6b539Samuel Tan * methods return false. 700a31202370581a91b3425e7b60757268d0f6b539Samuel Tan */ 710a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getBoolean(const String16& key, bool* out) const; 720a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getInt(const String16& key, int32_t* out) const; 730a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getLong(const String16& key, int64_t* out) const; 740a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getDouble(const String16& key, double* out) const; 750a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getString(const String16& key, String16* out) const; 760a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getBooleanVector(const String16& key, std::vector<bool>* out) const; 770a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getIntVector(const String16& key, std::vector<int32_t>* out) const; 780a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getLongVector(const String16& key, std::vector<int64_t>* out) const; 790a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getDoubleVector(const String16& key, std::vector<double>* out) const; 800a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getStringVector(const String16& key, std::vector<String16>* out) const; 810a31202370581a91b3425e7b60757268d0f6b539Samuel Tan bool getPersistableBundle(const String16& key, PersistableBundle* out) const; 820a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 8352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan /* Getters for all keys for each value type */ 8452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getBooleanKeys() const; 8552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getIntKeys() const; 8652545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getLongKeys() const; 8752545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getDoubleKeys() const; 8852545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getStringKeys() const; 8952545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getBooleanVectorKeys() const; 9052545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getIntVectorKeys() const; 9152545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getLongVectorKeys() const; 9252545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getDoubleVectorKeys() const; 9352545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getStringVectorKeys() const; 9452545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan std::set<String16> getPersistableBundleKeys() const; 9552545f2e3c9f942f59b416ba63e1b6068700d783Samuel Tan 960a31202370581a91b3425e7b60757268d0f6b539Samuel Tan friend bool operator==(const PersistableBundle& lhs, const PersistableBundle& rhs) { 970a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return (lhs.mBoolMap == rhs.mBoolMap && lhs.mIntMap == rhs.mIntMap && 980a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mLongMap == rhs.mLongMap && lhs.mDoubleMap == rhs.mDoubleMap && 990a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mStringMap == rhs.mStringMap && lhs.mBoolVectorMap == rhs.mBoolVectorMap && 1000a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mIntVectorMap == rhs.mIntVectorMap && 1010a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mLongVectorMap == rhs.mLongVectorMap && 1020a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mDoubleVectorMap == rhs.mDoubleVectorMap && 1030a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mStringVectorMap == rhs.mStringVectorMap && 1040a31202370581a91b3425e7b60757268d0f6b539Samuel Tan lhs.mPersistableBundleMap == rhs.mPersistableBundleMap); 1050a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 1060a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1070a31202370581a91b3425e7b60757268d0f6b539Samuel Tan friend bool operator!=(const PersistableBundle& lhs, const PersistableBundle& rhs) { 1080a31202370581a91b3425e7b60757268d0f6b539Samuel Tan return !(lhs == rhs); 1090a31202370581a91b3425e7b60757268d0f6b539Samuel Tan } 1100a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1110a31202370581a91b3425e7b60757268d0f6b539Samuel Tanprivate: 1120a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t writeToParcelInner(Parcel* parcel) const; 1130a31202370581a91b3425e7b60757268d0f6b539Samuel Tan status_t readFromParcelInner(const Parcel* parcel, size_t length); 1140a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1150a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, bool> mBoolMap; 1160a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, int32_t> mIntMap; 1170a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, int64_t> mLongMap; 1180a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, double> mDoubleMap; 1190a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, String16> mStringMap; 1200a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<bool>> mBoolVectorMap; 1210a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<int32_t>> mIntVectorMap; 1220a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<int64_t>> mLongVectorMap; 1230a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<double>> mDoubleVectorMap; 1240a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, std::vector<String16>> mStringVectorMap; 1250a31202370581a91b3425e7b60757268d0f6b539Samuel Tan std::map<String16, PersistableBundle> mPersistableBundleMap; 1260a31202370581a91b3425e7b60757268d0f6b539Samuel Tan}; 1270a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1280a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace os 1290a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1300a31202370581a91b3425e7b60757268d0f6b539Samuel Tan} // namespace android 1310a31202370581a91b3425e7b60757268d0f6b539Samuel Tan 1320a31202370581a91b3425e7b60757268d0f6b539Samuel Tan#endif // ANDROID_PERSISTABLE_BUNDLE_H 133