1b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling/*
2b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * Copyright (C) 2016 The Android Open Source Project
3b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling *
4b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * Licensed under the Apache License, Version 2.0 (the "License");
5b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * you may not use this file except in compliance with the License.
6b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * You may obtain a copy of the License at
7b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling *
8b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling *      http://www.apache.org/licenses/LICENSE-2.0
9b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling *
10b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * Unless required by applicable law or agreed to in writing, software
11b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * distributed under the License is distributed on an "AS IS" BASIS,
12b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * See the License for the specific language governing permissions and
14b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling * limitations under the License.
15b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling */
16b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingpackage com.android.settings.connecteddevice;
17b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
187c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhangimport android.app.Activity;
19b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingimport android.content.Context;
20762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhangimport android.provider.SearchIndexableResource;
217c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhangimport android.support.annotation.VisibleForTesting;
22b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
238f057ca3d401bc371bef9b2e94925cfe25980948Fan Zhangimport com.android.internal.logging.nano.MetricsProto;
24b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingimport com.android.settings.R;
25b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingimport com.android.settings.dashboard.DashboardFragment;
267c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhangimport com.android.settings.dashboard.SummaryLoader;
27e214570abf9067c469d033fab7030ea048d65beeDoris Lingimport com.android.settings.nfc.NfcPreferenceController;
28762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhangimport com.android.settings.search.BaseSearchIndexProvider;
294f636b90b8a41bfa3a57678e51d42547c1ba2229timhypengimport com.android.settingslib.core.AbstractPreferenceController;
304f636b90b8a41bfa3a57678e51d42547c1ba2229timhypengimport com.android.settingslib.core.lifecycle.Lifecycle;
31b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
324f636b90b8a41bfa3a57678e51d42547c1ba2229timhypengimport java.util.ArrayList;
33687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yuimport java.util.Arrays;
34b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingimport java.util.List;
35b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
36b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Lingpublic class ConnectedDeviceDashboardFragment extends DashboardFragment {
37b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
38b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    private static final String TAG = "ConnectedDeviceFrag";
39b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
40687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu    @VisibleForTesting
41687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu    static final String KEY_CONNECTED_DEVICES = "connected_device_list";
42687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu    @VisibleForTesting
43bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen    static final String KEY_AVAILABLE_DEVICES = "available_device_list";
44687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu
45b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    @Override
46b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    public int getMetricsCategory() {
478f057ca3d401bc371bef9b2e94925cfe25980948Fan Zhang        return MetricsProto.MetricsEvent.SETTINGS_CONNECTED_DEVICE_CATEGORY;
48b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    }
49b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
50b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    @Override
51b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    protected String getLogTag() {
52b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling        return TAG;
53b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    }
54b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
55b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    @Override
56e0b0e9f9025038d72f8129606cc1f432afcb54e0Fan Zhang    public int getHelpResource() {
57179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang        return R.string.help_url_connected_devices;
58179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang    }
59179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang
60179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang    @Override
61b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    protected int getPreferenceScreenResId() {
62b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling        return R.xml.connected_devices;
63b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    }
64b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling
65b2c8c9cc9cfe77934e98bfdf8a5c797f08a6ce3fDoris Ling    @Override
664f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
6778eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng        return buildPreferenceControllers(context, getLifecycle());
684f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng    }
694f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng
7078eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
7178eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng            Lifecycle lifecycle) {
724f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng        final List<AbstractPreferenceController> controllers = new ArrayList<>();
734f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng        final DiscoverableFooterPreferenceController discoverableFooterPreferenceController =
744f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng                new DiscoverableFooterPreferenceController(context);
754f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng        controllers.add(discoverableFooterPreferenceController);
764f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng
7778eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng        if (lifecycle != null) {
7878eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng            lifecycle.addObserver(discoverableFooterPreferenceController);
7978eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng        }
8078eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng
814f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng        return controllers;
824f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng    }
834f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng
844f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng    @Override
85bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen    public void onAttach(Context context) {
86bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen        super.onAttach(context);
87bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen        use(AvailableMediaDeviceGroupController.class).init(this);
88bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen        use(ConnectedDeviceGroupController.class).init(this);
89980b7189894e0bfb0b3c3c78c89028d02d558fa8hughchen        use(PreviouslyConnectedDevicePreferenceController.class).init(this);
904f636b90b8a41bfa3a57678e51d42547c1ba2229timhypeng        use(DiscoverableFooterPreferenceController.class).init(this);
91bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen    }
92bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen
937c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang    @VisibleForTesting
947c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang    static class SummaryProvider implements SummaryLoader.SummaryProvider {
957c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang
967c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        private final Context mContext;
977c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        private final SummaryLoader mSummaryLoader;
987c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang
997c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
1007c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            mContext = context;
1017c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            mSummaryLoader = summaryLoader;
1027c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        }
1037c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang
1047c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        @Override
1057c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        public void setListening(boolean listening) {
1067c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            if (listening) {
1077f1345c3cd8cb894eddd0245c03a3ae08372a528hughchen                mSummaryLoader.setSummary(this, mContext.getText(AdvancedConnectedDeviceController.
1087f1345c3cd8cb894eddd0245c03a3ae08372a528hughchen                        getConnectedDevicesSummaryResourceId(mContext)));
1097c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            }
1107c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        }
1117c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang    }
1127c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang
1137c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
1147c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            = new SummaryLoader.SummaryProviderFactory() {
1157c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        @Override
1167c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
1177c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang                SummaryLoader summaryLoader) {
1187c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang            return new SummaryProvider(activity, summaryLoader);
1197c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang        }
1207c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang    };
1217c3a87ebd3a5a3805758bb246ee5f6af17c627a0Fan Zhang
122762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang    /**
123762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang     * For Search.
124762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang     */
125687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
126762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang            new BaseSearchIndexProvider() {
127762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang                @Override
128762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang                public List<SearchIndexableResource> getXmlResourcesToIndex(
129762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang                        Context context, boolean enabled) {
130687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    final SearchIndexableResource sir = new SearchIndexableResource(context);
131687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    sir.xmlResId = R.xml.connected_devices;
132687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    return Arrays.asList(sir);
133687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                }
134687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu
135687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                @Override
13678eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng                public List<AbstractPreferenceController> createPreferenceControllers(Context
13778eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng                        context) {
13878eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng                    return buildPreferenceControllers(context, null /* lifecycle */);
13978eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng                }
14078eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng
14178eb5a81ba4b1236b6764a540546de3a84ca0c3ftimhypeng                @Override
1427ca6c2410c00856333e98ede2cec828b04f982c5Ruchi Kandoi                public List<String> getNonIndexableKeys(Context context) {
143687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    List<String> keys = super.getNonIndexableKeys(context);
144687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    // Disable because they show dynamic data
145bd3e5de207b4b3e62e08a1b0ab506e0b686399e5hughchen                    keys.add(KEY_AVAILABLE_DEVICES);
146687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    keys.add(KEY_CONNECTED_DEVICES);
147687964cf28591b30895a087f6cd364b3a6a9c1b3Lei Yu                    return keys;
1487ca6c2410c00856333e98ede2cec828b04f982c5Ruchi Kandoi                }
149762b4969d9c5efaed9241d66abc4417419ddd0e5Fan Zhang            };
1507ca6c2410c00856333e98ede2cec828b04f982c5Ruchi Kandoi}
151