Mobile App Development Group Activity
Mobile App Development Group Activity
Activity
Student Teacher File Sharing App
Team Members
Ravi Ranjan (21BCE10190)
Code files..
AdminCreatorActivity.java
package com.ay.filesharing;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import com.gc.materialdesign.views.ButtonRectangle;
import com.gc.materialdesign.widgets.Dialog;
import java.io.File;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import cryptography.EncryptionUtility;
import file.Network;
import file.NetworkList;
import file.NetworkUserDetail;
import file.NetworkUserTable;
import file.SignatureContainer;
import file.User;
import protocol.DistributedFileSharingProtocol;
import util.DatatypeConverter;
import util.ObjectConverter;
SectionsPagerAdapter sectionsPagerAdapter;
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_creator);
viewPager.setOnPageChangeListener(new ViewPager.SimpleOn
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransac
// When the given tab is selected, switch to the corresp
// the ViewPager.
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTrans
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new CreateNetworkFragment();
default:
return new AssignAdminFragment();
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Create Network";
case 1:
return "Assign Admin";
}
return null;
}
}
ButtonRectangle buttonCreate;
EditText editTextUsername;
EditText editTextPassword;
EditText editTextNetwork;
@Override
public View onCreateView(LayoutInflater inflater, ViewGr
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_c
return rootView;
}
@Override
public void onClick(View v) {
String network = editTextNetwork.getText().toString(
String username = editTextUsername.getText().toStrin
String password = editTextPassword.getText().toStrin
if (!nn.contains(nt)) {
nn.add(nt);
}
nList.addNetwork(getApplicationContext(), nn);
User u = new User();
u.username = username;
u.role = "admin";
u.publicKey = DatatypeConverter.printBase64Binary(se
try {
u.privateKeyHash = EncryptionUtility.hash(self.g
}catch(NoSuchAlgorithmException e){
Toast.makeText(getApplicationContext(), "This ph
return;
}
u.privateKey = DatatypeConverter.printBase64Binary(E
SignatureContainer sc = NetworkUserTable.createNetwo
NetworkUserTable.replaceNetworkUserTable(getApplicat
ButtonRectangle buttonCreate;
EditText editTextUsername;
EditText editTextPassword;
Spinner spinnerNetworkLists;
ArrayList<String> networkLists;
ArrayAdapter<String> networkAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGr
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_a
spinnerNetworkLists = (Spinner) rootView.findViewByI
networkLists=new ArrayList<>();
networkAdapter = new ArrayAdapter<>(getApplicationCo
R.layout.simple_spinner_item_grey, networkLi
networkAdapter.setDropDownViewResource(R.layout.simp
spinnerNetworkLists.setAdapter(networkAdapter);
refreshNetwork();
rootView.findViewById(R.id.imageButton1).setOnClickL
@Override
public void onClick(View v) {
refreshNetwork();
}
@Override
public void onClick(View v) {
String network = spinnerNetworkLists.getSelectedItem
String username = editTextUsername.getText().toStrin
String password = editTextPassword.getText().toStrin
Log.d("AssignAdminFragment", "Creating user " + user
NetworkUserTable.replaceNetworkUserTable(get
} else {
ArrayList<User> userlist = new ArrayList();
userlist.add(u);
SignatureContainer sc = NetworkUserTable.cre
NetworkUserTable.replaceNetworkUserTable(get
}
}
Dialog err = new Dialog(AdminCreatorActivity.this, "
err.show();
err.getButtonAccept().setText("OK");
err.getButtonCancel().setVisibility(View.INVISIBLE);
editTextUsername.setText("");
editTextPassword.setText("");
}
}
ChatActivity.java
import java.util.ArrayList;
import protocol.DistributedFileSharingProtocol;
import util.StateManager;
import file.ActiveLogin;
import file.ActiveUser;
import file.ChatMessage;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBarActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.DataSetObserver;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;
import com.ay.filesharing.view.ChatArrayAdapter;
Intent intent;
private ActiveLogin activeLogin;
private ArrayList<ChatMessage> chatMessageList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (null == chatMessageList) {
chatMessageList = new ArrayList<ChatMessage>();
}
Intent i = getIntent();
targetChat = (ActiveUser) i.getExtras().get(TAG_CHAT_TAR
activeLogin = (ActiveLogin) i.getExtras().get(TAG_ACTIVE
Log.d("targetChat", targetChat==null?"null":targetChat.u
setTitle(targetChat.username);
setContentView(R.layout.activity_chat);
fillMessageList();
if (activeLogin == null){
Toast.makeText(getApplicationContext(), "No Active L
.show();
@Override
public boolean onKey(View v, int keyCode, KeyEvent e
if ((event.getAction() == KeyEvent.ACTION_DOWN)
&& (keyCode == KeyEvent.KEYCODE_ENTER))
new SendChatMessage().execute();
return true;
}
return false;
}
});
buttonSend.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View arg0) {
new SendChatMessage().execute();
}
});
listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_A
listView.setAdapter(chatArrayAdapter);
BroadcastReceiver rec;
};
}
@Override
protected void onPause() {
super.onPause();
if (rec != null) {
LocalBroadcastManager.getInstance(this).unregisterRe
}
}
@Override
protected void onPostExecute(Boolean result) {
String msg = chatText.getText().toString();
if (result) {
ArrayList<file.ChatMessage> chatMessage = (Array
.getItem("ChatMessage");
if (chatMessage == null)
chatMessage = new ArrayList<ChatMessage>();
chatMessage.add(new ChatMessage(activeLogin.user
targetChat.username, msg));
StateManager.setItem("ChatMessage", chatMessage)
chatArrayAdapter.add(new ChatMessage(activeLogin
targetChat.username, msg));
chatText.setText("");
@Override
protected Boolean doInBackground(Void... params) {
String msg = chatText.getText().toString();
DistributedFileSharingProtocol protocol = Distribute
.getInstance();
return protocol.requestChat(activeLogin, msg, target
}
}
}
ChatFragment.java
package com.ay.filesharing;
import java.util.ArrayList;
import protocol.DistributedFileSharingProtocol;
import util.StateManager;
import file.ActiveLogin;
import file.ActiveUser;
import file.ChatMessage;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import com.ay.filesharing.view.ChatArrayAdapter;
ActiveUser targetChat;
private ChatArrayAdapter chatArrayAdapter;
private ListView listViewChatMessage;
private EditText editTextNewMessage;
private ImageButton buttonSend;
Intent intent;
private ActiveLogin activeLogin;
private ArrayList<ChatMessage> chatMessageList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
Bundle savedInstanceState) {
View rootView = inflater.inflate( R.layout.fragment_chat
false);
if (null == chatMessageList) {
chatMessageList = new ArrayList<ChatMessage>();
}
fillMessageList();
if (activeLogin == null){
Toast.makeText(getActivity(), "No Active Login", Toa
.show();
getActivity().finish();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent e
if ((event.getAction() == KeyEvent.ACTION_DOWN)
&& (keyCode == KeyEvent.KEYCODE_ENTER))
if(!editTextNewMessage.getText().toString()
return true;
}
return false;
}
});
buttonSend.setOnClickListener(new View.OnClickListener()
listViewChatMessage.setTranscriptMode(AbsListView.TRANSC
listViewChatMessage.setAdapter(chatArrayAdapter);
broadcastReceiver = createBroadcastReceiver();
LocalBroadcastManager.getInstance(getActivity()).registe
broadcastReceiver,
new IntentFilter("com.ay.filesharing.ChatActivit
+ targetChat.ip));
//when opened, scroll to the bottom
listViewChatMessage.setSelection(chatArrayAdapter.getCou
return rootView;
}
BroadcastReceiver broadcastReceiver;
};
}
@Override
public void onDestroyView() {
super.onDestroyView();
LocalBroadcastManager.getInstance(getActivity()).unregis
}
@Override
protected void onPostExecute(Boolean result) {
String msg = editTextNewMessage.getText().toString()
if (result) {
ArrayList<file.ChatMessage> chatMessage = (Array
.getItem("ChatMessage");
if (chatMessage == null)
chatMessage = new ArrayList<>();
chatMessage.add(new ChatMessage(activeLogin.user
targetChat.username, msg));
StateManager.setItem("ChatMessage", chatMessage)
chatArrayAdapter.add(new ChatMessage(activeLogin
targetChat.username, msg));
editTextNewMessage.setText("");
} else {
chatArrayAdapter.add(new ChatMessage(activeLogin
targetChat.username, "Failed to send mes
}
}
@Override
protected Boolean doInBackground(Void... params) {
String msg = editTextNewMessage.getText().toString()
DistributedFileSharingProtocol protocol = Distribute
.getInstance();
return protocol.requestChat(activeLogin, msg, target
}
}
}
package com.ay.filesharing;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentPagerAdapter;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.transition.Slide;
import android.transition.Transition;
import android.view.Window;
import file.ActiveLogin;
import file.ActiveUser;
@Override
viewPager.setOnPageChangeListener(new ViewPager.SimpleOn
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransac
viewPager.setCurrentItem(tab.getPosition());
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTrans
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTrans
}
@Override
public Fragment getItem(int position) {
Bundle bundle = new Bundle();
bundle.putAll(getIntent().getExtras());
if(position == 0){
FileTransferFragment fileTransferFragment = new
fileTransferFragment.setArguments(bundle);
return fileTransferFragment;
}else{
ChatFragment chatFragment = new ChatFragment();
chatFragment.setArguments(bundle);
return chatFragment;
}
@Override
public int getCount() {
return 2;
}
FileSharingService.java
package com.ay.filesharing;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.google.gson.Gson;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import cryptography.EncryptionUtility;
import file.ActiveLogin;
import file.ActiveUser;
import file.ChatMessage;
import file.DeletedNetworkList;
import file.DeletedUser;
import file.DeletedUserList;
import file.FTPUser;
import file.FileLog;
import file.FileLogManager;
import file.Network;
import file.NetworkList;
import file.NetworkUserDetail;
import file.NetworkUserTable;
import file.SignatureContainer;
import file.UnapprovedNetworkUserTable;
import file.User;
@Override
public void onCreate() {
super.onCreate();
loadDBActiveLogin();
udpServer = new UDPServer();
udpServerThread = new Thread(udpServer);
httpServer = new HTTPServer();
try {
httpServer.start();
udpServerThread.start();
FtpServer server = FtpServer.getInstance(getApplicat
} catch (IOException e) {
e.printStackTrace();
}
Log.d("FileSharingService", "Started");
StateManager.setItem("RequestActiveUserEnabled", true);
}
message.sPayload = ObjectConverter.ObjectToStrin
message.command = "REAU";
message.protocolVersion = 1;
break;
case "RERU":
// Cek signature dia
SignatureContainer sac = (SignatureContainer) Ob
.byteToObject(data.payload);
if (requester == null) {
break;
}
if (ketemu) {
String sig = (String) sac.object;
DistributedFileSharingProtocol instance = Di
.getInstance();
if (EncryptionUtility.verifySignature(sig.ge
DatatypeConverter.parseBase64Binary(
DatatypeConverter
.parseBase64Binary(requester
if (instance != null) {
// Check What Network I'm Active wit
ArrayList<ActiveLogin> activeLoginLi
.getItem("ActiveLogin");
if (activeLoginList == null) {
activeLoginList = new ArrayList<
}
ActiveLogin activeLogin = null;
for (int i = 0; i < activeLoginList
ActiveLogin temp = activeLoginLi
if (temp.ActiveNetwork.equals(sa
activeLogin = activeLoginLis
}
}
instance.requestActiveUser(sac.Type,
activeLogin.privKey);
}
}
}
break;
case "REDU":
ArrayList<DeletedUser> netsa = DeletedUserList.g
if (netsa.size() < 1) {
return;
}
message.sPayload = gson.toJson(netsa);
message.command = "REDU";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "RNUT":
ArrayList<ActiveLogin> aal = (ArrayList<ActiveLo
if (aal == null) {
aal = new ArrayList();
}
ActiveLogin u = null;
for (int i = 0; i < aal.size(); i++) {
ActiveLogin temp = aal.get(i);
if (temp.ActiveNetwork.equals(new String(dat
u = aal.get(i);
}
}
if (u.role.equals("client")) {
Log.e("RNUT[drop]","role of current active l
break;
}
//Check if I'm admin in usernettable
final ArrayList<SignatureContainer> sc = Network
if (sc == null) {
Log.e("RNUT[drop]","No data in getNetworkUse
break;
}
final SerializableProtocolStructure finalMessage
final String ip = data.senderIP;
final ArrayList<SignatureContainer>finalSc = sc;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < sc.size(); i++) {
message.sPayload = ObjectConverter.O
message.command = "RNUT";
message.protocolVersion = 1;
HTTPClient.requestPost(ip, 8888, mes
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
});
t.start();
break;
message.sPayload = ObjectConverter.ObjectToStrin
message.command = "RENA";
message.protocolVersion = 1;
break;
case "RERN":
SignatureContainer cax = (SignatureContainer) Ob
message.sPayload = DatatypeConverter.printBase64
message.command = "RERL";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "REDF":
SignatureContainer sigco = (SignatureContain
@Override
public Response serve(IHTTPSession session) {
Log.d("HttpServer", "session serve");
Map<String, String> headers = session.getHeaders();
NanoHTTPD.Response response = new NanoHTTPD.Response
Method method = session.getMethod();
Map<String, String> parms = session.getParms();
if (Method.PUT.equals(method) || Method.POST.equals(
try {
session.parseBody(parms);
} catch (IOException ioe) {
return new Response(Response.Status.INTERNAL
MIME_PLAINTEXT,
"SERVER INTERNAL ERROR: IOException
+ ioe.getMessage());
} catch (ResponseException re) {
return new Response(re.getStatus(), MIME_PLA
re.getMessage());
if (scon != null) {
Log.d("scon.Type", scon.Type);
Log.d("scon.Username", scon.Username);
} else
Log.d("scon", "null");
// Verifikasi signature
// Cek signature Network User Description
String pki = null;
StateManager.setItem("adminip", ipadd);
Log.d("AdminIP", ipadd);
}
response = new Response("success");
break;
case "REAU":
String sa = p.sPayload.replace(" ", "+");
SignatureContainer sco = (SignatureContainer) Ob
.StringToObject(sa);
if (!loggedin) {
break;
}
// Verifikasi signature
ArrayList<SignatureContainer> networkUsersTable
.getNetworkUserTable(getApplicationConte
null);
if (pk == null) {
return response;
}
boolean resu = EncryptionUtility.verifySignature
ObjectConverter.ObjectToByte(sco.object
"")), DatatypeConverter
.parseBase64Binary(sco.signature
"")), DatatypeConverter
.parseBase64Binary(pk.replace("\
if (resu) {
String ip = headers.get("remote-addr");
StateManager.setItem("activeuser", activeUse
response = new Response("success");
}
break;
case "RNUT":
String s = p.sPayload.replace(" ", "+");
SignatureContainer sc = (SignatureContainer) Obj
.StringToObject(s);
NetworkUserDetail nUd = (NetworkUserDetail) Obje
.StringToObject(sc.object);
ArrayList<User> d = nUd.userlist;
// Get Username
for (int k = 0; k < arraySC.size(); k++) {
NetworkUserDetail nU = (NetworkUserDetail) O
.StringToObject(arraySC.get(k).objec
ArrayList<User> e = nU.userlist;
publickey = e.get(j).publicKey;
break;
}
}
}
if (publickey == null) {
return response;
}
if (res) {
Log.d("RNUT", "replaceNetworkUserTable");
NetworkUserTable.replaceNetworkUserTable(
getApplicationContext(), sc);
response = new Response("success");
}
break;
case "RECA":
String replacedPayload = p.sPayload.replace(" ",
SignatureContainer sigContainer = (SignatureCont
.StringToObject(replacedPayload);
if (fromChat == null) {
break;
}
ActiveLogin al = null;
ArrayList<ActiveLogin> activeLogins = (ArrayList
.getItem("ActiveLogin");
for (ActiveLogin a : activeLogins) {
if (fromChat.network.equals(a.ActiveNetwork)
al = a;
}
ActiveUser au = null;
ArrayList<ActiveUser> ausers = (ArrayList<Ac
if(ausers!=null)
for(ActiveUser x: ausers){
if(x.ip.equals(ip)&&x.username.equal
au=x;
}
if(au!=null)
{
NotificationManager mNotifyManager = (No
.getSystemService(Context.NOTIFI
Builder mBuilder = new NotificationCompa
mBuilder.setContentTitle(fromChat.userna
.setSmallIcon(R.drawable.ic_laun
Uri alarmSound = RingtoneManager.getDefa
long[] pattern = {500,500};
mBuilder.setVibrate(pattern);
mBuilder.setSound(alarmSound);
//intent.addFlags(Intent.FLAG_ACTIVITY_N
PendingIntent pending = PendingIntent.ge
intent, PendingIntent.FLAG_UPDAT
mBuilder.setContentIntent(pending);
mBuilder.setAutoCancel(true);
mNotifyManager.notify(8, mBuilder.build(
}
}
response = new Response("success");
break;
case "RESK":
String str = p.sPayload.replace(" ", "+");
SignatureContainer sContainer = (SignatureContai
.StringToObject(str);
User us = null;
ArrayList<User> uaa = NetworkUserTable.getUserLi
getApplicationContext(), (String) sConta
for (User u : uaa) {
if (u.username.equals(sContainer.Username))
us = u;
}
}
ArrayList<ActiveLogin> aalo = (ArrayList<ActiveL
.getItem("ActiveLogin");
if (aalo == null) {
aalo = new ArrayList();
}
ActiveLogin ulo = null;
for (ActiveLogin temp : aalo) {
if (temp.ActiveNetwork.equals(sContainer.Typ
if (ul.role.contentEquals("client")) {
break;
}
if (foundd) {
//Cek Signature
if (EncryptionUtility.verifySignature(sconta
byte[] data = null;
try {
String filename = sconta.object + "_
FileInputStream fis = getApplication
Bitmap bitmap = BitmapFactory.decode
ByteArrayOutputStream stream = new B
bitmap.compress(Bitmap.CompressForma
data = stream.toByteArray();
//ObjectInputStream in = new ObjectI
//data = (byte[]) in.readObject();
//in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
if (data == null) {
break;
}
response = new Response(DatatypeConverte
}
}
break;
case "RELD":
ArrayList<String> nts = (ArrayList<String>) gson
if (nts == null) {
break;
}
import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
@Override
public void onCreate() {
@Override
public void onDestroy() {
super.onDestroy();
if (httpServer != null)
httpServer.stop();
if (udpServer != null && udpServerThread.isAlive()) {
udpServerThread.stop();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int star
return Service.START_NOT_STICKY;
}
void loadDBActiveLogin(){
SqliteUtil util = new SqliteUtil(getApplicationContext()
try {
Log.d("loadDBActiveLogin", "Loading");
Log.d("loadDBActiveLogin", "Finished");
} catch (Exception e) {
e.printStackTrace();
}finally{
util.close();
}
}
@Override
public IBinder onBind(Intent arg0) {
return serviceBinder;
}
public UDPServer() {
this.myIP = new ArrayList();
Arrays.copyOfRange(data, 0, packet.getLength
SerializableProtocolStructure p = (Serializa
.byteToObject(data);
message.sPayload = gson.toJson(nt);
message.command = "RENN";
message.protocolVersion = 1;
message.sPayload = ObjectConverter.ObjectToStrin
message.command = "REAU";
message.protocolVersion = 1;
break;
case "RERU":
// Cek signature dia
SignatureContainer sac = (SignatureContainer) Ob
.byteToObject(data.payload);
if (requester == null) {
break;
}
if (ketemu) {
String sig = (String) sac.object;
DistributedFileSharingProtocol instance = Di
.getInstance();
if (EncryptionUtility.verifySignature(sig.ge
DatatypeConverter.parseBase64Binary(
DatatypeConverter
.parseBase64Binary(requester
if (instance != null) {
// Check What Network I'm Active wit
ArrayList<ActiveLogin> activeLoginLi
.getItem("ActiveLogin");
if (activeLoginList == null) {
activeLoginList = new ArrayList<
}
ActiveLogin activeLogin = null;
for (int i = 0; i < activeLoginList
ActiveLogin temp = activeLoginLi
if (temp.ActiveNetwork.equals(sa
instance.requestActiveUser(sac.Type,
activeLogin.privKey);
}
}
}
break;
case "REDU":
ArrayList<DeletedUser> netsa = DeletedUserList.g
if (netsa.size() < 1) {
return;
}
message.sPayload = gson.toJson(netsa);
message.command = "REDU";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "RNUT":
ArrayList<ActiveLogin> aal = (ArrayList<ActiveLo
if (aal == null) {
aal = new ArrayList();
}
ActiveLogin u = null;
for (int i = 0; i < aal.size(); i++) {
ActiveLogin temp = aal.get(i);
if (temp.ActiveNetwork.equals(new String(dat
u = aal.get(i);
if (u == null) {
break;
}
if (u.role.equals("client")) {
Log.e("RNUT[drop]","role of current active l
break;
}
//Check if I'm admin in usernettable
final ArrayList<SignatureContainer> sc = Network
if (sc == null) {
Log.e("RNUT[drop]","No data in getNetworkUse
break;
}
final SerializableProtocolStructure finalMessage
final String ip = data.senderIP;
final ArrayList<SignatureContainer>finalSc = sc;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < sc.size(); i++) {
message.sPayload = ObjectConverter.O
message.command = "RNUT";
message.protocolVersion = 1;
HTTPClient.requestPost(ip, 8888, mes
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
message.sPayload = ObjectConverter.ObjectToStrin
message.command = "RENA";
message.protocolVersion = 1;
message.sPayload = DatatypeConverter.printBase64
message.command = "RERL";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "REDF":
SignatureContainer sigco = (SignatureContain
if (!foundThat) {
break;
}
@Override
public Response serve(IHTTPSession session) {
Log.d("HttpServer", "session serve");
Map<String, String> headers = session.getHeaders();
NanoHTTPD.Response response = new NanoHTTPD.Response
Method method = session.getMethod();
Map<String, String> parms = session.getParms();
if (Method.PUT.equals(method) || Method.POST.equals(
try {
session.parseBody(parms);
} catch (IOException ioe) {
return new Response(Response.Status.INTERNAL
MIME_PLAINTEXT,
"SERVER INTERNAL ERROR: IOException
+ ioe.getMessage());
if (scon != null) {
Log.d("scon.Type", scon.Type);
Log.d("scon.Username", scon.Username);
} else
Log.d("scon", "null");
// Verifikasi signature
// Cek signature Network User Description
String pki = null;
StateManager.setItem("adminip", ipadd);
Log.d("AdminIP", ipadd);
}
response = new Response("success");
break;
case "REAU":
String sa = p.sPayload.replace(" ", "+");
SignatureContainer sco = (SignatureContainer) Ob
.StringToObject(sa);
if (!loggedin) {
break;
// Verifikasi signature
// Cek signature Network User Description
String pk = null;
ArrayList<SignatureContainer> networkUsersTable
.getNetworkUserTable(getApplicationConte
null);
if (pk == null) {
return response;
}
boolean resu = EncryptionUtility.verifySignature
ObjectConverter.ObjectToByte(sco.object
"")), DatatypeConverter
.parseBase64Binary(sco.signature
"")), DatatypeConverter
.parseBase64Binary(pk.replace("\
if (resu) {
String ip = headers.get("remote-addr");
StateManager.setItem("activeuser", activeUse
response = new Response("success");
}
break;
case "RNUT":
String s = p.sPayload.replace(" ", "+");
SignatureContainer sc = (SignatureContainer) Obj
.StringToObject(s);
NetworkUserDetail nUd = (NetworkUserDetail) Obje
.StringToObject(sc.object);
ArrayList<User> d = nUd.userlist;
// Get Username
for (int k = 0; k < arraySC.size(); k++) {
NetworkUserDetail nU = (NetworkUserDetail) O
.StringToObject(arraySC.get(k).objec
ArrayList<User> e = nU.userlist;
publickey = e.get(j).publicKey;
break;
}
}
}
if (publickey == null) {
return response;
}
if (res) {
Log.d("RNUT", "replaceNetworkUserTable");
NetworkUserTable.replaceNetworkUserTable(
getApplicationContext(), sc);
response = new Response("success");
}
break;
case "RECA":
if (fromChat == null) {
break;
}
ActiveLogin al = null;
ArrayList<ActiveLogin> activeLogins = (ArrayList
.getItem("ActiveLogin");
for (ActiveLogin a : activeLogins) {
if (EncryptionUtility.verifySignature(sigContain
.getBytes(), DatatypeConverter
.parseBase64Binary(sigContainer.signatur
DatatypeConverter.parseBase64Binary(user
String ip = headers.get("remote-addr");
ArrayList<file.ChatMessage> chatMessage = (A
.getItem("ChatMessage");
if (chatMessage == null)
chatMessage = new ArrayList<ChatMessage>
chatMessage.add(new ChatMessage(fromChat.use
al == null ? null : al.username,
sigContainer.object));
StateManager.setItem("ChatMessage", chatMess
sendMessageToUI("com.ay.filesharing.ChatActi
"updateChatList");
ActiveUser au = null;
ArrayList<ActiveUser> ausers = (ArrayList<Ac
if(ausers!=null)
for(ActiveUser x: ausers){
if(x.ip.equals(ip)&&x.username.equal
au=x;
}
if(au!=null)
{
NotificationManager mNotifyManager = (No
.getSystemService(Context.NOTIFI
Builder mBuilder = new NotificationCompa
mBuilder.setContentTitle(fromChat.userna
.setSmallIcon(R.drawable.ic_laun
Uri alarmSound = RingtoneManager.getDefa
long[] pattern = {500,500};
//intent.addFlags(Intent.FLAG_ACTIVITY_N
PendingIntent pending = PendingIntent.ge
intent, PendingIntent.FLAG_UPDAT
mBuilder.setContentIntent(pending);
mBuilder.setAutoCancel(true);
mNotifyManager.notify(8, mBuilder.build(
}
}
response = new Response("success");
break;
case "RESK":
String str = p.sPayload.replace(" ", "+");
SignatureContainer sContainer = (SignatureContai
.StringToObject(str);
User us = null;
ArrayList<User> uaa = NetworkUserTable.getUserLi
getApplicationContext(), (String) sConta
for (User u : uaa) {
if (u.username.equals(sContainer.Username))
us = u;
}
}
ArrayList<ActiveLogin> aalo = (ArrayList<ActiveL
.getItem("ActiveLogin");
if (aalo == null) {
aalo = new ArrayList();
}
if (ul.role.contentEquals("client")) {
break;
}
if (foundd) {
//Cek Signature
if (EncryptionUtility.verifySignature(sconta
byte[] data = null;
try {
String filename = sconta.object + "_
FileInputStream fis = getApplication
Bitmap bitmap = BitmapFactory.decode
ByteArrayOutputStream stream = new B
bitmap.compress(Bitmap.CompressForma
data = stream.toByteArray();
//ObjectInputStream in = new ObjectI
//data = (byte[]) in.readObject();
//in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
if (data == null) {
break;
}
response = new Response(DatatypeConverte
}
}
break;
case "RELD":
ArrayList<String> nts = (ArrayList<String>) gson
FileTransferFragment.java
package com.ay.filesharing;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import java.io.File;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Stack;
import protocol.DistributedFileSharingProtocol;
import networking.ftp.FTPListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import file.ActiveLogin;
import file.ActiveUser;
import file.FTPUser;
import file.FileLogStatus;
}
});
if(pathHistory.isEmpty()) pathHistory.push("/");
rootView.findViewById(R.id.ImageButton01).setOnClickList
@Override
public void onClick(View v) {
pathHistory.push("/");
new refreshListFile().execute();
}
});
new refreshListFile().execute();
return rootView;
}
layoutHistory.removeAllViews();
String [] paths = pathText.split("/");
String path = "/";
for(int i = 1; i<paths.length;i++){
final Button button = new Button(getActivity());
button.setText(paths[i]);
final String finalPath = (path+=paths[i]+"/");
button.setOnClickListener(new View.OnClickListener()
@Override
protected void onPostExecute(Void result) {
ftpFileAdapter.notifyDataSetChanged();
try {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
generateLayoutHistory(pathHistory.peek()
}
});
}catch (Exception e){ e.printStackTrace(); }
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... arg0) {
FTPClient client = new FTPClient();
try {
client.connect(ftpClient.ip, 2225);
try{
client.login(ftpClient.ftpUser, ftpClient.ft
}catch(FTPException ex){
FTPUser sessionKey = DistributedFileSharingP
ftpClient.ftpUser = sessionKey.username;
ftpClient.ftpPassword = sessionKey.password;
}
class DownloadFile extends AsyncTask<Void, Void, String>{
FTPFile ftpFile;
public DownloadFile(FTPFile ftpFile){
this.ftpFile = ftpFile;
}
@Override
protected String doInBackground(Void... params) {
FTPClient client = new FTPClient();
String filename = ftpFile.getName();
File localFile = new File(activeLogin.homeDirectory+
Log.d("localFilePath", localFile.getPath());
if(localFile.exists()){
Log.e("FileTransfer", filename+" already exist")
}
}
FileUploadActivity.java
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
import com.ay.filesharing.view.SelectUserAdapter;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Random;
import file.ActiveLogin;
import file.ActiveUser;
import file.FTPUser;
import file.FileLogStatus;
import it.sauronsoftware.ftp4j.FTPClient;
import networking.ftp.FTPListener;
import protocol.DistributedFileSharingProtocol;
import util.SqliteUtil;
import util.StateManager;
ListView listViewActiveUsers;
SelectUserAdapter selectUserAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_upload);
startService(new Intent(getApplicationContext(), FileSha
setTitle("Select Users to Share");
//load active login
listActiveLogin = (ArrayList<ActiveLogin>) StateManager
if(listActiveLogin==null){
SqliteUtil util = new SqliteUtil(getApplicationConte
try {
Log.d("loadDBActiveLogin", "Loading");
@Override
public void onRefresh() {
Log.d("FileUploadActivity", "Refreshing
DistributedFileSharingProtocol protocol
// show path
try{
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != nul
Uri uri = (Uri) intent.getParcelableExtra(Intent
if(uri != null){
file = new File(new URI(uri.toString()));
}else{
@Override
protected Void doInBackground(Void... arg0) {
FolderChooseActivity.java
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.ay.filesharing.view.FileAdapter;
import com.gc.materialdesign.views.ButtonRectangle;
import java.io.File;
import java.util.ArrayList;
import java.util.Stack;
import butterknife.ButterKnife;
import butterknife.InjectView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override
public void onBackPressed() {
if (pathHistory != null && pathHistory.size() > 1){
pathHistory.pop();
refreshData();
} else {
super.onBackPressed();
}
}
}
GetClientInfo.java
package com.ay.filesharing;
import protocol.DistributedFileSharingProtocol;
import file.ActiveLogin;
import file.ActiveUser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
ListUserAdapter.java
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v4.app.ActivityOptionsCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.fortysevendeg.swipelistview.SwipeListView;
import java.util.ArrayList;
import file.ActiveLogin;
import file.ActiveUser;
import file.FTPUser;
import protocol.DistributedFileSharingProtocol;
import util.StateManager;
holder.txt.setText(user.username);
ActiveLogin currentActiveLogin = (ActiveLogin) StateMana
holder.img.setImageResource(R.drawable.ic_launcher);
if(currentActiveLogin!=null){
new GetClientInfo(holder.img, user, currentActiveLog
}
final ActiveLogin finalActiveLogin = currentActiveLogin;
final Intent i = new Intent(getContext(), ClientActivity
i.putExtra(ClientActivity.TAG_ACTIVE_LOGIN, finalActiveL
i.putExtra(ClientActivity.TAG_CLIENT, user);
holder.btFTP.setOnClickListener(new View.OnClickListener
@Override
getContext().startActivity(i);
activity.overridePendingTransition(R.anim.push_u
}
});
holder.btChat.setOnClickListener(new View.OnClickListene
@Override
public void onClick(View v) {
i.putExtra(ClientActivity.TAG_START, 1);
getContext().startActivity(i);
activity.overridePendingTransition(R.anim.push_u
}
});
return rowView;
}
class ViewHolder {
ImageView img;
TextView txt;
ImageButton btFTP;
ImageButton btChat;
}
ListUserFragment.java
package com.ay.filesharing;
import java.util.ArrayList;
import com.fortysevendeg.swipelistview.BaseSwipeListViewListener
import com.fortysevendeg.swipelistview.SwipeListView;
import file.ActiveLogin;
import file.ActiveUser;
@SuppressLint("NewApi")
public class ListUserFragment extends Fragment {
ArrayList<ActiveUser> list;
ListUserAdapter listUserAdapter;
SwipeListView swipeListView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_listu
@Override
public void onItemCheckedStateChanged(ActionMode
long id, b
mode.setTitle("Selected (" + swipeListView.g
}
@Override
public boolean onActionItemClicked(ActionMode mo
switch (item.getItemId()) {
default:
return false;
}
}
@Override
public boolean onCreateActionMode(ActionMode mod
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mo
return false;
}
});
}
swipeListView.setSwipeListViewListener(new BaseSwipeList
@Override
public void onOpened(int position, boolean toRight)
}
@Override
public void onClosed(int position, boolean fromRight
}
@Override
public void onListChanged() {
}
@Override
public void onMove(int position, float x) {
}
@Override
public void onStartOpen(int position, int action, bo
}
@Override
public void onStartClose(int position, boolean right
}
@Override
public void onClickBackView(int position) {
}
@Override
public void onDismiss(int[] reverseSortedPositions)
}
});
swipeListView.setAdapter(listUserAdapter);
@Override
public void onRefresh() {
DistributedFileSharingProtocol protocol
.getInstance();
ActiveLogin activeLogin = (ActiveLogin)
if(activeLogin==null)
{
list.clear();
ActiveUser u = new ActiveUser();
u.username = "No ActiveLogin";
list.add(u);
listUserAdapter.notifyDataSetChanged
return;
}