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