OnboardingUtils.java revision ba5845f23b8fbc985890f892961abc8b39886611
1/*
2 * Copyright (C) 2015 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 */
16
17package com.android.tv.util;
18
19import android.content.ContentResolver;
20import android.content.Context;
21import android.content.Intent;
22import android.database.Cursor;
23import android.media.tv.TvContract.Channels;
24import android.net.Uri;
25import android.preference.PreferenceManager;
26import android.support.annotation.UiThread;
27
28import com.android.tv.TvApplication;
29import com.android.tv.data.ChannelDataManager;
30
31/**
32 * A utility class related to onboarding experience.
33 */
34public final class OnboardingUtils {
35    private static final String PREF_KEY_IS_FIRST_BOOT = "pref_onbaording_is_first_boot";
36    private static final String PREF_KEY_ONBOARDING_VERSION_CODE = "pref_onbaording_versionCode";
37    private static final int ONBOARDING_VERSION = 1;
38
39    private static final String MERCHANT_COLLECTION_URL_STRING =
40            "https://play.google.com/store/apps/collection/promotion_3001bf9_ATV_livechannels";
41    /**
42     * Intent to show merchant collection in play store.
43     */
44    public static final Intent PLAY_STORE_INTENT = new Intent(Intent.ACTION_VIEW,
45            Uri.parse(MERCHANT_COLLECTION_URL_STRING));
46
47    /**
48     * Checks if this is the first boot after the onboarding experience has been applied.
49     */
50    public static boolean isFirstBoot(Context context) {
51        return PreferenceManager.getDefaultSharedPreferences(context)
52                .getBoolean(PREF_KEY_IS_FIRST_BOOT, true);
53    }
54
55    /**
56     * Marks that the first boot has been completed.
57     */
58    public static void setFirstBootCompleted(Context context) {
59        PreferenceManager.getDefaultSharedPreferences(context)
60                .edit()
61                .putBoolean(PREF_KEY_IS_FIRST_BOOT, false)
62                .apply();
63    }
64
65    /**
66     * Checks if this is the first run of {@link com.android.tv.MainActivity} with the
67     * current onboarding version.
68     */
69    public static boolean isFirstRunWithCurrentVersion(Context context) {
70        int versionCode = PreferenceManager.getDefaultSharedPreferences(context)
71                .getInt(PREF_KEY_ONBOARDING_VERSION_CODE, 0);
72        return versionCode != ONBOARDING_VERSION;
73    }
74
75    /**
76     * Marks that the first run of {@link com.android.tv.MainActivity} with the current
77     * onboarding version has been completed.
78     */
79    public static void setFirstRunWithCurrentVersionCompleted(Context context) {
80        PreferenceManager.getDefaultSharedPreferences(context).edit()
81                .putInt(PREF_KEY_ONBOARDING_VERSION_CODE, ONBOARDING_VERSION).apply();
82    }
83
84    /**
85     * Checks whether the onboarding screen should be shown or not.
86     */
87    public static boolean needToShowOnboarding(Context context) {
88        return isFirstRunWithCurrentVersion(context) || !areChannelsAvailable(context);
89    }
90
91    /**
92     * Checks if there are any available tuner channels.
93     */
94    @UiThread
95    public static boolean areChannelsAvailable(Context context) {
96        ChannelDataManager manager = TvApplication.getSingletons(context).getChannelDataManager();
97        if (manager.isDbLoadFinished()) {
98            return manager.getChannelCount() != 0;
99        }
100        // This method should block the UI thread.
101        ContentResolver resolver = context.getContentResolver();
102        try (Cursor c = resolver.query(Channels.CONTENT_URI, new String[] {Channels._ID}, null,
103                null, null)) {
104            return c.getCount() != 0;
105        }
106    }
107
108    /**
109     * Checks if there are any available TV inputs.
110     */
111    public static boolean areInputsAvailable(Context context) {
112        return TvApplication.getSingletons(context).getTvInputManagerHelper()
113                .getTvInputInfos(true, false).size() > 0;
114    }
115}
116