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            return mEnabledAlbums.contains(albumId);
55        }
56    }
57
58    public boolean areAllEnabled(Collection<String> validAlbums) {
59        synchronized (mEnabledAlbums) {
60            return mEnabledAlbums.containsAll(validAlbums);
61        }
62    }
63
64    public void setAlbumEnabled(String albumId, boolean enabled) {
65        if (isAlbumEnabled(albumId) != enabled) {
66            synchronized (mEnabledAlbums) {
67                readEnabledAlbumsLocked();
68                if (enabled) {
69                    mEnabledAlbums.add(albumId);
70                } else {
71                    mEnabledAlbums.remove(albumId);
72                }
73                writeEnabledAlbumsLocked();
74            }
75        }
76    }
77
78    public void disableAllAlbums() {
79        synchronized (mEnabledAlbums) {
80            mEnabledAlbums.clear();
81            writeEnabledAlbumsLocked();
82        }
83    }
84
85    public void enableAllAlbums(Collection<String> validAlbums) {
86        synchronized (mEnabledAlbums) {
87            mEnabledAlbums.clear();
88            mEnabledAlbums.addAll(validAlbums);
89            writeEnabledAlbumsLocked();
90        }
91    }
92
93    public void pruneObsoleteSettings(Collection<String> validAlbums) {
94        if (!validAlbums.containsAll(mEnabledAlbums)) {
95            synchronized (mEnabledAlbums) {
96                readEnabledAlbumsLocked();
97                mEnabledAlbums.retainAll(validAlbums);
98                writeEnabledAlbumsLocked();
99            }
100        }
101    }
102
103    public  boolean isConfigured() {
104        synchronized (mEnabledAlbums) {
105            return mEnabledAlbums.size() != 0;
106        }
107    }
108
109    private AlbumSettings(SharedPreferences settings) {
110        mSettings = settings;
111        mEnabledAlbums = new HashSet<String>();
112        readEnabledAlbums();
113    }
114
115    private void readEnabledAlbumsLocked() {
116        Set<String> enabledAlbums = mSettings.getStringSet(ALBUM_SET, null);
117        mEnabledAlbums.clear();
118        if (enabledAlbums != null) {
119            mEnabledAlbums.addAll(enabledAlbums);
120        }
121    }
122
123    private void writeEnabledAlbumsLocked() {
124        SharedPreferences.Editor editor = mSettings.edit();
125        // Give SharedSettings a copy, so that we are free to manipulate ours.
126        editor.putStringSet(ALBUM_SET, new HashSet<String>(mEnabledAlbums));
127        editor.commit();
128    }
129}
130