1446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian/* 2446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Copyright (C) 2017 The Android Open Source Project 3446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * 4446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Licensed under the Apache License, Version 2.0 (the "License"); 5446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * you may not use this file except in compliance with the License. 6446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * You may obtain a copy of the License at 7446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * 8446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * http://www.apache.org/licenses/LICENSE-2.0 9446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * 10446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Unless required by applicable law or agreed to in writing, software 11446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * distributed under the License is distributed on an "AS IS" BASIS, 12446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * See the License for the specific language governing permissions and 14446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * limitations under the License 15446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 16446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 17446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianpackage android.util; 18446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 19446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianimport android.annotation.NonNull; 20446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianimport android.content.res.Configuration; 21446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianimport android.os.Parcel; 22446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianimport android.os.Parcelable; 23446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 24e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwaleimport java.io.PrintWriter; 25e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 26446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian/** 27446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Container that holds global and override config and their merge product. 28446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Merged configuration updates automatically whenever global or override configs are updated via 29446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * setters. 30446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * 31446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * {@hide} 32446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 33446079600ece83b22cb91865bcbeb694292b0108Andrii Kulianpublic class MergedConfiguration implements Parcelable { 34446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 35446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian private Configuration mGlobalConfig = new Configuration(); 36446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian private Configuration mOverrideConfig = new Configuration(); 37446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian private Configuration mMergedConfig = new Configuration(); 38446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 39446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public MergedConfiguration() { 40446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 41446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 42446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public MergedConfiguration(Configuration globalConfig, Configuration overrideConfig) { 43446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian setConfiguration(globalConfig, overrideConfig); 44446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 45446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 46e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public MergedConfiguration(Configuration globalConfig) { 47e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale setGlobalConfiguration(globalConfig); 48e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 49e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 50446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public MergedConfiguration(MergedConfiguration mergedConfiguration) { 51446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian setConfiguration(mergedConfiguration.getGlobalConfiguration(), 52446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mergedConfiguration.getOverrideConfiguration()); 53446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 54446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 55446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian private MergedConfiguration(Parcel in) { 56446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian readFromParcel(in); 57446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 58446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 59446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian @Override 60446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public void writeToParcel(Parcel dest, int flags) { 61446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian dest.writeParcelable(mGlobalConfig, flags); 62446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian dest.writeParcelable(mOverrideConfig, flags); 63446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian dest.writeParcelable(mMergedConfig, flags); 64446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 65446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 66446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public void readFromParcel(Parcel source) { 67446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mGlobalConfig = source.readParcelable(Configuration.class.getClassLoader()); 68446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mOverrideConfig = source.readParcelable(Configuration.class.getClassLoader()); 69446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mMergedConfig = source.readParcelable(Configuration.class.getClassLoader()); 70446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 71446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 72446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian @Override 73446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public int describeContents() { 74446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return 0; 75446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 76446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 77446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public static final Creator<MergedConfiguration> CREATOR = new Creator<MergedConfiguration>() { 78446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian @Override 79446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public MergedConfiguration createFromParcel(Parcel in) { 80446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return new MergedConfiguration(in); 81446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 82446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 83446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian @Override 84446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public MergedConfiguration[] newArray(int size) { 85446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return new MergedConfiguration[size]; 86446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 87446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian }; 88446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 89446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian /** 90446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Update global and override configurations. 91446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * Merged configuration will automatically be updated. 92446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * @param globalConfig New global configuration. 93446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * @param overrideConfig New override configuration. 94446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 95446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public void setConfiguration(Configuration globalConfig, Configuration overrideConfig) { 96446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mGlobalConfig.setTo(globalConfig); 97446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mOverrideConfig.setTo(overrideConfig); 98446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian updateMergedConfig(); 99446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 100446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 101446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian /** 102e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * Update global configurations. 103e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * Merged configuration will automatically be updated. 104e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * @param globalConfig New global configuration. 105e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale */ 106e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public void setGlobalConfiguration(Configuration globalConfig) { 107e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale mGlobalConfig.setTo(globalConfig); 108e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale updateMergedConfig(); 109e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 110e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 111e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale /** 112e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * Update override configurations. 113e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * Merged configuration will automatically be updated. 114e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale * @param overrideConfig New override configuration. 115e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale */ 116e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public void setOverrideConfiguration(Configuration overrideConfig) { 117e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale mOverrideConfig.setTo(overrideConfig); 118e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale updateMergedConfig(); 119e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 120e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 121e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public void setTo(MergedConfiguration config) { 122e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale setConfiguration(config.mGlobalConfig, config.mOverrideConfig); 123e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 124e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 125e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public void unset() { 126e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale mGlobalConfig.unset(); 127e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale mOverrideConfig.unset(); 128e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale updateMergedConfig(); 129e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 130e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 131e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale /** 132446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * @return Stored global configuration value. 133446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 134446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian @NonNull 135446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public Configuration getGlobalConfiguration() { 136446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return mGlobalConfig; 137446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 138446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 139446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian /** 140446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * @return Stored override configuration value. 141446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 142446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public Configuration getOverrideConfiguration() { 143446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return mOverrideConfig; 144446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 145446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 146446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian /** 147446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian * @return Stored merged configuration value. 148446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian */ 149446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian public Configuration getMergedConfiguration() { 150446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian return mMergedConfig; 151446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 152446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian 153446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian /** Update merged config when global or override config changes. */ 154446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian private void updateMergedConfig() { 155446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mMergedConfig.setTo(mGlobalConfig); 156446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian mMergedConfig.updateFrom(mOverrideConfig); 157446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian } 158e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 159e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale @Override 160e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public String toString() { 161e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale return "{mGlobalConfig=" + mGlobalConfig + " mOverrideConfig=" + mOverrideConfig + "}"; 162e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 163e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale 164f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee @Override 165f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee public int hashCode() { 166f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee return mMergedConfig.hashCode(); 167f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee } 168f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee 169f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee @Override 170f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee public boolean equals(Object that) { 171f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee if (!(that instanceof MergedConfiguration)) { 172f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee return false; 173f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee } 174f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee 175f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee if (that == this) return true; 176f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee return mMergedConfig.equals(((MergedConfiguration) that).mMergedConfig); 177f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee } 178f858b5788e5bcc9a84633a77daf4d42cb5de9375Bryce Lee 179e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale public void dump(PrintWriter pw, String prefix) { 180e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale pw.println(prefix + "mGlobalConfig=" + mGlobalConfig); 181e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale pw.println(prefix + "mOverrideConfig=" + mOverrideConfig); 182e610d3dba8ea96636dd58ca4baa39dc9100467fdWale Ogunwale } 183446079600ece83b22cb91865bcbeb694292b0108Andrii Kulian} 184