/*
* 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.Intent;
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.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 kiwi.root.an2linuxclient.activities.AppNotificationSettingsActivity;
import kiwi.root.an2linuxclient.activities.EnabledApplicationsActivity;
import static android.content.Context.MODE_PRIVATE;
public class CustomNotificationSettingsFragment 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);
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
getActivity().setTheme(R.style.PreferenceFragmentTheme);
}
@Override
public void onStart() {
super.onStart();
getPreferenceScreen().removeAll();
class ApplicationTask extends AsyncTask<Void, Void, List<Preference>> {
@Override
protected void onPreExecute() {
if (taskCallbacks != null) {
taskCallbacks.onPreExecute();
}
}
@Override
protected List<Preference> doInBackground(Void... params) {
PackageManager pm = getActivity().getPackageManager();
List<ApplicationInfo> appList = pm.getInstalledApplications(PackageManager.GET_META_DATA);
List<ApplicationInfo> enabledApps = new ArrayList<>();
SharedPreferences sp = getActivity().getSharedPreferences(getString(R.string.enabled_applications), MODE_PRIVATE);
// apparently loadLabel() is very slow so it's faster to do it once and store in map
final Map<String, String> appLabels = new HashMap<>();
for (ApplicationInfo appInfo : appList) {
if (sp.getBoolean(appInfo.packageName, false)) {
enabledApps.add(appInfo);
appLabels.put(appInfo.packageName, appInfo.loadLabel(pm).toString());
}
}
Collections.sort(enabledApps, new Comparator<ApplicationInfo>() {
@Override
public int compare(ApplicationInfo lhs, ApplicationInfo rhs) {
return appLabels.get(lhs.packageName).compareToIgnoreCase(appLabels.get(rhs.packageName));
}
});
List<Preference> prefs = new ArrayList<>();
for (ApplicationInfo appInfo : enabledApps) {
Preference p = new Preference(getPreferenceScreen().getContext());
p.setTitle(appLabels.get(appInfo.packageName));
p.setSummary(getActivity().getSharedPreferences(getString(R.string.notification_settings_custom), MODE_PRIVATE)
.getBoolean(appInfo.packageName + "_" + getString(R.string.preference_use_custom_settings), false)
? getString(R.string.notif_custom_using_custom_settings) : getString(R.string.notif_custom_using_general_settings));
p.setIcon(appInfo.loadIcon(pm));
Intent i = new Intent(getActivity().getApplicationContext(), AppNotificationSettingsActivity.class);
i.putExtra("appName", appLabels.get(appInfo.packageName));
i.putExtra("packageName", appInfo.packageName);
p.setIntent(i);
prefs.add(p);
}
if (prefs.size() == 0) {
Preference p = new Preference(getPreferenceScreen().getContext());
p.setTitle(R.string.notif_settings_custom_no_enabled_title);
p.setSummary(R.string.notif_settings_custom_no_enabled_summary);
p.setIntent(new Intent(getActivity().getApplicationContext(), EnabledApplicationsActivity.class));
prefs.add(p);
}
return prefs;
}
@Override
protected void onPostExecute(List<Preference> prefs) {
PreferenceScreen screen = getPreferenceScreen();
for(Preference pref : prefs){
screen.addPreference(pref);
}
if (taskCallbacks != null) {
taskCallbacks.onPostExecute();
}
}
}
new ApplicationTask().execute();
}
}