/* * Copyright 2017 rootkiwi * * AN2Linux-client is licensed under GNU General Public License 3. * * See LICENSE for more details. */ package kiwi.root.an2linuxclient.fragments; import android.app.Activity; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import kiwi.root.an2linuxclient.R; import static android.content.Context.MODE_PRIVATE; public class EnabledApplicationsPreferenceFragment extends PreferenceFragment { private TaskCallbacks taskCallbacks; public interface TaskCallbacks { void onPreExecute(); void onPostExecute(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); view.setBackgroundColor(getResources().getColor(R.color.gray_dark)); return view; } @Override public void onAttach(Activity activity) { super.onAttach(activity); taskCallbacks = (TaskCallbacks) activity; } @Override public void onDetach() { super.onDetach(); taskCallbacks = null; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); getPreferenceManager().setSharedPreferencesName(getString(R.string.enabled_applications)); addPreferencesFromResource(R.xml.enabled_applications_preferences); getActivity().setTheme(R.style.PreferenceFragmentTheme); final PreferenceScreen prefScreen = (PreferenceScreen) findPreference(getString(R.string.enabled_apps_pref_screen)); findPreference(getString(R.string.preference_enable_disable_all_applications)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference arg0, Object arg1) { for (int i = 1; i < prefScreen.getPreferenceCount(); i++) { ((CheckBoxPreference) (prefScreen.getPreference(i))).setChecked((Boolean) arg1); } return true; } }); class ApplicationTask extends AsyncTask<Void, Void, List<CheckBoxPreference>> { @Override protected void onPreExecute() { if (taskCallbacks != null) { taskCallbacks.onPreExecute(); } } @Override protected List<CheckBoxPreference> doInBackground(Void... params) { PackageManager pm = getActivity().getPackageManager(); List<ApplicationInfo> appList = pm.getInstalledApplications(PackageManager.GET_META_DATA); // apparently loadLabel() is very slow so it's faster to do it once and store in map final Map<String, String> appLabels = new HashMap<>(); final Map<String, Boolean> appSettings = new HashMap<>(); SharedPreferences sp = getActivity().getSharedPreferences(getString(R.string.enabled_applications), MODE_PRIVATE); for (ApplicationInfo appInfo : appList) { appLabels.put(appInfo.packageName, appInfo.loadLabel(pm).toString()); appSettings.put(appInfo.packageName, sp.getBoolean(appInfo.packageName, false)); } Collections.sort(appList, new Comparator<ApplicationInfo>() { @Override public int compare(ApplicationInfo lhs, ApplicationInfo rhs) { boolean lhsEnabled = appSettings.get(lhs.packageName); boolean rhsEnabled = appSettings.get(rhs.packageName); if (lhsEnabled && !rhsEnabled) { return -1; } else if (!lhsEnabled && rhsEnabled) { return 1; } else { return appLabels.get(lhs.packageName).compareToIgnoreCase(appLabels.get(rhs.packageName)); } } }); List<CheckBoxPreference> checkBoxPreferences = new ArrayList<>(); for (ApplicationInfo appInfo : appList) { CheckBoxPreference c = new CheckBoxPreference(getPreferenceScreen().getContext()); c.setKey(appInfo.packageName); c.setTitle(appLabels.get(appInfo.packageName)); c.setSummary(appInfo.packageName); c.setIcon(appInfo.loadIcon(pm)); checkBoxPreferences.add(c); } return checkBoxPreferences; } @Override protected void onPostExecute(List<CheckBoxPreference> checkBoxPreferences) { for(CheckBoxPreference checkBoxPreference : checkBoxPreferences){ prefScreen.addPreference(checkBoxPreference); } if (taskCallbacks != null) { taskCallbacks.onPostExecute(); } } } new ApplicationTask().execute(); } }