diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..f34e436 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +DnD Service \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..526b4c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..277db36 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ddcaa5e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.example.dndservice" + minSdk 26 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/dndservice/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/dndservice/ExampleInstrumentedTest.java new file mode 100644 index 0000000..a16fa5a --- /dev/null +++ b/app/src/androidTest/java/com/example/dndservice/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.dndservice; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.dndservice", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e8d3c6b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/alert-playstore.png b/app/src/main/alert-playstore.png new file mode 100644 index 0000000..327f829 Binary files /dev/null and b/app/src/main/alert-playstore.png differ diff --git a/app/src/main/java/com/example/dndservice/CallActivity.java b/app/src/main/java/com/example/dndservice/CallActivity.java new file mode 100644 index 0000000..a82b722 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/CallActivity.java @@ -0,0 +1,283 @@ +package com.example.dndservice; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.provider.CallLog; +import android.telephony.SmsManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.dndservice.data.MyDbHandler; +import com.google.android.material.color.MaterialColors; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Locale; + + +public class CallActivity extends AppCompatActivity { + private TextView textView2; + EditText text_description2; + SimpleDateFormat formatter; + String pNumber, strDate , s1 , s2; + private Spinner spinner2; + List list ; + int spinnerPosition; + public String Message; + Cursor cursorCallLogs; + MyDbHandler db; + String SimState; + int subscriptionId; + Dialog alertDialog; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_call); + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CALL_LOG},0); + spinner2 = findViewById(R.id.spinner2); + list = new ArrayList<> (); + textView2 = findViewById(R.id.textView2); + text_description2 = findViewById(R.id.description2); + pNumber = ""; + db = new MyDbHandler(this); + + alertDialog = new Dialog(this); + alertDialog.setContentView(R.layout.already_sent_dialog_box); + alertDialog.getWindow().setBackgroundDrawable(getDrawable(R.drawable.background)); + alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); + alertDialog.setCancelable(false); + alertDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; + + Button no = alertDialog.findViewById(R.id.button11); + Button yes = alertDialog.findViewById(R.id.button12); + + no.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + alertDialog.dismiss(); + } + }); + + yes.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MyMessage(); + alertDialog.dismiss(); + } + }); + } + + public void back(View view) { + onBackPressed(); + } + + public void home(View view) { + Intent intent = new Intent(this,MainActivity.class); + startActivity(intent); + } + + @SuppressLint("ResourceAsColor") + public void fetchLogs(View view){ + int permissionCheck = ContextCompat.checkSelfPermission(this , Manifest.permission.READ_CALL_LOG); + if(permissionCheck == PackageManager.PERMISSION_GRANTED) { + String s0 = "Call Logging Started..."; + textView2.setText(s0); + + Uri allCalls = Uri.parse("content://call_log/calls"); + cursorCallLogs = getContentResolver().query(allCalls, null, null, null); + /* + Above one requires higher API so did something with lower API + changed min SDK TO 26 IN BUILD.gradle(:app) + Cursor cursorCallLogs = managedQuery(allCalls, null, null, null, null); + */ + cursorCallLogs.moveToFirst(); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, list); + //adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner2.setAdapter(adapter); + do { + int num = cursorCallLogs.getColumnIndex(CallLog.Calls.NUMBER); + int name = cursorCallLogs.getColumnIndex(CallLog.Calls.CACHED_NAME); + String stringNumber = cursorCallLogs.getString(num); + String stringName = cursorCallLogs.getString(name); + String s4 = stringNumber + "-" + stringName; + list.add(s4); + } while (cursorCallLogs.moveToNext()); + adapter.notifyDataSetChanged(); + s0 = "Check dropdown list and select!!"; + int color = MaterialColors.getColor(findViewById(R.id.textView2), R.attr.colorTertiary); + textView2.setTextColor(color); + textView2.setText(s0); + spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + spinnerPosition = spinner2.getSelectedItemPosition(); + s2 = setString2(spinnerPosition, allCalls); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + cursorCallLogs.close(); + }else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALL_LOG} , 0); + } + } + + public String setString1(@NonNull EditText text_description2) { + return text_description2.getText().toString().trim(); + } + + @NonNull + public String setString2(int spinnerPosition, Uri allCalls){ + cursorCallLogs = getContentResolver().query(allCalls, null, null, null); + cursorCallLogs.moveToFirst(); + cursorCallLogs.move(spinnerPosition); + int pNum = cursorCallLogs.getColumnIndex(CallLog.Calls.NUMBER); + pNumber = cursorCallLogs.getString(pNum); + + int intDate = cursorCallLogs.getColumnIndex(android.provider.CallLog.Calls.DATE); + String callDate = cursorCallLogs.getString(intDate); + subscriptionId = cursorCallLogs.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID);//00 + long seconds=Long.parseLong(callDate); + formatter = new SimpleDateFormat("dd/MM/yy", Locale.getDefault()); + strDate = formatter.format(new Date(seconds)); + return pNumber + +", " + +strDate; + } + + public void btn_send(View view){ + s1 = setString1(text_description2); + Message = s1 + ", " + s2; + int permissionCheckSendSms = ContextCompat.checkSelfPermission(this , Manifest.permission.SEND_SMS); + if(permissionCheckSendSms == PackageManager.PERMISSION_GRANTED) + { + if(!text_description2.equals("") && text_description2.getText().toString().length() > 0){ + if(!db.CheckIsDataAlreadyInDBorNot(pNumber)){//00 + MyMessage(); + }else { + alertDialog.show(); + //Toast.makeText(this,"Already reported", Toast.LENGTH_LONG).show(); + } + }else{ + Toast.makeText(this,"Enter complete details!", Toast.LENGTH_LONG).show(); + } + } + else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS} , 0); + } + + } + + private String dateTimeNow(){ + Date c = Calendar.getInstance().getTime(); + SimpleDateFormat df = new SimpleDateFormat("hh:mm a dd/MM/yy", Locale.getDefault()); + return df.format(c); + } + + public boolean isSimExists() { + TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + int SIM_STATE = telephonyManager.getSimState(); + + + switch (SIM_STATE) { + case TelephonyManager.SIM_STATE_READY: + return true; + case TelephonyManager.SIM_STATE_ABSENT: + SimState = "No Sim Found!"; + break; + case TelephonyManager.SIM_STATE_NETWORK_LOCKED: + SimState = "Network Locked!"; + break; + case TelephonyManager.SIM_STATE_PIN_REQUIRED: + SimState = "PIN Required to access SIM!"; + break; + case TelephonyManager.SIM_STATE_PUK_REQUIRED: + SimState = "PUK Required to access SIM!"; + // Personal + // Unblocking Code + break; + case TelephonyManager.SIM_STATE_UNKNOWN: + SimState = "Unknown SIM State!"; + break; + case TelephonyManager.SIM_STATE_CARD_IO_ERROR: + SimState = "Sim Card to error!"; + break; + case TelephonyManager.SIM_STATE_CARD_RESTRICTED: + SimState = "Sim card Restricted!"; + break; + case TelephonyManager.SIM_STATE_NOT_READY: + SimState = "Sim not ready!"; + break; + case TelephonyManager.SIM_STATE_PERM_DISABLED: + SimState = "Sim Perm Disabled!"; + break; + } + return false; + } + + private void MyMessage() { + String phoneNumber = "7014942422"; + int permissionCheck_ReadPhoneState = ContextCompat.checkSelfPermission(this , Manifest.permission.READ_PHONE_STATE); + if(permissionCheck_ReadPhoneState == PackageManager.PERMISSION_GRANTED){ + if(isSimExists()){ + SubscriptionManager localSubscriptionManager = SubscriptionManager.from(this); + if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {//00 + List localList = localSubscriptionManager.getActiveSubscriptionInfoList(); + + SubscriptionInfo simInfo1 = localList.get(0); + SubscriptionInfo simInfo2 = localList.get(1); + + if(subscriptionId == simInfo1.getSubscriptionId()){ +// SmsManager.getSmsManagerForSubscriptionId(simInfo1.getSubscriptionId()) +// .sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + }else{ +// SmsManager.getSmsManagerForSubscriptionId(simInfo2.getSubscriptionId()) +// .sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + } + }else{ +// SmsManager.getDefault().sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(this, SimState+ " " + "Cannot send SMS", Toast.LENGTH_LONG).show(); + } + }else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE} , 0); + } + String dateTimeNow = dateTimeNow(); + // TODO: What if SMS Sending failed + db.addContact(pNumber,"AlreadyDone",strDate,dateTimeNow); + Toast.makeText(this,pNumber, Toast.LENGTH_SHORT).show(); + db.close(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dndservice/MainActivity.java b/app/src/main/java/com/example/dndservice/MainActivity.java new file mode 100644 index 0000000..71a8878 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/MainActivity.java @@ -0,0 +1,30 @@ +package com.example.dndservice; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } + + public void goToSmsActivity(View view) { + Intent intent = new Intent(this,SmsActivity.class); + startActivity(intent); + } + public void goToCallActivity(View view) { + Intent intent = new Intent(this,CallActivity.class); + startActivity(intent); + } + + public void goToRecordsActivity(View view) { + Intent intent = new Intent(this,Records.class); + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dndservice/Records.java b/app/src/main/java/com/example/dndservice/Records.java new file mode 100644 index 0000000..798b751 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/Records.java @@ -0,0 +1,75 @@ +package com.example.dndservice; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.example.dndservice.data.MyDbHandler; +import com.example.dndservice.model.Contact; + +import java.util.ArrayList; +import java.util.List; + +public class Records extends AppCompatActivity { + ListView listView; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_records); + MyDbHandler db = new MyDbHandler(Records.this);//00 + /* + // Creating a contact for the db + Contact harry = new Contact(); + harry.setPhoneNumber("9090909090"); + harry.setName("Harry"); + + // Adding a contact to the db + db.addContact(harry); + //Log.d("dbharry","Id for harry successfully added to the db"); + */ + + //db.addContact("test","1910","01/01/2001","01/04/2001"); + + /* + harry.setId(1); + harry.setName("Changed Harry"); + harry.setPhoneNumber("121212"); + int affectedRows = db.updateContact(harry); + Log.d("dbharry","No of affected rows are: " + affectedRows); + */ + + releaseDataToUser(db); + db.close(); + } + + public void back(View view) { + onBackPressed(); + } + + public void home(View view) { + Intent intent = new Intent(this,MainActivity.class); + startActivity(intent); + } + + public void releaseDataToUser(MyDbHandler db){ + List allContacts = db.getAllContacts(); + ArrayList contacts = new ArrayList(); + + for(Contact contact: allContacts){ + //Log.d("dbharry","Id: " + contact.getId() + "\n" + "Name: " + contact.getName() + "\n" + "Phone Number: " + contact.getPhoneNumber()); + contacts.add(contact.getName() + + "\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t- " + + contact.getDateReport()); + } + + + listView = findViewById(R.id.listView); + ArrayAdapter arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contacts);//contacts + listView.setAdapter(arrayAdapter); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dndservice/SmsActivity.java b/app/src/main/java/com/example/dndservice/SmsActivity.java new file mode 100644 index 0000000..f6caa27 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/SmsActivity.java @@ -0,0 +1,280 @@ +package com.example.dndservice; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import android.Manifest; +import android.app.Dialog; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Telephony; +import android.telephony.SmsManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.dndservice.data.MyDbHandler; +import com.google.android.material.color.MaterialColors; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +public class SmsActivity extends AppCompatActivity { + private TextView textView; + SimpleDateFormat formatter; + String stringSender, strDate, s1 ; + private Spinner spinner; + List list ; + int spinnerPosition; + public String Message; + Cursor cursorSms; + MyDbHandler db; + String SimState; + int subscriptionId; + Dialog alertDialog; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sms); + + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},0); + spinner = findViewById(R.id.spinner); + list = new ArrayList<>(); + + textView = findViewById(R.id.textView); + db = new MyDbHandler(this); + stringSender = ""; + + alertDialog = new Dialog(this); + alertDialog.setContentView(R.layout.already_sent_dialog_box); + alertDialog.getWindow().setBackgroundDrawable(getDrawable(R.drawable.background)); + alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); + alertDialog.setCancelable(false); + alertDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; + + Button no = alertDialog.findViewById(R.id.button11); + Button yes = alertDialog.findViewById(R.id.button12); + + no.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + alertDialog.dismiss(); + } + }); + + yes.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MyMessage(); + alertDialog.dismiss(); + } + }); + } + + public void back(View view) { + onBackPressed(); + } + + public void home(View view) { + Intent intent = new Intent(this,MainActivity.class); + startActivity(intent); + } + + public void fetchSms(View view){ + int permissionCheckReadSms = ContextCompat.checkSelfPermission(this , Manifest.permission.READ_SMS); + if(permissionCheckReadSms == PackageManager.PERMISSION_GRANTED) { + String s0 = "SMS Fetching Started..."; + textView.setText(s0); + Uri allSms = Uri.parse("content://sms/inbox"); + cursorSms = getContentResolver().query(allSms,null,null,null); + cursorSms.moveToFirst(); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, list); + spinner.setAdapter(adapter); + do { + int sender = cursorSms.getColumnIndex(Telephony.Sms.ADDRESS); + int body = cursorSms.getColumnIndex(Telephony.Sms.BODY); + //int time = cursorSms.getColumnIndex(Telephony.Sms.DATE); + stringSender = cursorSms.getString(sender); + String stringBody = cursorSms.getString(body); + //String time = cursorSms.getString(time);//Needs to be fixed + String s4 = stringSender + + "\n\t" + stringBody + //+ "\n\t" + time + + "\n";//not in use as of now because content is shrunk + list.add(s4); + } while (cursorSms.moveToNext()); + adapter.notifyDataSetChanged(); + s0 = "Check dropdown list and select!!"; + int color = MaterialColors.getColor(findViewById(R.id.textView), R.attr.colorTertiary); + textView.setTextColor(color); + textView.setText(s0); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + spinnerPosition = spinner.getSelectedItemPosition(); + s1 = setString2(spinnerPosition, allSms); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + cursorSms.close(); + }else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS} , 0); + } + } + + + @NonNull + public String setString2(int spinnerPosition, Uri allSms){ + cursorSms = getContentResolver().query(allSms, null, null, null); + cursorSms.moveToFirst(); + cursorSms.move(spinnerPosition); + int ucc = cursorSms.getColumnIndex(Telephony.Sms.BODY); + String stringUcc = cursorSms.getString(ucc); + int sender = cursorSms.getColumnIndex(Telephony.Sms.ADDRESS); + stringSender = cursorSms.getString(sender); + + int intDate = cursorSms.getColumnIndex(Telephony.Sms.DATE); + String callDate = cursorSms.getString(intDate); + + subscriptionId = cursorSms.getColumnIndex(Telephony.Sms.SUBSCRIPTION_ID);//00 + + long seconds=Long.parseLong(callDate); + formatter = new SimpleDateFormat("dd/MM/yy", Locale.getDefault()); + strDate = formatter.format(new Date(seconds)); + return stringUcc + + ", " + +stringSender + +", " + +strDate; + } + + public void btn_send(View view){ + int permissionCheckSendSms = ContextCompat.checkSelfPermission(this , Manifest.permission.SEND_SMS); + if(permissionCheckSendSms == PackageManager.PERMISSION_GRANTED) + { + Message = s1; + if(!stringSender.equals("")){ + if(!db.CheckIsDataAlreadyInDBorNot(stringSender)){ + MyMessage(); + }else { + alertDialog.show(); + //Toast.makeText(this,"Already reported", Toast.LENGTH_LONG).show(); + } + }else{ + Toast.makeText(this,"Click Fetch SMS Button First !", Toast.LENGTH_LONG).show(); + } + } + else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS} , 0); + } + } + + private String dateTimeNow(){ + Date c = Calendar.getInstance().getTime(); + SimpleDateFormat df = new SimpleDateFormat("hh:mm a dd/MM/yy", Locale.getDefault()); + return df.format(c); + } + + public boolean isSimExists() { + TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + int SIM_STATE = telephonyManager.getSimState(); + + + switch (SIM_STATE) { + case TelephonyManager.SIM_STATE_READY: + return true; + case TelephonyManager.SIM_STATE_ABSENT: + SimState = "No Sim Found!"; + break; + case TelephonyManager.SIM_STATE_NETWORK_LOCKED: + SimState = "Network Locked!"; + break; + case TelephonyManager.SIM_STATE_PIN_REQUIRED: + SimState = "PIN Required to access SIM!"; + break; + case TelephonyManager.SIM_STATE_PUK_REQUIRED: + SimState = "PUK Required to access SIM!"; + // Personal + // Unblocking Code + break; + case TelephonyManager.SIM_STATE_UNKNOWN: + SimState = "Unknown SIM State!"; + break; + case TelephonyManager.SIM_STATE_CARD_IO_ERROR: + SimState = "Sim Card to error!"; + break; + case TelephonyManager.SIM_STATE_CARD_RESTRICTED: + SimState = "Sim card Restricted!"; + break; + case TelephonyManager.SIM_STATE_NOT_READY: + SimState = "Sim not ready!"; + break; + case TelephonyManager.SIM_STATE_PERM_DISABLED: + SimState = "Sim Perm Disabled!"; + break; + } + return false; + } + + private void MyMessage() { + String phoneNumber = "7014942422"; + int permissionCheck_ReadPhoneState = ContextCompat.checkSelfPermission(this , Manifest.permission.READ_PHONE_STATE); + if(permissionCheck_ReadPhoneState == PackageManager.PERMISSION_GRANTED){ + if(isSimExists()){ + SubscriptionManager localSubscriptionManager = SubscriptionManager.from(this); + if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {//00 + List localList = localSubscriptionManager.getActiveSubscriptionInfoList(); + + SubscriptionInfo simInfo1 = localList.get(0); + SubscriptionInfo simInfo2 = localList.get(1); + + if(subscriptionId == simInfo1.getSubscriptionId()){ +// SmsManager.getSmsManagerForSubscriptionId(simInfo1.getSubscriptionId()) +// .sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + }else{ +// SmsManager.getSmsManagerForSubscriptionId(simInfo2.getSubscriptionId()) +// .sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + } + }else{ +// SmsManager.getDefault().sendTextMessage(phoneNumber, null, Message, null, null); + Toast.makeText(this, Message , Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(this, SimState+ " " + "Cannot send SMS", Toast.LENGTH_LONG).show(); + } + }else{ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE} , 0); + } + String dateTimeNow = dateTimeNow(); + // TODO: What if SMS Sending failed + db.addContact(stringSender,"AlreadyDone",strDate,dateTimeNow); + //Toast.makeText(this,stringSender, Toast.LENGTH_SHORT).show(); + db.close(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dndservice/data/MyDbHandler.java b/app/src/main/java/com/example/dndservice/data/MyDbHandler.java new file mode 100644 index 0000000..d2a5648 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/data/MyDbHandler.java @@ -0,0 +1,126 @@ +package com.example.dndservice.data; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import com.example.dndservice.model.Contact; +import com.example.dndservice.params.Params; + +import java.util.ArrayList; +import java.util.List; + +public class MyDbHandler extends SQLiteOpenHelper { + + public MyDbHandler(Context context) { + super(context, Params.DB_NAME, null, Params.DB_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String create = "CREATE TABLE " + Params.TABLE_NAME + "(" + + Params.KEY_ID + " INTEGER PRIMARY KEY," + + Params.KEY_NAME + " TEXT, " + + Params.KEY_STATUS + " TEXT, " + + Params.KEY_DATE_REC + " TEXT, " + + Params.KEY_DATE_REPORT + " TEXT" + + ")"; + Log.d("phi", "Query being run is : "+ create); + db.execSQL(create); + + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + public void addContact(Contact contact){ + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(Params.KEY_NAME, contact.getName()); + values.put(Params.KEY_STATUS, contact.getStatus()); + values.put(Params.KEY_DATE_REC, contact.getDateRec()); + values.put(Params.KEY_DATE_REPORT, contact.getDateReport()); + db.insert(Params.TABLE_NAME, null, values); + Log.d("phi", "Successfully inserted"); + db.close(); + } + + public void addContact(String name, String status, String dateRec, String dateReport){ + SQLiteDatabase db = this.getWritableDatabase(); + // Adding a contact to the db + ContentValues values = new ContentValues(); + values.put(Params.KEY_NAME, name); + values.put(Params.KEY_STATUS, status); + values.put(Params.KEY_DATE_REC, dateRec); + values.put(Params.KEY_DATE_REPORT, dateReport); + + db.insert(Params.TABLE_NAME, null, values); + db.close(); + } + + public List getAllContacts(){ + List contactList = new ArrayList<>(); + SQLiteDatabase db = this.getReadableDatabase(); + // Generate the query to read from the database + String select = "SELECT * FROM " + Params.TABLE_NAME; + Cursor cursor = db.rawQuery(select, null); + + // Loop through now + //00 Edited : cursor ko reverse me chalaya + if(cursor.moveToLast()){ + do{ + Contact contact = new Contact(); + contact.setId(Integer.parseInt(cursor.getString(0))); + contact.setName(cursor.getString(1)); + contact.setStatus(cursor.getString(2)); + contact.setDateRec(cursor.getString(3)); + contact.setDateReport(cursor.getString(4)); + contactList.add(contact); + }while(cursor.moveToPrevious()); + } + return contactList; + } + + public int updateContact(Contact contact){ + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(Params.KEY_NAME, contact.getName()); + values.put(Params.KEY_STATUS, contact.getStatus()); + values.put(Params.KEY_DATE_REC, contact.getDateRec()); + values.put(Params.KEY_DATE_REPORT, contact.getDateReport()); + //Lets update now + return db.update(Params.TABLE_NAME, values, Params.KEY_ID + "=?", + new String[]{String.valueOf(contact.getId())}); + } + + public void deleteContactById(int id){ + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(Params.TABLE_NAME, Params.KEY_ID +"=?", new String[]{String.valueOf(id)}); + db.close(); + } + + public void deleteContact(Contact contact){ + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(Params.TABLE_NAME, Params.KEY_ID +"=?", new String[]{String.valueOf(contact.getId())}); + db.close(); + } + + public boolean CheckIsDataAlreadyInDBorNot(String fieldValue) { + SQLiteDatabase db = this.getReadableDatabase(); + String Query = "Select * from " + Params.TABLE_NAME + " where " + Params.KEY_NAME + " = \"" + fieldValue + "\";"; + Cursor cursor = db.rawQuery(Query, null); + if(cursor.getCount() <= 0){ + cursor.close(); + return false; + } + cursor.close(); + return true; + } +} diff --git a/app/src/main/java/com/example/dndservice/model/Contact.java b/app/src/main/java/com/example/dndservice/model/Contact.java new file mode 100644 index 0000000..69999e0 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/model/Contact.java @@ -0,0 +1,66 @@ +package com.example.dndservice.model; + +public class Contact { + private int id; + private String name; + private String status; + private String dateRec; + private String dateReport; + public Contact(String name, String status, String dateRec, String dateReport) { + this.name = name; + this.status = status; + this.dateRec = dateRec; + this.dateReport = dateReport; + } + + public Contact(int id, String name, String status, String dateRec, String dateReport) { + this.id = id; + this.name = name; + this.status = status; + this.dateRec = dateRec; + this.dateReport = dateReport; + } + + public Contact() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDateRec() { + return dateRec; + } + + public void setDateRec(String dateRec) { + this.dateRec = dateRec; + } + + public String getDateReport() { + return dateReport; + } + + public void setDateReport(String dateReport) { + this.dateReport = dateReport; + } +} diff --git a/app/src/main/java/com/example/dndservice/params/Params.java b/app/src/main/java/com/example/dndservice/params/Params.java new file mode 100644 index 0000000..5a51528 --- /dev/null +++ b/app/src/main/java/com/example/dndservice/params/Params.java @@ -0,0 +1,15 @@ +package com.example.dndservice.params; + +public class Params { + public static final int DB_VERSION = 1; + public static final String DB_NAME = "contacts_db"; + public static final String TABLE_NAME = "contacts_table"; + + // keys of our table in db + public static final String KEY_ID = "id"; + public static final String KEY_NAME = "name";// KEY_NAME = "name" + public static final String KEY_STATUS = "status"; + public static final String KEY_DATE_REC = "record_date"; + public static final String KEY_DATE_REPORT = "report_date"; + +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background.xml b/app/src/main/res/drawable/background.xml new file mode 100644 index 0000000..4aada36 --- /dev/null +++ b/app/src/main/res/drawable/background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml new file mode 100644 index 0000000..938c8e6 --- /dev/null +++ b/app/src/main/res/layout/activity_call.xml @@ -0,0 +1,96 @@ + + + + + + + +