Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
64e6cab
Table created for People
oguzkocer Mar 7, 2016
0f8ee49
Drop table & save methods added for People table
oguzkocer Mar 7, 2016
8ffd738
Adds getPerson to PeopleTable
oguzkocer Mar 7, 2016
f0c36fd
Fixed a few issues from the previous commit and renamed role toString…
oguzkocer Mar 8, 2016
883c582
Save person's role in the db, refactor Role enum
oguzkocer Mar 8, 2016
ff12174
Role enum method names refactored to make it clear what they do
oguzkocer Mar 8, 2016
ecfc163
Merge branch 'feature/people-management-sync' into feature/people-man…
oguzkocer Mar 14, 2016
87ae386
Reset table added to PeopleTable
oguzkocer Mar 15, 2016
bdcc913
Blog_id added to Person and blog & person id combination will be uniq…
oguzkocer Mar 16, 2016
78d01e5
Merge branch 'feature/people-management-sync' into feature/people-man…
oguzkocer Mar 29, 2016
0eecf5f
Introduced PeopleUtils with first iteration of fetchUsers implemented
oguzkocer Mar 30, 2016
550e1aa
Fetch users list when the people management activity is created
oguzkocer Mar 30, 2016
90db986
Save people list received from the server
oguzkocer Mar 30, 2016
9d8ba0a
getPersonFromCursor method introduced to reuse it
oguzkocer Mar 31, 2016
cf93798
getPeople implemented for PeopleTable
oguzkocer Mar 31, 2016
bae0d91
Network & data layers connected to PeopleManagementActivity to show u…
oguzkocer Mar 31, 2016
2a61cf8
Fixed the variable name for retrieving people list from db
oguzkocer Mar 31, 2016
28852ad
The remote blog id should be used to retrieve people from db
oguzkocer Mar 31, 2016
154cd38
Fixed the error message for json parsing error for sites/users request
oguzkocer Mar 31, 2016
055f14f
Add @ to username in Adapter instead of Model
oguzkocer Mar 31, 2016
5f45582
Use local blog id instead of remote site id for people
oguzkocer Apr 1, 2016
c0dfeca
getLocalTableBlogId should return int instead of long
oguzkocer Apr 1, 2016
b463e57
Merge branch 'feature/people-management-sync' into feature/people-man…
oguzkocer Apr 1, 2016
d610bcb
Added People to AppLog
oguzkocer Apr 1, 2016
ee9b0d5
Fixed a variable name in PeopleTable
oguzkocer Apr 1, 2016
e2d6e17
Fixed a typo in getPersonID method name
oguzkocer Apr 1, 2016
b2f6061
Fixed a possible NPE convertion JSON to Person model
oguzkocer Apr 1, 2016
6e8ac8d
Fixed a comment for the change from the remote site id to local one
oguzkocer Apr 1, 2016
7c40dce
Merge branch 'feature/people-management-sync' into feature/people-man…
oguzkocer Apr 4, 2016
526113e
Wrap saving people to DB in a transaction
oguzkocer Apr 4, 2016
05b18fe
Adds braces to if for single statements
oguzkocer Apr 4, 2016
f9d4c4f
Adds a comment which explains why we pick the first role from network…
oguzkocer Apr 5, 2016
03002cc
Handle unsupported case for Role enum instead of using default
oguzkocer Apr 5, 2016
4ba9d28
Person ID shouldn't be read as optional from the json
oguzkocer Apr 5, 2016
f837075
peopleListFromJSON should be private
oguzkocer Apr 5, 2016
a1ead5f
Instead of overriding notifyDataSetChanged pass the people list to Pe…
oguzkocer Apr 5, 2016
50389f6
Remove unnecessary global variables from PeopleManagementActivity
oguzkocer Apr 5, 2016
9a083b9
Remove unnecessary global variables from PersonActivity
oguzkocer Apr 5, 2016
17d3578
Adds onJSONException to PeopleUtils.Callback
oguzkocer Apr 5, 2016
5e7898f
Move saving the people to DB to the Activity from PeopleUtils
oguzkocer Apr 5, 2016
37f109d
Adds @Nullable to fromJSON method in Person
oguzkocer Apr 5, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);";
Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Person> peopleList) {
getWritableDb().beginTransaction();
try {
for (Person person : peopleList) {
PeopleTable.save(person);
}
getWritableDb().setTransactionSuccessful();
} finally {
getWritableDb().endTransaction();
}
}

public static List<Person> getPeople(int localTableBlogId) {
List<Person> 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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
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);
}
}

This file was deleted.

62 changes: 53 additions & 9 deletions WordPress/src/main/java/org/wordpress/android/models/Person.java
Original file line number Diff line number Diff line change
@@ -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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not a remark per se but, perhaps it could be useful to add the @Nullable annotation to the method to "nudge" the caller to check for NPE. Not a biggie nor a blocker and totally up to you to add it or not. Cheers!

}

public long getPersonID() {
return personID;
}

public int getLocalTableBlogId() {
return localTableBlogId;
}

public String getUsername() {
return "@" + username;
return username;
}

public void setUsername(String username) {
Expand Down Expand Up @@ -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;
}
}
43 changes: 36 additions & 7 deletions WordPress/src/main/java/org/wordpress/android/models/Role.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Loading