19b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck/* 29b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * Copyright (C) 2011 The Android Open Source Project 39b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * 49b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 59b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * you may not use this file except in compliance with the License. 69b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * You may obtain a copy of the License at 79b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * 89b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 99b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * 109b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * Unless required by applicable law or agreed to in writing, software 119b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 129b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * See the License for the specific language governing permissions and 149b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck * limitations under the License. 159b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck */ 169b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 179b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckpackage com.android.browser.widget; 189b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 199b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.app.ListActivity; 209b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.app.LoaderManager.LoaderCallbacks; 219b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.appwidget.AppWidgetManager; 223bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reckimport android.content.Context; 233bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reckimport android.content.CursorLoader; 249b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.content.Intent; 259b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.content.Loader; 269b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.database.Cursor; 279b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.os.Bundle; 283bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reckimport android.provider.BrowserContract.Accounts; 299b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.view.View; 309b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.view.View.OnClickListener; 319b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.widget.ArrayAdapter; 329b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport android.widget.ListView; 339b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 349b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport com.android.browser.AddBookmarkPage.BookmarkAccount; 359b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport com.android.browser.R; 369b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport com.android.browser.provider.BrowserProvider2; 379b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 389b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckpublic class BookmarkWidgetConfigure extends ListActivity 399b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck implements OnClickListener, LoaderCallbacks<Cursor> { 409b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 419b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck static final int LOADER_ACCOUNTS = 1; 429b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 439b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck private ArrayAdapter<BookmarkAccount> mAccountAdapter; 449b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 459b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 469b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 479b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck protected void onCreate(Bundle savedInstanceState) { 489b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck super.onCreate(savedInstanceState); 499b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setResult(RESULT_CANCELED); 509b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setVisible(false); 519b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setContentView(R.layout.widget_account_selection); 529b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck findViewById(R.id.cancel).setOnClickListener(this); 539b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck mAccountAdapter = new ArrayAdapter<BookmarkAccount>(this, 549b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck android.R.layout.simple_list_item_1); 559b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setListAdapter(mAccountAdapter); 569b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck Intent intent = getIntent(); 579b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck Bundle extras = intent.getExtras(); 589b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck if (extras != null) { 599b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck mAppWidgetId = extras.getInt( 609b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck AppWidgetManager.EXTRA_APPWIDGET_ID, 619b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck AppWidgetManager.INVALID_APPWIDGET_ID); 629b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 639b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 649b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck finish(); 659b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } else { 669b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck getLoaderManager().initLoader(LOADER_ACCOUNTS, null, this); 679b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 689b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 699b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 709b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 719b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck public void onClick(View v) { 729b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck finish(); 739b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 749b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 759b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 769b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck protected void onListItemClick(ListView l, View v, int position, long id) { 779b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck BookmarkAccount account = mAccountAdapter.getItem(position); 789b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck pickAccount(account.rootFolderId); 799b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 809b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 819b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 829b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck public Loader<Cursor> onCreateLoader(int id, Bundle args) { 839b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck return new AccountsLoader(this); 849b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 859b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 869b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck void pickAccount(long rootId) { 879b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck BookmarkThumbnailWidgetService.setupWidgetState(this, mAppWidgetId, rootId); 889b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck Intent result = new Intent(); 899b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 909b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setResult(RESULT_OK, result); 919b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck finish(); 929b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 939b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 949b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 959b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 963bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck if (cursor == null || cursor.getCount() < 1) { 973bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck // We always have the local account, so fall back to that 989b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck pickAccount(BrowserProvider2.FIXED_ID_ROOT); 993bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck } else if (cursor.getCount() == 1) { 1003bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck cursor.moveToFirst(); 1013bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck pickAccount(cursor.getLong(AccountsLoader.COLUMN_INDEX_ROOT_ID)); 1029b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } else { 1039b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck mAccountAdapter.clear(); 1049b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck while (cursor.moveToNext()) { 1059b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck mAccountAdapter.add(new BookmarkAccount(this, cursor)); 1069b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 1079b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck setVisible(true); 1089b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 1099b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck getLoaderManager().destroyLoader(LOADER_ACCOUNTS); 1109b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 1119b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 1129b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck @Override 1139b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck public void onLoaderReset(Loader<Cursor> loader) { 1149b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck // Don't care 1159b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck } 1169b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck 1173bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck static class AccountsLoader extends CursorLoader { 1183bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck 1193bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck static final String[] PROJECTION = new String[] { 1203bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck Accounts.ACCOUNT_NAME, 1213bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck Accounts.ACCOUNT_TYPE, 1223bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck Accounts.ROOT_ID, 1233bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck }; 1243bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck 1253bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck static final int COLUMN_INDEX_ACCOUNT_NAME = 0; 1263bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck static final int COLUMN_INDEX_ACCOUNT_TYPE = 1; 1273bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck static final int COLUMN_INDEX_ROOT_ID = 2; 1283bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck 1293bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck public AccountsLoader(Context context) { 1303bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck super(context, Accounts.CONTENT_URI 1313bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck .buildUpon() 1323bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck .appendQueryParameter(BrowserProvider2.PARAM_ALLOW_EMPTY_ACCOUNTS, "false") 1333bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck .build(), PROJECTION, null, null, null); 1343bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck } 1353bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck 1363bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck } 1373bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck 1389b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck} 139