Feature #245 » history.patch
| default.properties Tue Oct 26 00:59:27 2010 +0200 → default.properties Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 8 | 8 |
# project structure. |
| 9 | 9 | |
| 10 | 10 |
# Project target. |
| 11 |
target=android-7 |
|
| 11 |
target=android-8 |
|
| res/layout/preferences.xml Tue Oct 26 00:59:27 2010 +0200 → res/layout/preferences.xml Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 1 | 1 |
<?xml version="1.0" encoding="utf-8"?> |
| 2 |
<!-- |
|
| 3 |
The format of the preference key is defined in
|
|
| 4 |
src/com/beem/project/beem/BeemApplication.java
|
|
| 5 |
Basically it is just a simple name like account_username. |
|
| 6 |
TODO: There is still a lot of keys to convert
|
|
| 7 |
--> |
|
| 2 |
<!-- |
|
| 3 |
The format of the preference key is defined in
|
|
| 4 |
src/com/beem/project/beem/BeemApplication.java Basically it is just a
|
|
| 5 |
simple name like account_username. TODO: There is still a lot of keys |
|
| 6 |
to convert
|
|
| 7 |
-->
|
|
| 8 | 8 |
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" |
| 9 | 9 |
android:shouldDisableView="true" android:selectable="true"> |
| 10 | 10 |
<PreferenceCategory android:title="@string/general_preferences"> |
| 11 |
<CheckBoxPreference android:id="@+id/settings_key_history" |
|
| 12 |
android:title="@string/history" android:defaultValue="false" |
|
| 13 |
android:key="settings_key_history" /> |
|
| 11 | 14 |
<PreferenceScreen android:key="contact_list" |
| 12 | 15 |
android:title="@string/contact_list_preferences" android:summary="@string/contact_list_preferences_sum"> |
| 13 | 16 |
<CheckBoxPreference android:title="@string/CLP_hidden_contact" |
| ... | ... | |
| 28 | 31 |
<CheckBoxPreference android:title="@string/notification_enable_vibrate_title" |
| 29 | 32 |
android:defaultValue="false" android:summary="@string/notification_enable_vibrate_sum" |
| 30 | 33 |
android:key="notification_vibrate" /> |
| 31 |
<RingtonePreference |
|
| 32 |
android:title="@string/notification_snd_title" android:key="notification_sound" |
|
| 33 |
android:summary="@string/notification_snd_sum" android:ringtoneType="notification" |
|
| 34 |
android:showDefault="true" /> |
|
| 34 |
<RingtonePreference android:title="@string/notification_snd_title" |
|
| 35 |
android:key="notification_sound" android:summary="@string/notification_snd_sum" |
|
| 36 |
android:ringtoneType="notification" android:showDefault="true" /> |
|
| 35 | 37 |
</PreferenceScreen> |
| 36 | 38 |
</PreferenceCategory> |
| 37 | 39 |
<PreferenceCategory android:title="@string/user_preferences"> |
| ... | ... | |
| 70 | 72 |
<EditTextPreference android:singleLine="true" |
| 71 | 73 |
android:dependency="proxy_use" android:name="port" |
| 72 | 74 |
android:summary="@string/SettingsProxyPort" android:title="@string/settings_proxy_port" |
| 73 |
android:key="proxy_port" android:numeric="signed" android:hint="@string/comments_proxy_port" /> |
|
| 75 |
android:key="proxy_port" android:numeric="signed" |
|
| 76 |
android:hint="@string/comments_proxy_port" /> |
|
| 74 | 77 |
</PreferenceCategory> |
| 75 | 78 |
<PreferenceCategory android:title="@string/proxy_user_settings"> |
| 76 | 79 |
<EditTextPreference android:singleLine="true" |
| res/values/strings.xml Tue Oct 26 00:59:27 2010 +0200 → res/values/strings.xml Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 117 | 117 |
<string name="notification_enable_vibrate_sum">Enable vibrate on incoming messages</string> |
| 118 | 118 |
<string name="notification_snd_title">Message ringtone</string> |
| 119 | 119 |
<string name="notification_snd_sum">Set your incoming message ringtone</string> |
| 120 | ||
| 120 |
<string name="history">History</string> |
|
| 121 |
<string name="history_mount">You need to have SDcard mounted and writable to enable history</string> |
|
| 122 |
<string name="history_on_off">Enable/Disable history messages</string> |
|
| 121 | 123 |
|
| 122 | 124 |
<!-- Subscription class --> |
| 123 | 125 |
<string name="SubscriptAccept">Subscription accepted</string> |
| src/com/beem/project/beem/service/BeemChatManager.java Tue Oct 26 00:59:27 2010 +0200 → src/com/beem/project/beem/service/BeemChatManager.java Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 40 | 40 |
Flavien Astraud, November 26, 2009 |
| 41 | 41 |
Head of the EIP Laboratory. |
| 42 | 42 | |
| 43 |
*/ |
|
| 43 |
*/
|
|
| 44 | 44 |
package com.beem.project.beem.service; |
| 45 | 45 | |
| 46 | 46 |
import java.util.ArrayList; |
| ... | ... | |
| 79 | 79 |
private final ChatManager mAdaptee; |
| 80 | 80 |
private final Map<String, ChatAdapter> mChats = new HashMap<String, ChatAdapter>(); |
| 81 | 81 |
private final ChatListener mChatListener = new ChatListener(); |
| 82 |
private final RemoteCallbackList<IChatManagerListener> mRemoteChatCreationListeners = |
|
| 83 |
new RemoteCallbackList<IChatManagerListener>(); |
|
| 82 |
private final RemoteCallbackList<IChatManagerListener> mRemoteChatCreationListeners = new RemoteCallbackList<IChatManagerListener>(); |
|
| 84 | 83 |
private final BeemService mService; |
| 85 | 84 | |
| 86 | 85 |
/** |
| ... | ... | |
| 173 | 172 |
return mChats.get(key); |
| 174 | 173 |
} |
| 175 | 174 |
ChatAdapter res = new ChatAdapter(chat); |
| 175 |
boolean history = PreferenceManager.getDefaultSharedPreferences(mService.getBaseContext()).getBoolean("settings_key_history", false);
|
|
| 176 |
res.setHisory(history); |
|
| 176 | 177 |
Log.d(TAG, "getChat put " + key); |
| 177 | 178 |
mChats.put(key, res); |
| 178 | 179 |
return res; |
| ... | ... | |
| 256 | 257 |
private PendingIntent makeChatIntent(IChat chat) {
|
| 257 | 258 |
Intent chatIntent = new Intent(mService, com.beem.project.beem.ui.Chat.class); |
| 258 | 259 |
chatIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP |
| 259 |
| Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
| 260 |
| Intent.FLAG_ACTIVITY_NEW_TASK); |
|
| 260 | 261 |
try {
|
| 261 | 262 |
chatIntent.setData(chat.getParticipant().toUri()); |
| 262 | 263 |
} catch (RemoteException e) {
|
| ... | ... | |
| 275 | 276 |
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mService); |
| 276 | 277 |
try {
|
| 277 | 278 |
CharSequence tickerText = mService.getBind().getRoster().getContact(chat.getParticipant().getJID()) |
| 278 |
.getName(); |
|
| 279 |
.getName();
|
|
| 279 | 280 |
Notification notification = new Notification(android.R.drawable.stat_notify_chat, tickerText, System |
| 280 | 281 |
.currentTimeMillis()); |
| 281 | 282 |
notification.flags = Notification.FLAG_AUTO_CANCEL; |
| ... | ... | |
| 305 | 306 |
} |
| 306 | 307 | |
| 307 | 308 |
@Override |
| 308 |
public void stateChanged(final IChat chat) { }
|
|
| 309 |
public void stateChanged(final IChat chat) {
|
|
| 310 |
} |
|
| 309 | 311 |
} |
| 310 | 312 |
} |
| src/com/beem/project/beem/service/ChatAdapter.java Tue Oct 26 00:59:27 2010 +0200 → src/com/beem/project/beem/service/ChatAdapter.java Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 40 | 40 |
Flavien Astraud, November 26, 2009 |
| 41 | 41 |
Head of the EIP Laboratory. |
| 42 | 42 | |
| 43 |
*/ |
|
| 43 |
*/
|
|
| 44 | 44 |
package com.beem.project.beem.service; |
| 45 | 45 | |
| 46 |
import java.io.File; |
|
| 47 |
import java.io.FileWriter; |
|
| 48 |
import java.io.IOException; |
|
| 46 | 49 |
import java.util.Collections; |
| 47 | 50 |
import java.util.LinkedList; |
| 48 | 51 |
import java.util.List; |
| 49 | 52 | |
| 50 | 53 |
import org.jivesoftware.smack.Chat; |
| 51 | 54 |
import org.jivesoftware.smack.XMPPException; |
| 55 |
import org.jivesoftware.smack.util.StringUtils; |
|
| 56 |
import org.jivesoftware.smackx.ChatState; |
|
| 52 | 57 |
import org.jivesoftware.smackx.ChatStateListener; |
| 53 |
import org.jivesoftware.smackx.ChatState; |
|
| 54 | 58 | |
| 59 |
import android.os.Environment; |
|
| 55 | 60 |
import android.os.RemoteCallbackList; |
| 56 | 61 |
import android.os.RemoteException; |
| 57 | 62 |
import android.util.Log; |
| ... | ... | |
| 74 | 79 |
private final List<Message> mMessages; |
| 75 | 80 |
private final RemoteCallbackList<IMessageListener> mRemoteListeners = new RemoteCallbackList<IMessageListener>(); |
| 76 | 81 |
private final MsgListener mMsgListener = new MsgListener(); |
| 77 | ||
| 82 |
private boolean mIsHisory; |
|
| 78 | 83 |
/** |
| 79 | 84 |
* Constructor. |
| 80 | 85 |
* @param chat The chat to adapt |
| ... | ... | |
| 115 | 120 |
// TODO Auto-generated catch block |
| 116 | 121 |
e.printStackTrace(); |
| 117 | 122 |
} |
| 123 |
saveSendMessage(message); |
|
| 118 | 124 |
} |
| 119 | 125 | |
| 120 | 126 |
/** |
| ... | ... | |
| 192 | 198 |
if (mMessages.size() == HISTORY_MAX_SIZE) |
| 193 | 199 |
mMessages.remove(0); |
| 194 | 200 |
mMessages.add(msg); |
| 201 |
if (!"".equals(msg.getBody()) && msg.getBody() != null) {
|
|
| 202 |
saveRecvMessage(msg); |
|
| 203 |
} |
|
| 204 |
} |
|
| 205 | ||
| 206 |
/** |
|
| 207 |
* Write message in SDCard |
|
| 208 |
* @param msg the message receive |
|
| 209 |
*/ |
|
| 210 |
public void saveRecvMessage(Message msg) {
|
|
| 211 |
String state = Environment.getExternalStorageState(); |
|
| 212 |
if (mIsHisory && Environment.MEDIA_MOUNTED.equals(state)) {
|
|
| 213 |
File path = new File(Environment.getExternalStorageDirectory(), "beem"); |
|
| 214 |
File filepath = new File(path, StringUtils.parseBareAddress(msg.getFrom())); |
|
| 215 |
path.mkdirs(); |
|
| 216 |
try {
|
|
| 217 |
FileWriter file = new FileWriter(filepath, true); |
|
| 218 |
String log = msg.getTimestamp() + " " + msg.getFrom() + " :" + " " + msg.getBody() |
|
| 219 |
+ System.getProperty("line.separator");
|
|
| 220 |
file.write(log); |
|
| 221 |
file.close(); |
|
| 222 |
Log.i(TAG, log); |
|
| 223 |
} catch (IOException e) {
|
|
| 224 |
e.printStackTrace(); |
|
| 225 |
} |
|
| 226 |
} |
|
| 227 |
} |
|
| 228 | ||
| 229 |
public void saveSendMessage(Message msg) {
|
|
| 230 |
String state = Environment.getExternalStorageState(); |
|
| 231 |
if (mIsHisory && Environment.MEDIA_MOUNTED.equals(state)) {
|
|
| 232 |
File path = new File(Environment.getExternalStorageDirectory(), "beem"); |
|
| 233 |
File filepath = new File(path, StringUtils.parseBareAddress(msg.getTo())); |
|
| 234 |
path.mkdirs(); |
|
| 235 |
try {
|
|
| 236 |
FileWriter file = new FileWriter(filepath, true); |
|
| 237 |
//TODO : getString me |
|
| 238 |
String log = msg.getTimestamp() + " me : " + msg.getBody() + System.getProperty("line.separator");
|
|
| 239 |
file.write(log); |
|
| 240 |
file.close(); |
|
| 241 |
Log.i(TAG, log); |
|
| 242 |
} catch (IOException e) {
|
|
| 243 |
e.printStackTrace(); |
|
| 244 |
} |
|
| 245 |
} |
|
| 246 |
} |
|
| 247 | ||
| 248 |
public void setHisory(boolean mIsHisory) {
|
|
| 249 |
this.mIsHisory = mIsHisory; |
|
| 250 |
} |
|
| 251 | ||
| 252 |
public boolean getHisory() {
|
|
| 253 |
return mIsHisory; |
|
| 195 | 254 |
} |
| 196 | 255 | |
| 197 | 256 |
/** |
| ... | ... | |
| 201 | 260 |
/** |
| 202 | 261 |
* Constructor. |
| 203 | 262 |
*/ |
| 204 |
public MsgListener() { }
|
|
| 263 |
public MsgListener() {
|
|
| 264 |
} |
|
| 205 | 265 | |
| 206 | 266 |
@Override |
| 207 | 267 |
public void processMessage(Chat chat, org.jivesoftware.smack.packet.Message message) {
|
| 208 |
Message msg = new Message(message);
|
|
| 268 |
Message msg = new Message(message); |
|
| 209 | 269 |
//TODO add que les message pas de type errors |
| 210 | 270 |
ChatAdapter.this.addMessage(msg); |
| 211 | 271 |
final int n = mRemoteListeners.beginBroadcast(); |
| ... | ... | |
| 241 | 301 |
} |
| 242 | 302 |
} |
| 243 | 303 |
} |
| 244 | ||
| src/com/beem/project/beem/ui/Chat.java Tue Oct 26 00:59:27 2010 +0200 → src/com/beem/project/beem/ui/Chat.java Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 40 | 40 |
Flavien Astraud, November 26, 2009 |
| 41 | 41 |
Head of the EIP Laboratory. |
| 42 | 42 |
|
| 43 |
*/ |
|
| 43 |
*/
|
|
| 44 | 44 |
package com.beem.project.beem.ui; |
| 45 | 45 |
|
| 46 | 46 |
import java.text.DateFormat; |
| ... | ... | |
| 65 | 65 |
import android.os.Handler; |
| 66 | 66 |
import android.os.IBinder; |
| 67 | 67 |
import android.os.RemoteException; |
| 68 |
import android.preference.PreferenceManager; |
|
| 68 | 69 |
import android.text.util.Linkify; |
| 69 | 70 |
import android.util.Log; |
| 70 | 71 |
import android.view.KeyEvent; |
| ... | ... | |
| 170 | 171 |
sendMessage(); |
| 171 | 172 |
} |
| 172 | 173 |
}); |
| 173 |
|
|
| 174 | 174 |
prepareIconsStatus(); |
| 175 | 175 |
} |
| 176 | 176 |
|
| ... | ... | |
| 491 | 491 |
@Override |
| 492 | 492 |
public void run() {
|
| 493 | 493 |
if (msg.getType() == Message.MSG_TYPE_ERROR) {
|
| 494 |
mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), true, msg.getTimestamp())); |
|
| 494 |
mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), true, msg |
|
| 495 |
.getTimestamp())); |
|
| 495 | 496 |
mMessagesListAdapter.notifyDataSetChanged(); |
| 496 | 497 |
} else if (msg.getBody() != null) {
|
| 497 | 498 |
MessageText lastMessage = null; |
| ... | ... | |
| 503 | 504 |
lastMessage.setTimestamp(msg.getTimestamp()); |
| 504 | 505 |
mListMessages.set(mListMessages.size() - 1, lastMessage); |
| 505 | 506 |
} else if (msg.getBody() != null) |
| 506 |
mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), false, msg.getTimestamp())); |
|
| 507 |
mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), |
|
| 508 |
false, msg.getTimestamp())); |
|
| 507 | 509 |
mMessagesListAdapter.notifyDataSetChanged(); |
| 508 | 510 |
} |
| 509 | 511 |
} |
| ... | ... | |
| 705 | 707 |
* @param isError if the message is an error message. |
| 706 | 708 |
* @param date the time of the message. |
| 707 | 709 |
*/ |
| 708 |
public MessageText(final String bareJid, final String name, final String message, final boolean isError, Date date) {
|
|
| 710 |
public MessageText(final String bareJid, final String name, final String message, final boolean isError, |
|
| 711 |
Date date) {
|
|
| 709 | 712 |
mBareJid = bareJid; |
| 710 | 713 |
mName = name; |
| 711 | 714 |
mMessage = message; |
| ... | ... | |
| 773 | 776 |
|
| 774 | 777 |
/** |
| 775 | 778 |
* Set the Date of the message. |
| 776 |
* |
|
| 777 | 779 |
* @param date date of the message. |
| 778 | 780 |
*/ |
| 779 | 781 |
public void setTimestamp(Date date) {
|
| ... | ... | |
| 782 | 784 |
|
| 783 | 785 |
/** |
| 784 | 786 |
* Get the Date of the message. |
| 785 |
* |
|
| 786 | 787 |
* @return if it is a delayed message get the date the message was sended. |
| 787 | 788 |
*/ |
| 788 | 789 |
public Date getTimestamp() {
|
| src/com/beem/project/beem/ui/Settings.java Tue Oct 26 00:59:27 2010 +0200 → src/com/beem/project/beem/ui/Settings.java Wed Nov 03 11:56:15 2010 +0100 | ||
|---|---|---|
| 40 | 40 |
Flavien Astraud, November 26, 2009 |
| 41 | 41 |
Head of the EIP Laboratory. |
| 42 | 42 | |
| 43 |
*/ |
|
| 43 |
*/
|
|
| 44 | 44 |
package com.beem.project.beem.ui; |
| 45 | 45 | |
| 46 | 46 |
import android.content.ComponentName; |
| 47 | 47 |
import android.content.Intent; |
| 48 |
import android.content.SharedPreferences; |
|
| 48 | 49 |
import android.os.Bundle; |
| 50 |
import android.os.Environment; |
|
| 51 |
import android.preference.CheckBoxPreference; |
|
| 49 | 52 |
import android.preference.PreferenceActivity; |
| 53 |
import android.preference.PreferenceManager; |
|
| 50 | 54 |
import android.view.Menu; |
| 51 | 55 |
import android.view.MenuInflater; |
| 52 | 56 |
import android.view.MenuItem; |
| 57 |
import android.widget.CheckBox; |
|
| 53 | 58 | |
| 54 | 59 |
import com.beem.project.beem.R; |
| 55 | 60 | |
| ... | ... | |
| 74 | 79 |
public void onCreate(Bundle savedInstanceState) {
|
| 75 | 80 |
super.onCreate(savedInstanceState); |
| 76 | 81 |
addPreferencesFromResource(R.layout.preferences); |
| 82 |
CheckBoxPreference history = (CheckBoxPreference) findPreference("settings_key_history");
|
|
| 83 |
String state = Environment.getExternalStorageState(); |
|
| 84 |
if (!Environment.MEDIA_MOUNTED.equals(state)) {
|
|
| 85 |
history.setSelectable(false); |
|
| 86 |
history.setSummary(R.string.history_mount); |
|
| 87 |
} else {
|
|
| 88 |
history.setSelectable(true); |
|
| 89 |
history.setSummary(R.string.history_on_off); |
|
| 90 |
} |
|
| 91 |
} |
|
| 92 |
|
|
| 93 |
@Override |
|
| 94 |
protected void onResume() {
|
|
| 95 |
super.onResume(); |
|
| 77 | 96 |
} |
| 78 | 97 | |
| 79 | 98 |
/** |