package org.sugr.gearshift.ui.loader;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import android.support.v4.content.AsyncTaskLoader;
import org.sugr.gearshift.G;
import org.sugr.gearshift.core.TransmissionProfile;
import java.util.ArrayList;
import java.util.List;
public class TransmissionProfileSupportLoader extends AsyncTaskLoader<TransmissionProfile[]> {
private TransmissionProfile[] profiles;
private boolean ignoreInvalid;
private OnSharedPreferenceChangeListener listener = (sharedPreferences, key) -> onContentChanged();
private OnSharedPreferenceChangeListener defaultListener = (sharedPreferences, key) -> {
if (key.equals(G.PREF_PROFILES)) {
onContentChanged();
}
};
public TransmissionProfileSupportLoader(Context context) {
this(context, false);
}
public TransmissionProfileSupportLoader(Context context, boolean ignoreInvalid) {
super(context);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext().getApplicationContext());
prefs.registerOnSharedPreferenceChangeListener(defaultListener);
prefs = getContext().getSharedPreferences(TransmissionProfile.getPreferencesName(),
Activity.MODE_PRIVATE);
prefs.registerOnSharedPreferenceChangeListener(listener);
this.ignoreInvalid = ignoreInvalid;
}
@Override
public TransmissionProfile[] loadInBackground() {
Context context = getContext().getApplicationContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
TransmissionProfile[] profiles = TransmissionProfile.readProfiles(prefs);
List<TransmissionProfile> profileList = new ArrayList<>();
for (TransmissionProfile profile : profiles) {
if (profile.isValid() || ignoreInvalid) {
profileList.add(profile);
}
}
G.logD("TPLoader: Read %d profiles", new Object[] {profileList.size()});
return profileList.toArray(new TransmissionProfile[profileList.size()]);
}
@Override
public void deliverResult(TransmissionProfile[] profiles) {
if (isReset()) {
if (profiles != null) {
onReleaseResources();
return;
}
}
this.profiles = profiles;
if (isStarted()) {
G.logD("TPLoader: Delivering results: %d profiles", new Object[] {
profiles == null ? 0 : profiles.length
});
super.deliverResult(profiles);
}
}
@Override
public void onCanceled(TransmissionProfile[] profiles) {
super.onCanceled(profiles);
onReleaseResources();
}
@Override
protected void onStartLoading() {
super.onStartLoading();
G.logD("TPLoader: onStartLoading()");
if (profiles != null)
deliverResult(profiles);
if (takeContentChanged() || profiles == null) {
G.logD("TPLoader: forceLoad()");
forceLoad();
}
}
@Override
protected void onStopLoading() {
super.onStopLoading();
G.logD("TPLoader: onStopLoading()");
cancelLoad();
}
@Override
protected void onReset() {
super.onReset();
G.logD("TPLoader: onReset()");
onStopLoading();
if (profiles != null) {
onReleaseResources();
profiles = null;
}
}
protected void onReleaseResources() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext().getApplicationContext());
prefs.unregisterOnSharedPreferenceChangeListener(defaultListener);
prefs = getContext().getSharedPreferences(TransmissionProfile.getPreferencesName(),
Activity.MODE_PRIVATE);
prefs.registerOnSharedPreferenceChangeListener(listener);
}
}