/* * Copyright 2015 OpenMarket Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.matrix.androidsdk.db; import android.content.Context; import android.text.TextUtils; import org.matrix.androidsdk.util.Log; import org.matrix.androidsdk.util.ContentUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashMap; public class MXLatestChatMessageCache { private static final String LOG_TAG = "CLstChatMessageCache"; private static final String FILENAME = "ConsoleLatestChatMessageCache"; final String MXLATESTMESSAGES_STORE_FOLDER = "MXLatestMessagesStore"; private HashMap<String, String> mLatestMesssageByRoomId = null; private String mUserId = null; private File mLatestMessagesDirectory = null; private File mLatestMessagesFile = null; /** */ public MXLatestChatMessageCache(String userId) { mUserId = userId; } /** * Clear the text caches. * @param context The application context to use. */ public void clearCache(Context context) { ContentUtils.deleteDirectory(mLatestMessagesDirectory); mLatestMesssageByRoomId = null; } /** * Open the texts cache file. * @param context the context. */ private void openLatestMessagesDict(Context context) { // already checked if (null != mLatestMesssageByRoomId) { return; } mLatestMesssageByRoomId = new HashMap<>(); try { mLatestMessagesDirectory = new File(context.getApplicationContext().getFilesDir(), MXLATESTMESSAGES_STORE_FOLDER); mLatestMessagesDirectory = new File(mLatestMessagesDirectory, mUserId); mLatestMessagesFile = new File(mLatestMessagesDirectory, FILENAME.hashCode() + ""); if (!mLatestMessagesDirectory.exists()) { // create dir tree mLatestMessagesDirectory.mkdirs(); File oldFile = new File(context.getApplicationContext().getFilesDir(), FILENAME.hashCode() + ""); // backward compatibility if (oldFile.exists()) { oldFile.renameTo(mLatestMessagesFile); } } if (mLatestMessagesFile.exists()) { FileInputStream fis = new FileInputStream(mLatestMessagesFile); ObjectInputStream ois = new ObjectInputStream(fis); mLatestMesssageByRoomId = (HashMap) ois.readObject(); ois.close(); fis.close(); } } catch(Exception e) { Log.e(LOG_TAG, "## openLatestMessagesDict failed " + e.getMessage()); } } /** * Get the latest written text for a dedicated room. * @param context the context. * @param roomId the roomId * @return the latest message */ public String getLatestText(Context context, String roomId) { if (null == mLatestMesssageByRoomId) { openLatestMessagesDict(context); } if (TextUtils.isEmpty(roomId)) { return ""; } if (mLatestMesssageByRoomId.containsKey(roomId)) { return mLatestMesssageByRoomId.get(roomId); } return ""; } /** * Update the latest message dictionnary. * @param context the context. */ private void saveLatestMessagesDict(Context context) { try { FileOutputStream fos = new FileOutputStream(mLatestMessagesFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(mLatestMesssageByRoomId); oos.close(); fos.close(); } catch(Exception e) { Log.e(LOG_TAG, "## saveLatestMessagesDict() failed " + e.getMessage()); } } /** * Update the latest message for a dedicated roomId. * @param context the context. * @param roomId the roomId. * @param message the message. */ public void updateLatestMessage(Context context, String roomId, String message) { if (null == mLatestMesssageByRoomId) { openLatestMessagesDict(context); } if (TextUtils.isEmpty(message)) { mLatestMesssageByRoomId.remove(roomId); } mLatestMesssageByRoomId.put(roomId, message); saveLatestMessagesDict(context); } }