1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.chrome.browser.identity;
6
7import android.content.Context;
8import android.content.SharedPreferences;
9import android.preference.PreferenceManager;
10
11import org.chromium.base.VisibleForTesting;
12
13import java.util.UUID;
14
15import javax.annotation.Nullable;
16
17/**
18 * Generates unique IDs that are {@link UUID} strings.
19 */
20public class UuidBasedUniqueIdentificationGenerator implements UniqueIdentificationGenerator {
21    public static final String GENERATOR_ID = "UUID";
22    private final Context mContext;
23    private final String mPreferenceKey;
24
25    public UuidBasedUniqueIdentificationGenerator(Context context, String preferenceKey) {
26        mContext = context;
27        mPreferenceKey = preferenceKey;
28    }
29
30    @Override
31    public String getUniqueId(@Nullable String salt) {
32        SharedPreferences preferences = PreferenceManager
33                .getDefaultSharedPreferences(mContext);
34        String storedUniqueId = preferences.getString(mPreferenceKey, null);
35        if (storedUniqueId != null) {
36            return storedUniqueId;
37        }
38
39        // Generate a new unique ID.
40        String uniqueId = getUUID();
41
42        // Store the field so we ensure we always return the same unique ID.
43        SharedPreferences.Editor editor = preferences.edit();
44        editor.putString(mPreferenceKey, uniqueId);
45        editor.apply();
46        return uniqueId;
47
48    }
49
50    @VisibleForTesting
51    String getUUID() {
52        return UUID.randomUUID().toString();
53    }
54}
55