15b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk/*
25b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * Copyright (C) 2015 The Android Open Source Project
35b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk *
45b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * Licensed under the Apache License, Version 2.0 (the "License");
55b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * you may not use this file except in compliance with the License.
65b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * You may obtain a copy of the License at
75b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk *
85b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
95b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk *
105b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * Unless required by applicable law or agreed to in writing, software
115b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * distributed under the License is distributed on an "AS IS" BASIS,
125b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * See the License for the specific language governing permissions and
145b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk * limitations under the License.
155b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk */
165b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monkpackage com.android.settings.applications;
175b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
18d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monkimport android.content.BroadcastReceiver;
1991e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport android.content.Context;
2067e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganovimport android.content.Intent;
217f70ba18e6760c2539704c16cf3865bf49953d50Billy Lauimport android.os.AsyncTask;
2239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.os.Bundle;
2391e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport android.provider.SearchIndexableResource;
2439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
259d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
265b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monkimport com.android.settings.R;
275b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monkimport com.android.settings.SettingsPreferenceFragment;
2891e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport com.android.settings.Utils;
29e9866b6dc47201630c057f946423d572b8c46af8Jason Monkimport com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback;
3091e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport com.android.settings.search.BaseSearchIndexProvider;
3191e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport com.android.settings.search.Indexable;
3267cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState;
3367cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.AppEntry;
3467cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.Session;
355b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
365b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monkimport java.util.ArrayList;
3791e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport java.util.Arrays;
3891e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monkimport java.util.List;
395b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
4073a2496d316cb9a8dc0020c245bc61f766b7f7c2Jason Monkpublic class AdvancedAppSettings extends SettingsPreferenceFragment implements
4191e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk        ApplicationsState.Callbacks, Indexable {
425b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
435b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    static final String TAG = "AdvancedAppSettings";
445b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
452f41aa7955e27a050155765803d3a5ae98782f26Jason Monk    private static final String KEY_APP_PERM = "manage_perms";
468b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio    private static final String KEY_APP_DOMAIN_URLS = "domain_urls";
471eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk    private static final String KEY_HIGH_POWER_APPS = "high_power_apps";
487f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau    private static final String KEY_SYSTEM_ALERT_WINDOW = "system_alert_window";
497f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau    private static final String KEY_WRITE_SETTINGS_APPS = "write_settings_apps";
505b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
515b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    private Session mSession;
52e9866b6dc47201630c057f946423d572b8c46af8Jason Monk    private Preference mAppPermsPreference;
538b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio    private Preference mAppDomainURLsPreference;
541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk    private Preference mHighPowerPreference;
557f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau    private Preference mSystemAlertWindowPreference;
567f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau    private Preference mWriteSettingsPreference;
575b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
58d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk    private BroadcastReceiver mPermissionReceiver;
59d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk
605b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
615b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onCreate(Bundle icicle) {
625b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        super.onCreate(icicle);
635b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        addPreferencesFromResource(R.xml.advanced_apps);
645b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
6567e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov        Preference permissions = getPreferenceScreen().findPreference(KEY_APP_PERM);
6667e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov        permissions.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSIONS));
6767e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov
6867e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov        ApplicationsState applicationsState = ApplicationsState.getInstance(
6967e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov                getActivity().getApplication());
7067e067fff4e4ef1eb54f9c238dbf07312434a07eSvet Ganov        mSession = applicationsState.newSession(this);
715b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
72e9866b6dc47201630c057f946423d572b8c46af8Jason Monk        mAppPermsPreference = findPreference(KEY_APP_PERM);
738b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio        mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS);
741eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk        mHighPowerPreference = findPreference(KEY_HIGH_POWER_APPS);
757f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau        mSystemAlertWindowPreference = findPreference(KEY_SYSTEM_ALERT_WINDOW);
767f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau        mWriteSettingsPreference = findPreference(KEY_WRITE_SETTINGS_APPS);
775b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
785b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
795b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
819d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.APPLICATIONS_ADVANCED;
828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
848a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
855b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onRunningStateChanged(boolean running) {
865b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
875b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
885b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
895b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
905b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onPackageListChanged() {
91c5291b87b3b21cb6621d6d29b0400aad9c3d4f40Jason Monk        // No-op.
925b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
935b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
945b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
955b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onRebuildComplete(ArrayList<AppEntry> apps) {
965b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
975b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
985b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
995b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
1005b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onPackageIconChanged() {
1015b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
1025b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
1035b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
1045b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
1055b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onPackageSizeChanged(String packageName) {
1065b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
1075b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
1085b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
1095b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
1105b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onAllSizesComputed() {
1115b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
1125b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
1135b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
1145b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    @Override
1155b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    public void onLauncherInfoChanged() {
1165b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk        // No-op.
1175b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk    }
1185b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk
119584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
120584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onLoadEntriesCompleted() {
121584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No-op.
122584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
123e9866b6dc47201630c057f946423d572b8c46af8Jason Monk
124e9866b6dc47201630c057f946423d572b8c46af8Jason Monk    private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() {
125e9866b6dc47201630c057f946423d572b8c46af8Jason Monk        @Override
1267f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov        public void onAppWithPermissionsCountsResult(int standardGrantedPermissionAppCount,
1277f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov                int standardUsedPermissionAppCount) {
128e9866b6dc47201630c057f946423d572b8c46af8Jason Monk            if (getActivity() == null) {
129e9866b6dc47201630c057f946423d572b8c46af8Jason Monk                return;
130e9866b6dc47201630c057f946423d572b8c46af8Jason Monk            }
131d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk            mPermissionReceiver = null;
1327f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov            if (standardUsedPermissionAppCount != 0) {
133e9866b6dc47201630c057f946423d572b8c46af8Jason Monk                mAppPermsPreference.setSummary(getContext().getString(
1347f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov                        R.string.app_permissions_summary,
1357f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov                        standardGrantedPermissionAppCount,
1367f62addc1082f5f926a04a83edf07675b1317019Svetoslav Ganov                        standardUsedPermissionAppCount));
137e9866b6dc47201630c057f946423d572b8c46af8Jason Monk            } else {
138e9866b6dc47201630c057f946423d572b8c46af8Jason Monk                mAppPermsPreference.setSummary(null);
139e9866b6dc47201630c057f946423d572b8c46af8Jason Monk            }
140e9866b6dc47201630c057f946423d572b8c46af8Jason Monk        }
141e9866b6dc47201630c057f946423d572b8c46af8Jason Monk    };
1427f70ba18e6760c2539704c16cf3865bf49953d50Billy Lau
14391e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
14491e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk            new BaseSearchIndexProvider() {
14591e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                @Override
14691e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                public List<SearchIndexableResource> getXmlResourcesToIndex(
14791e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                        Context context, boolean enabled) {
14891e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                    SearchIndexableResource sir = new SearchIndexableResource(context);
14991e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                    sir.xmlResId = R.xml.advanced_apps;
15091e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                    return Arrays.asList(sir);
15191e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                }
15291e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk
15391e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                @Override
15491e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                public List<String> getNonIndexableKeys(Context context) {
15591e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                    return Utils.getNonIndexable(R.xml.advanced_apps, context);
15691e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk                }
15791e2f89b0f8b440728fe395ee02a71ae59e21ffcJason Monk            };
1585b3aa36e6fd17db995a31f9549b8fe628754a750Jason Monk}
159