Skip to content

Commit 3616a1f

Browse files
committed
Merge pull request #3916 from wordpress-mobile/feature/people-management-network-and-data-layer
People management network and data layer
2 parents 1348505 + 37f109d commit 3616a1f

File tree

12 files changed

+377
-72
lines changed

12 files changed

+377
-72
lines changed

WordPress/src/main/java/org/wordpress/android/WordPressDB.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
import org.json.JSONArray;
1717
import org.wordpress.android.datasets.AccountTable;
1818
import org.wordpress.android.datasets.CommentTable;
19+
import org.wordpress.android.datasets.PeopleTable;
1920
import org.wordpress.android.datasets.SiteSettingsTable;
2021
import org.wordpress.android.datasets.SuggestionTable;
2122
import org.wordpress.android.models.Account;
2223
import org.wordpress.android.models.Blog;
23-
import org.wordpress.android.models.Person;
2424
import org.wordpress.android.models.MediaUploadState;
2525
import org.wordpress.android.models.Post;
2626
import org.wordpress.android.models.PostLocation;
@@ -85,7 +85,7 @@ public class WordPressDB {
8585
public static final String COLUMN_NAME_VIDEO_PRESS_SHORTCODE = "videoPressShortcode";
8686
public static final String COLUMN_NAME_UPLOAD_STATE = "uploadState";
8787

88-
private static final int DATABASE_VERSION = 44;
88+
private static final int DATABASE_VERSION = 45;
8989

9090
private static final String CREATE_TABLE_BLOGS = "create table if not exists accounts (id integer primary key autoincrement, "
9191
+ "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) {
410410
case 43:
411411
db.execSQL(ADD_BLOGS_PLAN_PRODUCT_NAME_SHORT);
412412
currentVersion++;
413+
case 44:
414+
PeopleTable.createTables(db);
415+
currentVersion++;
413416
}
414417
db.setVersion(DATABASE_VERSION);
415418
}

