/* * Firetweet - Twitter client for Android * * Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.getlantern.firetweet.activity.support; import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.content.Intent; import android.content.Loader; import android.content.SharedPreferences; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.Toast; import org.apache.commons.lang3.ArrayUtils; import org.getlantern.firetweet.R; import org.getlantern.firetweet.adapter.AccountsAdapter; import org.getlantern.firetweet.provider.FiretweetDataStore.Accounts; public class AccountSelectorActivity extends BaseSupportDialogActivity implements LoaderCallbacks<Cursor>, OnClickListener, OnItemClickListener { private final ContentObserver mContentObserver = new ContentObserver(null) { @Override public void onChange(final boolean selfChange) { onChange(selfChange, null); } @Override public void onChange(final boolean selfChange, final Uri uri) { // Handle change. if (!isFinishing()) { getLoaderManager().restartLoader(0, null, AccountSelectorActivity.this); } } }; private SharedPreferences mPreferences; private ListView mListView; private AccountsAdapter mAdapter; private boolean mFirstCreated; private View mSelectAccountButtons; @Override public void onClick(final View view) { switch (view.getId()) { case R.id.save: { final long[] checkedIds = mListView.getCheckedItemIds(); if (checkedIds.length == 0 && !isSelectNoneAllowed()) { Toast.makeText(this, R.string.no_account_selected, Toast.LENGTH_SHORT).show(); return; } final Intent data = new Intent(); data.putExtra(EXTRA_IDS, checkedIds); setResult(RESULT_OK, data); finish(); break; } } } @Override public void onContentChanged() { super.onContentChanged(); mListView = (ListView) findViewById(android.R.id.list); mSelectAccountButtons = findViewById(R.id.select_account_buttons); } @Override public Loader<Cursor> onCreateLoader(final int id, final Bundle args) { final String where = isOAuthOnly() ? Accounts.AUTH_TYPE + " = " + Accounts.AUTH_TYPE_OAUTH : null; return new CursorLoader(this, Accounts.CONTENT_URI, Accounts.COLUMNS, where, null, null); } @Override public void onLoadFinished(final Loader<Cursor> loader, final Cursor cursor) { mAdapter.swapCursor(cursor); if (cursor != null && mFirstCreated) { final long[] activatedIds = getIntentExtraIds(); for (int i = 0, j = mAdapter.getCount(); i < j; i++) { mListView.setItemChecked(i, ArrayUtils.contains(activatedIds, mAdapter.getItemId(i))); } } } @Override public void onLoaderReset(final Loader<Cursor> loader) { mAdapter.swapCursor(null); } @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { final Intent data = new Intent(); data.putExtra(EXTRA_ID, mAdapter.getAccount(position).account_id); setResult(RESULT_OK, data); finish(); } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFirstCreated = savedInstanceState == null; mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE); setContentView(R.layout.activity_account_selector); mAdapter = new AccountsAdapter(this); final boolean isSingleSelection = isSingleSelection(); mListView.setChoiceMode(isSingleSelection ? ListView.CHOICE_MODE_NONE : ListView.CHOICE_MODE_MULTIPLE); mAdapter.setChoiceMode(mListView.getChoiceMode()); mAdapter.setSortEnabled(false); if (isSingleSelection) { mListView.setOnItemClickListener(this); } mSelectAccountButtons.setVisibility(isSingleSelection ? View.GONE : View.VISIBLE); mListView.setAdapter(mAdapter); getLoaderManager().initLoader(0, null, this); } @Override protected void onStart() { super.onStart(); getContentResolver().registerContentObserver(Accounts.CONTENT_URI, true, mContentObserver); } @Override protected void onResume() { super.onResume(); final boolean displayProfileImage = mPreferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true); mAdapter.setDisplayProfileImage(displayProfileImage); } @Override protected void onStop() { getContentResolver().unregisterContentObserver(mContentObserver); super.onStop(); } private long[] getIntentExtraIds() { final Intent intent = getIntent(); return intent.getLongArrayExtra(EXTRA_IDS); } private boolean isOAuthOnly() { final Intent intent = getIntent(); return intent.getBooleanExtra(EXTRA_OAUTH_ONLY, false); } private boolean isSelectNoneAllowed() { final Intent intent = getIntent(); return intent.getBooleanExtra(EXTRA_ALLOW_SELECT_NONE, false); } private boolean isSingleSelection() { final Intent intent = getIntent(); return intent.getBooleanExtra(EXTRA_SINGLE_SELECTION, false); } }