1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.dreams.phototable;
17
18import android.content.SharedPreferences;
19
20import java.util.Collection;
21import java.util.HashMap;
22import java.util.HashSet;
23import java.util.Set;
24
25/**
26 * Common utilities for album settings.
27 */
28public class AlbumSettings {
29    public static final String ALBUM_SET = "Enabled Album Set V2";
30
31    private static HashMap<SharedPreferences, AlbumSettings> singletons;
32
33    private final SharedPreferences mSettings;
34    private final HashSet<String> mEnabledAlbums;
35
36    public static AlbumSettings getAlbumSettings(SharedPreferences settings) {
37        if (singletons == null) {
38            singletons = new HashMap<SharedPreferences, AlbumSettings>();
39        }
40        if (!singletons.containsKey(settings)) {
41            singletons.put(settings, new AlbumSettings(settings));
42        }
43        return singletons.get(settings);
44    }
45
46    public void readEnabledAlbums() {
47        synchronized (mEnabledAlbums) {
48            readEnabledAlbumsLocked();
49        }
50    }
51
52    public boolean isAlbumEnabled(String albumId) {
53        synchronized (mEnabledAlbums) {
54            boolean isEnabled = mEnabledAlbums.contains(albumId);
55            return mEnabledAlbums.contains(albumId);
56        }
57    }
58
59    public void setAlbumEnabled(String albumId, boolean enabled) {
60        if (isAlbumEnabled(albumId) != enabled) {
61            synchronized (mEnabledAlbums) {
62                readEnabledAlbumsLocked();
63                if (enabled) {
64                    mEnabledAlbums.add(albumId);
65                } else {
66                    mEnabledAlbums.remove(albumId);
67                }
68                writeEnabledAlbumsLocked();
69            }
70        }
71    }
72
73    public void pruneObsoleteSettings(Collection<String> validAlbums) {
74        if (!validAlbums.containsAll(mEnabledAlbums)) {
75            synchronized (mEnabledAlbums) {
76                readEnabledAlbumsLocked();
77                mEnabledAlbums.retainAll(validAlbums);
78                writeEnabledAlbumsLocked();
79            }
80        }
81    }
82
83    public  boolean isConfigured() {
84        synchronized (mEnabledAlbums) {
85            return mEnabledAlbums.size() != 0;
86        }
87    }
88
89    private AlbumSettings(SharedPreferences settings) {
90        mSettings = settings;
91        mEnabledAlbums = new HashSet<String>();
92        readEnabledAlbums();
93    }
94
95    private void readEnabledAlbumsLocked() {
96        Set<String> enabledAlbums = mSettings.getStringSet(ALBUM_SET, null);
97        mEnabledAlbums.clear();
98        if (enabledAlbums != null) {
99            mEnabledAlbums.addAll(enabledAlbums);
100        }
101    }
102
103    private void writeEnabledAlbumsLocked() {
104        SharedPreferences.Editor editor = mSettings.edit();
105        // Give SharedSettings a copy, so that we are free to manipulate ours.
106        editor.putStringSet(ALBUM_SET, new HashSet<String>(mEnabledAlbums));
107        editor.commit();
108    }
109}
110