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