190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang/*
290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * Copyright 2016, The Android Open Source Project
390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang *
490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * Licensed under the Apache License, Version 2.0 (the "License");
590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * you may not use this file except in compliance with the License.
690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * You may obtain a copy of the License at
790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang *
890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang *     http://www.apache.org/licenses/LICENSE-2.0
990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang *
1090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * Unless required by applicable law or agreed to in writing, software
1190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * distributed under the License is distributed on an "AS IS" BASIS,
1290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * See the License for the specific language governing permissions and
1490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang * limitations under the License.
1590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang */
1690f58ca887207a527c80d7e9ccea97e205c960d4Victor Changpackage com.android.managedprovisioning.common;
1790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
1890f58ca887207a527c80d7e9ccea97e205c960d4Victor Changimport android.content.Context;
1990f58ca887207a527c80d7e9ccea97e205c960d4Victor Changimport android.content.SharedPreferences;
2090f58ca887207a527c80d7e9ccea97e205c960d4Victor Changimport android.support.annotation.VisibleForTesting;
2190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
2290f58ca887207a527c80d7e9ccea97e205c960d4Victor Changpublic class ManagedProvisioningSharedPreferences {
2390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    public static final long DEFAULT_PROVISIONING_ID = 0L;
2490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
2590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    @VisibleForTesting
2690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    static final String KEY_PROVISIONING_ID = "provisioning_id";
2790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
2890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    @VisibleForTesting
2990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    static final String SHARED_PREFERENCE = "managed_profile_shared_preferences";
3090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
3190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    /**
3290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang     * It's a process-wise in-memory write lock. No other processes will write the same file.
3390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang     */
3490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    private static final Object sWriteLock = new Object();
3590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
3690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    private final SharedPreferences mSharedPreferences;
3790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
3890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    public ManagedProvisioningSharedPreferences(Context context) {
3990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        mSharedPreferences = context.getSharedPreferences(SHARED_PREFERENCE, Context.MODE_PRIVATE);
4090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    }
4190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
4290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    @VisibleForTesting
4390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    public long getProvisioningId() {
4490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        return mSharedPreferences.getLong(KEY_PROVISIONING_ID, DEFAULT_PROVISIONING_ID);
4590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    }
4690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
4790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    /**
4890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang     * Can assume the id is unique across all provisioning sessions
4990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang     * @return a new provisioning id by incrementing the current id
5090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang     */
5190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    public long incrementAndGetProvisioningId() {
5290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        synchronized (sWriteLock) {
5390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            long provisioningId = getProvisioningId();
5490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            provisioningId++;
5590f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            // commit synchronously
5690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            mSharedPreferences.edit().putLong(KEY_PROVISIONING_ID, provisioningId).commit();
5790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            return provisioningId;
5890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        }
5990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    }
6090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang}
61