gravatarCache = GravatarCache.getInstance().getGravatarStorage();
107 |
108 | if(gravatarCache.containsKey(userHash)) {
109 | ivUser.setImageBitmap(gravatarCache.get(userHash));
110 | } else {
111 | final String url = "https://secure.gravatar.com/avatar/" + userHash + "?s=16&d=mm";
112 |
113 | HttpConnection connection = Platform.createHttpConnection(new NullLogger());
114 | Request request = new Request("GET");
115 | request.setUrl(url);
116 |
117 | connection.execute(request, new ResponseCallback() {
118 |
119 | @Override
120 | public void onResponse(Response response) throws Exception {
121 | if (response.getStatus() == 200) {
122 | final byte[] buff = response.readAllBytes();
123 | mActivity.runOnUiThread(new Runnable() {
124 |
125 | @Override
126 | public void run() {
127 |
128 | Bitmap bitmap = BitmapFactory.decodeByteArray(buff,0,buff.length);
129 |
130 | if (currentUUID.equals((UUID)currentView.getTag())) {
131 | ivUser.setImageBitmap(bitmap);
132 | GravatarCache.getInstance().getGravatarStorage().put(userHash, bitmap);
133 | }
134 |
135 | }
136 | });
137 | }
138 | }
139 | });
140 | }
141 | }
142 |
143 | return currentView;
144 | }
145 |
146 |
147 |
148 | }
149 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/SettingsActivity.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android;
2 |
3 | import android.os.Bundle;
4 | import android.preference.PreferenceActivity;
5 |
6 | /**
7 | * A {@link PreferenceActivity} that presents a set of application settings. On
8 | * handset devices, settings are presented as a single list. On tablets,
9 | * settings are split by category, with category headers shown to the left of
10 | * the list of settings.
11 | *
12 | * See
13 | * Android Design: Settings for design guidelines and the Settings
15 | * API Guide for more information on developing a Settings UI.
16 | */
17 | public class SettingsActivity extends PreferenceActivity {
18 |
19 | @SuppressWarnings("deprecation")
20 | @Override
21 | protected void onPostCreate(Bundle savedInstanceState) {
22 | super.onPostCreate(savedInstanceState);
23 |
24 | addPreferencesFromResource(R.xml.pref_general);
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/helpers/GravatarCache.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.helpers;
2 |
3 | import java.util.Hashtable;
4 | import java.util.Map;
5 |
6 | import android.graphics.Bitmap;
7 |
8 | public class GravatarCache {
9 | private static GravatarCache mInstance= null;
10 | private Map mGravatarStorage;
11 |
12 | protected GravatarCache() {
13 | mGravatarStorage = new Hashtable();
14 | }
15 |
16 | public static synchronized GravatarCache getInstance(){
17 | if(null == mInstance){
18 | mInstance = new GravatarCache();
19 | }
20 | return mInstance;
21 | }
22 |
23 | public Map getGravatarStorage() {
24 | return mGravatarStorage;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/helpers/HubConnectionFactory.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.helpers;
2 |
3 | import java.net.HttpURLConnection;
4 | import java.util.ArrayList;
5 | import java.util.List;
6 | import java.util.Map.Entry;
7 |
8 | import microsoft.aspnet.signalr.client.Action;
9 | import microsoft.aspnet.signalr.client.ErrorCallback;
10 | import microsoft.aspnet.signalr.client.InvalidStateException;
11 | import microsoft.aspnet.signalr.client.LogLevel;
12 | import microsoft.aspnet.signalr.client.Logger;
13 | import microsoft.aspnet.signalr.client.NullLogger;
14 | import microsoft.aspnet.signalr.client.Platform;
15 | import microsoft.aspnet.signalr.client.SignalRFuture;
16 | import microsoft.aspnet.signalr.client.SimpleEntry;
17 | import microsoft.aspnet.signalr.client.http.CookieCredentials;
18 | import microsoft.aspnet.signalr.client.http.HttpConnection;
19 | import microsoft.aspnet.signalr.client.http.HttpConnectionFuture;
20 | import microsoft.aspnet.signalr.client.http.HttpConnectionFuture.ResponseCallback;
21 | import microsoft.aspnet.signalr.client.http.Request;
22 | import microsoft.aspnet.signalr.client.http.Response;
23 | import microsoft.aspnet.signalr.client.hubs.HubConnection;
24 | import microsoft.aspnet.signalr.client.hubs.HubProxy;
25 |
26 | import android.util.Log;
27 |
28 | public class HubConnectionFactory {
29 |
30 | private static HubConnectionFactory mInstance= null;
31 | private HubConnection mConnection;
32 | private HubProxy mChat;
33 |
34 | protected HubConnectionFactory(){}
35 |
36 | public static synchronized HubConnectionFactory getInstance(){
37 | if(null == mInstance){
38 | mInstance = new HubConnectionFactory();
39 | }
40 | return mInstance;
41 | }
42 |
43 | public HubConnection getHubConnection() {
44 | return mConnection;
45 | }
46 |
47 | public HubProxy getChatHub() {
48 | return mChat;
49 | }
50 |
51 | public SignalRFuture connect(String url, CookieCredentials cookieCredentials) {
52 | final SignalRFuture future = new SignalRFuture();
53 | createObjects(url, future, cookieCredentials);
54 |
55 | return future;
56 | }
57 |
58 | public SignalRFuture connect(final String url, final String username, final String password) {
59 |
60 | final SignalRFuture connectFuture = new SignalRFuture();
61 |
62 | HttpConnection conn = Platform.createHttpConnection(new NullLogger());
63 |
64 | String loginUrl = url + "account/login";
65 |
66 | Request request = new Request("POST");
67 | request.setUrl(loginUrl);
68 | List> formData = new ArrayList>();
69 |
70 | formData.add(new SimpleEntry("username", username));
71 | formData.add(new SimpleEntry("password", password));
72 |
73 | request.setFormContent(formData);
74 |
75 | request.addHeader("Content-Type", "application/x-www-form-urlencoded");
76 |
77 | final CookieCredentials cc = new CookieCredentials();
78 | HttpURLConnection.setFollowRedirects(false);
79 | final HttpConnectionFuture connFuture = conn.execute(request, new ResponseCallback() {
80 |
81 | @Override
82 | public void onResponse(Response response) throws Exception {
83 | int status = response.getStatus();
84 | if (status != 303) {
85 |
86 | connectFuture.triggerError(new Exception("Login failed"));
87 | return;
88 | }
89 |
90 | List cookieHeaders = response.getHeaders().get("Set-Cookie");
91 |
92 | for (String cookie : cookieHeaders) {
93 | String hc = cookie.split("\\;")[0];
94 | String[] nameValue = hc.split("\\=");
95 |
96 | if(nameValue.length > 1) {
97 | String name = nameValue[0];
98 | String value = nameValue[1];
99 | cc.addCookie(name, value);
100 | }
101 | }
102 |
103 | createObjects(url, connectFuture, cc);
104 | }
105 | });
106 |
107 | connFuture.onError(new ErrorCallback() {
108 |
109 | @Override
110 | public void onError(Throwable error) {
111 | connectFuture.triggerError(error);
112 | Log.d("JABBR", "Error getting credentials: " + error.toString());
113 | }
114 | });
115 |
116 | return connectFuture;
117 | }
118 |
119 | public void createObjects(String url, final SignalRFuture future, CookieCredentials cc){
120 |
121 | mConnection = new HubConnection(url, "version=1.0.0.0", true, new Logger() {
122 |
123 | @Override
124 | public void log(String message, LogLevel level) {
125 | if (level == LogLevel.Critical) {
126 | Log.d("JABBR", level.toString() + ": " + message);
127 | }
128 | }
129 | });
130 |
131 | mConnection.setCredentials(cc);
132 |
133 |
134 | try {
135 | mChat = mConnection.createHubProxy("chat");
136 | } catch (InvalidStateException e) {
137 | Log.d("JABBR", "Error getting creating proxy: " + e.toString());
138 | future.triggerError(e);
139 | }
140 |
141 | SignalRFuture connectionFuture = mConnection.start();
142 |
143 | mConnection.connected(new Runnable() {
144 |
145 | @Override
146 | public void run() {
147 |
148 | future.setResult(null);
149 | }
150 | });
151 | connectionFuture.done(new Action() {
152 |
153 | @Override
154 | public void run(Void obj) throws Exception {
155 | future.setResult(null);
156 | }
157 | });
158 |
159 | connectionFuture.onError(new ErrorCallback() {
160 |
161 | @Override
162 | public void onError(Throwable error) {
163 | future.triggerError(error);
164 | }
165 | });
166 |
167 | mConnection.error(new ErrorCallback() {
168 |
169 | @Override
170 | public void onError(Throwable error) {
171 | Log.d("JABBR", "Connection error: " + error.toString());
172 |
173 | if (!future.isDone()) {
174 | future.triggerError(error);
175 | }
176 | }
177 | });
178 |
179 | }
180 |
181 |
182 | public void disconnect() {
183 | mChat = null;
184 | mConnection.stop();
185 | }
186 | }
187 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/ClientMessage.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | public class ClientMessage {
4 |
5 | @com.google.gson.annotations.SerializedName("Id")
6 | private String mId;
7 | @com.google.gson.annotations.SerializedName("Content")
8 | private String mContent;
9 | @com.google.gson.annotations.SerializedName("Room")
10 | private String mRoom;
11 |
12 | public String getContent() {
13 | return mContent;
14 | }
15 | public void setContent(String mContent) {
16 | this.mContent = mContent;
17 | }
18 | public String getId() {
19 | return mId;
20 | }
21 | public void setId(String mId) {
22 | this.mId = mId;
23 | }
24 | public String getRoom() {
25 | return mRoom;
26 | }
27 | public void setRoom(String mRoom) {
28 | this.mRoom = mRoom;
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/ClientNotification.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import android.graphics.Bitmap;
4 |
5 | public class ClientNotification {
6 |
7 | @com.google.gson.annotations.SerializedName("Room")
8 | private String mRoom;
9 | @com.google.gson.annotations.SerializedName("ImageUrl")
10 | private String mImageUrl;
11 | @com.google.gson.annotations.SerializedName("ImageBitmap")
12 | private Bitmap mImageBitmap;
13 | @com.google.gson.annotations.SerializedName("Source")
14 | private String mSource;
15 | @com.google.gson.annotations.SerializedName("Content")
16 | private String mContent;
17 |
18 |
19 | public String getImageUrl() {
20 | return mImageUrl;
21 | }
22 | public void setImageUrl(String mImageUrl) {
23 | this.mImageUrl = mImageUrl;
24 | }
25 | public String getRoom() {
26 | return mRoom;
27 | }
28 | public void setRoom(String mRoom) {
29 | this.mRoom = mRoom;
30 | }
31 | public String getSource() {
32 | return mSource;
33 | }
34 | public void setSource(String mSource) {
35 | this.mSource = mSource;
36 | }
37 | public String getContent() {
38 | return mContent;
39 | }
40 | public void setContent(String mContent) {
41 | this.mContent = mContent;
42 | }
43 | public Bitmap getImageBitmap() {
44 | return mImageBitmap;
45 | }
46 | public void setImageBitmap(Bitmap mImageBitmap) {
47 | this.mImageBitmap = mImageBitmap;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/LogOnInfo.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class LogOnInfo {
6 |
7 | @com.google.gson.annotations.SerializedName("UserId")
8 | private String mUserId;
9 | @com.google.gson.annotations.SerializedName("Rooms")
10 | private ArrayList mRooms;
11 |
12 | public LogOnInfo()
13 | {
14 | mRooms = new ArrayList();
15 | }
16 |
17 | public String getUserId() {
18 | return mUserId;
19 | }
20 |
21 | public void setUserId(String mUserId) {
22 | this.mUserId = mUserId;
23 | }
24 |
25 | public ArrayList getRooms() {
26 | return mRooms;
27 | }
28 |
29 | public void setRooms(ArrayList mRooms) {
30 | this.mRooms = mRooms;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/Message.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import java.util.Date;
4 |
5 | public class Message {
6 | @com.google.gson.annotations.SerializedName("HtmlEncoded")
7 | private boolean mHtmlEncoded;
8 | @com.google.gson.annotations.SerializedName("Id")
9 | private String mId;
10 | @com.google.gson.annotations.SerializedName("Content")
11 | private String mContent;
12 | @com.google.gson.annotations.SerializedName("When")
13 | private Date mWhen;
14 | @com.google.gson.annotations.SerializedName("User")
15 | private User mUser;
16 |
17 |
18 | public boolean isHtmlEncoded() {
19 | return mHtmlEncoded;
20 | }
21 | public void setHtmlEncoded(boolean mHtmlEncoded) {
22 | this.mHtmlEncoded = mHtmlEncoded;
23 | }
24 | public String getId() {
25 | return mId;
26 | }
27 | public void setId(String mId) {
28 | this.mId = mId;
29 | }
30 | public String getContent() {
31 | return mContent;
32 | }
33 | public void setContent(String mContent) {
34 | this.mContent = mContent;
35 | }
36 | public Date getWhen() {
37 | return mWhen;
38 | }
39 | public void setWhen(Date mWhen) {
40 | this.mWhen = mWhen;
41 | }
42 | public User getUser() {
43 | return mUser;
44 | }
45 | public void setUser(User mUser) {
46 | this.mUser = mUser;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/Room.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class Room {
6 |
7 | @com.google.gson.annotations.SerializedName("Name")
8 | private String mName;
9 | @com.google.gson.annotations.SerializedName("Count")
10 | private int mCount;
11 | @com.google.gson.annotations.SerializedName("Private")
12 | private boolean mPrivate;
13 | @com.google.gson.annotations.SerializedName("Topic")
14 | private String mTopic;
15 | @com.google.gson.annotations.SerializedName("Closed")
16 | private boolean mClosed;
17 | @com.google.gson.annotations.SerializedName("Welcome")
18 | private String mWelcome;
19 | @com.google.gson.annotations.SerializedName("Users")
20 | private ArrayList mUsers;
21 | @com.google.gson.annotations.SerializedName("Owners")
22 | private ArrayList mOwners;
23 | @com.google.gson.annotations.SerializedName("RecentMessages")
24 | private ArrayList mRecentMessages;
25 |
26 | public Room()
27 | {
28 | mUsers = new ArrayList();
29 | mOwners = new ArrayList();
30 | mRecentMessages = new ArrayList();
31 | }
32 |
33 | public String getName() {
34 | return mName;
35 | }
36 | public void setName(String mName) {
37 | this.mName = mName;
38 | }
39 | public int getCount() {
40 | return mCount;
41 | }
42 | public void setCount(int mCount) {
43 | this.mCount = mCount;
44 | }
45 | public boolean isPrivate() {
46 | return mPrivate;
47 | }
48 | public void setPrivate(boolean mPrivate) {
49 | this.mPrivate = mPrivate;
50 | }
51 | public String getTopic() {
52 | return mTopic;
53 | }
54 | public void setTopic(String mTopic) {
55 | this.mTopic = mTopic;
56 | }
57 | public boolean isClosed() {
58 | return mClosed;
59 | }
60 | public void setClosed(boolean mClosed) {
61 | this.mClosed = mClosed;
62 | }
63 | public String getWelcome() {
64 | return mWelcome;
65 | }
66 | public void setWelcome(String mWelcome) {
67 | this.mWelcome = mWelcome;
68 | }
69 | public ArrayList getUsers() {
70 | return mUsers;
71 | }
72 | public void setUsers(ArrayList mUsers) {
73 | this.mUsers = mUsers;
74 | }
75 | public ArrayList getOwners() {
76 | return mOwners;
77 | }
78 | public void setOwners(ArrayList mOwners) {
79 | this.mOwners = mOwners;
80 | }
81 | public ArrayList getRecentMessages() {
82 | return mRecentMessages;
83 | }
84 | public void setRecentMessages(ArrayList mRecentMessages) {
85 | this.mRecentMessages = mRecentMessages;
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/User.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import java.util.Date;
4 |
5 | public class User {
6 |
7 | @com.google.gson.annotations.SerializedName("Name")
8 | private String mName;
9 | @com.google.gson.annotations.SerializedName("Hash")
10 | private String mHash;
11 | @com.google.gson.annotations.SerializedName("Active")
12 | private boolean mActive;
13 | @com.google.gson.annotations.SerializedName("Status")
14 | private UserStatus mStatus;
15 | @com.google.gson.annotations.SerializedName("Note")
16 | private String mNote;
17 | @com.google.gson.annotations.SerializedName("AfkNote")
18 | private String mAfkNote;
19 | @com.google.gson.annotations.SerializedName("IsAfk")
20 | private boolean mIsAfk;
21 | @com.google.gson.annotations.SerializedName("Flag")
22 | private String mFlag;
23 | @com.google.gson.annotations.SerializedName("Country")
24 | private String mCountry;
25 | @com.google.gson.annotations.SerializedName("LastActivity")
26 | private Date mLastActivity;
27 | @com.google.gson.annotations.SerializedName("IsAdmin")
28 | private boolean mIsAdmin;
29 |
30 |
31 |
32 | public String getName() {
33 | return mName;
34 | }
35 | public void setName(String mName) {
36 | this.mName = mName;
37 | }
38 | public String getHash() {
39 | return mHash;
40 | }
41 | public void setHash(String mHash) {
42 | this.mHash = mHash;
43 | }
44 | public boolean isActive() {
45 | return mActive;
46 | }
47 | public void setActive(boolean mActive) {
48 | this.mActive = mActive;
49 | }
50 | public UserStatus getStatus() {
51 | return mStatus;
52 | }
53 | public void setStatus(UserStatus mStatus) {
54 | this.mStatus = mStatus;
55 | }
56 | public String getNote() {
57 | return mNote;
58 | }
59 | public void setNote(String mNote) {
60 | this.mNote = mNote;
61 | }
62 | public String getAfkNote() {
63 | return mAfkNote;
64 | }
65 | public void setAfkNote(String mAfkNote) {
66 | this.mAfkNote = mAfkNote;
67 | }
68 | public boolean isIsAfk() {
69 | return mIsAfk;
70 | }
71 | public void setIsAfk(boolean mIsAfk) {
72 | this.mIsAfk = mIsAfk;
73 | }
74 | public String getFlag() {
75 | return mFlag;
76 | }
77 | public void setFlag(String mFlag) {
78 | this.mFlag = mFlag;
79 | }
80 | public String getCountry() {
81 | return mCountry;
82 | }
83 | public void setCountry(String mCountry) {
84 | this.mCountry = mCountry;
85 | }
86 | public Date getLastActivity() {
87 | return mLastActivity;
88 | }
89 | public void setLastActivity(Date mLastActivity) {
90 | this.mLastActivity = mLastActivity;
91 | }
92 | public boolean isIsAdmin() {
93 | return mIsAdmin;
94 | }
95 | public void setIsAdmin(boolean mIsAdmin) {
96 | this.mIsAdmin = mIsAdmin;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/UserMessages.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class UserMessages {
6 |
7 | private User mUser;
8 | private ArrayList mMessages;
9 |
10 |
11 | public User getUser() {
12 | return mUser;
13 | }
14 | public void setUser(User mUser) {
15 | this.mUser = mUser;
16 | }
17 | public ArrayList getMessages() {
18 | return mMessages;
19 | }
20 | public void setMessages(ArrayList mMessages) {
21 | this.mMessages = mMessages;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/jabbr-client-android/src/net/jabbr/client/android/model/UserStatus.java:
--------------------------------------------------------------------------------
1 | package net.jabbr.client.android.model;
2 |
3 | public enum UserStatus {
4 | Active,
5 | Inactive,
6 | Offline
7 | }
8 |
--------------------------------------------------------------------------------
/license.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) Microsoft Open Technologies, Inc.
2 | All Rights Reserved
3 | Apache 2.0 License
4 |
5 | Licensed under the Apache License, Version 2.0 (the "License");
6 | you may not use this file except in compliance with the License.
7 | You may obtain a copy of the License at
8 |
9 | http://www.apache.org/licenses/LICENSE-2.0
10 |
11 | Unless required by applicable law or agreed to in writing, software
12 | distributed under the License is distributed on an "AS IS" BASIS,
13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | See the License for the specific language governing permissions and
15 | limitations under the License.
16 |
17 | See the Apache Version 2.0 License for specific language governing permissions and limitations under the License.
--------------------------------------------------------------------------------