package de.pinyto.ctSESAM; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.util.Base64; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.EditText; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.lang.ref.WeakReference; /** * Handles the responses from the sync service if the sync app is installed. */ class SyncResponseHandler extends Handler { static final int REQUEST_SYNC = 1; static final int SEND_UPDATE = 2; static final int SYNC_RESPONSE = 1; static final int SEND_UPDATE_RESPONSE = 2; private WeakReference<MainActivity> mainActivityWeakRef; private KgkManager kgkManager; private PasswordSettingsManager settingsManager; Messenger mService = null; boolean mBound; SyncResponseHandler(MainActivity mainActivity, KgkManager kgkManager, PasswordSettingsManager settingsManager, Messenger mService, boolean mBound) { super(); this.mainActivityWeakRef = new WeakReference<>(mainActivity); this.kgkManager = kgkManager; this.settingsManager = settingsManager; this.mService = mService; this.mBound = mBound; } @Override public void handleMessage(Message msg) { MainActivity activity = mainActivityWeakRef.get(); if (activity != null && !activity.isFinishing()) { int respCode = msg.what; switch (respCode) { case SYNC_RESPONSE: { String syncData = msg.getData().getString("respData"); try { JSONObject syncDataObject = new JSONObject(syncData); if (!syncDataObject.getString("status").equals("ok")) break; boolean updateRemote = true; EditText editTextMasterPassword = (EditText) activity.findViewById( R.id.editTextMasterPassword); if (syncDataObject.has("result")) { byte[] password = UTF8.encode(editTextMasterPassword.getText()); byte[] blob = Base64.decode(syncDataObject.getString("result"), Base64.DEFAULT); kgkManager.updateFromBlob(password, blob); updateRemote = settingsManager.updateFromExportData( kgkManager, blob); ArrayAdapter<String> adapter = new ArrayAdapter<>( activity.getBaseContext(), android.R.layout.simple_dropdown_item_1line, settingsManager.getDomainList()); AutoCompleteTextView autoCompleteTextViewDomain = (AutoCompleteTextView) activity.findViewById( R.id.autoCompleteTextViewDomain); autoCompleteTextViewDomain.setAdapter(adapter); Toast.makeText(activity.getBaseContext(), R.string.sync_loaded, Toast.LENGTH_SHORT).show(); Clearer.zero(password); } if (updateRemote) { byte[] encryptedBlob = settingsManager.getExportData(kgkManager); if (mService != null && mBound) { Message updateMsg = Message.obtain(null, SEND_UPDATE, 0, 0); updateMsg.replyTo = new Messenger(new SyncResponseHandler( activity, kgkManager, settingsManager, mService, mBound)); Bundle bUpdateMsg = new Bundle(); bUpdateMsg.putString("updatedData", Base64.encodeToString(encryptedBlob, Base64.DEFAULT)); updateMsg.setData(bUpdateMsg); try { mService.send(updateMsg); } catch (RemoteException e) { Log.d("Sync error", "Could not send update message to sync service."); e.printStackTrace(); } } } } catch (JSONException e) { Log.d("Sync error", "The response is not valid JSON."); e.printStackTrace(); } break; } case SEND_UPDATE_RESPONSE: { String updateRequestAnswer = msg.getData().getString("respData"); try { JSONObject syncDataObject = new JSONObject(updateRequestAnswer); if (syncDataObject.getString("status").equals("ok")) { settingsManager.setAllSettingsToSynced(); Toast.makeText(activity.getBaseContext(), R.string.sync_successful, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(activity.getBaseContext(), R.string.sync_error, Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { Log.d("update Settings error", "Server response is not JSON."); e.printStackTrace(); } break; } } } } }