package com.piusvelte.sonet.loader; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.Loader; import com.piusvelte.sonet.SonetCrypto; import com.piusvelte.sonet.provider.Accounts; import com.piusvelte.sonet.provider.Entity; import com.piusvelte.sonet.social.Client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * Created by bemmanuel on 4/26/15. */ public class AccountsProfilesLoader extends BaseAsyncTaskLoader<List<HashMap<String, String>>> { @NonNull private Context mContext; @Nullable private Cursor mCursor; @NonNull private ContentObserver mContentObserver; public AccountsProfilesLoader(Context context) { super(context); mContext = context.getApplicationContext(); mContentObserver = new ForceLoadObserver(this); } @Override public List<HashMap<String, String>> loadInBackground() { if (mCursor != null) { mCursor.close(); } List<HashMap<String, String>> accounts = new ArrayList<>(); mCursor = mContext.getContentResolver().query(Accounts.getContentUri(mContext), new String[] { Accounts._ID, Accounts.TOKEN, Accounts.SECRET, Accounts.SERVICE, Accounts.USERNAME, Accounts.SID }, null, null, null); mCursor.registerContentObserver(mContentObserver); if (mCursor.moveToFirst()) { int idIndex = mCursor.getColumnIndexOrThrow(Accounts._ID); int tokenIndex = mCursor.getColumnIndexOrThrow(Accounts.TOKEN); int secretIndex = mCursor.getColumnIndexOrThrow(Accounts.SECRET); int serviceIndex = mCursor.getColumnIndexOrThrow(Accounts.SERVICE); int sidIndex = mCursor.getColumnIndexOrThrow(Accounts.SID); int usernameIndex = mCursor.getColumnIndexOrThrow(Accounts.USERNAME); while (!mCursor.isAfterLast()) { HashMap<String, String> account = new HashMap<>(4); SonetCrypto sonetCrypto = SonetCrypto.getInstance(mContext); String token = sonetCrypto.Decrypt(mCursor.getString(tokenIndex)); String secret = sonetCrypto.Decrypt(mCursor.getString(secretIndex)); int service = mCursor.getInt(serviceIndex); String sid = sonetCrypto.Decrypt(mCursor.getString(sidIndex)); Client client = new Client.Builder(mContext) .setNetwork(service) .setCredentials(token, secret) .setAccount(sid) .build(); account.put(Accounts._ID, Long.toString(mCursor.getLong(idIndex))); account.put(Accounts.SERVICE, Integer.toString(service)); account.put(Entity.PROFILE_URL, client.getProfilePhotoUrl()); account.put(Accounts.USERNAME, mCursor.getString(usernameIndex)); account.put(Accounts.SID, sid); accounts.add(account); mCursor.moveToNext(); } } return accounts; } @Override public void onCanceled(List<HashMap<String, String>> data) { super.onCanceled(data); if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } mCursor = null; } @Override protected void onReset() { super.onReset(); if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } mCursor = null; } private static class ForceLoadObserver extends ContentObserver { @NonNull private Loader mLoader; ForceLoadObserver(@NonNull Loader loader) { super(new Handler()); mLoader = loader; } @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { mLoader.onContentChanged(); } } }