Merge "Implement new Manage Apps list"
This commit is contained in:
@@ -759,7 +759,6 @@
|
|||||||
<intent-filter android:priority="1">
|
<intent-filter android:priority="1">
|
||||||
<action android:name="android.settings.APPLICATION_SETTINGS" />
|
<action android:name="android.settings.APPLICATION_SETTINGS" />
|
||||||
<action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
|
<action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
|
||||||
<action android:name="android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -774,6 +773,19 @@
|
|||||||
android:resource="@id/application_settings" />
|
android:resource="@id/application_settings" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name="Settings$AllApplicationsActivity"
|
||||||
|
android:label="@string/applications_settings"
|
||||||
|
android:taskAffinity="">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
|
android:value="com.android.settings.applications.ManageApplications" />
|
||||||
|
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
|
||||||
|
android:resource="@id/application_settings" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
<!-- Keep compatibility with old shortcuts. -->
|
<!-- Keep compatibility with old shortcuts. -->
|
||||||
<activity-alias android:name=".applications.ManageApplications"
|
<activity-alias android:name=".applications.ManageApplications"
|
||||||
android:label="@string/applications_settings"
|
android:label="@string/applications_settings"
|
||||||
|
25
res/drawable/ic_settings_24dp.xml
Normal file
25
res/drawable/ic_settings_24dp.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:pathData="M19.4,13.0c0.0,-0.3 0.1,-0.6 0.1,-1.0s0.0,-0.7 -0.1,-1.0l2.1,-1.7c0.2,-0.2 0.2,-0.4 0.1,-0.6l-2.0,-3.5C19.5,5.1 19.3,5.0 19.0,5.1l-2.5,1.0c-0.5,-0.4 -1.1,-0.7 -1.7,-1.0l-0.4,-2.6C14.5,2.2 14.2,2.0 14.0,2.0l-4.0,0.0C9.8,2.0 9.5,2.2 9.5,2.4L9.1,5.1C8.5,5.3 8.0,5.7 7.4,6.1L5.0,5.1C4.7,5.0 4.5,5.1 4.3,5.3l-2.0,3.5C2.2,8.9 2.3,9.2 2.5,9.4L4.6,11.0c0.0,0.3 -0.1,0.6 -0.1,1.0s0.0,0.7 0.1,1.0l-2.1,1.7c-0.2,0.2 -0.2,0.4 -0.1,0.6l2.0,3.5C4.5,18.9 4.7,19.0 5.0,18.9l2.5,-1.0c0.5,0.4 1.1,0.7 1.7,1.0l0.4,2.6c0.0,0.2 0.2,0.4 0.5,0.4l4.0,0.0c0.2,0.0 0.5,-0.2 0.5,-0.4l0.4,-2.6c0.6,-0.3 1.2,-0.6 1.7,-1.0l2.5,1.0c0.2,0.1 0.5,0.0 0.6,-0.2l2.0,-3.5c0.1,-0.2 0.1,-0.5 -0.1,-0.6L19.4,13.0zM12.0,15.5c-1.9,0.0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5s3.5,1.6 3.5,3.5S13.9,15.5 12.0,15.5z"
|
||||||
|
android:fillColor="#ffffffff" />
|
||||||
|
</vector>
|
41
res/layout/apps_filter_spinner.xml
Normal file
41
res/layout/apps_filter_spinner.xml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?android:attr/actionBarSize"
|
||||||
|
android:background="@drawable/switchbar_background"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:theme="?attr/switchBarTheme" >
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/filter_spinner"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/switchbar_subsettings_margin_start"
|
||||||
|
android:layout_alignWithParentIfMissing="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/row_divider"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
27
res/layout/filter_spinner_item.xml
Normal file
27
res/layout/filter_spinner_item.xml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@android:id/text1"
|
||||||
|
style="?android:attr/spinnerItemStyle"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:textAppearance="@style/TextAppearance.Switch"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textAlignment="inherit"/>
|
@@ -1,43 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
/*
|
|
||||||
**
|
|
||||||
** Copyright 2012, 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.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:background="@drawable/default_preference_background">
|
|
||||||
|
|
||||||
<android.support.v4.view.ViewPager
|
|
||||||
android:id="@+id/pager"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="1">
|
|
||||||
<android.support.v4.view.PagerTabStrip
|
|
||||||
android:id="@+id/tabs"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="top"
|
|
||||||
android:textAppearance="@style/TextAppearance.PagerTabs"
|
|
||||||
android:padding="0dp">
|
|
||||||
</android.support.v4.view.PagerTabStrip>
|
|
||||||
</android.support.v4.view.ViewPager>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
23
res/menu/manage_apps.xml
Normal file
23
res/menu/manage_apps.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item
|
||||||
|
android:id="@+id/advanced"
|
||||||
|
android:title="@string/advanced_apps"
|
||||||
|
android:icon="@drawable/ic_settings_24dp"
|
||||||
|
android:showAsAction="collapseActionView|ifRoom" />
|
||||||
|
</menu>
|
@@ -5626,6 +5626,8 @@
|
|||||||
<string name="keywords_accounts">account</string>
|
<string name="keywords_accounts">account</string>
|
||||||
<string name="keywords_users">restriction restrict restricted</string>
|
<string name="keywords_users">restriction restrict restricted</string>
|
||||||
<string name="keywords_keyboard_and_ime">text correction correct sound vibrate auto language gesture suggest suggestion theme offensive word type emoji international</string>
|
<string name="keywords_keyboard_and_ime">text correction correct sound vibrate auto language gesture suggest suggestion theme offensive word type emoji international</string>
|
||||||
|
<string name="keywords_reset_apps">reset preferences default</string>
|
||||||
|
<string name="keywords_all_apps">apps download applications system</string>
|
||||||
<!-- Search keywords for different screen unlock modes : slide to unlock, password, pattern and PIN [CHAR LIMIT=none] -->
|
<!-- Search keywords for different screen unlock modes : slide to unlock, password, pattern and PIN [CHAR LIMIT=none] -->
|
||||||
<string name="keywords_lockscreen">slide password pattern pin</string>
|
<string name="keywords_lockscreen">slide password pattern pin</string>
|
||||||
|
|
||||||
@@ -6088,10 +6090,29 @@
|
|||||||
<item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> permissions granted</item>
|
<item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> permissions granted</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|
||||||
<!-- Launch defaults preference summary with some set [CHAR LIMIT=40] -->
|
<!-- Launch defaults preference summary with some set [CHAR LIMIT=40] -->
|
||||||
<string name="launch_defaults_some">Some defaults set</string>
|
<string name="launch_defaults_some">Some defaults set</string>
|
||||||
<!-- Launch defaults preference summary with none set [CHAR LIMIT=40] -->
|
<!-- Launch defaults preference summary with none set [CHAR LIMIT=40] -->
|
||||||
<string name="launch_defaults_none">No defaults set</string>
|
<string name="launch_defaults_none">No defaults set</string>
|
||||||
|
|
||||||
|
<!-- Label for showing all apps in list [CHAR LIMIT=30] -->
|
||||||
|
<string name="filter_all_apps">All apps</string>
|
||||||
|
<!-- Label for showing enabled apps in list [CHAR LIMIT=30] -->
|
||||||
|
<string name="filter_enabled_apps">Enabled</string>
|
||||||
|
<!-- Label for showing personal apps in list [CHAR LIMIT=30] -->
|
||||||
|
<string name="filter_personal_apps">Personal</string>
|
||||||
|
<!-- Label for showing work apps in list [CHAR LIMIT=30] -->
|
||||||
|
<string name="filter_work_apps">Work</string>
|
||||||
|
|
||||||
|
<!-- Description for advanced menu option to reset app preferences [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="reset_app_preferences_description">Reset preferences across all apps to defaults</string>
|
||||||
|
|
||||||
|
<!-- Description of settings item that leads to list of all apps
|
||||||
|
[CHAR LIMIT=NONE] -->
|
||||||
|
<string name="all_apps_summary"><xliff:g id="count" example="10">%d</xliff:g> apps installed, including system and downloaded apps</string>
|
||||||
|
|
||||||
|
<!-- Title for advanced application management settings [CHAR LIMIT=30] -->
|
||||||
|
<string name="advanced_apps">Advanced</string>
|
||||||
|
|
||||||
<!-- Warning toast shown when data usage screen can't find specified app -->
|
<!-- Warning toast shown when data usage screen can't find specified app -->
|
||||||
<string name="unknown_app">Unknown app</string>
|
<string name="unknown_app">Unknown app</string>
|
||||||
|
38
res/xml/advanced_apps.xml
Normal file
38
res/xml/advanced_apps.xml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
|
||||||
|
android:key="applications_settings">
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="all_apps"
|
||||||
|
android:fragment="com.android.settings.applications.ManageApplications"
|
||||||
|
android:title="@string/filter_all_apps"
|
||||||
|
settings:keywords="@string/keywords_all_apps">
|
||||||
|
<extra
|
||||||
|
android:name="classname"
|
||||||
|
android:value="com.android.settings.Settings$AllApplicationsActivity" />
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="reset_all"
|
||||||
|
android:title="@string/reset_app_preferences"
|
||||||
|
android:summary="@string/reset_app_preferences_description"
|
||||||
|
settings:keywords="@string/keywords_reset_apps" />
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
@@ -47,6 +47,7 @@ public class Settings extends SettingsActivity {
|
|||||||
public static class DeviceInfoSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class DeviceInfoSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class ApplicationSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class ApplicationSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class ManageApplicationsActivity extends SettingsActivity { /* empty */ }
|
public static class ManageApplicationsActivity extends SettingsActivity { /* empty */ }
|
||||||
|
public static class AllApplicationsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class AppOpsSummaryActivity extends SettingsActivity {
|
public static class AppOpsSummaryActivity extends SettingsActivity {
|
||||||
@Override
|
@Override
|
||||||
public boolean isValidFragment(String className) {
|
public boolean isValidFragment(String className) {
|
||||||
|
257
src/com/android/settings/applications/AdvancedAppSettings.java
Normal file
257
src/com/android/settings/applications/AdvancedAppSettings.java
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
/*
|
||||||
|
* 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.settings.applications;
|
||||||
|
|
||||||
|
import static android.net.NetworkPolicyManager.POLICY_NONE;
|
||||||
|
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.AppOpsManager;
|
||||||
|
import android.app.INotificationManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.IPackageManager;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.net.NetworkPolicyManager;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
|
import com.android.settings.applications.ApplicationsState.AppEntry;
|
||||||
|
import com.android.settings.applications.ApplicationsState.Callbacks;
|
||||||
|
import com.android.settings.applications.ApplicationsState.Session;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks,
|
||||||
|
DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
|
||||||
|
|
||||||
|
static final String TAG = "AdvancedAppSettings";
|
||||||
|
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
|
|
||||||
|
private static final String KEY_ALL_APPS = "all_apps";
|
||||||
|
private static final String KEY_RESET_ALL = "reset_all";
|
||||||
|
private static final String EXTRA_RESET_DIALOG = "resetDialog";
|
||||||
|
|
||||||
|
private ApplicationsState mApplicationsState;
|
||||||
|
private Session mSession;
|
||||||
|
private Preference mAllApps;
|
||||||
|
private Preference mResetAll;
|
||||||
|
|
||||||
|
AlertDialog mResetDialog;
|
||||||
|
|
||||||
|
private boolean mActivityResumed;
|
||||||
|
private PackageManager mPm;
|
||||||
|
private IPackageManager mIPm;
|
||||||
|
private INotificationManager mNm;
|
||||||
|
private NetworkPolicyManager mNpm;
|
||||||
|
private AppOpsManager mAom;
|
||||||
|
private Handler mHandler;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle icicle) {
|
||||||
|
super.onCreate(icicle);
|
||||||
|
addPreferencesFromResource(R.xml.advanced_apps);
|
||||||
|
|
||||||
|
mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
|
||||||
|
mSession = mApplicationsState.newSession(this);
|
||||||
|
|
||||||
|
mAllApps = findPreference(KEY_ALL_APPS);
|
||||||
|
mResetAll = findPreference(KEY_RESET_ALL);
|
||||||
|
mResetAll.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
buildResetDialog();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
updateAllAppsSummary();
|
||||||
|
|
||||||
|
mPm = getActivity().getPackageManager();
|
||||||
|
mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
|
||||||
|
mNm = INotificationManager.Stub.asInterface(
|
||||||
|
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
|
||||||
|
mNpm = NetworkPolicyManager.from(getActivity());
|
||||||
|
mAom = (AppOpsManager)getActivity().getSystemService(Context.APP_OPS_SERVICE);
|
||||||
|
mHandler = new Handler(getActivity().getMainLooper());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAllAppsSummary() {
|
||||||
|
mAllApps.setSummary(getString(R.string.all_apps_summary, mSession.getAllApps().size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
|
||||||
|
buildResetDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
if (mResetDialog != null) {
|
||||||
|
mResetDialog.dismiss();
|
||||||
|
mResetDialog = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
mActivityResumed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
mActivityResumed = false;
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
if (mResetDialog != null) {
|
||||||
|
outState.putBoolean(EXTRA_RESET_DIALOG, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buildResetDialog() {
|
||||||
|
if (mResetDialog == null) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle(R.string.reset_app_preferences_title);
|
||||||
|
builder.setMessage(R.string.reset_app_preferences_desc);
|
||||||
|
builder.setPositiveButton(R.string.reset_app_preferences_button, this);
|
||||||
|
builder.setNegativeButton(R.string.cancel, null);
|
||||||
|
mResetDialog = builder.show();
|
||||||
|
mResetDialog.setOnDismissListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDismiss(DialogInterface dialog) {
|
||||||
|
if (mResetDialog == dialog) {
|
||||||
|
mResetDialog = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (mResetDialog == dialog) {
|
||||||
|
(new AsyncTask<Void, Void, Void>() {
|
||||||
|
@Override protected Void doInBackground(Void... params) {
|
||||||
|
List<ApplicationInfo> apps = mPm.getInstalledApplications(
|
||||||
|
PackageManager.GET_DISABLED_COMPONENTS);
|
||||||
|
for (int i=0; i<apps.size(); i++) {
|
||||||
|
ApplicationInfo app = apps.get(i);
|
||||||
|
try {
|
||||||
|
if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
|
||||||
|
mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
|
||||||
|
} catch (android.os.RemoteException ex) {
|
||||||
|
}
|
||||||
|
if (!app.enabled) {
|
||||||
|
if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
|
||||||
|
if (mPm.getApplicationEnabledSetting(app.packageName)
|
||||||
|
== PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
|
||||||
|
mPm.setApplicationEnabledSetting(app.packageName,
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
|
||||||
|
PackageManager.DONT_KILL_APP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mIPm.resetPreferredActivities(UserHandle.myUserId());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
}
|
||||||
|
mAom.resetAllModes();
|
||||||
|
final int[] restrictedUids = mNpm.getUidsWithPolicy(
|
||||||
|
POLICY_REJECT_METERED_BACKGROUND);
|
||||||
|
final int currentUserId = ActivityManager.getCurrentUser();
|
||||||
|
for (int uid : restrictedUids) {
|
||||||
|
// Only reset for current user
|
||||||
|
if (UserHandle.getUserId(uid) == currentUserId) {
|
||||||
|
if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
|
||||||
|
mNpm.setUidPolicy(uid, POLICY_NONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mHandler.post(new Runnable() {
|
||||||
|
@Override public void run() {
|
||||||
|
if (DEBUG) Log.v(TAG, "Done clearing");
|
||||||
|
if (getActivity() != null && mActivityResumed) {
|
||||||
|
if (DEBUG) Log.v(TAG, "Updating UI!");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRunningStateChanged(boolean running) {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageListChanged() {
|
||||||
|
updateAllAppsSummary();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRebuildComplete(ArrayList<AppEntry> apps) {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageIconChanged() {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageSizeChanged(String packageName) {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAllSizesComputed() {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLauncherInfoChanged() {
|
||||||
|
// No-op.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -179,6 +179,11 @@ public abstract class AppInfoBase extends PreferenceFragment
|
|||||||
// No op.
|
// No op.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLauncherInfoChanged() {
|
||||||
|
// No op.
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPackageListChanged() {
|
public void onPackageListChanged() {
|
||||||
refreshUi();
|
refreshUi();
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.AppGlobals;
|
import android.app.AppGlobals;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
@@ -12,6 +13,7 @@ import android.content.pm.IPackageStatsObserver;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.PackageStats;
|
import android.content.pm.PackageStats;
|
||||||
import android.content.pm.ParceledListSlice;
|
import android.content.pm.ParceledListSlice;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -54,11 +56,12 @@ public class ApplicationsState {
|
|||||||
public void onPackageIconChanged();
|
public void onPackageIconChanged();
|
||||||
public void onPackageSizeChanged(String packageName);
|
public void onPackageSizeChanged(String packageName);
|
||||||
public void onAllSizesComputed();
|
public void onAllSizesComputed();
|
||||||
|
public void onLauncherInfoChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static interface AppFilter {
|
public static interface AppFilter {
|
||||||
public void init();
|
public void init();
|
||||||
public boolean filterApp(ApplicationInfo info);
|
public boolean filterApp(AppEntry info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static final int SIZE_UNKNOWN = -1;
|
static final int SIZE_UNKNOWN = -1;
|
||||||
@@ -90,7 +93,7 @@ public class ApplicationsState {
|
|||||||
// for purposes of cleaning them up in the app details UI.
|
// for purposes of cleaning them up in the app details UI.
|
||||||
long externalCacheSize;
|
long externalCacheSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AppEntry extends SizeInfo {
|
public static class AppEntry extends SizeInfo {
|
||||||
final File apkFile;
|
final File apkFile;
|
||||||
final long id;
|
final long id;
|
||||||
@@ -100,7 +103,9 @@ public class ApplicationsState {
|
|||||||
long externalSize;
|
long externalSize;
|
||||||
|
|
||||||
boolean mounted;
|
boolean mounted;
|
||||||
|
|
||||||
|
boolean hasLauncherEntry;
|
||||||
|
|
||||||
String getNormalizedLabel() {
|
String getNormalizedLabel() {
|
||||||
if (normalizedLabel != null) {
|
if (normalizedLabel != null) {
|
||||||
return normalizedLabel;
|
return normalizedLabel;
|
||||||
@@ -128,7 +133,7 @@ public class ApplicationsState {
|
|||||||
this.sizeStale = true;
|
this.sizeStale = true;
|
||||||
ensureLabel(context);
|
ensureLabel(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ensureLabel(Context context) {
|
void ensureLabel(Context context) {
|
||||||
if (this.label == null || !this.mounted) {
|
if (this.label == null || !this.mounted) {
|
||||||
if (!this.apkFile.exists()) {
|
if (!this.apkFile.exists()) {
|
||||||
@@ -141,7 +146,7 @@ public class ApplicationsState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean ensureIconLocked(Context context, PackageManager pm) {
|
boolean ensureIconLocked(Context context, PackageManager pm) {
|
||||||
if (this.icon == null) {
|
if (this.icon == null) {
|
||||||
if (this.apkFile.exists()) {
|
if (this.apkFile.exists()) {
|
||||||
@@ -175,13 +180,6 @@ public class ApplicationsState {
|
|||||||
private final Collator sCollator = Collator.getInstance();
|
private final Collator sCollator = Collator.getInstance();
|
||||||
@Override
|
@Override
|
||||||
public int compare(AppEntry object1, AppEntry object2) {
|
public int compare(AppEntry object1, AppEntry object2) {
|
||||||
final boolean normal1 = object1.info.enabled
|
|
||||||
&& (object1.info.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
|
|
||||||
final boolean normal2 = object2.info.enabled
|
|
||||||
&& (object2.info.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
|
|
||||||
if (normal1 != normal2) {
|
|
||||||
return normal1 ? -1 : 1;
|
|
||||||
}
|
|
||||||
return sCollator.compare(object1.label, object2.label);
|
return sCollator.compare(object1.label, object2.label);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -219,58 +217,105 @@ public class ApplicationsState {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AppFilter THIRD_PARTY_FILTER = new AppFilter() {
|
public static final AppFilter FILTER_PERSONAL = new AppFilter() {
|
||||||
|
private int mCurrentUser;
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
mCurrentUser = ActivityManager.getCurrentUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filterApp(AppEntry entry) {
|
||||||
|
return UserHandle.getUserId(entry.info.uid) == mCurrentUser;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final AppFilter FILTER_WORK = new AppFilter() {
|
||||||
|
private int mCurrentUser;
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
mCurrentUser = ActivityManager.getCurrentUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filterApp(AppEntry entry) {
|
||||||
|
return UserHandle.getUserId(entry.info.uid) != mCurrentUser;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final AppFilter FILTER_DOWNLOADED_AND_LAUNCHER = new AppFilter() {
|
||||||
public void init() {
|
public void init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filterApp(ApplicationInfo info) {
|
public boolean filterApp(AppEntry entry) {
|
||||||
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
||||||
return true;
|
return true;
|
||||||
} else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
} else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||||
|
return true;
|
||||||
|
} else if (entry.hasLauncherEntry) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AppFilter ON_SD_CARD_FILTER = new AppFilter() {
|
public static final AppFilter FILTER_THIRD_PARTY = new AppFilter() {
|
||||||
|
public void init() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filterApp(AppEntry entry) {
|
||||||
|
if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
||||||
|
return true;
|
||||||
|
} else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final AppFilter FILTER_ON_SD_CARD = new AppFilter() {
|
||||||
final CanBeOnSdCardChecker mCanBeOnSdCardChecker
|
final CanBeOnSdCardChecker mCanBeOnSdCardChecker
|
||||||
= new CanBeOnSdCardChecker();
|
= new CanBeOnSdCardChecker();
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
mCanBeOnSdCardChecker.init();
|
mCanBeOnSdCardChecker.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filterApp(ApplicationInfo info) {
|
public boolean filterApp(AppEntry entry) {
|
||||||
return mCanBeOnSdCardChecker.check(info);
|
return mCanBeOnSdCardChecker.check(entry.info);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AppFilter DISABLED_FILTER = new AppFilter() {
|
public static final AppFilter FILTER_DISABLED = new AppFilter() {
|
||||||
public void init() {
|
public void init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filterApp(ApplicationInfo info) {
|
public boolean filterApp(AppEntry entry) {
|
||||||
if (!info.enabled) {
|
return !entry.info.enabled;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AppFilter ALL_ENABLED_FILTER = new AppFilter() {
|
public static final AppFilter FILTER_ALL_ENABLED = new AppFilter() {
|
||||||
public void init() {
|
public void init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filterApp(ApplicationInfo info) {
|
public boolean filterApp(AppEntry entry) {
|
||||||
if (info.enabled) {
|
return entry.info.enabled;
|
||||||
return true;
|
}
|
||||||
}
|
};
|
||||||
return false;
|
|
||||||
|
public static final AppFilter FILTER_EVERYTHING = new AppFilter() {
|
||||||
|
public void init() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filterApp(AppEntry entry) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -398,6 +443,7 @@ public class ApplicationsState {
|
|||||||
static final int MSG_PACKAGE_SIZE_CHANGED = 4;
|
static final int MSG_PACKAGE_SIZE_CHANGED = 4;
|
||||||
static final int MSG_ALL_SIZES_COMPUTED = 5;
|
static final int MSG_ALL_SIZES_COMPUTED = 5;
|
||||||
static final int MSG_RUNNING_STATE_CHANGED = 6;
|
static final int MSG_RUNNING_STATE_CHANGED = 6;
|
||||||
|
static final int MSG_LAUNCHER_INFO_CHANGED = 7;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message msg) {
|
public void handleMessage(Message msg) {
|
||||||
@@ -436,6 +482,11 @@ public class ApplicationsState {
|
|||||||
msg.arg1 != 0);
|
msg.arg1 != 0);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case MSG_LAUNCHER_INFO_CHANGED: {
|
||||||
|
for (int i=0; i<mActiveSessions.size(); i++) {
|
||||||
|
mActiveSessions.get(i).mCallbacks.onLauncherInfoChanged();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -487,7 +538,7 @@ public class ApplicationsState {
|
|||||||
* it keeps running and locking again it can prevent the main thread from
|
* it keeps running and locking again it can prevent the main thread from
|
||||||
* acquiring its lock for a long time... sometimes even > 5 seconds
|
* acquiring its lock for a long time... sometimes even > 5 seconds
|
||||||
* (leading to an ANR).
|
* (leading to an ANR).
|
||||||
*
|
*
|
||||||
* Dalvik will promote a monitor to a "real" lock if it detects enough
|
* Dalvik will promote a monitor to a "real" lock if it detects enough
|
||||||
* contention on it. It doesn't figure this out fast enough for us
|
* contention on it. It doesn't figure this out fast enough for us
|
||||||
* here, though, so this little trick will force it to turn into a real
|
* here, though, so this little trick will force it to turn into a real
|
||||||
@@ -543,6 +594,12 @@ public class ApplicationsState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ArrayList<AppEntry> getAllApps() {
|
||||||
|
synchronized (mEntriesMap) {
|
||||||
|
return new ArrayList<>(mAppEntries);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Creates a new list of app entries with the given filter and comparator.
|
// Creates a new list of app entries with the given filter and comparator.
|
||||||
ArrayList<AppEntry> rebuild(AppFilter filter, Comparator<AppEntry> comparator) {
|
ArrayList<AppEntry> rebuild(AppFilter filter, Comparator<AppEntry> comparator) {
|
||||||
synchronized (mRebuildSync) {
|
synchronized (mRebuildSync) {
|
||||||
@@ -600,22 +657,21 @@ public class ApplicationsState {
|
|||||||
if (filter != null) {
|
if (filter != null) {
|
||||||
filter.init();
|
filter.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ApplicationInfo> apps;
|
List<AppEntry> apps;
|
||||||
synchronized (mEntriesMap) {
|
synchronized (mEntriesMap) {
|
||||||
apps = new ArrayList<ApplicationInfo>(mApplications);
|
apps = new ArrayList<>(mAppEntries);
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<AppEntry> filteredApps = new ArrayList<AppEntry>();
|
ArrayList<AppEntry> filteredApps = new ArrayList<AppEntry>();
|
||||||
if (DEBUG) Log.i(TAG, "Rebuilding...");
|
if (DEBUG) Log.i(TAG, "Rebuilding...");
|
||||||
for (int i=0; i<apps.size(); i++) {
|
for (int i=0; i<apps.size(); i++) {
|
||||||
ApplicationInfo info = apps.get(i);
|
AppEntry entry = apps.get(i);
|
||||||
if (filter == null || filter.filterApp(info)) {
|
if (filter == null || filter.filterApp(entry)) {
|
||||||
synchronized (mEntriesMap) {
|
synchronized (mEntriesMap) {
|
||||||
if (DEBUG_LOCKING) Log.v(TAG, "rebuild acquired lock");
|
if (DEBUG_LOCKING) Log.v(TAG, "rebuild acquired lock");
|
||||||
AppEntry entry = getEntryLocked(info);
|
|
||||||
entry.ensureLabel(mContext);
|
entry.ensureLabel(mContext);
|
||||||
if (DEBUG) Log.i(TAG, "Using " + info.packageName + ": " + entry);
|
if (DEBUG) Log.i(TAG, "Using " + entry.info.packageName + ": " + entry);
|
||||||
filteredApps.add(entry);
|
filteredApps.add(entry);
|
||||||
if (DEBUG_LOCKING) Log.v(TAG, "rebuild releasing lock");
|
if (DEBUG_LOCKING) Log.v(TAG, "rebuild releasing lock");
|
||||||
}
|
}
|
||||||
@@ -757,7 +813,7 @@ public class ApplicationsState {
|
|||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ensureIcon(AppEntry entry) {
|
void ensureIcon(AppEntry entry) {
|
||||||
if (entry.icon != null) {
|
if (entry.icon != null) {
|
||||||
return;
|
return;
|
||||||
@@ -766,7 +822,7 @@ public class ApplicationsState {
|
|||||||
entry.ensureIconLocked(mContext, mPm);
|
entry.ensureIconLocked(mContext, mPm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void requestSize(String packageName, int userId) {
|
void requestSize(String packageName, int userId) {
|
||||||
if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock...");
|
if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock...");
|
||||||
synchronized (mEntriesMap) {
|
synchronized (mEntriesMap) {
|
||||||
@@ -790,7 +846,7 @@ public class ApplicationsState {
|
|||||||
}
|
}
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
int indexOfApplicationInfoLocked(String pkgName, int userId) {
|
int indexOfApplicationInfoLocked(String pkgName, int userId) {
|
||||||
for (int i=mApplications.size()-1; i>=0; i--) {
|
for (int i=mApplications.size()-1; i>=0; i--) {
|
||||||
ApplicationInfo appInfo = mApplications.get(i);
|
ApplicationInfo appInfo = mApplications.get(i);
|
||||||
@@ -962,6 +1018,7 @@ public class ApplicationsState {
|
|||||||
static final int MSG_LOAD_ENTRIES = 2;
|
static final int MSG_LOAD_ENTRIES = 2;
|
||||||
static final int MSG_LOAD_ICONS = 3;
|
static final int MSG_LOAD_ICONS = 3;
|
||||||
static final int MSG_LOAD_SIZES = 4;
|
static final int MSG_LOAD_SIZES = 4;
|
||||||
|
static final int MSG_LOAD_LAUNCHER = 5;
|
||||||
|
|
||||||
boolean mRunning;
|
boolean mRunning;
|
||||||
|
|
||||||
@@ -1074,9 +1131,40 @@ public class ApplicationsState {
|
|||||||
if (numDone >= 6) {
|
if (numDone >= 6) {
|
||||||
sendEmptyMessage(MSG_LOAD_ENTRIES);
|
sendEmptyMessage(MSG_LOAD_ENTRIES);
|
||||||
} else {
|
} else {
|
||||||
sendEmptyMessage(MSG_LOAD_ICONS);
|
sendEmptyMessage(MSG_LOAD_LAUNCHER);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case MSG_LOAD_LAUNCHER: {
|
||||||
|
Intent launchIntent = new Intent(Intent.ACTION_MAIN, null)
|
||||||
|
.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||||
|
|
||||||
|
for (int i = 0; i < mEntriesMap.size(); i++) {
|
||||||
|
int userId = mEntriesMap.keyAt(i);
|
||||||
|
List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(launchIntent,
|
||||||
|
PackageManager.GET_DISABLED_COMPONENTS, userId);
|
||||||
|
synchronized (mEntriesMap) {
|
||||||
|
if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock");
|
||||||
|
HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i);
|
||||||
|
final int N = intents.size();
|
||||||
|
for (int j = 0; j < N; j++) {
|
||||||
|
String packageName = intents.get(j).activityInfo.packageName;
|
||||||
|
AppEntry entry = userEntries.get(packageName);
|
||||||
|
if (entry != null) {
|
||||||
|
entry.hasLauncherEntry = true;
|
||||||
|
} else {
|
||||||
|
Log.w(TAG, "Cannot find pkg: " + packageName
|
||||||
|
+ " on user " + userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mMainHandler.hasMessages(MainHandler.MSG_LAUNCHER_INFO_CHANGED)) {
|
||||||
|
mMainHandler.sendEmptyMessage(MainHandler.MSG_LAUNCHER_INFO_CHANGED);
|
||||||
|
}
|
||||||
|
sendEmptyMessage(MSG_LOAD_ICONS);
|
||||||
|
} break;
|
||||||
case MSG_LOAD_ICONS: {
|
case MSG_LOAD_ICONS: {
|
||||||
int numDone = 0;
|
int numDone = 0;
|
||||||
synchronized (mEntriesMap) {
|
synchronized (mEntriesMap) {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,7 @@ import com.android.settings.SecuritySettings;
|
|||||||
import com.android.settings.WallpaperTypeSettings;
|
import com.android.settings.WallpaperTypeSettings;
|
||||||
import com.android.settings.WirelessSettings;
|
import com.android.settings.WirelessSettings;
|
||||||
import com.android.settings.accessibility.AccessibilitySettings;
|
import com.android.settings.accessibility.AccessibilitySettings;
|
||||||
|
import com.android.settings.applications.AdvancedAppSettings;
|
||||||
import com.android.settings.bluetooth.BluetoothSettings;
|
import com.android.settings.bluetooth.BluetoothSettings;
|
||||||
import com.android.settings.deviceinfo.Memory;
|
import com.android.settings.deviceinfo.Memory;
|
||||||
import com.android.settings.deviceinfo.UsbSettings;
|
import com.android.settings.deviceinfo.UsbSettings;
|
||||||
@@ -67,16 +68,17 @@ public final class Ranking {
|
|||||||
public static final int RANK_NOTIFICATIONS = 9;
|
public static final int RANK_NOTIFICATIONS = 9;
|
||||||
public static final int RANK_STORAGE = 10;
|
public static final int RANK_STORAGE = 10;
|
||||||
public static final int RANK_POWER_USAGE = 11;
|
public static final int RANK_POWER_USAGE = 11;
|
||||||
public static final int RANK_USERS = 12;
|
public static final int RANK_APPS = 12;
|
||||||
public static final int RANK_LOCATION = 13;
|
public static final int RANK_USERS = 13;
|
||||||
public static final int RANK_SECURITY = 14;
|
public static final int RANK_LOCATION = 14;
|
||||||
public static final int RANK_IME = 15;
|
public static final int RANK_SECURITY = 15;
|
||||||
public static final int RANK_PRIVACY = 16;
|
public static final int RANK_IME = 16;
|
||||||
public static final int RANK_DATE_TIME = 17;
|
public static final int RANK_PRIVACY = 17;
|
||||||
public static final int RANK_ACCESSIBILITY = 18;
|
public static final int RANK_DATE_TIME = 18;
|
||||||
public static final int RANK_PRINTING = 19;
|
public static final int RANK_ACCESSIBILITY = 19;
|
||||||
public static final int RANK_DEVELOPEMENT = 20;
|
public static final int RANK_PRINTING = 20;
|
||||||
public static final int RANK_DEVICE_INFO = 21;
|
public static final int RANK_DEVELOPEMENT = 21;
|
||||||
|
public static final int RANK_DEVICE_INFO = 22;
|
||||||
|
|
||||||
public static final int RANK_UNDEFINED = -1;
|
public static final int RANK_UNDEFINED = -1;
|
||||||
public static final int RANK_OTHERS = 1024;
|
public static final int RANK_OTHERS = 1024;
|
||||||
@@ -129,6 +131,9 @@ public final class Ranking {
|
|||||||
sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
|
sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
|
||||||
sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE);
|
sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE);
|
||||||
|
|
||||||
|
// Advanced app settings
|
||||||
|
sRankMap.put(AdvancedAppSettings.class.getName(), RANK_APPS);
|
||||||
|
|
||||||
// Users
|
// Users
|
||||||
sRankMap.put(UserSettings.class.getName(), RANK_USERS);
|
sRankMap.put(UserSettings.class.getName(), RANK_USERS);
|
||||||
|
|
||||||
|
@@ -31,6 +31,7 @@ import com.android.settings.SecuritySettings;
|
|||||||
import com.android.settings.WallpaperTypeSettings;
|
import com.android.settings.WallpaperTypeSettings;
|
||||||
import com.android.settings.WirelessSettings;
|
import com.android.settings.WirelessSettings;
|
||||||
import com.android.settings.accessibility.AccessibilitySettings;
|
import com.android.settings.accessibility.AccessibilitySettings;
|
||||||
|
import com.android.settings.applications.AdvancedAppSettings;
|
||||||
import com.android.settings.bluetooth.BluetoothSettings;
|
import com.android.settings.bluetooth.BluetoothSettings;
|
||||||
import com.android.settings.deviceinfo.Memory;
|
import com.android.settings.deviceinfo.Memory;
|
||||||
import com.android.settings.deviceinfo.UsbSettings;
|
import com.android.settings.deviceinfo.UsbSettings;
|
||||||
@@ -188,6 +189,13 @@ public final class SearchIndexableResources {
|
|||||||
BatterySaverSettings.class.getName(),
|
BatterySaverSettings.class.getName(),
|
||||||
R.drawable.ic_settings_battery));
|
R.drawable.ic_settings_battery));
|
||||||
|
|
||||||
|
sResMap.put(AdvancedAppSettings.class.getName(),
|
||||||
|
new SearchIndexableResource(
|
||||||
|
Ranking.getRankForClassName(AdvancedAppSettings.class.getName()),
|
||||||
|
R.xml.advanced_apps,
|
||||||
|
AdvancedAppSettings.class.getName(),
|
||||||
|
R.drawable.ic_settings_applications));
|
||||||
|
|
||||||
sResMap.put(UserSettings.class.getName(),
|
sResMap.put(UserSettings.class.getName(),
|
||||||
new SearchIndexableResource(
|
new SearchIndexableResource(
|
||||||
Ranking.getRankForClassName(UserSettings.class.getName()),
|
Ranking.getRankForClassName(UserSettings.class.getName()),
|
||||||
|
Reference in New Issue
Block a user