package com.camnter.newlife.ui.activity.ipc;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Toast;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.camnter.newlife.R;
import com.camnter.newlife.core.activity.BaseAppCompatActivity;
import com.camnter.newlife.utils.ToastUtils;
import com.camnter.newlife.utils.ipc.MessengerService;
import java.util.ArrayList;
import static com.camnter.newlife.utils.ipc.MessengerService.BUNDLE_SPARSE_PARCELABLE_BUNDLE;
import static com.camnter.newlife.utils.ipc.MessengerService.BUNDLE_SPARSE_PARCELABLE_BUNDLE_ARRAY_LIST;
import static com.camnter.newlife.utils.ipc.MessengerService.BUNDLE_SPARSE_PARCELABLE_BUNDLE_ID_INDEX;
import static com.camnter.newlife.utils.ipc.MessengerService.BUNDLE_SPARSE_PARCELABLE_BUNDLE_PATH_INDEX;
import static com.camnter.newlife.utils.ipc.MessengerService.CALLBACK_BUNDLE_ARRAY;
import static com.camnter.newlife.utils.ipc.MessengerService.CALLBACK_BUNDLE_ARRAY_LIST;
import static com.camnter.newlife.utils.ipc.MessengerService.CALLBACK_SPARSE_PARCELABLE_BUNDLE;
/**
* @author CaMnter
*/
public class MessengerActivity extends BaseAppCompatActivity {
private static final String TAG = MessengerActivity.class.getSimpleName();
private Messenger sendMessenger;
private ServiceConnection connection;
private Messenger serviceCallBackMessenger;
/**
* Fill in layout id
*
* @return layout id
*/
@Override protected int getLayoutId() {
return R.layout.activity_messenger;
}
/**
* Initialize the view in the layout
*
* @param savedInstanceState savedInstanceState
*/
@Override protected void initViews(Bundle savedInstanceState) {
ButterKnife.bind(this);
}
/**
* Initialize the View of the listener
*/
@Override protected void initListeners() {
}
/**
* Initialize the Activity data
*/
@Override protected void initData() {
}
@Override protected void onDestroy() {
this.unbindService(this.connection);
super.onDestroy();
}
@OnClick({ R.id.messenger_send_text, R.id.messenger_send_array_text,
R.id.messenger_send_sparse_array })
public void onViewClicked(View v) {
switch (v.getId()) {
case R.id.messenger_send_text:
this.requestMessengerService("https://www.camnter.com");
break;
case R.id.messenger_send_array_text:
this.requestMessengerService(new String[] { "Save", "you", "from", "anything" },
new ArrayList<String>() {
{
this.add("Save");
this.add("you");
this.add("from");
this.add("anything");
}
});
break;
case R.id.messenger_send_sparse_array:
this.requestMessengerService(
new ArrayList<String>() {
{
this.add("https://www.camnter.com/1");
this.add("https://www.camnter.com/2");
this.add("https://www.camnter.com/3");
this.add("https://www.camnter.com/4");
}
},
new ArrayList<String>() {
{
this.add("id: 2233");
this.add("id: 2333");
}
}
);
break;
}
}
private void requestMessengerService(@NonNull final String path) {
if (this.connection == null) {
this.initCallbackMessenger();
this.connection = new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
sendMessenger = new Messenger(service);
try {
sendMessenger.send(createRequestMessage("https://www.camnter.com"));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(this, MessengerService.class);
intent.setAction("com.camnter.ipc.messenger");
this.bindService(intent, this.connection, Context.BIND_AUTO_CREATE);
} else {
try {
this.sendMessenger.send(this.createRequestMessage(path));
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private void requestMessengerService(@NonNull final String[] stringArray,
@NonNull final ArrayList<String> arrayList) {
if (this.connection == null) {
this.initCallbackMessenger();
this.connection = new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
sendMessenger = new Messenger(service);
try {
sendMessenger.send(createRequestMessage(stringArray, arrayList));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(this, MessengerService.class);
intent.setAction("com.camnter.ipc.messenger");
this.bindService(intent, this.connection, Context.BIND_AUTO_CREATE);
} else {
try {
this.sendMessenger.send(this.createRequestMessage(stringArray, arrayList));
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private void requestMessengerService(@NonNull final ArrayList<String> pathList,
@NonNull final ArrayList<String> idList) {
if (this.connection == null) {
this.initCallbackMessenger();
this.connection = new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
sendMessenger = new Messenger(service);
try {
sendMessenger.send(createRequestMessage(pathList, idList));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(this, MessengerService.class);
intent.setAction("com.camnter.ipc.messenger");
this.bindService(intent, this.connection, Context.BIND_AUTO_CREATE);
} else {
try {
this.sendMessenger.send(this.createRequestMessage(pathList, idList));
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private Message createRequestMessage(@NonNull final String path) {
Message message = Message.obtain(null,
MessengerService.ENCODING_REQUEST_TASK);
Bundle bundle = new Bundle();
bundle.putString(MessengerService.BUNDLE_KEY_PATH,
path);
message.setData(bundle);
message.replyTo = this.serviceCallBackMessenger;
return message;
}
private Message createRequestMessage(@NonNull final ArrayList<String> pathList,
@NonNull final ArrayList<String> idList) {
Message message = Message.obtain(null,
MessengerService.SPARSE_PARCELABLE_BUNDLE_TASK);
Bundle bundle = new Bundle();
Bundle pathBundle = new Bundle();
pathBundle.putStringArrayList(BUNDLE_SPARSE_PARCELABLE_BUNDLE_ARRAY_LIST, pathList);
Bundle idBundle = new Bundle();
idBundle.putStringArrayList(BUNDLE_SPARSE_PARCELABLE_BUNDLE_ARRAY_LIST, idList);
SparseArray<Bundle> sparseArray = new SparseArray<>();
sparseArray.put(BUNDLE_SPARSE_PARCELABLE_BUNDLE_PATH_INDEX, pathBundle);
sparseArray.put(BUNDLE_SPARSE_PARCELABLE_BUNDLE_ID_INDEX, idBundle);
bundle.putSparseParcelableArray(BUNDLE_SPARSE_PARCELABLE_BUNDLE, sparseArray);
message.setData(bundle);
message.replyTo = this.serviceCallBackMessenger;
return message;
}
private Message createRequestMessage(@NonNull final String[] stringArray,
@NonNull final ArrayList<String> arrayList) {
Message message = Message.obtain(null,
MessengerService.ARRAY_REQUEST_TASK);
Bundle bundle = new Bundle();
bundle.putStringArray(MessengerService.BUNDLE_ARRAY, stringArray);
bundle.putStringArrayList(MessengerService.BUNDLE_ARRAY_LIST, arrayList);
message.setData(bundle);
message.replyTo = this.serviceCallBackMessenger;
return message;
}
private void initCallbackMessenger() {
this.serviceCallBackMessenger = new Messenger(new Handler(Looper.getMainLooper()) {
@Override public void handleMessage(Message msg) {
Bundle bundle;
switch (msg.what) {
case MessengerService.ENCODING_REQUEST_TASK_CALL_BACK:
bundle = msg.getData();
ToastUtils.show(MessengerActivity.this, "[BUNDLE_REQUEST_CODE] = " +
bundle.getInt(MessengerService.BUNDLE_REQUEST_CODE),
Toast.LENGTH_LONG);
break;
case MessengerService.ARRAY_REQUEST_TASK_CALL_BACK:
bundle = msg.getData();
String[] stringArray = bundle.getStringArray(CALLBACK_BUNDLE_ARRAY);
ArrayList<String> stringList = bundle.getStringArrayList(
CALLBACK_BUNDLE_ARRAY_LIST);
String stringText = stringArray != null
? String.valueOf(stringArray.length)
: "null";
ToastUtils.show(MessengerActivity.this, "[CALLBACK_BUNDLE_ARRAY] = " +
stringText + " [CALLBACK_BUNDLE_ARRAY_LIST] = " +
stringList,
Toast.LENGTH_LONG);
break;
case MessengerService.SPARSE_PARCELABLE_BUNDLE_REQUEST_TASK_CALL_BACK:
bundle = msg.getData();
SparseArray<Bundle> sparseArray = bundle.getSparseParcelableArray(
CALLBACK_SPARSE_PARCELABLE_BUNDLE);
if (sparseArray == null) {
Log.e(TAG, "[sparseArray] = null");
return;
}
Bundle pathBundle = sparseArray.get(
BUNDLE_SPARSE_PARCELABLE_BUNDLE_PATH_INDEX);
ArrayList<String> pathList = pathBundle.getStringArrayList(
BUNDLE_SPARSE_PARCELABLE_BUNDLE_ARRAY_LIST);
Bundle idBundle = sparseArray.get(BUNDLE_SPARSE_PARCELABLE_BUNDLE_ID_INDEX);
ArrayList<String> idList = idBundle.getStringArrayList(
BUNDLE_SPARSE_PARCELABLE_BUNDLE_ARRAY_LIST);
ToastUtils.show(MessengerActivity.this, "[pathList] = " +
pathList + " [idList] = " +
idList,
Toast.LENGTH_LONG);
break;
}
}
});
}
}