diff --git a/android_apps/SnapChatClone/.gitignore b/android_apps/SnapChatClone/.gitignore new file mode 100644 index 000000000..aa724b770 --- /dev/null +++ b/android_apps/SnapChatClone/.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/android_apps/SnapChatClone/README.md b/android_apps/SnapChatClone/README.md new file mode 100644 index 000000000..eee527513 --- /dev/null +++ b/android_apps/SnapChatClone/README.md @@ -0,0 +1,46 @@ +

SnapChat Clone

+ +
+

+

Simple Snapchat like app

+

+
+ + ### :zap: Features: + - [x] Create User account + - [x] Send snaps(Choose from Device storage) + - [x] Send small message along with snap + - [x] View Snap + - [x] Automatically delete snap after view + +
+ + ### :sunny: Recomended updates: + - [ ] Good UI + - [ ] Increase upload speed of images + +
+ + ### 🛠️ Tools Used: + ![android](https://img.shields.io/badge/Android%20Studio-ED8B00?style=for-the-badge&logo=android&logoColor=white) + ![Kotlin](https://img.shields.io/badge/Kotlin-0095D5?&style=for-the-badge&logo=kotlin&logoColor=white) + ![Firebase](https://img.shields.io/badge/firebase-ffca28?style=for-the-badge&logo=firebase) + +
+ + ### :confused: How to use: +

+

+ 1. Download android studio (v3 or higer recomended)

+ 2. Clone the repository using github CLI

+ + ` gh repo clone AdityaVSM/SnapChatClone ` +

+ 3.Setup Firebase Project. Read official documentation to know more about setting up a project in firebase here

+ 4.Enjoy using the app :blush: + +

+

Feel free to contribute:computer:


+ + ### Thank you:smile:, Happy coding :muscle: +

