Update visual style shortcut picker and make it async

* Use dialog when in XL screen size
* Show different strings in launcher and in dialog/activity title
* Add cancel button to picker
* Move accounts query to AsyncTask
* Remove obsolete AccountsAdapter

Bug: 3093928
Change-Id: Ief771482c6db684c434c21cf92844c37a927d34a
This commit is contained in:
Andy Stadler 2010-11-23 22:54:49 -08:00
parent 2eaa910a65
commit d87f81e901
7 changed files with 154 additions and 165 deletions

View File

@ -147,10 +147,13 @@
<activity
android:name=".activity.AccountShortcutPicker"
android:label="@string/app_name"
android:label="@string/account_shortcut_picker_title"
android:enabled="false"
android:theme="@android:style/Theme.Holo.DialogWhenLarge"
>
<intent-filter>
<intent-filter
android:label="@string/account_shortcut_picker_name"
>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
<!-- TODO selectableItemBackground is a placeholder for the new "cancel" style -->
<Button
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cancel_action"
android:background="?android:attr/selectableItemBackground"
/>
</LinearLayout>

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
android:paddingRight="4dip"
android:paddingLeft="6dip"
>
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
/>
<TextView
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
/>
</LinearLayout>

View File

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<LinearLayout
android:id="@+id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@string/accounts_welcome"
android:textColor="?android:attr/textColorPrimary" />
<View
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="54dip"
android:background="@android:drawable/bottom_bar">
<Button
android:id="@+id/add_new_account"
android:layout_width="wrap_content"
android:minWidth="@dimen/button_minWidth"
android:layout_height="wrap_content"
android:text="@string/next_action"
android:drawableRight="@drawable/button_indicator_next"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
</LinearLayout>
</FrameLayout>

View File

@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingRight="4dip">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="6dip">
<TextView
android:id="@+id/description"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/email"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<View
android:layout_height="match_parent"
android:layout_width="0dip"
android:layout_weight="1" />
<TextView
android:id="@+id/new_message_count"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/text_box_light"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:minWidth="64dip"
android:gravity="right" />
</LinearLayout>

View File

@ -823,8 +823,15 @@ save attachment.</string>
<!-- On Settings screen, settings option for delete account [CHAR LIMIT=none] -->
<string name="account_settings_delete_account_label">Remove account</string>
<!-- Strings used for account shortcut picker -->
<!-- String displayed in launcher [CHAR_LIMIT=10] -->
<string name="account_shortcut_picker_name">Email account</string>
<!-- Title of activity/dialog containing shortcut picker (list of accounts) [CHAR_LIMIT=20] -->
<string name="account_shortcut_picker_title">Select an account</string>
<!-- Title of Upgrade Accounts activity -->
<string name="upgrade_accounts_title">Upgrade accounts</string>
<!-- Error shown when Upgrade Accounts fails (shown below name of that account) -->
<string name="upgrade_accounts_error">Unable to upgrade account</string>
<!-- Message that appears when adding a Windows Live Hotmail Plus account -->

View File

@ -17,33 +17,33 @@
package com.android.email.activity;
import com.android.email.R;
import com.android.email.Utility;
import com.android.email.provider.EmailContent;
import com.android.email.provider.EmailContent.Account;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
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.SimpleCursorAdapter;
import android.widget.TextView;
/**
*
* This class implements a launcher shortcut for directly accessing a single account.
*
* This is simply a lightweight version of Accounts, and should almost certainly be merged with it
* (or, one could be a base class of the other).
*
* TODO Handle upgraded shortcuts for the phone UI release. Shortcuts used to launch MessageList
* directly. We need to detect this and redirect to Welcome.
*/
public class AccountShortcutPicker extends ListActivity implements OnItemClickListener {
public class AccountShortcutPicker extends ListActivity
implements OnClickListener, OnItemClickListener {
private AccountTask mAccountTask;
/**
* Support for list adapter
@ -51,12 +51,10 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi
private final static String[] FROM_COLUMNS = new String[] {
EmailContent.AccountColumns.DISPLAY_NAME,
EmailContent.AccountColumns.EMAIL_ADDRESS,
EmailContent.RECORD_ID
};
private final static int[] TO_IDS = new int[] {
R.id.description,
R.id.email,
R.id.new_message_count
};
@Override
@ -69,27 +67,40 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi
return;
}
// finish() immediately if no accounts are configured
// TODO: lightweight projection with only those columns needed for this display
// TODO: query outside of UI thread
Cursor c = this.managedQuery(
EmailContent.Account.CONTENT_URI,
EmailContent.Account.CONTENT_PROJECTION,
null, null, null);
if (c.getCount() == 0) {
finish();
return;
}
setContentView(R.layout.account_shortcut_picker);
findViewById(R.id.cancel).setOnClickListener(this);
setContentView(R.layout.accounts);
ListView listView = getListView();
listView.setOnItemClickListener(this);
listView.setItemsCanFocus(false);
listView.setEmptyView(findViewById(R.id.empty));
AccountsAdapter a = new AccountsAdapter(this,
R.layout.accounts_item, c, FROM_COLUMNS, TO_IDS);
listView.setAdapter(a);
mAccountTask = new AccountTask();
mAccountTask.execute();
}
@Override
public void onDestroy() {
super.onDestroy();
// Cleanup running async task (if any)
Utility.cancelTaskInterrupt(mAccountTask);
mAccountTask = null;
// Cleanup accounts cursor (if any)
SimpleCursorAdapter adapter = (SimpleCursorAdapter) getListAdapter();
if (adapter != null) {
adapter.changeCursor(null);
}
}
/**
* Implements View.OnClickListener
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cancel:
finish();
break;
}
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@ -99,33 +110,40 @@ public class AccountShortcutPicker extends ListActivity implements OnItemClickLi
finish();
}
private static class AccountsAdapter extends SimpleCursorAdapter {
/**
* Load the accounts and create the adapter.
*/
private class AccountTask extends AsyncTask<Void, Void, Cursor> {
public AccountsAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
setViewBinder(new MyViewBinder());
@Override
protected Cursor doInBackground(Void... params) {
Cursor cursor = AccountShortcutPicker.this.getContentResolver().query(
EmailContent.Account.CONTENT_URI,
EmailContent.Account.CONTENT_PROJECTION,
null, null, null);
if (isCancelled()) {
cursor.close();
cursor = null;
}
return cursor;
}
/**
* This is only used for the unread messages count. Most of the views are handled
* normally by SimpleCursorAdapter.
*/
private static class MyViewBinder implements SimpleCursorAdapter.ViewBinder {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if (view.getId() == R.id.new_message_count) {
int unreadMessageCount = 0; // TODO get unread count from Account
if (unreadMessageCount <= 0) {
view.setVisibility(View.GONE);
} else {
((TextView)view).setText(String.valueOf(unreadMessageCount));
}
return true;
}
return false;
@Override
protected void onPostExecute(Cursor cursor) {
// If canceled, get out immediately
if (cursor == null) {
return;
}
// If there are no accounts, we should never have been here - exit the activity
if (cursor.getCount() == 0) {
finish();
return;
}
// Create an adapter and connect to the ListView
AccountShortcutPicker activity = AccountShortcutPicker.this;
SimpleCursorAdapter adapter = new SimpleCursorAdapter(activity,
R.layout.account_shortcut_picker_item, cursor, FROM_COLUMNS, TO_IDS);
activity.getListView().setAdapter(adapter);
}
}