0% found this document useful (0 votes)
21 views111 pages

Mobile App Development Group Activity

Uploaded by

Ravi Ranjan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views111 pages

Mobile App Development Group Activity

Uploaded by

Ravi Ranjan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 111

Mobile App Development Group

Activity
Student Teacher File Sharing App
Team Members
Ravi Ranjan (21BCE10190)

Vidushi Pandey (21BCE10286)

Stuti Yadav (21BCE10543)

Sajal Saxena (21BCE10515)

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;

Mobile App Development Group Activity 1


import android.widget.Spinner;
import android.widget.Toast;

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;

public class AdminCreatorActivity extends ActionBarActivity impl

SectionsPagerAdapter sectionsPagerAdapter;

ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_creator);

final ActionBar actionBar = getSupportActionBar();

Mobile App Development Group Activity 2


actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TA

sectionsPagerAdapter = new SectionsPagerAdapter(getSuppo

viewPager = (ViewPager) findViewById(R.id.pager);


viewPager.setAdapter(sectionsPagerAdapter);

viewPager.setOnPageChangeListener(new ViewPager.SimpleOn
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});

for (int i = 0; i < sectionsPagerAdapter.getCount(); i++


actionBar.addTab(
actionBar.newTab()
.setText(sectionsPagerAdapter.getPag
.setTabListener(this));
}

@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
}

Mobile App Development Group Activity 3


@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTrans
}

public class SectionsPagerAdapter extends FragmentPagerAdapt

public SectionsPagerAdapter(FragmentManager fm) {


super(fm);
}

@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;
}
}

Mobile App Development Group Activity 4


class CreateNetworkFragment extends Fragment implements View

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

editTextNetwork = (EditText) rootView.findViewById(R


editTextUsername = (EditText) rootView.findViewById(
editTextPassword = (EditText) rootView.findViewById(
buttonCreate = (ButtonRectangle) rootView.findViewBy
buttonCreate.setOnClickListener(this);

return rootView;
}
@Override
public void onClick(View v) {
String network = editTextNetwork.getText().toString(
String username = editTextUsername.getText().toStrin
String password = editTextPassword.getText().toStrin

Log.d("CreateNetworkFragment", "Creating network " +

//Generate Self Key


KeyPair self = EncryptionUtility.generateAsymmetricK

//Generate Network Key


KeyPair net = EncryptionUtility.generateAsymmetricKe

Mobile App Development Group Activity 5


//Put into Network Table
NetworkList nList = new NetworkList();
Network nt = new Network();
nt.NetworkName = network;
nt.Signature = DatatypeConverter.printBase64Binary(E

//Save Into File


ArrayList<Network> nn = nList.getNetworkTable(getApp

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

ArrayList<User> userlist = new ArrayList();


userlist.add(u);

SignatureContainer sc = NetworkUserTable.createNetwo
NetworkUserTable.replaceNetworkUserTable(getApplicat

Dialog err = new Dialog(AdminCreatorActivity.this, "


err.show();
err.getButtonAccept().setText("OK");

Mobile App Development Group Activity 6


err.getButtonCancel().setVisibility(View.INVISIBLE);
editTextUsername.setText("");
editTextPassword.setText("");
editTextNetwork.setText("");
}
}
class AssignAdminFragment extends Fragment implements View.O

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();
}

Mobile App Development Group Activity 7


});

editTextUsername = (EditText) rootView.findViewById(


editTextPassword = (EditText) rootView.findViewById(
buttonCreate = (ButtonRectangle) rootView.findViewBy
buttonCreate.setOnClickListener(this);
return rootView;
}

public void refreshNetwork() {


DistributedFileSharingProtocol.getInstance().request
//Load From File
Log.d("Refresh Network List", "Loading From File");
NetworkList n = new NetworkList();
ArrayList<Network> networkFromFile = n
.getNetworkTable(getApplicationContext());
if(networkFromFile!=null && !networkFromFile.isEmpty
networkLists.clear();
for(Network net:networkFromFile)
networkLists.add(net.NetworkName);
networkAdapter.notifyDataSetChanged();
Log.d("Refresh Network List", networkLists.size(
}else{
Log.d("Refresh Network List", "No Data From File
}
}

@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

KeyPair self = EncryptionUtility.generateAsymmetricK

Mobile App Development Group Activity 8


//Create the user
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){
Log.e("ManageUserActivity", "NoSuchAlgorithmExce
return;
}
u.privateKey = DatatypeConverter.printBase64Binary(E

byte[] enprivKey = DatatypeConverter


.parseBase64Binary(u.privateKey);
byte[] passwordKey = EncryptionUtility.createKeyFrom
password, u.privateKeyHash).getEncoded();
byte[] privKey = EncryptionUtility.decryptSymetric(
enprivKey, passwordKey);

NetworkUserDetail obj = new NetworkUserDetail();


ArrayList<SignatureContainer> scao = NetworkUserTabl
if (scao == null) {
Log.e("ManageUserActivity", "scao null");
}else{
if (scao.size() > 0) {
SignatureContainer myNT = scao.get(0);
if (myNT == null) {
return;
}
for(File f:getApplicationContext().getFilesD
Log.d("AdminCreatorActivity", f.getAbsol

NetworkUserDetail myNud = (NetworkUserDetail

ArrayList<User> ual = myNud.userlist;

Mobile App Development Group Activity 9


ual.add(u);
obj.userlist = ual;
obj.VersionNumber = myNud.VersionNumber + 1;
obj.networkName = myNud.networkName;

//put into new Signature Container


SignatureContainer c = new SignatureContaine
c.Type = "usertable";
c.Username = username;
c.object = ObjectConverter.ObjectToString(ob
c.signature = DatatypeConverter.printBase64B

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

Mobile App Development Group Activity 10


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.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;

public class ChatActivity extends ActionBarActivity {

final public static String TAG_CHAT_TARGET = "target";


final public static String TAG_ACTIVE_LOGIN = "activelogin";
private static final String TAG = "ChatActivity";

Mobile App Development Group Activity 11


ActiveUser targetChat;
private ChatArrayAdapter chatArrayAdapter;
private ListView listView;
private EditText chatText;
private ImageButton buttonSend;

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);

buttonSend = (ImageButton) findViewById(R.id.buttonSend)


listView = (ListView) findViewById(R.id.listView1);

chatArrayAdapter = new ChatArrayAdapter(getApplicationCo


R.layout.view_message, targetChat, chatMessageLi
listView.setAdapter(chatArrayAdapter);

fillMessageList();

if (activeLogin == null){
Toast.makeText(getApplicationContext(), "No Active L
.show();

Mobile App Development Group Activity 12


finish();
}

chatText = (EditText) findViewById(R.id.chatText);


chatText.setOnKeyListener(new View.OnKeyListener() {

@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);

// to scroll the list view to bottom on data change


chatArrayAdapter.registerDataSetObserver(new DataSetObse
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(chatArrayAdapter.getCount(
}
});

Mobile App Development Group Activity 13


rec = createBroadcastReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver
rec,
new IntentFilter("com.ay.filesharing.ChatActivit
+ targetChat.ip));
//when opened, scroll to the bottom
listView.setSelection(chatArrayAdapter.getCount() - 1);
}

BroadcastReceiver rec;

private BroadcastReceiver createBroadcastReceiver() {


return new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent
String method = (String) intent.getExtras().get(
Log.e("ChatActivity", "BroadcastReceived method
switch (method) {
case "updateChatList":
fillMessageList();
break;
}
}

};
}

@Override
protected void onPause() {
super.onPause();
if (rec != null) {
LocalBroadcastManager.getInstance(this).unregisterRe
}
}

private void fillMessageList() {

Mobile App Development Group Activity 14


chatMessageList.clear();
ArrayList<file.ChatMessage> chatMessages = (ArrayList<Ch
.getItem("ChatMessage");
if (chatMessages == null)
chatMessages = new ArrayList<ChatMessage>();
Log.d("fillMessageList","populating");
for (file.ChatMessage message : chatMessages)
{
Log.d("targetChat.username", targetChat.username);
Log.d("message.from", String.format("'%s'",message.f
Log.d("message.to", String.format("'%s'",message.to=
Log.d("message.message", message.message==null?"null
if (message.from.equals(targetChat.username) || mess
chatMessageList.add(message);
}
//chatMessageList.addAll(chatMessages);
chatArrayAdapter.notifyDataSetChanged();
}

class SendChatMessage extends AsyncTask<Void, Void, Boolean>

@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("");

Mobile App Development Group Activity 15


} else {
chatArrayAdapter.add(new ChatMessage(activeLogin
targetChat.username, "Failed to send mes
}
}

@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;

Mobile App Development Group Activity 16


import android.database.DataSetObserver;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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;

public class ChatFragment extends Fragment {

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>();
}

Mobile App Development Group Activity 17


Bundle bundle = getArguments();
targetChat = (ActiveUser) bundle.get(ClientActivity.TAG_
activeLogin = (ActiveLogin) bundle.get(ClientActivity.TA
Log.d("targetChat", targetChat == null ? "null" : target

buttonSend = (ImageButton) rootView.findViewById(R.id.bu


listViewChatMessage = (ListView) rootView.findViewById(R

chatArrayAdapter = new ChatArrayAdapter(getActivity(),


R.layout.view_message, targetChat, chatMessageLi
listViewChatMessage.setAdapter(chatArrayAdapter);

fillMessageList();

if (activeLogin == null){
Toast.makeText(getActivity(), "No Active Login", Toa
.show();
getActivity().finish();
}

editTextNewMessage = (EditText) rootView.findViewById(R


editTextNewMessage.setOnKeyListener(new View.OnKeyListen

@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()

Mobile App Development Group Activity 18


@Override
public void onClick(View arg0) {
if(!editTextNewMessage.getText().toString().trim
new SendChatMessage().execute();
}
});

listViewChatMessage.setTranscriptMode(AbsListView.TRANSC
listViewChatMessage.setAdapter(chatArrayAdapter);

// to scroll the list view to bottom on data change


chatArrayAdapter.registerDataSetObserver(new DataSetObse
@Override
public void onChanged() {
super.onChanged();
listViewChatMessage.setSelection(chatArrayAdapte
}
});

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;

private BroadcastReceiver createBroadcastReceiver() {


return new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent
String method = (String) intent.getExtras().get(

Mobile App Development Group Activity 19


Log.e("ChatActivity", "BroadcastReceived method
switch (method) {
case "updateChatList":
fillMessageList();
break;
}
}

};
}

@Override
public void onDestroyView() {
super.onDestroyView();
LocalBroadcastManager.getInstance(getActivity()).unregis
}

private void fillMessageList() {


chatMessageList.clear();
ArrayList<file.ChatMessage> chatMessages = (ArrayList<Ch
.getItem("ChatMessage");
if (chatMessages == null)
chatMessages = new ArrayList<>();
Log.d("fillMessageList","populating");
for (file.ChatMessage message : chatMessages)
{
Log.d("targetChat.username", targetChat.username);
Log.d("message.from", String.format("'%s'",message.f
Log.d("message.to", String.format("'%s'",message.to=
Log.d("message.message", message.message==null?"null
if (message.from.equals(targetChat.username) || mess
chatMessageList.add(message);
}
//chatMessageList.addAll(chatMessages);
chatArrayAdapter.notifyDataSetChanged();
}

Mobile App Development Group Activity 20


class SendChatMessage extends AsyncTask<Void, Void, Boolean>

@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
}

}
}

Mobile App Development Group Activity 21


ClientActivity.java

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;

public class ClientActivity extends ActionBarActivity implements

private SectionsPagerAdapter sectionsPagerAdapter;

private ViewPager viewPager;

private ActiveLogin activeLogin;


private ActiveUser client;

public static final String TAG_CLIENT = "client";


public static final String TAG_ACTIVE_LOGIN = "activelogin";
public static final String TAG_START = "start";

@Override

Mobile App Development Group Activity 22


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);

final ActionBar actionBar = getSupportActionBar();


actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TA

sectionsPagerAdapter = new SectionsPagerAdapter(getSuppo

viewPager = (ViewPager) findViewById(R.id.pager);


viewPager.setAdapter(sectionsPagerAdapter);

viewPager.setOnPageChangeListener(new ViewPager.SimpleOn
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});

for (int i = 0; i < sectionsPagerAdapter.getCount(); i++


actionBar.addTab(
actionBar.newTab()
.setText(sectionsPagerAdapter.getPag
.setTabListener(this));
}

Bundle extras = getIntent().getExtras();


viewPager.setCurrentItem(extras.getInt(TAG_START));
activeLogin = (ActiveLogin) extras.get(TAG_ACTIVE_LOGIN)
client = (ActiveUser) extras.get(TAG_CLIENT);
setTitle(client.username);
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransac
viewPager.setCurrentItem(tab.getPosition());

Mobile App Development Group Activity 23


}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTrans
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTrans
}

public class SectionsPagerAdapter extends FragmentPagerAdapt

public SectionsPagerAdapter(FragmentManager fm) {


super(fm);
}

@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;
}

Mobile App Development Group Activity 24


@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "File Transfer";
case 1:
return "Chat";
}
return null;
}
}
}

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;

Mobile App Development Group Activity 25


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;

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;

Mobile App Development Group Activity 26


import networking.ftp.FtpServer;
import networking.httpd.HTTPClient;
import networking.httpd.NanoHTTPD;
import networking.util.ProtocolStructure;
import networking.util.SerializableProtocolStructure;
import protocol.DistributedFileSharingProtocol;
import util.DatatypeConverter;
import util.ObjectConverter;
import util.SqliteUtil;
import util.StateManager;

public class FileSharingService extends Service {


private final IBinder serviceBinder = new ServiceBinder();
UDPServer udpServer;
Thread udpServerThread;
HTTPServer httpServer;

@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);
}

// Return saya aktif

Mobile App Development Group Activity 27


SignatureContainer sco = new SignatureContainer(
sco.Type = c.Type;
sco.Username = ul.username;
sco.object = c.object;
sco.signature = DatatypeConverter
.printBase64Binary(EncryptionUtility.gen
ObjectConverter.ObjectToByte(sco
ul.privKey));

message.sPayload = ObjectConverter.ObjectToStrin
message.command = "REAU";
message.protocolVersion = 1;

HTTPClient.requestPost(data.senderIP, 8888, mess


Log.d("REAU Reply", "sent to " + data.senderIP +

break;
case "RERU":
// Cek signature dia
SignatureContainer sac = (SignatureContainer) Ob
.byteToObject(data.payload);

// Get Older user Network table , put the new us


// check username already exist
ArrayList<SignatureContainer> signaturec = Netwo
.getNetworkUserTable(getApplicationConte
(String) sac.Type, null);
boolean ketemu = false;
User requester = null;

for (int i = 0; i < signaturec.size(); i++) {


NetworkUserDetail networkUd = (NetworkUserDe
.StringToObject(signaturec.get(i).ob
ArrayList<User> ual = networkUd.userlist;
for (int j = 0; j < ual.size(); j++) {
requester = ual.get(j);

Mobile App Development Group Activity 28


if (requester.username.equals(sac.Userna
ketemu = true;
break;
}
}
if (ketemu) {
break;
}
}

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
}
}

Mobile App Development Group Activity 29


if (activeLogin == null) {
return;
}

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);
}
}

Mobile App Development Group Activity 30


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();
}

}
}
});
t.start();
break;

Mobile App Development Group Activity 31


case "RENA":
SignatureContainer ca = (SignatureContainer) Obj
ArrayList<ActiveLogin> aalux = (ArrayList<Active
if (aalux == null) {
aalux = new ArrayList();
}
ActiveLogin ulx = null;
for (int i = 0; i < aalux.size(); i++) {
ActiveLogin temp = aalux.get(i);
if (temp.ActiveNetwork.equals(ca.Type)) {
ulx = aalux.get(i);
}
}
if (ulx == null) {
return;
}

if (!ulx.role.contentEquals("admin") && !ulx.rol


Log.d("FileSharingService", ulx.role+"is inv
return;
}
SignatureContainer scon = new SignatureContainer
scon.Type = (String) ca.Type;
scon.object = ca.object;
scon.Username = ulx.username;
scon.signature = DatatypeConverter.printBase64Bi

message.sPayload = ObjectConverter.ObjectToStrin
message.command = "RENA";
message.protocolVersion = 1;

HTTPClient.requestPost(data.senderIP, 8888, mess

break;
case "RERN":
SignatureContainer cax = (SignatureContainer) Ob

Mobile App Development Group Activity 32


//Get Older user Network table , put the new use
ArrayList<SignatureContainer> sca = NetworkUserT
boolean found = false;
User uuu = null;
for (int i = 0; i < sca.size(); i++) {
NetworkUserDetail nUd = (NetworkUserDetail)
ArrayList<User> ual = nUd.userlist;
for (int j = 0; j < ual.size(); i++) {
uuu = ual.get(j);
if (uuu.username.equals(cax.Username)) {
found = true;
break;
}
}
if (found) {
break;
}
}
if (uuu == null) {
break;
}
if (found) {
String nn = (String) cax.object;
if (EncryptionUtility.verifySignature(nn.get
DistributedFileSharingProtocol.getInstan
}
}
break;
//Request delete network
case "REDN":
SignatureContainer siCo = (SignatureContainer) O
//Verifikasi signature
//Cek signature Network User Description
String pk = null;
ArrayList<SignatureContainer> scko = NetworkUser

Mobile App Development Group Activity 33


for (int i = 0; i < scko.size(); i++) {
SignatureContainer sck = scko.get(i);
NetworkUserDetail nUdesc = (NetworkUserDetai
//Get Username
for (int j = 0; j < nUdesc.userlist.size();
if (nUdesc.userlist.get(j).username.cont
pk = nUdesc.userlist.get(j).publicKe
break;
}
}
if (pk != null) {
break;
}
}
if (pk == null) {
break;
}
EncryptionUtility.verifySignature(ObjectConverte
Network netw = (Network) ObjectConverter.StringT
NetworkList nList = new NetworkList();
String netwo = nList.selectAndRemoveNetworkByNam
break;
//Request delete network
case "RDUS":
SignatureContainer siCon = (SignatureContainer)
//Verifikasi signature
//Cek signature Network User Description
String pki = null;
ArrayList<SignatureContainer> sckon = NetworkUse
for (int i = 0; i < sckon.size(); i++) {
SignatureContainer sck = sckon.get(i);
NetworkUserDetail nUdesc = (NetworkUserDetai
for (int j = 0; j < nUdesc.userlist.size();
if (nUdesc.userlist.get(j).username.cont
pki = nUdesc.userlist.get(j).publicK
break;

Mobile App Development Group Activity 34


}
}
if (pki != null) {
break;
}
}
if (pki == null) {
break;
}
EncryptionUtility.verifySignature(ObjectConverte
DeletedUser delu = (DeletedUser) ObjectConverter
DeletedUserList.addDeletedUser(getApplicationCon
break;
case "RERL":
SignatureContainer signaco = (SignatureContainer
//encrutil.verifySignature(ObjectConverter.Objec

//get username for current network name


ArrayList<ActiveLogin> activeLogins = (ArrayList
if (activeLogins == null) {
activeLogins = new ArrayList();
}
ActiveLogin actlog = null;
for (int i = 0; i < activeLogins.size(); i++) {
ActiveLogin temp = activeLogins.get(i);
if (temp.ActiveNetwork.equals(signaco.Type))
actlog = activeLogins.get(i);
}
}
if (actlog == null) {
break; // no curent user
}
signaco.Username = actlog.username;
// add arraylist of logfile into signature conta
ArrayList<FileLog> fileLogs = new FileLogManager
if (fileLogs == null) {

Mobile App Development Group Activity 35


break;// no file log, there's no need for tc
}
signaco.object = ObjectConverter.ObjectToString(
byte[] bs = EncryptionUtility.generateSignature(
signaco.signature = DatatypeConverter.printBase6

message.sPayload = DatatypeConverter.printBase64
message.command = "RERL";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "REDF":
SignatureContainer sigco = (SignatureContain

//Get Older user Network table , put the new


ArrayList<SignatureContainer> scax = Network
boolean foundThat = false;
User uux = null;
for (int i = 0; i < scax.size(); i++) {
NetworkUserDetail nUd = (NetworkUserDeta
ArrayList<User> ual = nUd.userlist;
for (int j = 0; j < ual.size(); j++) {
uux = ual.get(j);
if (uux.username.equals(sigco.Userna
foundThat = true;
break;
}
}
if (foundThat) {
break;
}
}
if (uux == null) {
break;
}

Mobile App Development Group Activity 36


if (!foundThat) {
break;
}

ArrayList<ActiveLogin> aalo = (ArrayList<Act


if (aalo == null) {
aalo = new ArrayList();
}
ActiveLogin ulo = null;
for (int i = 0; i < aalo.size(); i++) {
ActiveLogin temp = aalo.get(i);
if (temp.ActiveNetwork.equals(sigco.Type
ulo = aalo.get(i);
}
}
if (ulo == null) {
break;
}

final String nn = sigco.object;


if (EncryptionUtility.verifySignature(nn.get

final File r = new File(ulo.homeDirector


Thread thr = new Thread(new Runnable() {
@Override
public void run() {
Log.d("FileSharingService", "RED
for(File f:r.listFiles()){
if(f.isFile()){
Log.d("FileSharingServic
if (f.getName().contentE
f.delete();
Log.d("FileSharingSe
}
}
}

Mobile App Development Group Activity 37


Log.d("FileSharingService", "RED
}
});
thr.start();
}
break;
}
}
}

public class HTTPServer extends NanoHTTPD {


public HTTPServer() {
super(8888);
Log.e("HTTP SERVER", "Started");
}

@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());

Mobile App Development Group Activity 38


}
}
SerializableProtocolStructure p = new SerializablePr
try {
p.command = ((String) parms.get("Command"));
p.protocolVersion = Integer.parseInt((String) pa
.get("ProtocolVersion"));
p.sPayload = ((String) parms.get("payload"));
} catch (Exception e) {
Log.e("HTTP Server", "Request Format Invalid");
return response;
}
Gson gson = new Gson();
Log.e("Serving HTTP", "GET COMMAND:" + p.command + "
+ headers.get("remote-addr"));
switch (p.command) {
case "RENN":
ArrayList<LinkedTreeMap> nt = (ArrayList) gson.f
p.sPayload, ArrayList.class);
NetworkList n = new NetworkList();

ArrayList<String> deletedNetworkList = new Delet


.getDeletedNetworkTable(getApplicationCo
if (deletedNetworkList == null) {
deletedNetworkList = new ArrayList<String>()
}
ArrayList<Network> networkList = n
.getNetworkTable(getApplicationContext()
for (int i = 0; i < nt.size(); i++) {
Network wrk = new Network();
wrk.Signature = ((String) ((LinkedTreeMap) n
.get("Signature"));
wrk.NetworkName = ((String) ((LinkedTreeMap)
.get("NetworkName"));

boolean exist = false;

Mobile App Development Group Activity 39


for (Network ntw : networkList) {
if (ntw.NetworkName.contentEquals(wrk.Ne
exist = true;
}
}
if (!exist) {
networkList.add(wrk);
}
}
for (Iterator<String> i = deletedNetworkList.ite
.hasNext();) {
String nw = (String) i.next();
for (Iterator<Network> j = networkList.itera
.hasNext();) {
Network ntw = (Network) j.next();
if (ntw.NetworkName.equals(nw)) {
j.remove();
}
}
}
n.writeNetworkTable(getApplicationContext(), net

ArrayList<String> availableNetwork = new ArrayLi


for (int i = 0; i < networkList.size(); i++) {
availableNetwork
.add(((Network) networkList.get(i))
}
if (availableNetwork.size() > 0)
StateManager.setItem("AvailableNetwork", ava
sendMessageToUI("com.ay.filesharing.MainActivity
"updateNetworkList");
response = new Response("success");
break;
case "RENA":
Log.d("p.sPayload", p.sPayload);
String strsPayload = p.sPayload.replace(" ", "+"

Mobile App Development Group Activity 40


Log.d("p.sPayload2", p.sPayload);
SignatureContainer scon = (SignatureContainer) O
.StringToObject(strsPayload);

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;

ArrayList<SignatureContainer> sckna = NetworkUse


.getNetworkUserTable(getApplicationConte
scon.Type, null);
Log.d("sckna.size()", "" + sckna.size());
for (int i = 0; i < sckna.size(); i++) {
SignatureContainer sckn = sckna.get(i);
NetworkUserDetail nUdescd = (NetworkUserDeta
.StringToObject(sckn.object);
// Get Username
for (int j = 0; j < nUdescd.userlist.size();
User user = nUdescd.userlist.get(j);
if (user.username.contentEquals(scon.Use
pki = user.publicKey;
}
}
}
if (pki == null) {
Log.e("pki", "pki null");
return response;
}

boolean result = EncryptionUtility.verifySignatu

Mobile App Development Group Activity 41


ObjectConverter.ObjectToByte(scon.object
DatatypeConverter.parseBase64Binary(scon
DatatypeConverter.parseBase64Binary(pki)
if (result) {
String ipadd = headers.get("remote-addr");
Log.d("remote-addr",
headers.containsKey("remote-addr") ?
.get("remote-addr") : "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);

boolean loggedin = false;


ArrayList<ActiveLogin> aal = (ArrayList<ActiveLo
.getItem("ActiveLogin");
if (aal == null) {
aal = new ArrayList<ActiveLogin>();
}

for (ActiveLogin al : aal) {


if (al.ActiveNetwork.equals(sco.Type))
loggedin = true;
}

if (!loggedin) {
break;
}

// Verifikasi signature

Mobile App Development Group Activity 42


// Cek signature Network User Description
String pk = null;

ArrayList<SignatureContainer> networkUsersTable
.getNetworkUserTable(getApplicationConte
null);

for (SignatureContainer signatureContainer : net


NetworkUserDetail networkUserdetail = (Netwo
.StringToObject(signatureContainer.o
for (file.User user : networkUserdetail.user
if (user.username.contentEquals(sco.User
pk = user.publicKey;
break;
}
}
if (pk != null)
break;
}

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");

ArrayList<ActiveUser> activeUserArray = (Arr


.getItem("activeuser");
if (activeUserArray == null) {
activeUserArray = new ArrayList<ActiveUs

Mobile App Development Group Activity 43


}

ActiveUser a = new ActiveUser();


a.username = sco.Username;
a.ip = ip;
a.network = sco.Type;

int idx = -1;


for (int i = 0; i < activeUserArray.size();
if (activeUserArray.get(i).username.equa
idx = i;
if (idx == -1) {
activeUserArray.add(a);
Log.d("activeuser", "Insert new, count:"
+ activeUserArray.size());
} else
activeUserArray.set(idx, a);

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;

ArrayList<SignatureContainer> arraySC = NetworkU


.getNetworkUserTable(getApplicationConte
nUd.networkName, null);
arraySC.add(sc);

// Cek signature Network User Description

Mobile App Development Group Activity 44


String publickey = null;

// Get Username
for (int k = 0; k < arraySC.size(); k++) {
NetworkUserDetail nU = (NetworkUserDetail) O
.StringToObject(arraySC.get(k).objec
ArrayList<User> e = nU.userlist;

for (int j = 0; j < e.size(); j++) {


if (e.get(j).username.contentEquals(sc.U

publickey = e.get(j).publicKey;
break;
}
}
}
if (publickey == null) {
return response;
}

boolean res = EncryptionUtility.verifySignature(


DatatypeConverter.parseBase64Binary(sc.o
DatatypeConverter.parseBase64Binary(sc.s
DatatypeConverter.parseBase64Binary(publ

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);

Mobile App Development Group Activity 45


User user = null;
ArrayList<User> ual = NetworkUserTable.getUserLi
getApplicationContext(), (String) sigCon
null);
for (User u : ual) {
if (u.username.equals(sigContainer.Username)
user = u;
}
}
if (user == null) {
break;
}

ArrayList<ActiveUser> activeusers = (ArrayList<A


.getItem("activeuser");
if (activeusers == null) {
activeusers = new ArrayList<ActiveUser>();
}
ActiveUser fromChat = null;
for (ActiveUser temp : activeusers) {
if (temp.username.equals(sigContainer.Userna
fromChat = temp;
}
}

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;
}

Mobile App Development Group Activity 46


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};
mBuilder.setVibrate(pattern);
mBuilder.setSound(alarmSound);

Mobile App Development Group Activity 47


Intent intent = new Intent(getApplicatio
intent.putExtra(ClientActivity.TAG_CLIEN
intent.putExtra(ClientActivity.TAG_ACTIV
intent.putExtra(ClientActivity.TAG_START

//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

Mobile App Development Group Activity 48


ulo = temp;
}
}
if (ulo == null) {
break;
}
if (ulo.homeDirectory == null
|| ulo.homeDirectory.length() == 0) {
break;
}
// Cek Signature
if (EncryptionUtility.verifySignature(
sContainer.object.getBytes(),
DatatypeConverter.parseBase64Binary(sCon
DatatypeConverter.parseBase64Binary(us.p
FtpServer ftps = FtpServer.getInstance(getAp
FTPUser ftpuser = ftps.generatePassword(ulo

String tbs = DatatypeConverter


.printBase64Binary(EncryptionUtility
ObjectConverter.ObjectToByte
DatatypeConverter
.parseBase64Binary(u

Log.d("RESK response", String.format("{%s}",


//response=new Response("G1VKlLEiqdPEt0S1x7m
response = new Response(tbs);
}
break;
case "RERE":
String sap = p.sPayload.replace(" ", "+");
SignatureContainer scont = (SignatureContain
User u = (User) ObjectConverter.StringToObje

ArrayList<ActiveLogin> aalu = (ArrayList<Act


if (aalu == null) {

Mobile App Development Group Activity 49


aalu = new ArrayList();
}
ActiveLogin ul = null;
for (int i = 0; i < aalu.size(); i++) {
ActiveLogin temp = aalu.get(i);
if (temp.ActiveNetwork.equals(scont.Type
ul = aalu.get(i);
}
}
if (ul == null) {
break;
}

if (ul.role.contentEquals("client")) {
break;
}

//Cek apakan nama user sudah ada dalam table


boolean exist = false;

ArrayList<SignatureContainer> scau = Network


for (int i = 0; i < scau.size(); i++) {
SignatureContainer sck = scau.get(i);
NetworkUserDetail nud = (NetworkUserDeta
ArrayList<User> uali = nud.userlist;
for (int j = 0; j < uali.size(); j++) {
if (uali.get(j).username.equals(scon
exist = true;
break;
}
}
}

//Cek apakan nama user sudah ada dalam table


SignatureContainer unutcont = UnapprovedNetw
ArrayList<User> uulist;

Mobile App Development Group Activity 50


if (unutcont == null) {
uulist = new ArrayList();
uulist.add(u);
unutcont = UnapprovedNetworkUserTable.cr
} else {
NetworkUserDetail nude = (NetworkUserDet
uulist = nude.userlist;
for (int i = 0; i < uulist.size(); i++)
if (uulist.get(i).username.contentEq
exist = true;
break;
}
}
uulist.add(u);
nude.userlist = uulist;
nude.VersionNumber += 1;
unutcont.object = ObjectConverter.Object
}
if (!exist) {
unutcont.Username = ul.username;
unutcont.signature = DatatypeConverter.p
UnapprovedNetworkUserTable.replaceUnappr
response = new Response("success");
}

Log.d("FileSharingService", "New User ( " +


break;
case "RECL":
String reclPayload = p.sPayload.replace(" ", "+"
SignatureContainer sconta = (SignatureContainer)

boolean foundd = false;


User uuu = null;
ArrayList<User> ualu = NetworkUserTable.getUserL
for (int j = 0; j < ualu.size(); j++) {
uuu = ualu.get(j);

Mobile App Development Group Activity 51


if (uuu.username.equals(sconta.Username)) {
foundd = true;
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;
}

Mobile App Development Group Activity 52


DeletedNetworkList delNetList = new DeletedNetwo
for (int i = 0; i < nts.size(); i++) {
delNetList.addDeletedNetwork(getApplicationC
}
break;
case "REDU":
//Request List Deleted User
ArrayList<LinkedTreeMap> ntsi = gson.fromJson(p
if (ntsi == null) {
break;
}
for (int i = 0; i < ntsi.size(); i++) {
DeletedUserList.addDeletedUser(
getApplicationContext(),
(String) ntsi.get(i).get("networkNam
(String) ntsi.get(i).get("username")
}
break;
case "RERL"://Request Replace Log File
String strin = p.sPayload.replace(" ", "+");
SignatureContainer signaco = (SignatureContainer
ArrayList<FileLog> fileLogs = (ArrayList<FileLog
String UsernameRERL = signaco.Username;
String NetworkNameRERL = signaco.Type;
if (fileLogs == null) {
break;
}
new FileLogManager(getApplicationContext()).writ
break;
}
return response;
}
}
}
package com.ay.filesharing;

Mobile App Development Group Activity 53


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 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;

Mobile App Development Group Activity 54


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;
import networking.ftp.FtpServer;
import networking.httpd.HTTPClient;
import networking.httpd.NanoHTTPD;
import networking.util.ProtocolStructure;
import networking.util.SerializableProtocolStructure;
import protocol.DistributedFileSharingProtocol;
import util.DatatypeConverter;
import util.ObjectConverter;
import util.SqliteUtil;
import util.StateManager;

public class FileSharingService extends Service {


private final IBinder serviceBinder = new ServiceBinder();
UDPServer udpServer;
Thread udpServerThread;
HTTPServer httpServer;

@Override
public void onCreate() {

Mobile App Development Group Activity 55


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);
}

@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");

Mobile App Development Group Activity 56


ArrayList<ActiveLogin> query = (ArrayList) util.quer
if(query != null && query.size()>0){
StateManager.setItem("ActiveLogin", query);
}

Log.d("loadDBActiveLogin", "Finished");
} catch (Exception e) {
e.printStackTrace();
}finally{
util.close();
}
}

public void sendMessageToUI(String uiname, String method) {


Intent x = new Intent(uiname);
x.putExtra("method", method);
LocalBroadcastManager.getInstance(this).sendBroadcast(x)
}

@Override
public IBinder onBind(Intent arg0) {
return serviceBinder;
}

public class ServiceBinder extends Binder {


FileSharingService getService() {
return FileSharingService.this;
}
}

class UDPServer implements Runnable {


DatagramSocket socket;
ArrayList<String> myIP;

public UDPServer() {
this.myIP = new ArrayList();

Mobile App Development Group Activity 57


}

public void run() {


try {
this.socket = new DatagramSocket(8889,
InetAddress.getByName("0.0.0.0"));
this.socket.setBroadcast(true);

Enumeration interfaces = NetworkInterface


.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = (Network
.nextElement();
for (InterfaceAddress interfaceAddress : net
.getInterfaceAddresses()) {
this.myIP.add(interfaceAddress.getAddres
}
}
Log.e("UDP Server", "Listening");
for (;;) {
byte[] recvBuf = new byte[1500];
DatagramPacket packet = new DatagramPacket(r
recvBuf.length);
this.socket.receive(packet);
// Log.e("UDP Server", "UDP Received");
byte[] data = packet.getData();

Arrays.copyOfRange(data, 0, packet.getLength

SerializableProtocolStructure p = (Serializa
.byteToObject(data);

ProtocolStructure s = new ProtocolStructure(


s.command = p.command;
s.payload = p.payload;
s.protocolVersion = p.protocolVersion;

Mobile App Development Group Activity 58


s.sendType = "UDP";
s.senderIP = packet.getAddress().getHostAddr
if(packet.getAddress().isMulticastAddress())
if(s.command.equals("REAU")||s.command.equal
//Refresh List IP in case of IP Network
this.myIP.clear();
interfaces = NetworkInterface
.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface =
.nextElement();
for (InterfaceAddress interfaceAddre
.getInterfaceAddresses()) {
this.myIP.add(interfaceAddress.g
}
}
}
if (!this.myIP.contains("/" + s.senderIP) &&
Log.d("UDP command", p.command);
Log.d("UDP protocolVersion", p.protocolV
handleUDPRequest(s);
}
}
} catch (SocketException ex) {
ex.printStackTrace();
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
finally{
Log.e("UDP Server", "Stopped");
}
}
/**
* @param data

Mobile App Development Group Activity 59


* Protocol Structure data from UDP Request
*/
void handleUDPRequest(ProtocolStructure data) {
final SerializableProtocolStructure message = new Se
Gson gson = new Gson();
Log.d("Handling UDP Request", data.command);
switch (data.command) {
case "RENN":
ArrayList<Network> nt = new NetworkList()
.getNetworkTable(getApplicationContext()

message.sPayload = gson.toJson(nt);
message.command = "RENN";
message.protocolVersion = 1;

HTTPClient.requestPost(data.senderIP, 8888, mess


break;
case "REAU":
SignatureContainer c = (SignatureContainer) Obje
.byteToObject(data.payload);

// Check What Network I'm Active with & admin st


ArrayList<ActiveLogin> aalu = (ArrayList<ActiveL
.getItem("ActiveLogin");
if (aalu == null) {
aalu = new ArrayList();
}
ActiveLogin ul = null;
for (int i = 0; i < aalu.size(); i++) {
ActiveLogin temp = aalu.get(i);
if (temp.ActiveNetwork.equals(c.Type)) {
ul = aalu.get(i);
}
}
if (ul == null) {
return;

Mobile App Development Group Activity 60


}

// Return saya aktif


SignatureContainer sco = new SignatureContainer(
sco.Type = c.Type;
sco.Username = ul.username;
sco.object = c.object;
sco.signature = DatatypeConverter
.printBase64Binary(EncryptionUtility.gen
ObjectConverter.ObjectToByte(sco
ul.privKey));

message.sPayload = ObjectConverter.ObjectToStrin
message.command = "REAU";
message.protocolVersion = 1;

HTTPClient.requestPost(data.senderIP, 8888, mess


Log.d("REAU Reply", "sent to " + data.senderIP +

break;
case "RERU":
// Cek signature dia
SignatureContainer sac = (SignatureContainer) Ob
.byteToObject(data.payload);

// Get Older user Network table , put the new us


// check username already exist
ArrayList<SignatureContainer> signaturec = Netwo
.getNetworkUserTable(getApplicationConte
(String) sac.Type, null);
boolean ketemu = false;
User requester = null;

for (int i = 0; i < signaturec.size(); i++) {


NetworkUserDetail networkUd = (NetworkUserDe
.StringToObject(signaturec.get(i).ob

Mobile App Development Group Activity 61


ArrayList<User> ual = networkUd.userlist;
for (int j = 0; j < ual.size(); j++) {
requester = ual.get(j);
if (requester.username.equals(sac.Userna
ketemu = true;
break;
}
}
if (ketemu) {
break;
}
}

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

Mobile App Development Group Activity 62


activeLogin = activeLoginLis
}
}
if (activeLogin == null) {
return;
}

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);

Mobile App Development Group Activity 63


}
}

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();
}

}
}

Mobile App Development Group Activity 64


});
t.start();
break;
case "RENA":
SignatureContainer ca = (SignatureContainer) Obj
ArrayList<ActiveLogin> aalux = (ArrayList<Active
if (aalux == null) {
aalux = new ArrayList();
}
ActiveLogin ulx = null;
for (int i = 0; i < aalux.size(); i++) {
ActiveLogin temp = aalux.get(i);
if (temp.ActiveNetwork.equals(ca.Type)) {
ulx = aalux.get(i);
}
}
if (ulx == null) {
return;
}

if (!ulx.role.contentEquals("admin") && !ulx.rol


Log.d("FileSharingService", ulx.role+"is inv
return;
}
SignatureContainer scon = new SignatureContainer
scon.Type = (String) ca.Type;
scon.object = ca.object;
scon.Username = ulx.username;
scon.signature = DatatypeConverter.printBase64Bi

message.sPayload = ObjectConverter.ObjectToStrin
message.command = "RENA";
message.protocolVersion = 1;

HTTPClient.requestPost(data.senderIP, 8888, mess

Mobile App Development Group Activity 65


break;
case "RERN":
SignatureContainer cax = (SignatureContainer) Ob

//Get Older user Network table , put the new use


ArrayList<SignatureContainer> sca = NetworkUserT
boolean found = false;
User uuu = null;
for (int i = 0; i < sca.size(); i++) {
NetworkUserDetail nUd = (NetworkUserDetail)
ArrayList<User> ual = nUd.userlist;
for (int j = 0; j < ual.size(); i++) {
uuu = ual.get(j);
if (uuu.username.equals(cax.Username)) {
found = true;
break;
}
}
if (found) {
break;
}
}
if (uuu == null) {
break;
}
if (found) {
String nn = (String) cax.object;
if (EncryptionUtility.verifySignature(nn.get
DistributedFileSharingProtocol.getInstan
}
}
break;
//Request delete network
case "REDN":
SignatureContainer siCo = (SignatureContainer) O
//Verifikasi signature

Mobile App Development Group Activity 66


//Cek signature Network User Description
String pk = null;
ArrayList<SignatureContainer> scko = NetworkUser
for (int i = 0; i < scko.size(); i++) {
SignatureContainer sck = scko.get(i);
NetworkUserDetail nUdesc = (NetworkUserDetai
//Get Username
for (int j = 0; j < nUdesc.userlist.size();
if (nUdesc.userlist.get(j).username.cont
pk = nUdesc.userlist.get(j).publicKe
break;
}
}
if (pk != null) {
break;
}
}
if (pk == null) {
break;
}
EncryptionUtility.verifySignature(ObjectConverte
Network netw = (Network) ObjectConverter.StringT
NetworkList nList = new NetworkList();
String netwo = nList.selectAndRemoveNetworkByNam
break;
//Request delete network
case "RDUS":
SignatureContainer siCon = (SignatureContainer)
//Verifikasi signature
//Cek signature Network User Description
String pki = null;
ArrayList<SignatureContainer> sckon = NetworkUse
for (int i = 0; i < sckon.size(); i++) {
SignatureContainer sck = sckon.get(i);
NetworkUserDetail nUdesc = (NetworkUserDetai
for (int j = 0; j < nUdesc.userlist.size();

Mobile App Development Group Activity 67


if (nUdesc.userlist.get(j).username.cont
pki = nUdesc.userlist.get(j).publicK
break;
}
}
if (pki != null) {
break;
}
}
if (pki == null) {
break;
}
EncryptionUtility.verifySignature(ObjectConverte
DeletedUser delu = (DeletedUser) ObjectConverter
DeletedUserList.addDeletedUser(getApplicationCon
break;
case "RERL":
SignatureContainer signaco = (SignatureContainer
//encrutil.verifySignature(ObjectConverter.Objec

//get username for current network name


ArrayList<ActiveLogin> activeLogins = (ArrayList
if (activeLogins == null) {
activeLogins = new ArrayList();
}
ActiveLogin actlog = null;
for (int i = 0; i < activeLogins.size(); i++) {
ActiveLogin temp = activeLogins.get(i);
if (temp.ActiveNetwork.equals(signaco.Type))
actlog = activeLogins.get(i);
}
}
if (actlog == null) {
break; // no curent user
}
signaco.Username = actlog.username;

Mobile App Development Group Activity 68


// add arraylist of logfile into signature conta
ArrayList<FileLog> fileLogs = new FileLogManager
if (fileLogs == null) {
break;// no file log, there's no need for tc
}
signaco.object = ObjectConverter.ObjectToString(
byte[] bs = EncryptionUtility.generateSignature(
signaco.signature = DatatypeConverter.printBase6

message.sPayload = DatatypeConverter.printBase64
message.command = "RERL";
message.protocolVersion = 1;
HTTPClient.requestPost(data.senderIP, 8888, mess
break;
case "REDF":
SignatureContainer sigco = (SignatureContain

//Get Older user Network table , put the new


ArrayList<SignatureContainer> scax = Network
boolean foundThat = false;
User uux = null;
for (int i = 0; i < scax.size(); i++) {
NetworkUserDetail nUd = (NetworkUserDeta
ArrayList<User> ual = nUd.userlist;
for (int j = 0; j < ual.size(); j++) {
uux = ual.get(j);
if (uux.username.equals(sigco.Userna
foundThat = true;
break;
}
}
if (foundThat) {
break;
}
}
if (uux == null) {

Mobile App Development Group Activity 69


break;
}

if (!foundThat) {
break;
}

ArrayList<ActiveLogin> aalo = (ArrayList<Act


if (aalo == null) {
aalo = new ArrayList();
}
ActiveLogin ulo = null;
for (int i = 0; i < aalo.size(); i++) {
ActiveLogin temp = aalo.get(i);
if (temp.ActiveNetwork.equals(sigco.Type
ulo = aalo.get(i);
}
}
if (ulo == null) {
break;
}

final String nn = sigco.object;


if (EncryptionUtility.verifySignature(nn.get

final File r = new File(ulo.homeDirector


Thread thr = new Thread(new Runnable() {
@Override
public void run() {
Log.d("FileSharingService", "RED
for(File f:r.listFiles()){
if(f.isFile()){
Log.d("FileSharingServic
if (f.getName().contentE
f.delete();
Log.d("FileSharingSe

Mobile App Development Group Activity 70


}
}
}
Log.d("FileSharingService", "RED
}
});
thr.start();
}
break;
}
}
}

public class HTTPServer extends NanoHTTPD {


public HTTPServer() {
super(8888);
Log.e("HTTP SERVER", "Started");
}

@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());

Mobile App Development Group Activity 71


} catch (ResponseException re) {
return new Response(re.getStatus(), MIME_PLA
re.getMessage());
}
}
SerializableProtocolStructure p = new SerializablePr
try {
p.command = ((String) parms.get("Command"));
p.protocolVersion = Integer.parseInt((String) pa
.get("ProtocolVersion"));
p.sPayload = ((String) parms.get("payload"));
} catch (Exception e) {
Log.e("HTTP Server", "Request Format Invalid");
return response;
}
Gson gson = new Gson();
Log.e("Serving HTTP", "GET COMMAND:" + p.command + "
+ headers.get("remote-addr"));
switch (p.command) {
case "RENN":
ArrayList<LinkedTreeMap> nt = (ArrayList) gson.f
p.sPayload, ArrayList.class);
NetworkList n = new NetworkList();

ArrayList<String> deletedNetworkList = new Delet


.getDeletedNetworkTable(getApplicationCo
if (deletedNetworkList == null) {
deletedNetworkList = new ArrayList<String>()
}
ArrayList<Network> networkList = n
.getNetworkTable(getApplicationContext()
for (int i = 0; i < nt.size(); i++) {
Network wrk = new Network();
wrk.Signature = ((String) ((LinkedTreeMap) n
.get("Signature"));
wrk.NetworkName = ((String) ((LinkedTreeMap)

Mobile App Development Group Activity 72


.get("NetworkName"));

boolean exist = false;


for (Network ntw : networkList) {
if (ntw.NetworkName.contentEquals(wrk.Ne
exist = true;
}
}
if (!exist) {
networkList.add(wrk);
}
}
for (Iterator<String> i = deletedNetworkList.ite
.hasNext();) {
String nw = (String) i.next();
for (Iterator<Network> j = networkList.itera
.hasNext();) {
Network ntw = (Network) j.next();
if (ntw.NetworkName.equals(nw)) {
j.remove();
}
}
}
n.writeNetworkTable(getApplicationContext(), net

ArrayList<String> availableNetwork = new ArrayLi


for (int i = 0; i < networkList.size(); i++) {
availableNetwork
.add(((Network) networkList.get(i))
}
if (availableNetwork.size() > 0)
StateManager.setItem("AvailableNetwork", ava
sendMessageToUI("com.ay.filesharing.MainActivity
"updateNetworkList");
response = new Response("success");
break;

Mobile App Development Group Activity 73


case "RENA":
Log.d("p.sPayload", p.sPayload);
String strsPayload = p.sPayload.replace(" ", "+"
Log.d("p.sPayload2", p.sPayload);
SignatureContainer scon = (SignatureContainer) O
.StringToObject(strsPayload);

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;

ArrayList<SignatureContainer> sckna = NetworkUse


.getNetworkUserTable(getApplicationConte
scon.Type, null);
Log.d("sckna.size()", "" + sckna.size());
for (int i = 0; i < sckna.size(); i++) {
SignatureContainer sckn = sckna.get(i);
NetworkUserDetail nUdescd = (NetworkUserDeta
.StringToObject(sckn.object);
// Get Username
for (int j = 0; j < nUdescd.userlist.size();
User user = nUdescd.userlist.get(j);
if (user.username.contentEquals(scon.Use
pki = user.publicKey;
}
}
}
if (pki == null) {
Log.e("pki", "pki null");
return response;

Mobile App Development Group Activity 74


}

boolean result = EncryptionUtility.verifySignatu


ObjectConverter.ObjectToByte(scon.object
DatatypeConverter.parseBase64Binary(scon
DatatypeConverter.parseBase64Binary(pki)
if (result) {
String ipadd = headers.get("remote-addr");
Log.d("remote-addr",
headers.containsKey("remote-addr") ?
.get("remote-addr") : "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);

boolean loggedin = false;


ArrayList<ActiveLogin> aal = (ArrayList<ActiveLo
.getItem("ActiveLogin");
if (aal == null) {
aal = new ArrayList<ActiveLogin>();
}

for (ActiveLogin al : aal) {


if (al.ActiveNetwork.equals(sco.Type))
loggedin = true;
}

if (!loggedin) {
break;

Mobile App Development Group Activity 75


}

// Verifikasi signature
// Cek signature Network User Description
String pk = null;

ArrayList<SignatureContainer> networkUsersTable
.getNetworkUserTable(getApplicationConte
null);

for (SignatureContainer signatureContainer : net


NetworkUserDetail networkUserdetail = (Netwo
.StringToObject(signatureContainer.o
for (file.User user : networkUserdetail.user
if (user.username.contentEquals(sco.User
pk = user.publicKey;
break;
}
}
if (pk != null)
break;
}

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");

ArrayList<ActiveUser> activeUserArray = (Arr

Mobile App Development Group Activity 76


.getItem("activeuser");
if (activeUserArray == null) {
activeUserArray = new ArrayList<ActiveUs
}

ActiveUser a = new ActiveUser();


a.username = sco.Username;
a.ip = ip;
a.network = sco.Type;

int idx = -1;


for (int i = 0; i < activeUserArray.size();
if (activeUserArray.get(i).username.equa
idx = i;
if (idx == -1) {
activeUserArray.add(a);
Log.d("activeuser", "Insert new, count:"
+ activeUserArray.size());
} else
activeUserArray.set(idx, a);

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;

ArrayList<SignatureContainer> arraySC = NetworkU


.getNetworkUserTable(getApplicationConte
nUd.networkName, null);

Mobile App Development Group Activity 77


arraySC.add(sc);

// Cek signature Network User Description


String publickey = null;

// Get Username
for (int k = 0; k < arraySC.size(); k++) {
NetworkUserDetail nU = (NetworkUserDetail) O
.StringToObject(arraySC.get(k).objec
ArrayList<User> e = nU.userlist;

for (int j = 0; j < e.size(); j++) {


if (e.get(j).username.contentEquals(sc.U

publickey = e.get(j).publicKey;
break;
}
}
}
if (publickey == null) {
return response;
}

boolean res = EncryptionUtility.verifySignature(


DatatypeConverter.parseBase64Binary(sc.o
DatatypeConverter.parseBase64Binary(sc.s
DatatypeConverter.parseBase64Binary(publ

if (res) {
Log.d("RNUT", "replaceNetworkUserTable");
NetworkUserTable.replaceNetworkUserTable(
getApplicationContext(), sc);
response = new Response("success");
}
break;
case "RECA":

Mobile App Development Group Activity 78


String replacedPayload = p.sPayload.replace(" ",
SignatureContainer sigContainer = (SignatureCont
.StringToObject(replacedPayload);

User user = null;


ArrayList<User> ual = NetworkUserTable.getUserLi
getApplicationContext(), (String) sigCon
null);
for (User u : ual) {
if (u.username.equals(sigContainer.Username)
user = u;
}
}
if (user == null) {
break;
}

ArrayList<ActiveUser> activeusers = (ArrayList<A


.getItem("activeuser");
if (activeusers == null) {
activeusers = new ArrayList<ActiveUser>();
}
ActiveUser fromChat = null;
for (ActiveUser temp : activeusers) {
if (temp.username.equals(sigContainer.Userna
fromChat = temp;
}
}

if (fromChat == null) {
break;
}
ActiveLogin al = null;
ArrayList<ActiveLogin> activeLogins = (ArrayList
.getItem("ActiveLogin");
for (ActiveLogin a : activeLogins) {

Mobile App Development Group Activity 79


if (fromChat.network.equals(a.ActiveNetwork)
al = a;
}

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};

Mobile App Development Group Activity 80


mBuilder.setVibrate(pattern);
mBuilder.setSound(alarmSound);

Intent intent = new Intent(getApplicatio


intent.putExtra(ClientActivity.TAG_CLIEN
intent.putExtra(ClientActivity.TAG_ACTIV
intent.putExtra(ClientActivity.TAG_START

//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();
}

Mobile App Development Group Activity 81


ActiveLogin ulo = null;
for (ActiveLogin temp : aalo) {
if (temp.ActiveNetwork.equals(sContainer.Typ
ulo = temp;
}
}
if (ulo == null) {
break;
}
if (ulo.homeDirectory == null
|| ulo.homeDirectory.length() == 0) {
break;
}
// Cek Signature
if (EncryptionUtility.verifySignature(
sContainer.object.getBytes(),
DatatypeConverter.parseBase64Binary(sCon
DatatypeConverter.parseBase64Binary(us.p
FtpServer ftps = FtpServer.getInstance(getAp
FTPUser ftpuser = ftps.generatePassword(ulo

String tbs = DatatypeConverter


.printBase64Binary(EncryptionUtility
ObjectConverter.ObjectToByte
DatatypeConverter
.parseBase64Binary(u

Log.d("RESK response", String.format("{%s}",


//response=new Response("G1VKlLEiqdPEt0S1x7m
response = new Response(tbs);
}
break;
case "RERE":
String sap = p.sPayload.replace(" ", "+");
SignatureContainer scont = (SignatureContain
User u = (User) ObjectConverter.StringToObje

Mobile App Development Group Activity 82


ArrayList<ActiveLogin> aalu = (ArrayList<Act
if (aalu == null) {
aalu = new ArrayList();
}
ActiveLogin ul = null;
for (int i = 0; i < aalu.size(); i++) {
ActiveLogin temp = aalu.get(i);
if (temp.ActiveNetwork.equals(scont.Type
ul = aalu.get(i);
}
}
if (ul == null) {
break;
}

if (ul.role.contentEquals("client")) {
break;
}

//Cek apakan nama user sudah ada dalam table


boolean exist = false;

ArrayList<SignatureContainer> scau = Network


for (int i = 0; i < scau.size(); i++) {
SignatureContainer sck = scau.get(i);
NetworkUserDetail nud = (NetworkUserDeta
ArrayList<User> uali = nud.userlist;
for (int j = 0; j < uali.size(); j++) {
if (uali.get(j).username.equals(scon
exist = true;
break;
}
}
}

Mobile App Development Group Activity 83


//Cek apakan nama user sudah ada dalam table
SignatureContainer unutcont = UnapprovedNetw
ArrayList<User> uulist;
if (unutcont == null) {
uulist = new ArrayList();
uulist.add(u);
unutcont = UnapprovedNetworkUserTable.cr
} else {
NetworkUserDetail nude = (NetworkUserDet
uulist = nude.userlist;
for (int i = 0; i < uulist.size(); i++)
if (uulist.get(i).username.contentEq
exist = true;
break;
}
}
uulist.add(u);
nude.userlist = uulist;
nude.VersionNumber += 1;
unutcont.object = ObjectConverter.Object
}
if (!exist) {
unutcont.Username = ul.username;
unutcont.signature = DatatypeConverter.p
UnapprovedNetworkUserTable.replaceUnappr
response = new Response("success");
}

Log.d("FileSharingService", "New User ( " +


break;
case "RECL":
String reclPayload = p.sPayload.replace(" ", "+"
SignatureContainer sconta = (SignatureContainer)

boolean foundd = false;


User uuu = null;

Mobile App Development Group Activity 84


ArrayList<User> ualu = NetworkUserTable.getUserL
for (int j = 0; j < ualu.size(); j++) {
uuu = ualu.get(j);
if (uuu.username.equals(sconta.Username)) {
foundd = true;
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

Mobile App Development Group Activity 85


if (nts == null) {
break;
}
DeletedNetworkList delNetList = new DeletedNetwo
for (int i = 0; i < nts.size(); i++) {
delNetList.addDeletedNetwork(getApplicationC
}
break;
case "REDU":
//Request List Deleted User
ArrayList<LinkedTreeMap> ntsi = gson.fromJson(p
if (ntsi == null) {
break;
}
for (int i = 0; i < ntsi.size(); i++) {
DeletedUserList.addDeletedUser(
getApplicationContext(),
(String) ntsi.get(i).get("networkNam
(String) ntsi.get(i).get("username")
}
break;
case "RERL"://Request Replace Log File
String strin = p.sPayload.replace(" ", "+");
SignatureContainer signaco = (SignatureContainer
ArrayList<FileLog> fileLogs = (ArrayList<FileLog
String UsernameRERL = signaco.Username;
String NetworkNameRERL = signaco.Type;
if (fileLogs == null) {
break;
}
new FileLogManager(getApplicationContext()).writ
break;
}
return response;
}
}

Mobile App Development Group Activity 86


}
l

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;

Mobile App Development Group Activity 87


import com.ay.filesharing.view.FTPFileAdapter;

import file.ActiveLogin;
import file.ActiveUser;
import file.FTPUser;
import file.FileLogStatus;

public class FileTransferFragment extends Fragment {

private ActiveUser ftpClient;

private ActiveLogin activeLogin;


static Stack<String> pathHistory = new Stack<>();

ArrayList<FTPFile> listFile = new ArrayList<>();


FTPFileAdapter ftpFileAdapter;
ListView listViewFtpFile;
LinearLayout layoutHistory;
@Override
//protected void onCreate(Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_file_
false);
Bundle extras = getArguments();
ftpClient = (ActiveUser) extras.get(ClientActivity.TAG_C
activeLogin = (ActiveLogin) extras.get(ClientActivity.TA

if(ftpFileAdapter ==null) ftpFileAdapter = new FTPFileAd


R.layout.view_file, listFile);
layoutHistory = (LinearLayout) rootView.findViewById(R.i
listViewFtpFile = (ListView) rootView.findViewById(R.id
listViewFtpFile.setAdapter(ftpFileAdapter);
listViewFtpFile.setOnItemClickListener(new AdapterView.O
@Override

Mobile App Development Group Activity 88


public void onItemClick(AdapterView<?> parent, View
int position, long id) {
FTPFile ftpFile = listFile.get(position);
if (ftpFile.getType() == FTPFile.TYPE_DIRECTORY)
pathHistory.push(pathHistory.peek() + ftpFil
new refreshListFile().execute();
} else {
Toast.makeText(getActivity(), "Fetching "+ft
new DownloadFile(ftpFile).execute();
}

}
});
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;
}

public void generateLayoutHistory(String pathText){

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()

Mobile App Development Group Activity 89


@Override
public void onClick(View v) {
pathHistory.push(finalPath);
new refreshListFile().execute();
}
});
layoutHistory.addView(button);
}
}

class refreshListFile extends AsyncTask<Void, Void, Void> {

@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;

Mobile App Development Group Activity 90


client.login(ftpClient.ftpUser, ftpClient.ft
}
client.changeDirectory(pathHistory.peek());
listFile.clear();
listFile.addAll(Arrays.asList(client.list()));
}
catch(it.sauronsoftware.ftp4j.FTPException e){
if(e.getCode()==550){
//No Such Directory
pathHistory.pop();
}
}catch (SocketTimeoutException e){
Toast.makeText(getActivity(),"Request Timeout",
}
catch(Exception e){
Log.d("pathHistory.peek()", pathHistory.peek());
e.printStackTrace();
}
return null;
}

}
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")

Mobile App Development Group Activity 91


}
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;
client.login(ftpClient.ftpUser, ftpClient.ft
}
FileLogStatus s = new FileLogStatus();
s.setId(100000 + new Random().nextInt(900000));
s.setFilename(ftpFile.getName());
s.setFrom(ftpClient.username);
s.setType("download");
s.setNetworkName(ftpClient.network);
s.setTo(activeLogin.username);
s.setProgress(Double.valueOf(0));
s.setStatus("Transfering");
s.setSize(ftpFile.getSize());
s.setPath(localFile.getPath());
s.setFtpclient(client);
client.download(pathHistory.peek()+ftpFile.getNa
return "Done Fetching";
}catch(Exception e){
e.printStackTrace();
return e.getLocalizedMessage();
}
}

}
}

FileUploadActivity.java

Mobile App Development Group Activity 92


package com.ay.filesharing;

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;

public class FileUploadActivity extends ActionBarActivity {

ListView listViewActiveUsers;
SelectUserAdapter selectUserAdapter;

Mobile App Development Group Activity 93


ArrayList<ActiveUser> activeUsers;
File file;
ArrayList<ActiveLogin> listActiveLogin;

@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");

listActiveLogin = (ArrayList) util.query(ActiveL


if(listActiveLogin != null && !listActiveLogin.i
StateManager.setItem("ActiveLogin", listActi
}else{
startActivity(new Intent(getApplicationConte
this.finish();
}
Log.d("loadDBActiveLogin", "Finished");
} catch (Exception e) {
e.printStackTrace();
}finally{
util.close();
}
}
//load active user
listViewActiveUsers = (ListView) findViewById(R.id.listV
activeUsers = (ArrayList<ActiveUser>) StateManager.getIt
if(activeUsers == null) {
activeUsers = new ArrayList<>();

Mobile App Development Group Activity 94


ActiveUser object = new ActiveUser();
object.username="Scroll down to refresh";
activeUsers.add(object);
new Thread(){
@Override
public void run() {
if(listActiveLogin!=null)
for(ActiveLogin activeLogin:listActiveLo
DistributedFileSharingProtocol.getIn
}
}.start();
new android.os.Handler().postDelayed(new Runnable()
@Override
public void run() {
ArrayList<ActiveUser> aLa = (ArrayList<Activ
if (aLa != null && !aLa.isEmpty()) {
activeUsers.clear();
activeUsers.addAll(aLa);
selectUserAdapter.notifyDataSetChanged()
}
}
}, 1000);
}
selectUserAdapter = new SelectUserAdapter(getApplication
listViewActiveUsers.setAdapter(selectUserAdapter);

//setup refresh gesture

final SwipeRefreshLayout swipeLayout = (SwipeRefreshLayo


swipeLayout.setOnRefreshListener(new SwipeRefreshLayout

@Override
public void onRefresh() {
Log.d("FileUploadActivity", "Refreshing

DistributedFileSharingProtocol protocol

Mobile App Development Group Activity 95


.getInstance();
for(ActiveLogin activeLogin:listActiveLo
Log.e("RequestingActiveUser", active
protocol.requestActiveUser(activeLog
}
new Handler().postDelayed(new Runnable()
@Override
public void run() {

ArrayList<ActiveUser> aLa = (Arr


ArrayList<ActiveUser> clone = (A
if(aLa!=null) {
activeUsers.clear();
activeUsers.addAll(clone);
selectUserAdapter.notifyData
}
swipeLayout.setRefreshing(false)
}
}, 5000);
}
});
swipeLayout.setColorScheme(R.color.light_blue_500,
R.color.red_500,
R.color.green_500,
R.color.yellow_500);

// 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{

Mobile App Development Group Activity 96


Toast.makeText(this, "No URI to send file",
finish();
}
}
}catch(Exception e){
Toast.makeText(this, e.getLocalizedMessage(), Toast
}
}

public void upload(View v){


for(ActiveUser u: selectUserAdapter.getActiveUsers()){
Log.d("Upload", u.username);
new UploadFile(u).execute();
}
Toast.makeText(getApplicationContext(), "Sending to "+ s
}
class UploadFile extends AsyncTask<Void, Void, Void>{
ActiveUser user;
UploadFile(ActiveUser user){
this.user = user;
}

@Override
protected Void doInBackground(Void... arg0) {

ActiveLogin activeLogin = null;


for(ActiveLogin a: listActiveLogin){
if(a.ActiveNetwork.equals(user.network)) {
activeLogin = a;
Log.d("found:activeLogin", a.ActiveNetwork);
}
}
try {
FTPUser ftpUser = null;
int i = 0;
do {

Mobile App Development Group Activity 97


ftpUser = DistributedFileSharingProtocol.get
Thread.sleep(1000*i);
i++;
if(i>10) return null;
} while(ftpUser==null);
FTPClient client = new FTPClient();
client.connect(user.ip, 2225);
client.login(ftpUser.username, ftpUser.password)

FileLogStatus s = new FileLogStatus();


s.setId(100000 + new Random().nextInt(900000));
s.setFilename(file.getName());
s.setFrom(activeLogin.username);
s.setType("upload");
s.setNetworkName(activeLogin.ActiveNetwork);
s.setTo(user.username);
s.setProgress(Double.valueOf(0));
s.setStatus("Transfering");
s.setSize(file.length());
s.setPath(file.getPath());
s.setFtpclient(client);
FTPListener ftpListener = new FTPListener(file.l
client.upload(file, ftpListener);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

FolderChooseActivity.java

Mobile App Development Group Activity 98


package com.ay.filesharing;

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;

public class FolderChooserActivity extends ActionBarActivity {

public static final String TAG_PATH = "path";


static Stack<String> pathHistory = new Stack<String>();
@InjectView(R.id.listView1)
ListView listViewFile;
@InjectView(R.id.button1)
ButtonRectangle buttonSelect;
ArrayList<File> listFile = new ArrayList<File>();
FileAdapter fileAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Mobile App Development Group Activity 99


setContentView(R.layout.activity_folder_chooser);
ButterKnife.inject(this);
if (pathHistory.isEmpty())
pathHistory.push("/");
if (fileAdapter == null)
fileAdapter = new FileAdapter(getApplicationContext(
R.layout.view_file, listFile);
refreshData();
listViewFile.setAdapter(fileAdapter);
listViewFile.setOnItemClickListener(new OnItemClickListe
@Override
public void onItemClick(AdapterView<?> arg0, View ar
int postition, long arg3) {
final File dir = listFile.get(postition);
pathHistory.push(pathHistory.peek() + dir.getNam
Log.d("click listFile.size()", listFile.size() +
refreshData();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
pathHistory.clear();
if (pathHistory.isEmpty())
pathHistory.push("/");
}

private void refreshData() {


listFile.clear();
String dir = pathHistory.peek();
buttonSelect.setText(String.format("Select '%s'", dir));
File[] files = new File(dir).listFiles();
if (files != null)
for (File f : files)
if (f.isDirectory())

Mobile App Development Group Activity 100


listFile.add(f);
fileAdapter.notifyDataSetChanged();
}

public void select(View v) {


Intent data = new Intent();
data.putExtra(TAG_PATH, pathHistory.peek());
if (getParent() == null) {
setResult(ActionBarActivity.RESULT_OK, data);
} else {
getParent().setResult(ActionBarActivity.RESULT_OK, d
}
finish();
}

@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;

Mobile App Development Group Activity 101


import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

public class GetClientInfo extends AsyncTask<Void, Void, byte[]>


private ActiveUser activeUser;
private ActiveLogin activeLogin;
private ImageView imageView;
public GetClientInfo(ImageView imageView, ActiveUser use
this.activeUser = user;
this.activeLogin = login;
this.imageView = imageView;
}
@Override
protected void onPostExecute(byte[] result) {
try{
Bitmap b = BitmapFactory.decodeByteArray(result
imageView.setImageBitmap(b);
}catch(NullPointerException e){
Log.e(e.getLocalizedMessage(), "from "+ activeUs
}catch(Exception e){
e.printStackTrace();
}
}
@Override
protected byte[] doInBackground(Void... arg0) {
byte[] requestClientInfo = DistributedFileSharingPro
.requestClientInfo(activeUser, activeLogin);
return requestClientInfo;
}

ListUserAdapter.java

Mobile App Development Group Activity 102


package com.ay.filesharing;

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;

class ListUserAdapter extends ArrayAdapter<ActiveUser> {

private Activity activity;


ListUserAdapter(Activity activity, ArrayList<ActiveUser> act
super(activity,R.layout.view_activeuser, activeUsers);
this.activity = activity;
}

Mobile App Development Group Activity 103


@Override
public View getView(int position, View view, ViewGroup paren
View rowView = view;
ViewHolder holder;
if (rowView == null) {
LayoutInflater inflater = (LayoutInflater) getContex
.getSystemService(Context.LAYOUT_INFLATER_SE
rowView = inflater.inflate(R.layout.view_activeuser,
holder = new ViewHolder();
holder.btFTP = (ImageButton) rowView.findViewById(R
holder.btChat = (ImageButton) rowView.findViewById(R
holder.img = (ImageView) rowView.findViewById(R.id.i
holder.txt = (TextView) rowView.findViewById(R.id.tx
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}

((SwipeListView) parent).recycle(rowView, position);

//get target active user


final ActiveUser user = getItem(position);

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

Mobile App Development Group Activity 104


public void onClick(View v) {
i.putExtra(ClientActivity.TAG_START, 0);

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;

Mobile App Development Group Activity 105


import protocol.DistributedFileSharingProtocol;
import util.StateManager;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;

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

Mobile App Development Group Activity 106


false);
swipeListView = (SwipeListView) rootView.findViewById(R
if(list ==null){
ActiveUser u = new ActiveUser();
u.username = "Swipe Down to Refresh";
list = new ArrayList<ActiveUser>();
list.add(u);
}
listUserAdapter = new ListUserAdapter(getActivity(), thi

DisplayMetrics displayMetrics = getActivity().getResourc


//set up swipe right for Chat + FileTransfer
swipeListView.setOffsetRight(displayMetrics.widthPixels
swipeListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPL
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCO
swipeListView.setMultiChoiceModeListener(new AbsList

@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;
}

Mobile App Development Group Activity 107


@Override
public void onDestroyActionMode(ActionMode mode)
swipeListView.unselectedChoiceStates();
}

@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
}

Mobile App Development Group Activity 108


@Override
public void onClickFrontView(int position) {
}

@Override
public void onClickBackView(int position) {
}

@Override
public void onDismiss(int[] reverseSortedPositions)
}

});

swipeListView.setAdapter(listUserAdapter);

//set SwipeLayout for refresh List User


final SwipeRefreshLayout swipeLayout = (SwipeRefreshLayo
.findViewById(R.id.swipe_container);
swipeLayout
.setOnRefreshListener(new SwipeRefreshLayout.OnR

@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;
}

Mobile App Development Group Activity 109


StateManager.deleteItem("activeuser");
protocol.requestActiveUser(activeLogin.u
final ActiveLogin finalActiveLogin = act
new Handler().postDelayed(new Runnable()
@Override
public void run() {
ArrayList<ActiveUser> aLa = (Arr
.getItem("activeuser");
if (aLa != null) {
for(ActiveUser u:aLa)
Log.d("activeuser", u.us
list.clear();
for(ActiveUser au:aLa)
if(au.network.equals(fin
list.add(au);
if(list.isEmpty()){
ActiveUser u = new Activ
u.username = "No Active
list.add(u);
}
listUserAdapter.notifyDataSe
}
swipeLayout.setRefreshing(false)
}
}, 5000);
}
});
swipeLayout.setColorScheme(R.color.light_blue_500,
R.color.red_500,
R.color.green_500,
R.color.yellow_500);
refreshActiveUser();
return rootView;
}

public void refreshActiveUser() {

Mobile App Development Group Activity 110


Log.d("ListUserFragment", "refreshActiveUser called");
new Thread(){
public void run() {
StateManager.deleteItem("activeuser");
ActiveLogin activeLogin = (ActiveLogin) StateMan
if(activeLogin!=null)
DistributedFileSharingProtocol.getInstance()
}
}.start();
Runnable r = new Runnable() {
@Override
public void run() {
ArrayList<ActiveUser> aLa = (ArrayList<ActiveUser>)
.getItem("activeuser");
if (aLa != null) {
list.clear();
ActiveLogin activeLogin = (ActiveLogin) StateMan
for(ActiveUser au:aLa)
if(au.network.equals(activeLogin.ActiveNetwo
list.add(au);
if(list.isEmpty()){
ActiveUser u = new ActiveUser();
u.username = "No Active User";
list.add(u);
}
listUserAdapter.notifyDataSetChanged();
}
Log.d("ListUserFragment", "refreshActiveUser Runnabl
}
};
new Handler().postDelayed(r, 500);
new Handler().postDelayed(r, 1500);
}
}

Mobile App Development Group Activity 111

You might also like