diff --git a/android_apps/SnapChatClone/app/.gitignore b/android_apps/SnapChatClone/app/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/android_apps/SnapChatClone/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/build.gradle b/android_apps/SnapChatClone/app/build.gradle new file mode 100644 index 000000000..f4418db18 --- /dev/null +++ b/android_apps/SnapChatClone/app/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "com.example.snapchatclone" + minSdkVersion 26 + targetSdkVersion 30 + 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 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + implementation platform('com.google.firebase:firebase-bom:27.1.0') + implementation 'com.google.firebase:firebase-auth-ktx:20.0.4' + implementation 'com.google.firebase:firebase-storage-ktx' + implementation 'com.google.firebase:firebase-database-ktx' + + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' +} +apply plugin: 'com.google.gms.google-services' diff --git a/android_apps/SnapChatClone/app/google-services.json b/android_apps/SnapChatClone/app/google-services.json new file mode 100644 index 000000000..bbf358937 --- /dev/null +++ b/android_apps/SnapChatClone/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "867489977492", + "project_id": "snapchat-e191b", + "storage_bucket": "snapchat-e191b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:867489977492:android:cacf17a8c841d166699081", + "android_client_info": { + "package_name": "com.example.snapchatclone" + } + }, + "oauth_client": [ + { + "client_id": "867489977492-94j0iho548618oh7qiuk98qr4u4t98jd.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBtsCEMkXJbnN56MdwbPYmreylQ6EG5Fkk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "867489977492-94j0iho548618oh7qiuk98qr4u4t98jd.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/proguard-rules.pro b/android_apps/SnapChatClone/app/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/android_apps/SnapChatClone/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/android_apps/SnapChatClone/app/src/androidTest/java/com/example/snapchatclone/ExampleInstrumentedTest.kt b/android_apps/SnapChatClone/app/src/androidTest/java/com/example/snapchatclone/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..30f6162b6 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/androidTest/java/com/example/snapchatclone/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.snapchatclone + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.snapchatclone", appContext.packageName) + } +} \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/AndroidManifest.xml b/android_apps/SnapChatClone/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..ea2273655 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ChoseUserActivity.kt b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ChoseUserActivity.kt new file mode 100644 index 000000000..31dd7890f --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ChoseUserActivity.kt @@ -0,0 +1,57 @@ +package com.example.snapchatclone + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.ListView +import com.google.firebase.FirebaseError +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.* +import com.google.firebase.ktx.Firebase + +class ChoseUserActivity : AppCompatActivity() { + var chooseUserListView: ListView? = null + var emailsArrayList:ArrayList = ArrayList() + var userNameArrayList:ArrayList = ArrayList() + var keys:ArrayList = ArrayList() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_chose_user) + + chooseUserListView = findViewById(R.id.chooseUserListView) + val arrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,userNameArrayList) + chooseUserListView?.adapter = arrayAdapter + + var userName = ""; + FirebaseDatabase.getInstance().getReference().child("users").addChildEventListener(object :ChildEventListener { + override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) { + userName = snapshot?.child("userName")?.value as String + userNameArrayList.add(userName) + keys.add(snapshot.key.toString()) + arrayAdapter.notifyDataSetChanged() + } + + override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {} + override fun onChildRemoved(snapshot: DataSnapshot) {} + override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {} + override fun onCancelled(error: DatabaseError) {} + }) + chooseUserListView?.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> + val snapMap: Any = mapOf("from" to userName, "imageName" to intent.getStringExtra("imageName"), "imageUrl" to intent.getStringExtra("imageUrl"), "message" to intent.getStringExtra("message")) as Any + FirebaseDatabase.getInstance().getReference().child("users").child(keys.get(position)).child("snaps").push().setValue(snapMap) + + val intent = Intent(this,SnapsActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) + } + + } + + + +} + diff --git a/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/CreateSnapActivity.kt b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/CreateSnapActivity.kt new file mode 100644 index 000000000..0187a80f7 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/CreateSnapActivity.kt @@ -0,0 +1,108 @@ +package com.example.snapchatclone + +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.util.Log +import android.view.View +import android.widget.EditText +import android.widget.ImageView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.google.android.gms.tasks.Task +import com.google.firebase.storage.FirebaseStorage +import java.io.ByteArrayOutputStream +import java.util.* + + +class CreateSnapActivity : AppCompatActivity() { + + var createSnapImageView:ImageView? = null + var messageEditText:EditText? = null + val imageName = UUID.randomUUID().toString()+ ".jpg"; + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_create_snap) + + createSnapImageView = findViewById(R.id.createSnapImageView) + messageEditText = findViewById(R.id.messageEditText) + } + + fun getPhoto(){ + val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(intent, 1) + } + + fun chooseImage(view: View){ + if(checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ + requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1) + }else{ + getPhoto() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + val selectedImage = data!!.data + + if(requestCode == 1 && resultCode == Activity.RESULT_OK && data != null){ + try{ + val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, selectedImage) + createSnapImageView?.setImageBitmap(bitmap) + }catch (e: Exception){ + e.printStackTrace() + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if(requestCode == 1){ + if(grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ + getPhoto() + } + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + } + + fun nextClicked(view: View){ + createSnapImageView?.isDrawingCacheEnabled = true + createSnapImageView?.buildDrawingCache() + val bitmap = (createSnapImageView?.drawable as BitmapDrawable).bitmap + val baos = ByteArrayOutputStream() + bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, baos) + val data = baos.toByteArray() + + //FirebaseStorage.getInstance().getReference().child("Images").child(imageName) + + var uploadTask = FirebaseStorage.getInstance().getReference().child("Images").child(imageName).putBytes(data) + uploadTask.addOnSuccessListener { taskSnapshot -> + if (taskSnapshot.metadata != null) { + if (taskSnapshot.metadata!!.reference != null) { + val result: Task = taskSnapshot.storage.downloadUrl + result.addOnSuccessListener { uri -> + val imageUrl: String = uri.toString() + Log.i("Download url : ", imageUrl.toString()) + + val intent = Intent(this, ChoseUserActivity::class.java) + intent.putExtra("imageUrl", imageUrl) + intent.putExtra("imageName", imageName) + intent.putExtra("message", messageEditText?.text.toString()) + startActivity(intent) + } + } + } + }.addOnFailureListener { + // Handle unsuccessful uploads + Toast.makeText(this, "Upload failed", Toast.LENGTH_SHORT).show() + } + + + + } +} \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/MainActivity.kt b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/MainActivity.kt new file mode 100644 index 000000000..4c207e116 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/MainActivity.kt @@ -0,0 +1,62 @@ +package com.example.snapchatclone + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.EditText +import android.widget.Toast +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.ktx.Firebase + +class MainActivity : AppCompatActivity() { + var userNameEditText:EditText?=null + var emailEditText : EditText?=null + var passwordEditText : EditText?=null + val mAuth = FirebaseAuth.getInstance() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + userNameEditText = findViewById(R.id.userNameEditText) + emailEditText = findViewById(R.id.emailEditText); + passwordEditText = findViewById(R.id.passwordEditText) + + if(mAuth.currentUser != null){ + login() + } + } + + fun goClicked(view: View){ + //Check if we can login the user + + mAuth.signInWithEmailAndPassword(emailEditText?.text.toString(), passwordEditText?.text.toString()) + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + login(); + } else { + // Sign up user + mAuth.createUserWithEmailAndPassword(emailEditText?.text.toString(), passwordEditText?.text.toString()) + .addOnCompleteListener(this) { task -> + if(task.isSuccessful){ + //Add to database + FirebaseDatabase.getInstance().getReference().child("users").child(task.result!!.user?.uid!!).child("email").setValue(emailEditText?.text.toString()) + FirebaseDatabase.getInstance().getReference().child("users").child(task.result!!.user?.uid!!).child("userName").setValue(userNameEditText?.text.toString()) + login() + }else{ + Toast.makeText(this,"Login failed. Try again", Toast.LENGTH_SHORT).show() + } + } + } + } + } + + fun login(){ + //Move to next activity + val intent = Intent(this, SnapsActivity::class.java) + startActivity(intent) + } +} \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/SnapsActivity.kt b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/SnapsActivity.kt new file mode 100644 index 000000000..1ad505db2 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/SnapsActivity.kt @@ -0,0 +1,93 @@ +package com.example.snapchatclone + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.ContextMenu +import android.view.Menu +import android.view.MenuItem +import android.widget.Adapter +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.ListView +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.ChildEventListener +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseError +import com.google.firebase.database.FirebaseDatabase + +class SnapsActivity : AppCompatActivity() { + val mAuth = FirebaseAuth.getInstance() + var snapsListView:ListView ?= null; + //var emailList:ArrayList = ArrayList(); + var userNameList:ArrayList = ArrayList() + var snaps:ArrayList = ArrayList() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_snaps) + + snapsListView = findViewById(R.id.snapListView) + val arrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,userNameList); + snapsListView?.adapter = arrayAdapter + + FirebaseDatabase.getInstance().getReference().child("users").child(mAuth?.currentUser!!.uid).child("snaps").addChildEventListener(object : ChildEventListener { + override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) { + userNameList.add(snapshot.child("from").value as String) + snaps.add(snapshot) + arrayAdapter.notifyDataSetChanged() + } + override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {} + override fun onChildRemoved(snapshot: DataSnapshot) { + var index = 0; + for(snap:DataSnapshot in snaps){ + if(snap.key == snapshot.key){ + snaps.removeAt(index) + userNameList.removeAt(index) + } + index++; + } + arrayAdapter.notifyDataSetChanged() + } + override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {} + override fun onCancelled(error: DatabaseError) {} + }) + snapsListView?.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> + FirebaseDatabase.getInstance().getReference() + val snapshot = snaps.get(position) + var intent = Intent(this, ViewSnapActivity::class.java) + + intent.putExtra("imageName",snapshot.child("imageName").value as String) + intent.putExtra("imageUrl",snapshot.child("imageUrl").value as String) + intent.putExtra("message",snapshot.child("message").value as String) + intent.putExtra("snapKey",snapshot.key) + + startActivity(intent) + } + } + + override fun onCreateOptionsMenu(menu: Menu?):Boolean{ + val inflater = menuInflater; + inflater.inflate(R.menu.snaps,menu) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + + if(item?.itemId == R.id.createSnap){ + val intent = Intent(this,CreateSnapActivity::class.java) + startActivity(intent) + }else if(item?.itemId == R.id.logout){ + mAuth.signOut() + finish() + } + + return super.onOptionsItemSelected(item) + } + + override fun onBackPressed() { + mAuth.signOut() + super.onBackPressed() + } + +} \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ViewSnapActivity.kt b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ViewSnapActivity.kt new file mode 100644 index 000000000..9f123062e --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/java/com/example/snapchatclone/ViewSnapActivity.kt @@ -0,0 +1,70 @@ +package com.example.snapchatclone + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.os.AsyncTask +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.bumptech.glide.Glide +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.storage.FirebaseStorage +import java.lang.Exception +import java.net.HttpURLConnection +import java.net.URL + + +class ViewSnapActivity : AppCompatActivity() { + var messageTextView: TextView? = null + var mAuth = FirebaseAuth.getInstance() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_new_snap) + + messageTextView = findViewById(R.id.messageTextView) + var snapsImageView: ImageView = findViewById(R.id.snapImageView) + + messageTextView?.text = intent.getStringExtra("message") + + var url = intent.getStringExtra("imageUrl") + Glide.with(this).load(url).dontAnimate().dontTransform().into(snapsImageView) + // Glide.with(.getContext()).load(url).placeholder(R.drawable.default_profile).dontAnimate().into(view); + } + + /*val task = ImageDownoader() + val myImage: Bitmap + try { + myImage = task.execute(intent.getStringExtra("imageUrl")).get() + snapsImageView?.setImageBitmap(myImage) + } catch (e: Exception) { + e.printStackTrace() + } + + } + + inner class ImageDownoader : AsyncTask() { + override fun doInBackground(vararg urls: String?): Bitmap? { + try { + val url = URL(urls[0]) + val connection = url.openConnection() as HttpURLConnection + connection.connect() + val `is` = connection.inputStream + return BitmapFactory.decodeStream(`is`) + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + }*/ + + override fun onBackPressed() { + super.onBackPressed() + + intent.getStringExtra("snapKey")?.let { FirebaseDatabase.getInstance().getReference().child("users").child(mAuth?.currentUser!!.uid).child("snaps").child(it).removeValue() } + intent.getStringExtra("imageName")?.let { FirebaseStorage.getInstance().getReference().child("Images").child(it).delete() } + } +} diff --git a/android_apps/SnapChatClone/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android_apps/SnapChatClone/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..2b068d114 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/res/drawable/ic_launcher_background.xml b/android_apps/SnapChatClone/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..07d5da9cb --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android_apps/SnapChatClone/app/src/main/res/layout/activity_chose_user.xml b/android_apps/SnapChatClone/app/src/main/res/layout/activity_chose_user.xml new file mode 100644 index 000000000..9f87d96c8 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/res/layout/activity_chose_user.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/android_apps/SnapChatClone/app/src/main/res/layout/activity_create_snap.xml b/android_apps/SnapChatClone/app/src/main/res/layout/activity_create_snap.xml new file mode 100644 index 000000000..f2e729330 --- /dev/null +++ b/android_apps/SnapChatClone/app/src/main/res/layout/activity_create_snap.xml @@ -0,0 +1,56 @@ + + + + + +