Skip to content

Commit 4421850

Browse files
committed
Commit 3
1 parent d0ad001 commit 4421850

39 files changed

Lines changed: 1593 additions & 2337 deletions

app/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ dependencies {
3939
implementation(libs.constraintlayout)
4040
implementation(libs.firebase.auth)
4141
implementation(libs.firebase.database)
42+
implementation("androidx.camera:camera-core:1.3.2")
43+
implementation("androidx.camera:camera-view:1.3.2")
44+
implementation("androidx.camera:camera-camera2:1.3.2")
45+
implementation("androidx.camera:camera-lifecycle:1.3.2")
46+
implementation("org.tensorflow:tensorflow-lite-support:0.4.2")
4247
implementation("org.tensorflow:tensorflow-lite:2.15.0")
4348
implementation("com.google.mlkit:face-detection:16.1.6")
4449
testImplementation(libs.junit)

app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
<uses-permission android:name="android.permission.INTERNET" />
66
<uses-permission android:name="android.permission.READ_CONTACTS" />
77
<uses-permission android:name="android.permission.CAMERA" />
8+
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
9+
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
10+
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
811

912
<uses-feature android:name="android.hardware.camera" />
1013
<uses-feature android:name="android.hardware.camera.autofocus" />
@@ -19,27 +22,21 @@
1922
android:supportsRtl="true"
2023
android:theme="@style/AppTheme"
2124
tools:targetApi="31">
25+
2226
<activity
23-
android:name=".AddFace"
24-
android:exported="false" />
25-
<activity
26-
android:name=".FaceDetection.CameraActivity"
27+
android:name=".FaceDetection.FaceRecognitionActivity"
2728
android:exported="false"
2829
android:screenOrientation="portrait" />
30+
<activity
31+
android:name=".AddFace"
32+
android:exported="false" />
2933
<activity
3034
android:name=".AddContact"
3135
android:exported="false" />
3236
<activity
3337
android:name=".DummyPowerScreen"
3438
android:exported="false"
35-
android:showOnLockScreen="true"
36-
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
37-
38-
<service
39-
android:name=".PowerButtonService"
40-
android:enabled="true"
41-
android:exported="true" />
42-
39+
android:showOnLockScreen="true" />
4340
<activity
4441
android:name=".Verify"
4542
android:exported="false" />

app/src/main/java/com/xncoder/advanceprotection/AddContact.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,16 @@ private void showPopup() {
106106
contactList.setAdapter(adapter);
107107

108108
popupWindow = new PopupWindow(popupView, (int) (getResources().getDisplayMetrics().widthPixels * 0.9),
109-
(int) (getResources().getDisplayMetrics().heightPixels * 0.7));
109+
(int) (getResources().getDisplayMetrics().heightPixels * 0.8));
110110

111111
okButton.setOnClickListener(v -> {
112112
selectedContacts.clear();
113113
saveContacts.deleteAllData();
114-
database.deleteUserAllData(new SaveCredentials(this).getAllUsers().get(0).replace(".", "_"));
114+
database.deleteAllContactData(new SaveCredentials(this).getAllUsers().get(0).replace(".", "_"));
115115
adapter.getContact().forEach((s, customItems) -> {
116116
selectedContacts.add(customItems);
117117
saveContacts.insertData(customItems.getName(), customItems.getNumber());
118-
database.setData(new SaveCredentials(this).getAllUsers().get(0).replace(".", "_"), customItems.getNumber(), customItems.getName());
118+
database.setContactData(new SaveCredentials(this).getAllUsers().get(0).replace(".", "_"), customItems.getNumber(), customItems.getName());
119119
});
120120
updateContactList();
121121
popupWindow.dismiss();

app/src/main/java/com/xncoder/advanceprotection/AddFace.java

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,44 @@
11
package com.xncoder.advanceprotection;
22

3+
import android.content.Context;
34
import android.content.Intent;
5+
import android.graphics.Bitmap;
6+
import android.graphics.Color;
7+
import android.graphics.drawable.ColorDrawable;
48
import android.os.Bundle;
9+
import android.view.Gravity;
10+
import android.view.LayoutInflater;
11+
import android.view.View;
12+
import android.widget.Button;
13+
import android.widget.EditText;
514
import android.widget.ImageButton;
15+
import android.widget.ImageView;
16+
import android.widget.ListView;
17+
import android.widget.PopupWindow;
18+
import android.widget.Toast;
619

720
import androidx.activity.EdgeToEdge;
21+
import androidx.annotation.Nullable;
822
import androidx.appcompat.app.AppCompatActivity;
923
import androidx.core.graphics.Insets;
1024
import androidx.core.view.ViewCompat;
1125
import androidx.core.view.WindowInsetsCompat;
1226

13-
import com.xncoder.advanceprotection.FaceDetection.CameraActivity;
27+
import com.xncoder.advanceprotection.FaceDetection.FaceRecognitionActivity;
28+
import com.xncoder.advanceprotection.FaceDetection.SaveFaces;
29+
30+
import java.util.ArrayList;
31+
import java.util.List;
1432

1533
public class AddFace extends AppCompatActivity {
1634

35+
private final int REQUEST_CODE = 101;
36+
private SaveFaces saveFaces;
37+
private ListView facesListView;
38+
private List<CustomItems> listFaces;
39+
private Database database;
40+
private int faceNo = 1;
41+
1742
@Override
1843
protected void onCreate(Bundle savedInstanceState) {
1944
super.onCreate(savedInstanceState);
@@ -25,8 +50,78 @@ protected void onCreate(Bundle savedInstanceState) {
2550
return insets;
2651
});
2752

28-
Intent cameraIntent = new Intent(this, CameraActivity.class);
53+
database = new Database(this);
54+
listFaces = new ArrayList<>();
55+
facesListView = findViewById(R.id.selected_faces);
56+
saveFaces = new SaveFaces(this);
57+
saveFaces.getAllData().forEach((name, vector) -> {
58+
listFaces.add(new CustomItems("Face " + faceNo, name, true));
59+
faceNo += 1;
60+
});
61+
updateFaceList();
62+
2963
ImageButton addFace = findViewById(R.id.add_face_btn);
30-
addFace.setOnClickListener(view -> startActivity(cameraIntent));
64+
addFace.setOnClickListener(view -> {
65+
if (faceNo != 5)
66+
startActivityForResult(new Intent(this, FaceRecognitionActivity.class), REQUEST_CODE);
67+
else
68+
Toast.makeText(this, "You can add maximum 5 faces", Toast.LENGTH_SHORT).show();
69+
});
70+
}
71+
72+
private void showPopup(Bitmap tempBitmap, float[] tempVector) {
73+
74+
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
75+
View popupView = inflater.inflate(R.layout.image_popup, null);
76+
77+
ImageView face = popupView.findViewById(R.id.dlg_image);
78+
EditText faceN = popupView.findViewById(R.id.face_input);
79+
Button okBtn = popupView.findViewById(R.id.button_ok);
80+
Button cancelBtn = popupView.findViewById(R.id.button_cancel);
81+
82+
face.setImageBitmap(tempBitmap);
83+
84+
PopupWindow popupWindow = new PopupWindow(popupView, (int) (getResources().getDisplayMetrics().widthPixels * 0.7),
85+
(int) (getResources().getDisplayMetrics().heightPixels * 0.5));
86+
87+
okBtn.setOnClickListener(viewNav -> {
88+
String input = String.valueOf(faceN.getText());
89+
if (!input.isEmpty() && new SaveFaces(this).getFaceVector(input).isEmpty()) {
90+
database.setFaceData(new SaveCredentials(this).getAllUsers().get(0).replace(".", "_"), input, tempVector);
91+
listFaces.add(new CustomItems("Face " + faceNo, input, true));
92+
faceNo += 1;
93+
saveFaces.addFace(input, tempVector);
94+
popupWindow.dismiss();
95+
updateFaceList();
96+
} else if (!new SaveFaces(this).getFaceVector(input).isEmpty()) {
97+
Toast.makeText(this, "This name already exists", Toast.LENGTH_SHORT).show();
98+
}
99+
100+
});
101+
102+
cancelBtn.setOnClickListener(viewNav -> popupWindow.dismiss());
103+
104+
popupWindow.setOutsideTouchable(false);
105+
popupWindow.setFocusable(true);
106+
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
107+
popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0);
108+
109+
}
110+
111+
@Override
112+
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
113+
super.onActivityResult(requestCode, resultCode, data);
114+
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
115+
if (data != null) {
116+
showPopup(data.getParcelableExtra("Bitmap"), data.getFloatArrayExtra("Vector"));
117+
}
118+
}
119+
}
120+
121+
private void updateFaceList() {
122+
if(listFaces != null) {
123+
CustomFaceAdapter adapterFace = new CustomFaceAdapter(this, listFaces);
124+
facesListView.setAdapter(adapterFace);
125+
}
31126
}
32127
}

