diff --git a/ForceThemDoIt/ForceThemDoIt.iml b/ForceThemDoIt/ForceThemDoIt.iml new file mode 100644 index 0000000..f0fa0fc --- /dev/null +++ b/ForceThemDoIt/ForceThemDoIt.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ForceThemDoIt/README.md b/ForceThemDoIt/README.md new file mode 100644 index 0000000..43480e9 --- /dev/null +++ b/ForceThemDoIt/README.md @@ -0,0 +1,9 @@ +# Force Them Do It +Android mobile app which gives you posibility to anoing people by sending sms messages in small interval of time. +Recipient of messages has possibility to stop this, only by sending eply message. + +Try and enjoy it. + +![alt tag](https://raw.githubusercontent.com/ASV44/cowsay-hackday/master/ForceThemDoIt/screens/Screen%20Shot%202017-04-07%20at%2023.04.57.png) +![alt tag](https://raw.githubusercontent.com/ASV44/cowsay-hackday/master/ForceThemDoIt/screens/Screen%20Shot%202017-04-07%20at%2023.05.16.png) +![alt tag](https://raw.githubusercontent.com/ASV44/cowsay-hackday/master/ForceThemDoIt/screens/Screen%20Shot%202017-04-07%20at%2023.05.32.png) diff --git a/ForceThemDoIt/app/.gitignore b/ForceThemDoIt/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/ForceThemDoIt/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/ForceThemDoIt/app/app.iml b/ForceThemDoIt/app/app.iml new file mode 100644 index 0000000..0ede7d8 --- /dev/null +++ b/ForceThemDoIt/app/app.iml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ForceThemDoIt/app/build.gradle b/ForceThemDoIt/app/build.gradle new file mode 100644 index 0000000..265a44b --- /dev/null +++ b/ForceThemDoIt/app/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "com.example.hackintosh.forcethemdoit" + minSdkVersion 15 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.2.0' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.android.support:design:25.3.1' + compile 'com.android.support:recyclerview-v7:21.0.3' + testCompile 'junit:junit:4.12' +} diff --git a/ForceThemDoIt/app/proguard-rules.pro b/ForceThemDoIt/app/proguard-rules.pro new file mode 100644 index 0000000..035857e --- /dev/null +++ b/ForceThemDoIt/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/hackintosh/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/ForceThemDoIt/app/src/androidTest/java/com/example/hackintosh/forcethemdoit/ExampleInstrumentedTest.java b/ForceThemDoIt/app/src/androidTest/java/com/example/hackintosh/forcethemdoit/ExampleInstrumentedTest.java new file mode 100644 index 0000000..9a75e60 --- /dev/null +++ b/ForceThemDoIt/app/src/androidTest/java/com/example/hackintosh/forcethemdoit/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.hackintosh.forcethemdoit; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.hackintosh.forcethemdoit", appContext.getPackageName()); + } +} diff --git a/ForceThemDoIt/app/src/main/AndroidManifest.xml b/ForceThemDoIt/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b0175c2 --- /dev/null +++ b/ForceThemDoIt/app/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ForceThemDoIt/app/src/main/assets/Milkshake.ttf b/ForceThemDoIt/app/src/main/assets/Milkshake.ttf new file mode 100644 index 0000000..3e4643d Binary files /dev/null and b/ForceThemDoIt/app/src/main/assets/Milkshake.ttf differ diff --git a/ForceThemDoIt/app/src/main/assets/actonia.ttf b/ForceThemDoIt/app/src/main/assets/actonia.ttf new file mode 100755 index 0000000..279b8de Binary files /dev/null and b/ForceThemDoIt/app/src/main/assets/actonia.ttf differ diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/AddSchedule.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/AddSchedule.java new file mode 100644 index 0000000..c904a69 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/AddSchedule.java @@ -0,0 +1,98 @@ +package com.example.hackintosh.forcethemdoit; + +import android.Manifest; +import android.app.AlarmManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.icu.util.Calendar; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class AddSchedule extends AppCompatActivity { + + SmsSender sender; + private DataBase dataBase; + ArrayList recipients2Lists; + private Intent sendSMS; + + private ArrayList recipientsBigList(String recipientsListString, String defaultMessage) { + String[] lines = recipientsListString.split( "\n" ); + ArrayList recList = new ArrayList(); + + for( int i = 0; i < lines.length; i++ ) { + String[] line_elements = lines[i].split("\\s+"); + String message = "Hi "; + for( int j = 0; j < line_elements.length - 1; j++){ + message += line_elements[j] + " "; + } + String[] list = new String[2]; + list[0] = line_elements[line_elements.length - 1]; + message += "! " + defaultMessage; + list[1] = message; + recList.add(list); + } + return recList; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_add_schedule); + this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // Hide keyboard + + final Button sendSms = (Button) findViewById(R.id.sendButton); + dataBase = new DataBase(getApplicationContext()); + final TextView recipientsList = (TextView) findViewById(R.id.recipientsList); + final TextView smsText = (TextView) findViewById(R.id.recipientsText); + final TextView smsInterval = (TextView) findViewById(R.id.sendDelay); + + sendSms.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String recipientsListString = recipientsList.getText().toString(); + String defaultMessage = smsText.getText().toString(); + String smsIntervalText = smsInterval.getText().toString(); + EditText schedule = (EditText) findViewById(R.id.scheduleName); + String scheduleName = schedule.getText().toString(); + int smsIntervalMsec = !smsIntervalText.matches("") ? Integer.parseInt(smsIntervalText) * 1000 : 30 * 1000; + Toast.makeText(AddSchedule.this, "Messages are sending now every " + String.valueOf(smsIntervalMsec) + " msec", Toast.LENGTH_LONG).show(); + recipients2Lists = recipientsBigList(recipientsListString, defaultMessage); + dataBase.populateDB(scheduleName,recipients2Lists); + dataBase.populateFlagTable("1",scheduleName); + sendSMS = new Intent(getApplicationContext(), SmsSender.class); + sendSMS.putExtra("schedule",scheduleName); + startService(sendSMS); + Log.d("TimeInterval", smsInterval.getText().toString()); + startActivity(new Intent(getApplicationContext(),MainActivity.class)); + //stopActivity(); + } + }); + + sender = new SmsSender(); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1); + } + } + + public void stopActivity() { + this.finish(); + } + +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBase.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBase.java new file mode 100644 index 0000000..617cf7c --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBase.java @@ -0,0 +1,174 @@ +package com.example.hackintosh.forcethemdoit; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by hackintosh on 4/2/17. + */ + +public class DataBase { + private SQLiteDatabase db; + private DataBaseHelper dbHelper; + private Context context; + + public DataBase(Context context) { + this.context = context; + dbHelper = new DataBaseHelper(context); + db = dbHelper.getWritableDatabase(); + } + + public void populateDB(String tableName, List victims) { + deleteTable(tableName); + if(!checkIfExist(tableName)) { + dbHelper.addNewReceiversTable(tableName,db); + } + db = dbHelper.getWritableDatabase(); + + for(String[] victim : victims) { + ContentValues values = new ContentValues(); + values.put(DataBaseHelper.ReceiverModel.NUMBER, victim[0]); + values.put(DataBaseHelper.ReceiverModel.MESSAGE, victim[1]); + db.insert(tableName, null, values); + } + showTable(tableName, + DataBaseHelper.ReceiverModel.NUMBER, + DataBaseHelper.ReceiverModel.MESSAGE); + + } + + public void populateFlagTable(String flag, String schedule) { + deleteTable(DataBaseHelper.FlagModel.TABLE_NAME); + if(!checkIfExist(DataBaseHelper.FlagModel.TABLE_NAME)) { + dbHelper.addNewFlagTable(db); + } + ContentValues values = new ContentValues(); + values.put(DataBaseHelper.FlagModel.FLAG, flag); + values.put(DataBaseHelper.FlagModel.SCHEDULE, schedule); + db.insert(DataBaseHelper.FlagModel.TABLE_NAME, null, values); + } + + public boolean checkIfExist(String tableName) { + Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+ tableName +"'", null); + + if(cursor.getCount() <= 0) { return false; } + else { return true; } + } + + public void showTable(String tableName, String tableColumn1, String tableColumn2) { + if(checkIfExist(tableName)) { + Cursor cursor = db.rawQuery("select * from " + tableName, null); + Log.d("Show table","table exist"); + List items = new ArrayList(); + while (cursor.moveToNext()) { + String[] item = new String[2]; + item[0] = cursor.getString( + cursor.getColumnIndexOrThrow(tableColumn1)); + item[1] = cursor.getString( + cursor.getColumnIndexOrThrow(tableColumn2)); + items.add(0, item); + } + cursor.close(); + + for(String[] item: items) { + Log.d("DataBase item_0", "" + item[0]); + Log.d("DataBase item_1", "" + item[1]); + } + + } + else { + Log.d("Show Table", "table doesn't exit"); + } + } + + public String getFlag() { + if(checkIfExist(DataBaseHelper.FlagModel.TABLE_NAME)) { + Cursor cursor = db.rawQuery("select * from " + DataBaseHelper.FlagModel.TABLE_NAME, null); + + String flag = null; + while (cursor.moveToNext()) { + flag = cursor.getString( + cursor.getColumnIndexOrThrow(DataBaseHelper.FlagModel.FLAG)); + } + cursor.close(); + return flag; + } + + return null; + } + + public String getSchedule() { + if(checkIfExist(DataBaseHelper.FlagModel.TABLE_NAME)) { + Cursor cursor = db.rawQuery("select * from " + DataBaseHelper.FlagModel.TABLE_NAME, null); + + String schedule = null; + while (cursor.moveToNext()) { + schedule = cursor.getString( + cursor.getColumnIndexOrThrow(DataBaseHelper.FlagModel.SCHEDULE)); + } + cursor.close(); + return schedule; + } + + return null; + } + + public List getVictims(String schedule) { + String tableName = schedule; + if(checkIfExist(tableName)) { + Cursor cursor = db.rawQuery("select * from " + tableName, null); + + List items = new ArrayList(); + while (cursor.moveToNext()) { + String[] item = new String[2]; + item[0] = cursor.getString( + cursor.getColumnIndexOrThrow(DataBaseHelper.ReceiverModel.NUMBER)); + item[1] = cursor.getString( + cursor.getColumnIndexOrThrow(DataBaseHelper.ReceiverModel.MESSAGE)); + items.add(item); + } + cursor.close(); + + Log.d("DataBase", "" + items); + + return items; + } + + return null; + } + + public void deleteTable(String tableName) { + String SQL_DELETE_ENTRIES = + "DROP TABLE IF EXISTS " + tableName; + db.execSQL(SQL_DELETE_ENTRIES); + } + + public List getDBschedules() { + List schedules = new ArrayList(); + db = dbHelper.getReadableDatabase(); + Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); + + if (cursor.moveToFirst()) { + while ( !cursor.isAfterLast() ) { + Log.d("TableNames",cursor.getString(0)); + if(!cursor.getString(0).equals(DataBaseHelper.FlagModel.TABLE_NAME)) { + schedules.add(cursor.getString(0)); + } + cursor.moveToNext(); + + } + } + for(String schedule: schedules) { + Log.d("DataBase Schedules", "" + schedule); + } + return schedules; + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBaseHelper.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBaseHelper.java new file mode 100644 index 0000000..afaa9d5 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DataBaseHelper.java @@ -0,0 +1,59 @@ +package com.example.hackintosh.forcethemdoit; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.provider.BaseColumns; + +/** + * Created by hackintosh on 4/2/17. + */ + +public class DataBaseHelper extends SQLiteOpenHelper { + public static final int DATABASE_VERSION = 1; + public static final String DATABASE_NAME = "SmsSender.db"; + + public DataBaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + public static class ReceiverModel implements BaseColumns { + public static final String TABLE_NAME = "receivers"; + public static final String NUMBER = "number"; + public static final String MESSAGE = "message"; + } + + public static class FlagModel implements BaseColumns { + public static final String TABLE_NAME = "sendFlag"; + public static final String FLAG = "flag"; + public static final String SCHEDULE = "schedule"; + } + + @Override + public void onCreate(SQLiteDatabase db) { + + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + public void addNewReceiversTable(String tableName, SQLiteDatabase db) { + String table = "CREATE TABLE " + tableName + " (" + + ReceiverModel._ID + " INTEGER PRIMARY KEY," + + ReceiverModel.NUMBER + " TEXT," + + ReceiverModel.MESSAGE + " TEXT)"; + + db.execSQL(table); + } + + public void addNewFlagTable(SQLiteDatabase db) { + String table = "CREATE TABLE " + FlagModel.TABLE_NAME + " (" + + FlagModel._ID + " INTEGER PRIMARY KEY," + + FlagModel.FLAG + " TEXT," + + FlagModel.SCHEDULE + " TEXT)"; + + db.execSQL(table); + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringActivity.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringActivity.java new file mode 100644 index 0000000..842c9b3 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringActivity.java @@ -0,0 +1,104 @@ +package com.example.hackintosh.forcethemdoit; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.app.Activity; +import android.support.v4.content.LocalBroadcastManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import java.util.List; + +public class DeliveringActivity extends Activity { + + private RecyclerView deliverListView; + private RecyclerView.Adapter deliverListAdapter; + private RecyclerView.LayoutManager deliverListManager; + + private List victims; + private Intent sendSMS; + private String scheduleName; + private BroadcastReceiver receiver; + private DataBase dataBase; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_delivering); + + dataBase = new DataBase(getApplicationContext()); + scheduleName = getIntent().getExtras().getString("schedule"); + victims = dataBase.getVictims(scheduleName); + + TextView header = (TextView) findViewById(R.id.delivering); + if(isMyServiceRunning(SmsSender.class)) { + header.setText("Delivering On"); + } + else { + header.setText("Delivering Off"); + } + + deliverListView = (RecyclerView) findViewById(R.id.receivers_list); + deliverListManager = new LinearLayoutManager(this); + deliverListView.setLayoutManager(deliverListManager); + deliverListAdapter = new DeliveringListAdapter(victims); + deliverListView.setAdapter(deliverListAdapter); + + Button button = (Button) findViewById(R.id.stopDelivering); + if(isMyServiceRunning(SmsSender.class)) { + button.setText("Stop Delivering"); + } + else { + button.setText("Start Delivering"); + } + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sendSMS = new Intent(getApplicationContext(), SmsSender.class); + sendSMS.putExtra("schedule",scheduleName); + if(isMyServiceRunning(SmsSender.class)) { + stopService(sendSMS); + } + else { + startService(sendSMS); + } + stopActivity(); + } + }); + + receiver = new BroadcastReceiver(){ + + @Override + public void onReceive(Context context, Intent intent) { + Log.d("onReceive","Works"); +// time = intent.getExtras().getInt("time"); +// lexiconDB.setNotificationTIme(time); + dataBase.populateFlagTable("0",scheduleName); + stopService(sendSMS); + } + }; + LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("STOP_SMS")); + } + + private boolean isMyServiceRunning(Class serviceClass) { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + + public void stopActivity() { + this.finish(); + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringListAdapter.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringListAdapter.java new file mode 100644 index 0000000..ee5e6d5 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/DeliveringListAdapter.java @@ -0,0 +1,55 @@ +package com.example.hackintosh.forcethemdoit; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.List; + +/** + * Created by hackintosh on 4/7/17. + */ + +public class DeliveringListAdapter extends RecyclerView.Adapter { + + private ViewHolder viewHolder; + private List receivers; + + public DeliveringListAdapter(List receivers) { + this.receivers = receivers; + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + // each data item is just a string in this case + + public TextView mMessage; + public TextView mNumber; + public ViewHolder(View v) { + super(v); + mMessage = (TextView) v.findViewById(R.id.message); + mNumber = (TextView) v.findViewById(R.id.number); + } + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.receivers_model,parent,false); + ViewHolder viewHolder = new ViewHolder(view); + this.viewHolder = viewHolder; + return viewHolder; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.mMessage.setText(receivers.get(position)[1]); + holder.mNumber.setText(receivers.get(position)[0]); + } + + + @Override + public int getItemCount() { + return receivers.size(); + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/MainActivity.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/MainActivity.java new file mode 100644 index 0000000..962b238 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/MainActivity.java @@ -0,0 +1,134 @@ +package com.example.hackintosh.forcethemdoit; + +import android.Manifest; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.graphics.Typeface; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.LocalBroadcastManager; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import java.util.HashMap; +import java.util.Map; + +public class MainActivity extends AppCompatActivity { + + SmsSender sender; + Intent sendSMS; + private List victims; + List projectsList = new ArrayList<>(); + + private RecyclerView scheduleListView; + private RecyclerView.Adapter scheduleListAdapter; + private RecyclerView.LayoutManager scheduleListManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + TextView header = (TextView) findViewById(R.id.header); + Typeface typeface = Typeface.createFromAsset(getAssets(),"Milkshake.ttf"); + header.setTypeface(typeface); + TextView scheduleText = (TextView) findViewById(R.id.scheduleText); + scheduleText.setTypeface(typeface); + +// victims = new ArrayList(); +// victims.add(new String[] {"060642415","Hi, We are developing and testing SMS Sender Now.\nYou are our victim"}); +// victims.add(new String[] {"069000000","Hi, We are developing and testing SMS Sender Now.\nYou are our victim"}); +// victims.add(new String[] {"069111111","Hi, We are developing and testing SMS Sender Now.\nYou are our victim"}); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1); + } + //sender.sendSms("068591082", "Test Message"); + DataBase dataBase = new DataBase(getApplicationContext()); + dataBase.deleteTable("android_metadata"); + //dataBase.populateDB(victims); + //dataBase.populateFlagTable("1"); + //victims = dataBase.getVictims(); + //sendSMS = new Intent(this, SmsSender.class); + //sendSMS.putExtra("victims",victims); + //startService(sendSMS); + FloatingActionButton newSchedule = (FloatingActionButton) findViewById(R.id.addSchedule); + + newSchedule.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), AddSchedule.class); + startActivity(intent); + stopActivity(); + } + }); + +// dummyList(); + + scheduleListView = (RecyclerView) findViewById(R.id.scheduleList); + + scheduleListManager = new LinearLayoutManager(this); + scheduleListView.setLayoutManager(scheduleListManager); + + projectsList = dataBase.getDBschedules(); + if (projectsList.isEmpty()) { + TextView emptyList = (TextView) findViewById(R.id.empty_list); + emptyList.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(v.getContext(), AddSchedule.class); + startActivity(intent); + stopActivity(); + } + }); + emptyList.setVisibility(View.VISIBLE); + } + scheduleListAdapter = new ScheduleListAdapter(projectsList); + scheduleListView.setAdapter(scheduleListAdapter); + + + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + switch (requestCode) { + case 1: { + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.d("SMS_permission","Permitted"); + } else { + Log.d("SMS_permission","Failed"); + } + return; + } + } + } + + public void dummyList() { + for(int i = 0; i < 10; i++) { + projectsList.add(i,"Element" + i); + } + } + + public void stopActivity() { + this.finish(); + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/ScheduleListAdapter.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/ScheduleListAdapter.java new file mode 100644 index 0000000..e14f897 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/ScheduleListAdapter.java @@ -0,0 +1,64 @@ +package com.example.hackintosh.forcethemdoit; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by strainu on 01.04.2017. + */ + +public class ScheduleListAdapter extends RecyclerView.Adapter { + List scheduleList; + ViewHolder viewHolder; + + public ScheduleListAdapter(List scheduleList) { + this.scheduleList = scheduleList; + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + // each data item is just a string in this case + + public TextView mText; + public ViewHolder(View v) { + super(v); + mText = (TextView) v.findViewById(R.id.myText); + mText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(v.getContext(),DeliveringActivity.class); + intent.putExtra("schedule",mText.getText().toString()); + v.getContext().startActivity(intent); + } + }); + } + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false); + ViewHolder viewHolder = new ViewHolder(view); + this.viewHolder = viewHolder; + return viewHolder; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Log.d("myTag", String.valueOf(position)); + holder.mText.setText(scheduleList.get(position)); + } + + @Override + public int getItemCount() { + return scheduleList.size(); + } + +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsMonitor.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsMonitor.java new file mode 100644 index 0000000..3a273fb --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsMonitor.java @@ -0,0 +1,61 @@ +package com.example.hackintosh.forcethemdoit; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; +import android.telephony.SmsMessage; +import android.util.Log; + +import java.util.HashMap; +import java.util.List; + +/** + * Created by hackintosh on 4/1/17. + */ + +public class SmsMonitor extends BroadcastReceiver { + private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; + + private SmsMessage messages; + private List victims; + private DataBase dataBase; + + public SmsMonitor() { + } + + public SmsMonitor(List victims) { + this.victims = victims; + } + + @Override + public void onReceive(Context context, Intent intent) { + Log.d("BroadcastReceiver","Receive"); + if(dataBase == null) { + dataBase = new DataBase(context); + } + victims = dataBase.getVictims(dataBase.getSchedule()); + if (intent != null && intent.getAction() != null && + ACTION.compareToIgnoreCase(intent.getAction()) == 0) { + Object[] pduArray = (Object[]) intent.getExtras().get("pdus"); + for (Object aPduArray : pduArray) { + messages = SmsMessage.createFromPdu((byte[]) aPduArray); + Log.d("Message",messages.getMessageBody().toString()); + Log.d("Address","" + messages.getDisplayOriginatingAddress()); + for(String[] victim : victims) { + if(victim[0].contains("0" + messages.getDisplayOriginatingAddress().substring(4))) { + Log.d("Victim","number in List"); + //Log.d("currentNumbers","" + victims); + //currentNumbers.remove(messages.getDisplayOriginatingAddress()); +// Intent serviceIntent = new Intent(context,SmsSender.class); +// //Activity activity = (Activity) context; +// context.stopService(serviceIntent); + Intent localIntent = new Intent ("STOP_SMS"); + LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent); + } + } + } + } + } +} diff --git a/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsSender.java b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsSender.java new file mode 100644 index 0000000..12376c1 --- /dev/null +++ b/ForceThemDoIt/app/src/main/java/com/example/hackintosh/forcethemdoit/SmsSender.java @@ -0,0 +1,138 @@ +package com.example.hackintosh.forcethemdoit; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.CountDownTimer; +import android.os.IBinder; +import android.os.Vibrator; +import android.support.annotation.Nullable; +import android.telephony.SmsManager; +import android.util.Log; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by hackintosh on 4/1/17. + */ + +public class SmsSender extends Service { + SmsManager smsManager; + Intent sendSMSIntent; + List victims; //= new HashMap(); + private String scheduleName; + private int time; + private CountDownTimer timer; + private DataBase dataBase; + private int flag; //if 1 messages are send, else nothing + + @Override + public void onCreate() { + Log.d("Service","create"); + super.onCreate(); + smsManager = SmsManager.getDefault(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d("Service", "start"); + dataBase = new DataBase(getApplicationContext()); + dataBase.showTable(DataBaseHelper.ReceiverModel.TABLE_NAME, + DataBaseHelper.ReceiverModel.NUMBER, + DataBaseHelper.ReceiverModel.MESSAGE); + sendSMSIntent = intent; + //victims = (HashMap) intent.getSerializableExtra("victims"); + scheduleName = intent.getExtras().getString("schedule"); + victims = dataBase.getVictims(scheduleName); + flag = Integer.parseInt(dataBase.getFlag()); + time = 60000; + for(String[] victim : victims) { + Log.d("Victims",victim[0] + " " + victim[1]); + } + sendMessagePeriodically(); + return START_REDELIVER_INTENT; + } + + @Override + public void onDestroy() { + super.onDestroy(); + // STOP YOUR TASKS + Log.d("Service", "Stop and Destroy"); + timer.cancel(); + if(flag <= 0) { + shuflleVictims(); + dataBase.populateDB(scheduleName,victims); + stopSelf(); + restartService(); + } + stopSelf(); + + } + + @Override + public void onTaskRemoved(Intent rootIntent) { + Log.d("Service", "TASK REMOVED"); + stopSelf(); + super.onTaskRemoved(rootIntent); + } + + + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + public void sendMessagePeriodically() { + final int tick = 1000; + + timer = new CountDownTimer(time,tick) { + @Override + public void onTick(long l) { + time -= tick; + Log.d("Time_tick","" + time); + } + + @Override + public void onFinish() { + time = 60000; + sendMessagePeriodically(); + Log.d("Time","" + time); + Log.d("Flag","" + flag); + if(flag > 0) { + Log.d("Send SMS to " + victims.get(0)[0], "Message:" + victims.get(0)[1]); + sendSms(victims.get(0)[0], victims.get(0)[1]); + } + } + }.start(); + } + + public void sendSms(String number, String message) { + smsManager.sendTextMessage(number, null, message, null, null); + } + + public void restartService() { + startService(sendSMSIntent); + } + + public void shuflleVictims() { + String[] temp = null; + for(int i = 0; i < victims.size(); i++) { + if(i == 0) { + temp = victims.get(i); + } + if(i == victims.size() - 1) { + victims.set(i,temp); + } + else { + victims.set(i,victims.get(i + 1)); + } + } + } +} diff --git a/ForceThemDoIt/app/src/main/res/drawable-hdpi/ic_action_plus.png b/ForceThemDoIt/app/src/main/res/drawable-hdpi/ic_action_plus.png new file mode 100644 index 0000000..fb70e73 Binary files /dev/null and b/ForceThemDoIt/app/src/main/res/drawable-hdpi/ic_action_plus.png differ diff --git a/ForceThemDoIt/app/src/main/res/drawable-mdpi/ic_action_plus.png b/ForceThemDoIt/app/src/main/res/drawable-mdpi/ic_action_plus.png new file mode 100644 index 0000000..278f816 Binary files /dev/null and b/ForceThemDoIt/app/src/main/res/drawable-mdpi/ic_action_plus.png differ diff --git a/ForceThemDoIt/app/src/main/res/drawable-xhdpi/ic_action_plus.png b/ForceThemDoIt/app/src/main/res/drawable-xhdpi/ic_action_plus.png new file mode 100644 index 0000000..454cd4f Binary files /dev/null and b/ForceThemDoIt/app/src/main/res/drawable-xhdpi/ic_action_plus.png differ diff --git a/ForceThemDoIt/app/src/main/res/drawable-xxhdpi/ic_action_plus.png b/ForceThemDoIt/app/src/main/res/drawable-xxhdpi/ic_action_plus.png new file mode 100644 index 0000000..6c8df63 Binary files /dev/null and b/ForceThemDoIt/app/src/main/res/drawable-xxhdpi/ic_action_plus.png differ diff --git a/ForceThemDoIt/app/src/main/res/layout/activity_add_schedule.xml b/ForceThemDoIt/app/src/main/res/layout/activity_add_schedule.xml new file mode 100644 index 0000000..95c014c --- /dev/null +++ b/ForceThemDoIt/app/src/main/res/layout/activity_add_schedule.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + +