/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera.app; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.android.camera.stats.profiler.Profile; import com.android.camera.stats.profiler.Profiler; import com.android.camera.stats.profiler.Profilers; public class FirstRunDetector { private static final long UNKNOWN = -1; // Default SharedPreferences key for when the application was first used. private static final String CLIENT_FIRST_USE_TIME = "client_first_use_time_millis"; private static class Singleton { private static final FirstRunDetector INSTANCE = new FirstRunDetector( Profilers.instance().guard()); } public static FirstRunDetector instance() { return Singleton.INSTANCE; } private final Profile mProfile; private long mTimeOfFirstRun; /** Flag set to true if and only if first run of application is detected. */ private boolean mIsFirstRun = false; private FirstRunDetector(Profiler profiler) { mProfile = profiler.create("FirstRunDetector getTimeOfFirstRun"); } /** * Return true if this is the first time the app was opened. */ public boolean isFirstRun() { return mIsFirstRun; } /** * Return true if this is the first time the app was opened. */ public long getTimeOfFirstRun() { return mTimeOfFirstRun; } /** * Clear the first run flag. */ public void clear() { mIsFirstRun = false; } /** * Returns time the app was first used, or UNKNOWN if the * client is too old. This could be moved a separate utility class. * * @param context Application context. */ public void initializeTimeOfFirstRun(Context context) { mProfile.start(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); mProfile.mark("PreferenceManager.getDefaultSharedPreferences"); // Read time of first installation. long timeOfFirstUseMillis = preferences.getLong(CLIENT_FIRST_USE_TIME, 0); mProfile.mark("preferences.getLong"); // Write installation time if not set. if (timeOfFirstUseMillis == 0) { SharedPreferences cameraPrefs = context.getSharedPreferences( context.getPackageName() + "_preferences_camera", Context.MODE_PRIVATE); mProfile.mark("getSharedPreferences"); // If we can find previous Shared Preferences, this is not a new install. boolean isUpgrade = cameraPrefs.getAll().size() > 0 || preferences.getAll().size() > 0; // Preference CLIENT_FIRST_USE_TIME is set to UNKNOWN for preference // upgrades and the actual first use time for new installs. We call // System.currentTimeMillis() to match the log timebase. timeOfFirstUseMillis = isUpgrade ? UNKNOWN : System.currentTimeMillis(); preferences.edit().putLong(CLIENT_FIRST_USE_TIME, timeOfFirstUseMillis).apply(); mProfile.mark("preferences.edit()"); if (!isUpgrade) { mIsFirstRun = true; } } mTimeOfFirstRun = timeOfFirstUseMillis; mProfile.stop(); } }