app/src/main/java/com/xncoder/advanceprotection/CustomContactAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
6363
numberTextView.setText(contact.getNumber());
6464
removeItem.setOnClickListener(view -> {
6565
if (saveContacts.deleteData(contacts.get(position).getNumber())) {
66-
database.deleteUserData(new SaveCredentials(context).getAllUsers().get(0).replace(".", "_"), contacts.get(position).getNumber());
66+
database.deleteContactData(new SaveCredentials(context).getAllUsers().get(0).replace(".", "_"), contacts.get(position).getNumber());
6767
Toast.makeText(context, contacts.get(position).getNumber() + "\nremoved", Toast.LENGTH_SHORT).show();
6868
contacts.remove(position);
6969
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.xncoder.advanceprotection;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.BaseAdapter;
8+
import android.widget.ImageButton;
9+
import android.widget.TextView;
10+
import android.widget.Toast;
11+
12+
import com.xncoder.advanceprotection.FaceDetection.SaveFaces;
13+
14+
import java.util.List;
15+
16+
public class CustomFaceAdapter extends BaseAdapter {
17+
private Context context;
18+
private List<CustomItems> faces;
19+
private SaveFaces saveFaces;
20+
private Database database;
21+
22+
public CustomFaceAdapter(Context context, List<CustomItems> faces) {
23+
this.context = context;
24+
this.faces = faces;
25+
saveFaces = new SaveFaces(context);
26+
database = new Database(context);
27+
}
28+
29+
@Override
30+
public int getCount() {
31+
return faces.size();
32+
}
33+
34+
@Override
35+
36+
public Object getItem(int position) {
37+
return faces.get(position);
38+
}
39+
40+
@Override
41+
public long getItemId(int position) {
42+
return position;
43+
}
44+
45+
@Override
46+
public View getView(int position, View convertView, ViewGroup parent) {
47+
if (convertView == null) {
48+
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
49+
convertView = inflater.inflate(R.layout.contact_list_item, null);
50+
}
51+
52+
TextView nameTextView = convertView.findViewById(R.id.list_name);
53+
TextView numberTextView = convertView.findViewById(R.id.list_number);
54+
ImageButton removeItem = convertView.findViewById(R.id.contact_select);
55+
56+
CustomItems contact = faces.get(position);
57+
nameTextView.setText(contact.getName());
58+
numberTextView.setText(contact.getNumber());
59+
removeItem.setOnClickListener(view -> {
60+
if (saveFaces.deleteEntry(faces.get(position).getNumber())) {
61+
database.deleteFaceData(new SaveCredentials(context).getAllUsers().get(0).replace(".", "_"), faces.get(position).getNumber());
62+
Toast.makeText(context, faces.get(position).getNumber() + "\nremoved", Toast.LENGTH_SHORT).show();
63+
faces.remove(position);
64+
}
65+
else
66+
Toast.makeText(context, faces.get(position).getNumber()+"\nfailed", Toast.LENGTH_SHORT).show();
67+
notifyDataSetChanged();
68+
});
69+
70+
return convertView;
71+
}
72+
}

app/src/main/java/com/xncoder/advanceprotection/Database.java

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,77 @@
22

33
import android.content.Context;
44
import android.util.Log;
5+
import android.widget.Toast;
6+
7+
import androidx.annotation.NonNull;
58

69
import com.google.firebase.database.DataSnapshot;
710
import com.google.firebase.database.DatabaseError;
811
import com.google.firebase.database.DatabaseReference;
912
import com.google.firebase.database.FirebaseDatabase;
1013
import com.google.firebase.database.ValueEventListener;
14+
import com.xncoder.advanceprotection.FaceDetection.SaveFaces;
15+
16+
import java.util.Arrays;
17+
import java.util.Objects;
1118

1219
public class Database {
1320
private DatabaseReference db = FirebaseDatabase.getInstance().getReference();
1421
private Context context;
15-
1622
public Database(Context context) {
1723
this.context = context;
1824
}
1925

20-
public void setData(String userId, String key, String name) {
21-
DatabaseReference userRef = db.child("AllUsers").child(userId);
26+
public void setContactData(String userId, String key, String name) {
27+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Contacts");
2228
userRef.child(key).setValue(name);
2329
}
24-
public void deleteUserData(String userId, String key) {
25-
DatabaseReference userRef = db.child("AllUsers").child(userId);
30+
31+
public void setFaceData(String userId, String name, float[] vector) {
32+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Faces");
33+
userRef.child(name).setValue(floatArrayToString(vector));
34+
}
35+
36+
public String floatArrayToString(float[] array) {
37+
StringBuilder sb = new StringBuilder();
38+
for (float value : array) {
39+
sb.append(value).append(",");
40+
}
41+
if (sb.length() > 0) {
42+
sb.setLength(sb.length() - 1);
43+
}
44+
return sb.toString();
45+
}
46+
47+
public float[] stringToFloatArray(String str) {
48+
String[] parts = str.split(",");
49+
float[] result = new float[parts.length];
50+
for (int i = 0; i < parts.length; i++) {
51+
result[i] = Float.parseFloat(parts[i]);
52+
}
53+
return result;
54+
}
55+
56+
public void deleteContactData(String userId, String key) {
57+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Contacts");
2658
DatabaseReference keyRef = userRef.child(key);
2759
keyRef.removeValue();
2860
}
29-
public void deleteUserAllData(String userId) {
30-
DatabaseReference userRef = db.child("AllUsers").child(userId);
61+
62+
public void deleteFaceData(String userId, String name) {
63+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Faces");
64+
DatabaseReference keyRef = userRef.child(name);
65+
keyRef.removeValue();
66+
}
67+
68+
public void deleteAllContactData(String userId) {
69+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Contacts");
3170
userRef.removeValue();
3271
}
33-
public void getUserData(String userId) {
72+
73+
public void getContactData(String userId) {
3474
new SaveContacts(context).deleteAllData();
35-
DatabaseReference userRef = db.child("AllUsers").child(userId);
75+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Contacts");
3676
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
3777
@Override
3878
public void onDataChange(DataSnapshot dataSnapshot) {
@@ -46,4 +86,21 @@ public void onCancelled(DatabaseError databaseError) {
4686
}
4787
});
4888
}
89+
90+
public void getFaceData(String userId) {
91+
new SaveFaces(context).deleteAllData();
92+
DatabaseReference userRef = db.child("AllUsers").child(userId).child("Faces");
93+
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
94+
@Override
95+
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
96+
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
97+
new SaveFaces(context).addFace(snapshot.getKey(), stringToFloatArray(snapshot.getValue(String.class)));
98+
}
99+
}
100+
@Override
101+
public void onCancelled(@NonNull DatabaseError databaseError) {
102+
Log.e("getUserData", "Error: " + databaseError.getMessage());
103+
}
104+
});
105+
}
49106
}

0 commit comments

Comments
 (0)