WordPress/src/main/java/org/wordpress/android/datasets/CommentTable.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,9 @@ public static Comment getComment(int localBlogId, long commentId) {
116116
String[] args = {Integer.toString(localBlogId), Long.toString(commentId)};
117117
Cursor c = getReadableDb().rawQuery("SELECT * FROM " + COMMENTS_TABLE + " WHERE blog_id=? AND comment_id=?", args);
118118
try {
119-
if (!c.moveToFirst())
119+
if (!c.moveToFirst()) {
120120
return null;
121+
}
121122
return getCommentFromCursor(c);
122123
} finally {
123124
SqlUtils.closeCursor(c);
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package org.wordpress.android.datasets;
2+
3+
import android.content.ContentValues;
4+
import android.database.Cursor;
5+
import android.database.sqlite.SQLiteDatabase;
6+
7+
import org.wordpress.android.WordPress;
8+
import org.wordpress.android.models.Person;
9+
import org.wordpress.android.models.Role;
10+
import org.wordpress.android.util.AppLog;
11+
import org.wordpress.android.util.SqlUtils;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class PeopleTable {
17+
public static final String PEOPLE_TABLE = "people";
18+
19+
private static SQLiteDatabase getReadableDb() {
20+
return WordPress.wpDB.getDatabase();
21+
}
22+
private static SQLiteDatabase getWritableDb() {
23+
return WordPress.wpDB.getDatabase();
24+
}
25+
26+
public static void createTables(SQLiteDatabase db) {
27+
db.execSQL("CREATE TABLE " + PEOPLE_TABLE + " ("
28+
+ "person_id INTEGER DEFAULT 0,"
29+
+ "local_blog_id INTEGER DEFAULT 0,"
30+
+ "user_name TEXT,"
31+
+ "first_name TEXT,"
32+
+ "last_name TEXT,"
33+
+ "display_name TEXT,"
34+
+ "avatar_url TEXT,"
35+
+ "role TEXT,"
36+
+ "PRIMARY KEY (person_id, local_blog_id)"
37+
+ ");");
38+
}
39+
40+
private static void dropTables(SQLiteDatabase db) {
41+
db.execSQL("DROP TABLE IF EXISTS " + PEOPLE_TABLE);
42+
}
43+
44+
public static void reset(SQLiteDatabase db) {
45+
AppLog.i(AppLog.T.PEOPLE, "resetting people table");
46+
dropTables(db);
47+
createTables(db);
48+
}
49+
50+
public static void save(Person person) {
51+
save(person, getWritableDb());
52+
}
53+
54+
public static void save(Person person, SQLiteDatabase database) {
55+
ContentValues values = new ContentValues();
56+
values.put("person_id", person.getPersonID());
57+
values.put("local_blog_id", person.getLocalTableBlogId());
58+
values.put("user_name", person.getUsername());
59+
values.put("first_name", person.getFirstName());
60+
values.put("last_name", person.getLastName());
61+
values.put("display_name", person.getDisplayName());
62+
values.put("avatar_url", person.getAvatarUrl());
63+
values.put("role", Role.toKey(person.getRole()));
64+
database.insertWithOnConflict(PEOPLE_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
65+
}
66+
67+
public static void savePeople(List<Person> peopleList) {
68+
getWritableDb().beginTransaction();
69+
try {
70+
for (Person person : peopleList) {
71+
PeopleTable.save(person);
72+
}
73+
getWritableDb().setTransactionSuccessful();
74+
} finally {
75+
getWritableDb().endTransaction();
76+
}
77+
}
78+
79+
public static List<Person> getPeople(int localTableBlogId) {
80+
List<Person> people = new ArrayList<>();
81+
String[] args = { Integer.toString(localTableBlogId) };
82+
Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE + " WHERE local_blog_id=?", args);
83+
84+
try {
85+
while (c.moveToNext()) {
86+
Person person = getPersonFromCursor(c, localTableBlogId);
87+
people.add(person);
88+
}
89+
90+
return people;
91+
} finally {
92+
SqlUtils.closeCursor(c);
93+
}
94+
}
95+
96+
/**
97+
* retrieve a single person
98+
* @param personId - id of a person in a particular site
99+
* @param localTableBlogId - the local blog id the user belongs to
100+
* @return Person if found, null otherwise
101+
*/
102+
public static Person getPerson(long personId, int localTableBlogId) {
103+
String[] args = { Long.toString(personId), Integer.toString(localTableBlogId) };
104+
Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE + " WHERE person_id=? AND local_blog_id=?", args);
105+
try {
106+
if (!c.moveToFirst()) {
107+
return null;
108+
}
109+
return getPersonFromCursor(c, localTableBlogId);
110+
} finally {
111+
SqlUtils.closeCursor(c);
112+
}
113+
}
114+
115+
private static Person getPersonFromCursor(Cursor c, int localTableBlogId) {
116+
long personId = c.getInt(c.getColumnIndex("person_id"));
117+
String username = c.getString(c.getColumnIndex("user_name"));
118+
String firstName = c.getString(c.getColumnIndex("first_name"));
119+
String lastName = c.getString(c.getColumnIndex("last_name"));
120+
String displayName = c.getString(c.getColumnIndex("display_name"));
121+
String avatarUrl = c.getString(c.getColumnIndex("avatar_url"));
122+
Role role = Role.fromKey(c.getString(c.getColumnIndex("role")));
123+
124+
return new Person(personId, localTableBlogId, username, firstName, lastName, displayName, avatarUrl, role);
125+
}
126+
}

WordPress/src/main/java/org/wordpress/android/datasets/PersonTable.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

WordPress/src/main/java/org/wordpress/android/models/Person.java

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,77 @@
11
package org.wordpress.android.models;
22

3+
import android.support.annotation.Nullable;
4+
5+
import org.json.JSONException;
6+
import org.json.JSONObject;
7+
import org.wordpress.android.util.AppLog;
8+
39
public class Person {
4-
public long personID;
10+
private long personID;
11+
private int localTableBlogId;
512

613
private String username;
714
private String firstName;
815
private String lastName;
916
private String displayName;
10-
private String imageUrl;
17+
private String avatarUrl;
1118
private Role role;
1219

1320
public Person(long personID,
21+
int localTableBlogId,
1422
String username,
1523
String firstName,
1624
String lastName,
1725
String displayName,
18-
String imageUrl,
26+
String avatarUrl,
1927
Role role) {
2028
this.personID = personID;
29+
this.localTableBlogId = localTableBlogId;
2130
this.username = username;
2231
this.firstName = firstName;
2332
this.lastName = lastName;
2433
this.displayName = displayName;
25-
this.imageUrl = imageUrl;
34+
this.avatarUrl = avatarUrl;
2635
this.role = role;
2736
}
2837

38+
@Nullable
39+
public static Person fromJSON(JSONObject json, int localTableBlogId) {
40+
if (json == null) {
41+
return null;
42+
}
43+
44+
// Response parameters can be found in https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/users/%24user_id/
45+
try {
46+
long personID = Long.parseLong(json.getString("ID"));
47+
String username = json.optString("login");
48+
String firstName = json.optString("first_name");
49+
String lastName = json.optString("last_name");
50+
String displayName = json.optString("nice_name");
51+
String avatarUrl = json.optString("avatar_URL");
52+
// We don't support multiple roles, so the first role is picked just as it's in Calypso
53+
Role role = Role.fromKey(json.optJSONArray("roles").optString(0));
54+
55+
return new Person(personID, localTableBlogId, username, firstName, lastName, displayName, avatarUrl, role);
56+
} catch (JSONException e) {
57+
AppLog.e(AppLog.T.PEOPLE, "JSON exception occurred while parsing the user json: " + e);
58+
} catch (NumberFormatException e) {
59+
AppLog.e(AppLog.T.PEOPLE, "The ID parsed from the JSON couldn't be converted to long: " + e);
60+
}
61+
62+
return null;
63+
}
64+
65+
public long getPersonID() {
66+
return personID;
67+
}
68+
69+
public int getLocalTableBlogId() {
70+
return localTableBlogId;
71+
}
72+
2973
public String getUsername() {
30-
return "@" + username;
74+
return username;
3175
}
3276

3377
public void setUsername(String username) {
@@ -66,11 +110,11 @@ public void setRole(Role role) {
66110
this.role = role;
67111
}
68112

69-
public String getImageUrl() {
70-
return imageUrl;
113+
public String getAvatarUrl() {
114+
return avatarUrl;
71115
}
72116

73-
public void setImageUrl(String imageUrl) {
74-
this.imageUrl = imageUrl;
117+
public void setAvatarUrl(String avatarUrl) {
118+
this.avatarUrl = avatarUrl;
75119
}
76120
}

WordPress/src/main/java/org/wordpress/android/models/Role.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ public enum Role {
1313
CONTRIBUTOR(R.string.role_contributor, R.color.blue_wordpress),
1414
UNSUPPORTED(R.string.role_unsupported, R.color.blue_wordpress);
1515

16+
private static String KEY_SUPER_ADMIN = "super_administrator";
17+
private static String KEY_ADMIN = "administrator";
18+
private static String KEY_EDITOR = "editor";
19+
private static String KEY_AUTHOR = "author";
20+
private static String KEY_CONTRIBUTOR = "contributor";
21+
1622
private final int label;
1723
private final int backgroundColor;
1824

@@ -21,21 +27,44 @@ public enum Role {
2127
this.backgroundColor = backgroundColor;
2228
}
2329

24-
public static String toString(Context context, Role role) {
30+
// Label to be used in UI
31+
public static String getLabel(Context context, Role role) {
2532
return context.getString(role.label);
2633
}
2734

28-
// This method will be used to determine the role of the user from network request
29-
public static Role fromString(String value) {
35+
// Returns the key for that role
36+
public static String toKey(Role role) {
37+
switch (role) {
38+
case SUPER_ADMIN:
39+
return KEY_SUPER_ADMIN;
40+
case ADMIN:
41+
return KEY_ADMIN;
42+
case EDITOR:
43+
return KEY_EDITOR;
44+
case AUTHOR:
45+
return KEY_AUTHOR;
46+
case CONTRIBUTOR:
47+
return KEY_CONTRIBUTOR;
48+
case UNSUPPORTED:
49+
return "unsupported";
50+
}
51+
// this is just a fallback for when we don't know the role returned by the server
52+
return "unsupported";
53+
}
54+
55+
// This method is be used to determine the role of the user from network request & db
56+
public static Role fromKey(String value) {
3057
if (value == null)
3158
return Role.UNSUPPORTED;
32-
if (value.equals("administrator"))
59+
if (value.equals(KEY_SUPER_ADMIN))
60+
return Role.SUPER_ADMIN;
61+
if (value.equals(KEY_ADMIN))
3362
return Role.ADMIN;
34-
if (value.equals("editor"))
63+
if (value.equals(KEY_EDITOR))
3564
return Role.EDITOR;
36-
if (value.equals("author"))
65+
if (value.equals(KEY_AUTHOR))
3766
return Role.AUTHOR;
38-
if (value.equals("contributor"))
67+
if (value.equals(KEY_CONTRIBUTOR))
3968
return Role.CONTRIBUTOR;
4069
return Role.UNSUPPORTED;
4170
}

WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ public static void addSelfHostedSiteForResult(Activity activity) {
285285

286286
public static void viewPersonDetails(Context context, Person person) {
287287
Intent intent = new Intent(context, PersonActivity.class);
288-
intent.putExtra(PersonActivity.EXTRA_PERSON_ID, person.personID);
288+
intent.putExtra(PersonActivity.EXTRA_PERSON_ID, person.getPersonID());
289+
intent.putExtra(PersonActivity.EXTRA_LOCAL_BLOG_ID, person.getLocalTableBlogId());
289290
slideInFromRight(context, intent);
290291
}
291292

0 commit comments

Comments
 (0)