diff --git a/WordPress/src/main/java/org/wordpress/android/WordPressDB.java b/WordPress/src/main/java/org/wordpress/android/WordPressDB.java index 548608134970..0dc87c890400 100644 --- a/WordPress/src/main/java/org/wordpress/android/WordPressDB.java +++ b/WordPress/src/main/java/org/wordpress/android/WordPressDB.java @@ -16,11 +16,11 @@ import org.json.JSONArray; import org.wordpress.android.datasets.AccountTable; import org.wordpress.android.datasets.CommentTable; +import org.wordpress.android.datasets.PeopleTable; import org.wordpress.android.datasets.SiteSettingsTable; import org.wordpress.android.datasets.SuggestionTable; import org.wordpress.android.models.Account; import org.wordpress.android.models.Blog; -import org.wordpress.android.models.Person; import org.wordpress.android.models.MediaUploadState; import org.wordpress.android.models.Post; import org.wordpress.android.models.PostLocation; @@ -85,7 +85,7 @@ public class WordPressDB { public static final String COLUMN_NAME_VIDEO_PRESS_SHORTCODE = "videoPressShortcode"; public static final String COLUMN_NAME_UPLOAD_STATE = "uploadState"; - private static final int DATABASE_VERSION = 44; + private static final int DATABASE_VERSION = 45; private static final String CREATE_TABLE_BLOGS = "create table if not exists accounts (id integer primary key autoincrement, " + "url text, blogName text, username text, password text, imagePlacement text, centerThumbnail boolean, fullSizeImage boolean, maxImageWidth text, maxImageWidthId integer);"; @@ -410,6 +410,9 @@ public WordPressDB(Context ctx) { case 43: db.execSQL(ADD_BLOGS_PLAN_PRODUCT_NAME_SHORT); currentVersion++; + case 44: + PeopleTable.createTables(db); + currentVersion++; } db.setVersion(DATABASE_VERSION); } diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/CommentTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/CommentTable.java index 4aea9bb3827f..9545ec10f019 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/CommentTable.java +++ b/WordPress/src/main/java/org/wordpress/android/datasets/CommentTable.java @@ -116,8 +116,9 @@ public static Comment getComment(int localBlogId, long commentId) { String[] args = {Integer.toString(localBlogId), Long.toString(commentId)}; Cursor c = getReadableDb().rawQuery("SELECT * FROM " + COMMENTS_TABLE + " WHERE blog_id=? AND comment_id=?", args); try { - if (!c.moveToFirst()) + if (!c.moveToFirst()) { return null; + } return getCommentFromCursor(c); } finally { SqlUtils.closeCursor(c); diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java new file mode 100644 index 000000000000..cf78237d4da9 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java @@ -0,0 +1,126 @@ +package org.wordpress.android.datasets; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import org.wordpress.android.WordPress; +import org.wordpress.android.models.Person; +import org.wordpress.android.models.Role; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.SqlUtils; + +import java.util.ArrayList; +import java.util.List; + +public class PeopleTable { + public static final String PEOPLE_TABLE = "people"; + + private static SQLiteDatabase getReadableDb() { + return WordPress.wpDB.getDatabase(); + } + private static SQLiteDatabase getWritableDb() { + return WordPress.wpDB.getDatabase(); + } + + public static void createTables(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + PEOPLE_TABLE + " (" + + "person_id INTEGER DEFAULT 0," + + "local_blog_id INTEGER DEFAULT 0," + + "user_name TEXT," + + "first_name TEXT," + + "last_name TEXT," + + "display_name TEXT," + + "avatar_url TEXT," + + "role TEXT," + + "PRIMARY KEY (person_id, local_blog_id)" + + ");"); + } + + private static void dropTables(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + PEOPLE_TABLE); + } + + public static void reset(SQLiteDatabase db) { + AppLog.i(AppLog.T.PEOPLE, "resetting people table"); + dropTables(db); + createTables(db); + } + + public static void save(Person person) { + save(person, getWritableDb()); + } + + public static void save(Person person, SQLiteDatabase database) { + ContentValues values = new ContentValues(); + values.put("person_id", person.getPersonID()); + values.put("local_blog_id", person.getLocalTableBlogId()); + values.put("user_name", person.getUsername()); + values.put("first_name", person.getFirstName()); + values.put("last_name", person.getLastName()); + values.put("display_name", person.getDisplayName()); + values.put("avatar_url", person.getAvatarUrl()); + values.put("role", Role.toKey(person.getRole())); + database.insertWithOnConflict(PEOPLE_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + + public static void savePeople(List peopleList) { + getWritableDb().beginTransaction(); + try { + for (Person person : peopleList) { + PeopleTable.save(person); + } + getWritableDb().setTransactionSuccessful(); + } finally { + getWritableDb().endTransaction(); + } + } + + public static List getPeople(int localTableBlogId) { + List people = new ArrayList<>(); + String[] args = { Integer.toString(localTableBlogId) }; + Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE + " WHERE local_blog_id=?", args); + + try { + while (c.moveToNext()) { + Person person = getPersonFromCursor(c, localTableBlogId); + people.add(person); + } + + return people; + } finally { + SqlUtils.closeCursor(c); + } + } + + /** + * retrieve a single person + * @param personId - id of a person in a particular site + * @param localTableBlogId - the local blog id the user belongs to + * @return Person if found, null otherwise + */ + public static Person getPerson(long personId, int localTableBlogId) { + String[] args = { Long.toString(personId), Integer.toString(localTableBlogId) }; + Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE + " WHERE person_id=? AND local_blog_id=?", args); + try { + if (!c.moveToFirst()) { + return null; + } + return getPersonFromCursor(c, localTableBlogId); + } finally { + SqlUtils.closeCursor(c); + } + } + + private static Person getPersonFromCursor(Cursor c, int localTableBlogId) { + long personId = c.getInt(c.getColumnIndex("person_id")); + String username = c.getString(c.getColumnIndex("user_name")); + String firstName = c.getString(c.getColumnIndex("first_name")); + String lastName = c.getString(c.getColumnIndex("last_name")); + String displayName = c.getString(c.getColumnIndex("display_name")); + String avatarUrl = c.getString(c.getColumnIndex("avatar_url")); + Role role = Role.fromKey(c.getString(c.getColumnIndex("role"))); + + return new Person(personId, localTableBlogId, username, firstName, lastName, displayName, avatarUrl, role); + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/PersonTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/PersonTable.java deleted file mode 100644 index 39efc825b9a1..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/datasets/PersonTable.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.wordpress.android.datasets; - -import org.wordpress.android.models.Person; -import org.wordpress.android.models.Role; - -public class PersonTable { - /** - * retrieve a single person - * @param personId - unique id in person table - * @return Person if found, null otherwise - */ - public static Person getPerson(int personId) { - // This is a stub method for now so it returns a mock object, once implemented it will query the db - return new Person(4, "oguzkocer", "Oguz", "Kocer", "Oguz", "http://lorempixum.com/76/76", Role.EDITOR); - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/models/Person.java b/WordPress/src/main/java/org/wordpress/android/models/Person.java index 54f849155178..3ec954b46013 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/Person.java +++ b/WordPress/src/main/java/org/wordpress/android/models/Person.java @@ -1,33 +1,77 @@ package org.wordpress.android.models; +import android.support.annotation.Nullable; + +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.util.AppLog; + public class Person { - public long personID; + private long personID; + private int localTableBlogId; private String username; private String firstName; private String lastName; private String displayName; - private String imageUrl; + private String avatarUrl; private Role role; public Person(long personID, + int localTableBlogId, String username, String firstName, String lastName, String displayName, - String imageUrl, + String avatarUrl, Role role) { this.personID = personID; + this.localTableBlogId = localTableBlogId; this.username = username; this.firstName = firstName; this.lastName = lastName; this.displayName = displayName; - this.imageUrl = imageUrl; + this.avatarUrl = avatarUrl; this.role = role; } + @Nullable + public static Person fromJSON(JSONObject json, int localTableBlogId) { + if (json == null) { + return null; + } + + // Response parameters can be found in https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/users/%24user_id/ + try { + long personID = Long.parseLong(json.getString("ID")); + String username = json.optString("login"); + String firstName = json.optString("first_name"); + String lastName = json.optString("last_name"); + String displayName = json.optString("nice_name"); + String avatarUrl = json.optString("avatar_URL"); + // We don't support multiple roles, so the first role is picked just as it's in Calypso + Role role = Role.fromKey(json.optJSONArray("roles").optString(0)); + + return new Person(personID, localTableBlogId, username, firstName, lastName, displayName, avatarUrl, role); + } catch (JSONException e) { + AppLog.e(AppLog.T.PEOPLE, "JSON exception occurred while parsing the user json: " + e); + } catch (NumberFormatException e) { + AppLog.e(AppLog.T.PEOPLE, "The ID parsed from the JSON couldn't be converted to long: " + e); + } + + return null; + } + + public long getPersonID() { + return personID; + } + + public int getLocalTableBlogId() { + return localTableBlogId; + } + public String getUsername() { - return "@" + username; + return username; } public void setUsername(String username) { @@ -66,11 +110,11 @@ public void setRole(Role role) { this.role = role; } - public String getImageUrl() { - return imageUrl; + public String getAvatarUrl() { + return avatarUrl; } - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; + public void setAvatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; } } diff --git a/WordPress/src/main/java/org/wordpress/android/models/Role.java b/WordPress/src/main/java/org/wordpress/android/models/Role.java index 5f8528b95b57..b8daefd8a325 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/Role.java +++ b/WordPress/src/main/java/org/wordpress/android/models/Role.java @@ -13,6 +13,12 @@ public enum Role { CONTRIBUTOR(R.string.role_contributor, R.color.blue_wordpress), UNSUPPORTED(R.string.role_unsupported, R.color.blue_wordpress); + private static String KEY_SUPER_ADMIN = "super_administrator"; + private static String KEY_ADMIN = "administrator"; + private static String KEY_EDITOR = "editor"; + private static String KEY_AUTHOR = "author"; + private static String KEY_CONTRIBUTOR = "contributor"; + private final int label; private final int backgroundColor; @@ -21,21 +27,44 @@ public enum Role { this.backgroundColor = backgroundColor; } - public static String toString(Context context, Role role) { + // Label to be used in UI + public static String getLabel(Context context, Role role) { return context.getString(role.label); } - // This method will be used to determine the role of the user from network request - public static Role fromString(String value) { + // Returns the key for that role + public static String toKey(Role role) { + switch (role) { + case SUPER_ADMIN: + return KEY_SUPER_ADMIN; + case ADMIN: + return KEY_ADMIN; + case EDITOR: + return KEY_EDITOR; + case AUTHOR: + return KEY_AUTHOR; + case CONTRIBUTOR: + return KEY_CONTRIBUTOR; + case UNSUPPORTED: + return "unsupported"; + } + // this is just a fallback for when we don't know the role returned by the server + return "unsupported"; + } + + // This method is be used to determine the role of the user from network request & db + public static Role fromKey(String value) { if (value == null) return Role.UNSUPPORTED; - if (value.equals("administrator")) + if (value.equals(KEY_SUPER_ADMIN)) + return Role.SUPER_ADMIN; + if (value.equals(KEY_ADMIN)) return Role.ADMIN; - if (value.equals("editor")) + if (value.equals(KEY_EDITOR)) return Role.EDITOR; - if (value.equals("author")) + if (value.equals(KEY_AUTHOR)) return Role.AUTHOR; - if (value.equals("contributor")) + if (value.equals(KEY_CONTRIBUTOR)) return Role.CONTRIBUTOR; return Role.UNSUPPORTED; } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java index cadb700191a8..22d9177b8800 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java @@ -285,7 +285,8 @@ public static void addSelfHostedSiteForResult(Activity activity) { public static void viewPersonDetails(Context context, Person person) { Intent intent = new Intent(context, PersonActivity.class); - intent.putExtra(PersonActivity.EXTRA_PERSON_ID, person.personID); + intent.putExtra(PersonActivity.EXTRA_PERSON_ID, person.getPersonID()); + intent.putExtra(PersonActivity.EXTRA_LOCAL_BLOG_ID, person.getLocalTableBlogId()); slideInFromRight(context, intent); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleAdapter.java index 39bea3bc1390..4d1296560cd7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleAdapter.java @@ -13,40 +13,39 @@ import org.wordpress.android.util.GravatarUtils; import org.wordpress.android.widgets.WPNetworkImageView; -import java.util.ArrayList; import java.util.List; public class PeopleAdapter extends BaseAdapter { private final Context mContext; private final LayoutInflater mInflater; - private List mPersonList; + private List mPeopleList; private int mAvatarSz; - public PeopleAdapter(Context context) { + public PeopleAdapter(Context context, List peopleList) { mContext = context; mAvatarSz = context.getResources().getDimensionPixelSize(R.dimen.avatar_sz_medium); mInflater = LayoutInflater.from(context); - mPersonList = new ArrayList<>(); - mPersonList.add(new Person(1, "beaulebens", "Beau", "Lebens", "Beau", "http://lorempixum.com/76/76", Role.ADMIN)); - mPersonList.add(new Person(2, "ebinnion", "Eric", "Binnion", "Eric", "http://lorempixum.com/76/76", Role.AUTHOR)); - mPersonList.add(new Person(3, "javialvarez", "Javi", "Alvarez", "Javi", "http://lorempixum.com/76/76", Role.CONTRIBUTOR)); - mPersonList.add(new Person(4, "oguzkocer", "Oguz", "Kocer", "Oguz", "http://lorempixum.com/76/76", Role.EDITOR)); + mPeopleList = peopleList; + } + + public void setPeopleList(List peopleList) { + mPeopleList = peopleList; } @Override public int getCount() { - if (mPersonList == null) { + if (mPeopleList == null) { return 0; } - return mPersonList.size(); + return mPeopleList.size(); } @Override public Person getItem(int position) { - if (mPersonList == null) { + if (mPeopleList == null) { return null; } - return mPersonList.get(position); + return mPeopleList.get(position); } @Override @@ -55,7 +54,7 @@ public long getItemId(int position) { if (person == null) { return 0; } - return person.personID; + return person.getPersonID(); } @Override @@ -73,11 +72,11 @@ public View getView(int position, View convertView, ViewGroup parent) { Person person = getItem(position); if (person != null) { - String avatarUrl = GravatarUtils.fixGravatarUrl(person.getImageUrl(), mAvatarSz); + String avatarUrl = GravatarUtils.fixGravatarUrl(person.getAvatarUrl(), mAvatarSz); holder.imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); holder.txtDisplayName.setText(person.getDisplayName()); - holder.txtUsername.setText(person.getUsername()); - holder.txtRole.setText(Role.toString(mContext, person.getRole())); + holder.txtUsername.setText(String.format("@%s", person.getUsername())); + holder.txtRole.setText(Role.getLabel(mContext, person.getRole())); holder.txtRole.setBackgroundColor(Role.backgroundColor(mContext, person.getRole())); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java index 5c03c29a8ad8..05cf4b9f9a2f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java @@ -9,16 +9,31 @@ import android.widget.AdapterView; import android.widget.ListView; +import com.android.volley.VolleyError; + +import org.json.JSONException; import org.wordpress.android.R; +import org.wordpress.android.WordPress; +import org.wordpress.android.datasets.PeopleTable; +import org.wordpress.android.models.Blog; import org.wordpress.android.models.Person; import org.wordpress.android.ui.ActivityLauncher; +import org.wordpress.android.ui.accounts.BlogUtils; +import org.wordpress.android.ui.people.utils.PeopleUtils; + +import java.util.List; public class PeopleManagementActivity extends AppCompatActivity { + private PeopleAdapter mPeopleAdapter; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + int localBlogId = BlogUtils.getBlogLocalId(WordPress.getCurrentBlog()); + Blog blog = WordPress.getBlog(localBlogId); + ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setHomeButtonEnabled(true); @@ -28,17 +43,23 @@ public void onCreate(Bundle savedInstanceState) { setTitle(R.string.people); - ListView listView = (ListView)findViewById(android.R.id.list); - listView.setAdapter(new PeopleAdapter(this)); + if (blog != null) { + ListView listView = (ListView)findViewById(android.R.id.list); + List peopleList = PeopleTable.getPeople(localBlogId); + mPeopleAdapter = new PeopleAdapter(this, peopleList); + listView.setAdapter(mPeopleAdapter); - final Activity context = this; - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Person person = (Person) parent.getItemAtPosition(position); - ActivityLauncher.viewPersonDetails(context, person); - } - }); + final Activity context = this; + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Person person = (Person) parent.getItemAtPosition(position); + ActivityLauncher.viewPersonDetails(context, person); + } + }); + + refreshUsersList(blog.getDotComBlogId(), localBlogId); + } } @Override @@ -55,4 +76,25 @@ public boolean onOptionsItemSelected(final MenuItem item) { } return super.onOptionsItemSelected(item); } + + private void refreshUsersList(String dotComBlogId, final int localBlogId) { + PeopleUtils.fetchUsers(dotComBlogId, localBlogId, new PeopleUtils.Callback() { + @Override + public void onSuccess(List peopleList) { + PeopleTable.savePeople(peopleList); + mPeopleAdapter.setPeopleList(peopleList); + mPeopleAdapter.notifyDataSetChanged(); + } + + @Override + public void onError(VolleyError error) { + //TODO: show some kind of error to the user + } + + @Override + public void onJSONException(JSONException exception) { + //TODO: show some kind of error to the user + } + }); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PersonActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PersonActivity.java index 7dbcc333f1bf..acae297c18d8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/PersonActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PersonActivity.java @@ -8,7 +8,7 @@ import android.widget.TextView; import org.wordpress.android.R; -import org.wordpress.android.datasets.PersonTable; +import org.wordpress.android.datasets.PeopleTable; import org.wordpress.android.models.Person; import org.wordpress.android.models.Role; import org.wordpress.android.ui.ActivityLauncher; @@ -17,14 +17,14 @@ public class PersonActivity extends AppCompatActivity { public static final String EXTRA_PERSON_ID = "EXTRA_PERSON_ID"; - - private int mPersonId; + public static final String EXTRA_LOCAL_BLOG_ID = "EXTRA_LOCAL_BLOG_ID"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mPersonId = getIntent().getExtras().getInt(EXTRA_PERSON_ID); + long personId = getIntent().getExtras().getLong(EXTRA_PERSON_ID); + int localBlogId = getIntent().getExtras().getInt(EXTRA_LOCAL_BLOG_ID); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -35,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(R.string.edit_user); - refreshUserDetails(); + refreshUserDetails(personId, localBlogId); } @Override @@ -53,23 +53,23 @@ public boolean onOptionsItemSelected(final MenuItem item) { return super.onOptionsItemSelected(item); } - private void refreshUserDetails() { + private void refreshUserDetails(long personId, int localBlogId) { WPNetworkImageView imgAvatar = (WPNetworkImageView) findViewById(R.id.person_avatar); TextView txtDisplayName = (TextView) findViewById(R.id.person_display_name); TextView txtUsername = (TextView) findViewById(R.id.person_username); TextView txtRole = (TextView) findViewById(R.id.person_role); TextView txtRemove = (TextView) findViewById(R.id.person_remove); - Person person = PersonTable.getPerson(mPersonId); + Person person = PeopleTable.getPerson(personId, localBlogId); if (person != null) { int avatarSz = getResources().getDimensionPixelSize(R.dimen.avatar_sz_large); - String avatarUrl = GravatarUtils.fixGravatarUrl(person.getImageUrl(), avatarSz); + String avatarUrl = GravatarUtils.fixGravatarUrl(person.getAvatarUrl(), avatarSz); imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); txtDisplayName.setText(person.getDisplayName()); txtUsername.setText(person.getUsername()); - txtRole.setText(Role.toString(this, person.getRole())); + txtRole.setText(Role.getLabel(this, person.getRole())); txtRemove.setText(String.format(getString(R.string.remove_user), person.getFirstName().toUpperCase())); txtRemove.setOnClickListener(new View.OnClickListener() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java new file mode 100644 index 000000000000..c5b79c200d68 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java @@ -0,0 +1,76 @@ +package org.wordpress.android.ui.people.utils; + +import com.android.volley.VolleyError; +import com.wordpress.rest.RestRequest; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.WordPress; +import org.wordpress.android.models.Person; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.AppLog.T; + +import java.util.ArrayList; +import java.util.List; + +public class PeopleUtils { + + public static void fetchUsers(String siteID, final int localTableBlogId, final PeopleUtils.Callback callback) { + com.wordpress.rest.RestRequest.Listener listener = new RestRequest.Listener() { + @Override + public void onResponse(JSONObject jsonObject) { + if (jsonObject != null && callback != null) { + try { + JSONArray jsonArray = jsonObject.getJSONArray("users"); + List people = peopleListFromJSON(jsonArray, localTableBlogId); + callback.onSuccess(people); + + } + catch (JSONException e) { + AppLog.e(T.API, "JSON exception occurred while parsing the response for sites/%s/users: " + e); + callback.onJSONException(e); + } + } + } + }; + + RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError volleyError) { + AppLog.e(T.API, volleyError); + if (callback != null) { + callback.onError(volleyError); + } + } + }; + + String path = String.format("sites/%s/users", siteID); + WordPress.getRestClientUtilsV1_1().get(path, listener, errorListener); + } + + private static List peopleListFromJSON(JSONArray jsonArray, int localTableBlogId) { + if (jsonArray == null) { + return null; + } + + ArrayList peopleList = new ArrayList<>(jsonArray.length()); + + for (int i = 0; i < jsonArray.length(); i++) { + Person person = Person.fromJSON(jsonArray.optJSONObject(i), localTableBlogId); + if (person != null) { + peopleList.add(person); + } + } + + return peopleList; + } + + public interface Callback { + void onSuccess(List peopleList); + + void onError(VolleyError error); + + void onJSONException(JSONException e); + } +} diff --git a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AppLog.java b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AppLog.java index 433809317525..e170b4b5672c 100644 --- a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AppLog.java +++ b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AppLog.java @@ -16,7 +16,7 @@ public class AppLog { // T for Tag public enum T {READER, EDITOR, MEDIA, NUX, API, STATS, UTILS, NOTIFS, DB, POSTS, COMMENTS, THEMES, TESTS, PROFILING, - SIMPERIUM, SUGGESTION, MAIN, SETTINGS, PLANS} + SIMPERIUM, SUGGESTION, MAIN, SETTINGS, PLANS, PEOPLE} public static final String TAG = "WordPress"; public static final int HEADER_LINE_COUNT = 2;