package info.guardianproject.otr.app.im.app; import info.guardianproject.otr.app.im.IImConnection; import info.guardianproject.otr.app.im.R; import info.guardianproject.otr.app.im.provider.Imps; import android.app.Activity; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.FragmentActivity; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ListView; public class AccountsFragment extends ListFragment implements ProviderListItem.SignInManager { private FragmentActivity mActivity; private int mAccountLayoutView; @Override public void onAttach(Activity activity) { super.onAttach(activity); mActivity = (FragmentActivity)activity; mAccountLayoutView = R.layout.account_view; if (mActivity instanceof NewChatActivity) mAccountLayoutView = R.layout.account_view_sidebar; initProviderCursor(); } @Override public void onDetach() { super.onDetach(); mActivity = null; } @Override public void onListItemClick(ListView l, View v, int position, long id) { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { // TODO Auto-generated method stub super.onViewCreated(view, savedInstanceState); } private void initProviderCursor() { final Uri uri = Imps.Provider.CONTENT_URI_WITH_ACCOUNT; mAdapter = new AccountAdapter(mActivity, new ProviderListItemFactory(), mAccountLayoutView); setListAdapter(mAdapter); mActivity.getSupportLoaderManager().initLoader(ACCOUNT_LOADER_ID, null, new LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader loader = new CursorLoader(mActivity, uri, PROVIDER_PROJECTION, Imps.Provider.CATEGORY + "=?" + " AND " + Imps.Provider.ACTIVE_ACCOUNT_USERNAME + " NOT NULL" /* selection */, new String[] { ImApp.IMPS_CATEGORY } /* selection args */, Imps.Provider.DEFAULT_SORT_ORDER); loader.setUpdateThrottle(100l); return loader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor newCursor) { mAdapter.swapCursor(newCursor); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }); } private class ProviderListItemFactory implements LayoutInflater.Factory { public View onCreateView(String name, Context context, AttributeSet attrs) { if (name != null && name.equals(ProviderListItem.class.getName())) { return new ProviderListItem(context, mActivity, AccountsFragment.this); } return null; } } public void signIn(long accountId) { if (accountId <= 0) { return; } Cursor cursor = mAdapter.getCursor(); cursor.moveToFirst(); while (!cursor.isAfterLast()) { long cAccountId = cursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); if (cAccountId == accountId) break; cursor.moveToNext(); } // Remember that the user signed in. setKeepSignedIn(accountId, true); long providerId = cursor.getLong(PROVIDER_ID_COLUMN); String password = cursor.getString(ACTIVE_ACCOUNT_PW_COLUMN); boolean isActive = false; // TODO(miron) new SignInHelper(mActivity).signIn(password, providerId, accountId, isActive); cursor.moveToPosition(-1); } public void signOut(final long accountId) { // Remember that the user signed out and do not auto sign in until they // explicitly do so setKeepSignedIn(accountId, false); try { IImConnection conn = ((ImApp)mActivity.getApplication()).getConnectionByAccount(accountId); if (conn != null) { conn.logout(); } } catch (Exception ex) { } } private void setKeepSignedIn(final long accountId, boolean signin) { Uri mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId); ContentValues values = new ContentValues(); values.put(Imps.Account.KEEP_SIGNED_IN, signin); mActivity.getContentResolver().update(mAccountUri, values, null, null); } AccountAdapter mAdapter; private static final String[] PROVIDER_PROJECTION = { Imps.Provider._ID, Imps.Provider.NAME, Imps.Provider.FULLNAME, Imps.Provider.CATEGORY, Imps.Provider.ACTIVE_ACCOUNT_ID, Imps.Provider.ACTIVE_ACCOUNT_USERNAME, Imps.Provider.ACTIVE_ACCOUNT_PW, Imps.Provider.ACTIVE_ACCOUNT_LOCKED, Imps.Provider.ACTIVE_ACCOUNT_KEEP_SIGNED_IN, Imps.Provider.ACCOUNT_PRESENCE_STATUS, Imps.Provider.ACCOUNT_CONNECTION_STATUS }; static final int PROVIDER_ID_COLUMN = 0; static final int PROVIDER_NAME_COLUMN = 1; static final int PROVIDER_FULLNAME_COLUMN = 2; static final int PROVIDER_CATEGORY_COLUMN = 3; static final int ACTIVE_ACCOUNT_ID_COLUMN = 4; static final int ACTIVE_ACCOUNT_USERNAME_COLUMN = 5; static final int ACTIVE_ACCOUNT_PW_COLUMN = 6; static final int ACTIVE_ACCOUNT_LOCKED = 7; static final int ACTIVE_ACCOUNT_KEEP_SIGNED_IN = 8; static final int ACCOUNT_PRESENCE_STATUS = 9; static final int ACCOUNT_CONNECTION_STATUS = 10; private static final int ACCOUNT_LOADER_ID = 1000; }