├── .gitattributes ├── .gitignore ├── .idea ├── encodings.xml ├── gradle.xml ├── misc.xml ├── render.experimental.xml └── runConfigurations.xml ├── app ├── .gitignore ├── build.gradle ├── google-services.json ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── recipeapp │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── recipeapp │ │ │ ├── DetailActivity.java │ │ │ ├── FoodData.java │ │ │ ├── MainActivity.java │ │ │ ├── MyAdapter.java │ │ │ ├── UpdateRecipeActivity.java │ │ │ └── Upload_Recipe.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_file_upload_black_24dp.xml │ │ ├── ic_launcher_background.xml │ │ ├── image.jpg │ │ ├── image2.jpg │ │ ├── image3.jpg │ │ ├── image4.jpg │ │ └── index.png │ │ ├── layout │ │ ├── activity_detail.xml │ │ ├── activity_main.xml │ │ ├── activity_update_recipe.xml │ │ ├── activity_upload__recipe.xml │ │ └── recycler_row_item.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── recipeapp │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'com.google.gms.google-services' 3 | 4 | android { 5 | compileSdkVersion 28 6 | buildToolsVersion "29.0.0" 7 | defaultConfig { 8 | applicationId "com.example.recipeapp" 9 | minSdkVersion 15 10 | targetSdkVersion 28 11 | versionCode 1 12 | versionName "1.0" 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(dir: 'libs', include: ['*.jar']) 25 | //noinspection GradleCompatible 26 | implementation 'com.android.support:appcompat-v7:28.0.0' 27 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 28 | implementation 'com.google.firebase:firebase-database:16.0.4' 29 | implementation 'com.google.firebase:firebase-storage:16.0.4' 30 | implementation 'com.google.firebase:firebase-auth:16.0.5' 31 | testImplementation 'junit:junit:4.12' 32 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 33 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 34 | implementation 'com.android.support:recyclerview-v7:28.0.0' 35 | implementation 'com.android.support:cardview-v7:28.0.0' 36 | implementation 'com.android.support:design:28.0.0' 37 | implementation 'com.github.bumptech.glide:glide:4.9.0' 38 | annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "212281396864", 4 | "firebase_url": "https://fir-project-c6cd7.firebaseio.com", 5 | "project_id": "fir-project-c6cd7", 6 | "storage_bucket": "fir-project-c6cd7.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:212281396864:android:224d8152642cde27", 12 | "android_client_info": { 13 | "package_name": "com.example.recipeapp" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "212281396864-9eks1t2reeu0q2e1tj7ve3th6a7r1c0r.apps.googleusercontent.com", 19 | "client_type": 1, 20 | "android_info": { 21 | "package_name": "com.example.recipeapp", 22 | "certificate_hash": "54f2463544dc66d8da55def197bdb5c73817bdf1" 23 | } 24 | }, 25 | { 26 | "client_id": "212281396864-mf7lk43pueqlhogufqha1g97jhkdhag8.apps.googleusercontent.com", 27 | "client_type": 3 28 | } 29 | ], 30 | "api_key": [ 31 | { 32 | "current_key": "AIzaSyCi7HADFS445Xgf9fLIZckq6926Vsi8koA" 33 | } 34 | ], 35 | "services": { 36 | "appinvite_service": { 37 | "other_platform_oauth_client": [ 38 | { 39 | "client_id": "212281396864-mf7lk43pueqlhogufqha1g97jhkdhag8.apps.googleusercontent.com", 40 | "client_type": 3 41 | } 42 | ] 43 | } 44 | } 45 | } 46 | ], 47 | "configuration_version": "1" 48 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/recipeapp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.recipeapp", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 16 | 17 | 20 | 21 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/DetailActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.view.Window; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | import android.widget.Toast; 11 | 12 | import com.bumptech.glide.Glide; 13 | import com.google.android.gms.tasks.OnSuccessListener; 14 | import com.google.firebase.database.DatabaseReference; 15 | import com.google.firebase.database.FirebaseDatabase; 16 | import com.google.firebase.storage.FirebaseStorage; 17 | import com.google.firebase.storage.StorageReference; 18 | 19 | import org.w3c.dom.Text; 20 | 21 | public class DetailActivity extends AppCompatActivity { 22 | 23 | TextView foodDescription,RecipeName,RecipePrice; 24 | ImageView foodImage; 25 | String key=""; 26 | String imageUrl=""; 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_detail); 32 | RecipeName = (TextView) findViewById(R.id.txtRecipeName); 33 | RecipePrice = (TextView) findViewById(R.id.txtPrice); 34 | foodDescription = (TextView)findViewById(R.id.txtDescription); 35 | foodImage = (ImageView)findViewById(R.id.ivImage2); 36 | 37 | Bundle mBundle = getIntent().getExtras(); 38 | 39 | if(mBundle!=null){ 40 | 41 | foodDescription.setText(mBundle.getString("Description")); 42 | key = mBundle.getString("keyValue"); 43 | imageUrl = mBundle.getString("Image"); 44 | RecipeName.setText(mBundle.getString("RecipeName")); 45 | RecipePrice.setText(mBundle.getString("price")); 46 | // foodImage.setImageResource(mBundle.getInt("Image")); 47 | 48 | Glide.with(this) 49 | .load(mBundle.getString("Image")) 50 | .into(foodImage); 51 | 52 | 53 | } 54 | 55 | } 56 | 57 | public void btnDeleteRecipe(View view) { 58 | 59 | final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Recipe"); 60 | FirebaseStorage storage = FirebaseStorage.getInstance(); 61 | 62 | StorageReference storageReference = storage.getReferenceFromUrl(imageUrl); 63 | 64 | storageReference.delete().addOnSuccessListener(new OnSuccessListener() { 65 | @Override 66 | public void onSuccess(Void aVoid) { 67 | 68 | reference.child(key).removeValue(); 69 | Toast.makeText(DetailActivity.this, "Recipe Deleted", Toast.LENGTH_SHORT).show(); 70 | startActivity(new Intent(getApplicationContext(),MainActivity.class)); 71 | finish(); 72 | 73 | } 74 | }); 75 | 76 | 77 | 78 | 79 | 80 | 81 | } 82 | 83 | public void btnUpdateRecipe(View view) { 84 | 85 | startActivity(new Intent(getApplicationContext(),UpdateRecipeActivity.class) 86 | .putExtra("recipeNameKey",RecipeName.getText().toString()) 87 | .putExtra("descriptionKey",foodDescription.getText().toString()) 88 | .putExtra("priceKey",RecipePrice.getText().toString()) 89 | .putExtra("oldimageUrl",imageUrl) 90 | .putExtra("key",key) 91 | ); 92 | 93 | 94 | 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/FoodData.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | public class FoodData { 4 | 5 | private String itemName; 6 | private String itemDescription; 7 | private String itemPrice; 8 | private String itemImage; 9 | private String key; 10 | 11 | public FoodData() { 12 | } 13 | 14 | public FoodData(String itemName, String itemDescription, String itemPrice, String itemImage) { 15 | this.itemName = itemName; 16 | this.itemDescription = itemDescription; 17 | this.itemPrice = itemPrice; 18 | this.itemImage = itemImage; 19 | } 20 | 21 | public String getItemName() { 22 | return itemName; 23 | } 24 | 25 | public String getItemDescription() { 26 | return itemDescription; 27 | } 28 | 29 | public String getItemPrice() { 30 | return itemPrice; 31 | } 32 | 33 | public String getItemImage() { 34 | return itemImage; 35 | } 36 | 37 | public String getKey() { 38 | return key; 39 | } 40 | 41 | public void setKey(String key) { 42 | this.key = key; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Intent; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.os.Bundle; 8 | import android.support.v7.widget.GridLayoutManager; 9 | import android.support.v7.widget.RecyclerView; 10 | import android.text.Editable; 11 | import android.text.TextWatcher; 12 | import android.view.View; 13 | import android.widget.EditText; 14 | import android.widget.Toast; 15 | 16 | import com.google.firebase.database.DataSnapshot; 17 | import com.google.firebase.database.DatabaseError; 18 | import com.google.firebase.database.DatabaseReference; 19 | import com.google.firebase.database.FirebaseDatabase; 20 | import com.google.firebase.database.ValueEventListener; 21 | 22 | import java.util.ArrayList; 23 | import java.util.List; 24 | 25 | public class MainActivity extends AppCompatActivity { 26 | 27 | RecyclerView mRecyclerView; 28 | List myFoodList; 29 | FoodData mFoodData; 30 | ProgressDialog progressDialog; 31 | MyAdapter myAdapter; 32 | EditText txt_Search; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_main); 38 | 39 | mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView); 40 | GridLayoutManager gridLayoutManager = new GridLayoutManager(MainActivity.this,1); 41 | mRecyclerView.setLayoutManager(gridLayoutManager); 42 | 43 | txt_Search = (EditText)findViewById(R.id.txt_searchtext); 44 | 45 | progressDialog = new ProgressDialog(this); 46 | progressDialog.setMessage("Loading Items ...."); 47 | 48 | 49 | myFoodList = new ArrayList<>(); 50 | 51 | myAdapter = new MyAdapter(MainActivity.this,myFoodList); 52 | mRecyclerView.setAdapter(myAdapter); 53 | 54 | 55 | DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Recipe"); 56 | 57 | progressDialog.show(); 58 | ValueEventListener eventListener = databaseReference.addValueEventListener(new ValueEventListener() { 59 | @Override 60 | public void onDataChange(@NonNull DataSnapshot dataSnapshot) { 61 | 62 | myFoodList.clear(); 63 | 64 | for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()) { 65 | 66 | FoodData foodData = itemSnapshot.getValue(FoodData.class); 67 | foodData.setKey(itemSnapshot.getKey()); 68 | myFoodList.add(foodData); 69 | 70 | } 71 | 72 | myAdapter.notifyDataSetChanged(); 73 | progressDialog.dismiss(); 74 | 75 | } 76 | 77 | @Override 78 | public void onCancelled(@NonNull DatabaseError databaseError) { 79 | progressDialog.dismiss(); 80 | } 81 | }); 82 | 83 | 84 | txt_Search.addTextChangedListener(new TextWatcher() { 85 | @Override 86 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 87 | 88 | } 89 | 90 | @Override 91 | public void onTextChanged(CharSequence s, int start, int before, int count) { 92 | 93 | } 94 | 95 | @Override 96 | public void afterTextChanged(Editable s) { 97 | 98 | filter(s.toString()); 99 | 100 | } 101 | }); 102 | 103 | 104 | 105 | } 106 | private void filter(String text) { 107 | 108 | ArrayList filterList = new ArrayList<>(); 109 | 110 | for(FoodData item: myFoodList){ 111 | 112 | if(item.getItemName().toLowerCase().contains(text.toLowerCase())){ 113 | 114 | filterList.add(item); 115 | 116 | } 117 | 118 | } 119 | 120 | myAdapter.filteredList(filterList); 121 | 122 | } 123 | public void btn_uploadActivity(View view) { 124 | startActivity(new Intent(this,Upload_Recipe.class)); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/MyAdapter.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.widget.CardView; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.view.animation.AlphaAnimation; 12 | import android.view.animation.Animation; 13 | import android.view.animation.ScaleAnimation; 14 | import android.widget.ImageView; 15 | import android.widget.TextView; 16 | 17 | import com.bumptech.glide.Glide; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | import java.util.Random; 22 | 23 | public class MyAdapter extends RecyclerView.Adapter{ 24 | 25 | private Context mContext; 26 | private List myFoodList; 27 | private int lastPosition = -1; 28 | 29 | public MyAdapter(Context mContext, List myFoodList) { 30 | this.mContext = mContext; 31 | this.myFoodList = myFoodList; 32 | } 33 | 34 | @Override 35 | public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { 36 | View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_row_item,viewGroup,false); 37 | 38 | return new FoodViewHolder(mView); 39 | } 40 | 41 | 42 | @Override 43 | public void onBindViewHolder(@NonNull final FoodViewHolder foodViewHolder, int i) { 44 | 45 | 46 | Glide.with(mContext) 47 | .load(myFoodList.get(i).getItemImage()) 48 | .into(foodViewHolder.imageView); 49 | 50 | // foodViewHolder.imageView.setImageResource(myFoodList.get(i).getItemImage()); 51 | foodViewHolder.mTitle.setText(myFoodList.get(i).getItemName()); 52 | foodViewHolder.mDescription.setText(myFoodList.get(i).getItemDescription()); 53 | foodViewHolder.mPrice.setText(myFoodList.get(i).getItemPrice()); 54 | 55 | foodViewHolder.mCardView.setOnClickListener(new View.OnClickListener() { 56 | @Override 57 | public void onClick(View view) { 58 | 59 | Intent intent = new Intent(mContext,DetailActivity.class); 60 | intent.putExtra("Image",myFoodList.get(foodViewHolder.getAdapterPosition()).getItemImage()); 61 | intent.putExtra("Description",myFoodList.get(foodViewHolder.getAdapterPosition()).getItemDescription()); 62 | intent.putExtra("RecipeName",myFoodList.get(foodViewHolder.getAdapterPosition()).getItemName()); 63 | intent.putExtra("price",myFoodList.get(foodViewHolder.getAdapterPosition()).getItemPrice()); 64 | intent.putExtra("keyValue",myFoodList.get(foodViewHolder.getAdapterPosition()).getKey()); 65 | mContext.startActivity(intent); 66 | 67 | 68 | } 69 | }); 70 | 71 | 72 | setAnimation(foodViewHolder.itemView,i); 73 | 74 | } 75 | 76 | public void setAnimation(View viewToAnimate, int position ){ 77 | 78 | if(position> lastPosition){ 79 | 80 | ScaleAnimation animation = new ScaleAnimation(0.0f,1.0f,0.0f,1.0f, 81 | Animation.RELATIVE_TO_SELF,0.5f, 82 | Animation.RELATIVE_TO_SELF,0.5f); 83 | animation.setDuration(1500); 84 | viewToAnimate.startAnimation(animation); 85 | lastPosition = position; 86 | 87 | 88 | } 89 | 90 | 91 | 92 | } 93 | 94 | @Override 95 | public int getItemCount() { return myFoodList.size(); } 96 | 97 | 98 | public void filteredList(ArrayList filterList) { 99 | 100 | myFoodList = filterList; 101 | notifyDataSetChanged(); 102 | } 103 | } 104 | 105 | class FoodViewHolder extends RecyclerView.ViewHolder{ 106 | 107 | 108 | ImageView imageView; 109 | TextView mTitle,mDescription,mPrice; 110 | CardView mCardView; 111 | 112 | 113 | public FoodViewHolder( View itemView) { 114 | super(itemView); 115 | 116 | imageView = itemView.findViewById(R.id.ivImage); 117 | mTitle = itemView.findViewById(R.id.tvTitle); 118 | mDescription = itemView.findViewById(R.id.tvDescription); 119 | mPrice = itemView.findViewById(R.id.tvPrice); 120 | mCardView = itemView.findViewById(R.id.myCardView); 121 | } 122 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/UpdateRecipeActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.os.Bundle; 10 | import android.view.View; 11 | import android.widget.EditText; 12 | import android.widget.ImageView; 13 | import android.widget.Toast; 14 | 15 | import com.bumptech.glide.Glide; 16 | import com.google.android.gms.tasks.OnCompleteListener; 17 | import com.google.android.gms.tasks.OnFailureListener; 18 | import com.google.android.gms.tasks.OnSuccessListener; 19 | import com.google.android.gms.tasks.Task; 20 | import com.google.firebase.database.DatabaseReference; 21 | import com.google.firebase.database.FirebaseDatabase; 22 | import com.google.firebase.storage.FirebaseStorage; 23 | import com.google.firebase.storage.StorageReference; 24 | import com.google.firebase.storage.UploadTask; 25 | 26 | import java.text.DateFormat; 27 | import java.util.Calendar; 28 | 29 | public class UpdateRecipeActivity extends AppCompatActivity { 30 | 31 | ImageView recipeImage; 32 | Uri uri; 33 | EditText txt_name,txt_description,txt_price; 34 | String imageUrl; 35 | String key,oldImageUrl; 36 | DatabaseReference databaseReference; 37 | StorageReference storageReference; 38 | String recipename,recipeDescription,recipePrice; 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | setContentView(R.layout.activity_update_recipe); 43 | 44 | recipeImage = (ImageView)findViewById(R.id.iv_foodImage); 45 | txt_name = (EditText)findViewById(R.id.txt_recipe_name); 46 | txt_description = (EditText)findViewById(R.id.text_description); 47 | txt_price = (EditText)findViewById(R.id.text_price); 48 | 49 | Bundle bundle = getIntent().getExtras(); 50 | if(bundle!=null){ 51 | 52 | Glide.with(UpdateRecipeActivity.this) 53 | .load(bundle.getString("oldimageUrl")) 54 | .into(recipeImage); 55 | txt_name.setText(bundle.getString("recipeNameKey")); 56 | txt_description.setText(bundle.getString("descriptionKey")); 57 | txt_price.setText(bundle.getString("priceKey")); 58 | key = bundle.getString("key"); 59 | oldImageUrl = bundle.getString("oldimageUrl"); 60 | } 61 | 62 | 63 | databaseReference = FirebaseDatabase.getInstance().getReference("Recipe").child(key); 64 | 65 | 66 | 67 | } 68 | 69 | public void btnSelectImage(View view) { 70 | Intent photoPicker = new Intent(Intent.ACTION_PICK); 71 | photoPicker.setType("image/*"); 72 | startActivityForResult(photoPicker,1); 73 | } 74 | @Override 75 | protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 76 | super.onActivityResult(requestCode, resultCode, data); 77 | 78 | if(resultCode == RESULT_OK){ 79 | 80 | uri = data.getData(); 81 | recipeImage.setImageURI(uri); 82 | 83 | } 84 | else Toast.makeText(this, "You haven't picked image", Toast.LENGTH_SHORT).show(); 85 | 86 | } 87 | 88 | 89 | public void btnUpdateRecipe(View view) { 90 | 91 | recipename = txt_name.getText().toString().trim(); 92 | recipeDescription = txt_description.getText().toString().trim(); 93 | recipePrice = txt_price.getText().toString(); 94 | 95 | 96 | final ProgressDialog progressDialog = new ProgressDialog(this); 97 | progressDialog.setMessage("Recipe Uplading...."); 98 | progressDialog.show(); 99 | storageReference = FirebaseStorage.getInstance() 100 | .getReference().child("RecipeImage").child(uri.getLastPathSegment()); 101 | storageReference.putFile(uri).addOnSuccessListener(new OnSuccessListener() { 102 | @Override 103 | public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 104 | 105 | Task uriTask = taskSnapshot.getStorage().getDownloadUrl(); 106 | while(!uriTask.isComplete()); 107 | Uri urlImage = uriTask.getResult(); 108 | imageUrl = urlImage.toString(); 109 | uploadRecipe(); 110 | progressDialog.dismiss(); 111 | } 112 | }).addOnFailureListener(new OnFailureListener() { 113 | @Override 114 | public void onFailure(@NonNull Exception e) { 115 | progressDialog.dismiss(); 116 | } 117 | }); 118 | 119 | 120 | } 121 | 122 | public void uploadRecipe(){ 123 | 124 | 125 | 126 | FoodData foodData = new FoodData( 127 | recipename, 128 | recipeDescription, 129 | recipePrice, 130 | imageUrl 131 | ); 132 | 133 | 134 | databaseReference.setValue(foodData).addOnCompleteListener(new OnCompleteListener() { 135 | @Override 136 | public void onComplete(@NonNull Task task) { 137 | StorageReference storageReferenceNew = FirebaseStorage.getInstance().getReferenceFromUrl(oldImageUrl); 138 | storageReferenceNew.delete(); 139 | Toast.makeText(UpdateRecipeActivity.this, "Data Updated", Toast.LENGTH_SHORT).show(); 140 | } 141 | }); 142 | 143 | 144 | 145 | 146 | } 147 | 148 | } 149 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/recipeapp/Upload_Recipe.java: -------------------------------------------------------------------------------- 1 | package com.example.recipeapp; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.os.Bundle; 10 | import android.view.View; 11 | import android.widget.EditText; 12 | import android.widget.ImageView; 13 | import android.widget.Toast; 14 | 15 | import com.google.android.gms.tasks.OnCompleteListener; 16 | import com.google.android.gms.tasks.OnFailureListener; 17 | import com.google.android.gms.tasks.OnSuccessListener; 18 | import com.google.android.gms.tasks.Task; 19 | import com.google.firebase.database.FirebaseDatabase; 20 | import com.google.firebase.storage.FirebaseStorage; 21 | import com.google.firebase.storage.StorageReference; 22 | import com.google.firebase.storage.UploadTask; 23 | 24 | import java.text.DateFormat; 25 | import java.util.Calendar; 26 | 27 | public class Upload_Recipe extends AppCompatActivity { 28 | 29 | ImageView recipeImage; 30 | Uri uri; 31 | EditText txt_name,txt_description,txt_price; 32 | String imageUrl; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_upload__recipe); 38 | 39 | recipeImage = (ImageView)findViewById(R.id.iv_foodImage); 40 | txt_name = (EditText)findViewById(R.id.txt_recipe_name); 41 | txt_description = (EditText)findViewById(R.id.text_description); 42 | txt_price = (EditText)findViewById(R.id.text_price); 43 | 44 | } 45 | 46 | public void btnSelectImage(View view) { 47 | 48 | Intent photoPicker = new Intent(Intent.ACTION_PICK); 49 | photoPicker.setType("image/*"); 50 | startActivityForResult(photoPicker,1); 51 | } 52 | 53 | @Override 54 | protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 55 | super.onActivityResult(requestCode, resultCode, data); 56 | 57 | if(resultCode == RESULT_OK){ 58 | 59 | uri = data.getData(); 60 | recipeImage.setImageURI(uri); 61 | 62 | } 63 | else Toast.makeText(this, "You haven't picked image", Toast.LENGTH_SHORT).show(); 64 | 65 | } 66 | 67 | public void uploadImage(){ 68 | 69 | StorageReference storageReference = FirebaseStorage.getInstance() 70 | .getReference().child("RecipeImage").child(uri.getLastPathSegment()); 71 | 72 | final ProgressDialog progressDialog = new ProgressDialog(this); 73 | progressDialog.setMessage("Recipe Uplading...."); 74 | progressDialog.show(); 75 | 76 | storageReference.putFile(uri).addOnSuccessListener(new OnSuccessListener() { 77 | @Override 78 | public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 79 | 80 | Task uriTask = taskSnapshot.getStorage().getDownloadUrl(); 81 | while(!uriTask.isComplete()); 82 | Uri urlImage = uriTask.getResult(); 83 | imageUrl = urlImage.toString(); 84 | uploadRecipe(); 85 | progressDialog.dismiss(); 86 | } 87 | }).addOnFailureListener(new OnFailureListener() { 88 | @Override 89 | public void onFailure(@NonNull Exception e) { 90 | progressDialog.dismiss(); 91 | } 92 | }); 93 | 94 | 95 | 96 | } 97 | 98 | 99 | public void btnUploadRecipe(View view) { 100 | 101 | uploadImage(); 102 | 103 | } 104 | 105 | public void uploadRecipe(){ 106 | 107 | 108 | 109 | FoodData foodData = new FoodData( 110 | txt_name.getText().toString(), 111 | txt_description.getText().toString(), 112 | txt_price.getText().toString(), 113 | imageUrl 114 | ); 115 | 116 | String myCurrentDateTime = DateFormat.getDateTimeInstance() 117 | .format(Calendar.getInstance().getTime()); 118 | 119 | FirebaseDatabase.getInstance().getReference("Recipe") 120 | .child(myCurrentDateTime).setValue(foodData).addOnCompleteListener(new OnCompleteListener() { 121 | @Override 122 | public void onComplete(@NonNull Task task) { 123 | 124 | if(task.isSuccessful()){ 125 | 126 | Toast.makeText(Upload_Recipe.this, "Recipe Uploaded", Toast.LENGTH_SHORT).show(); 127 | 128 | finish(); 129 | 130 | } 131 | 132 | 133 | 134 | } 135 | }).addOnFailureListener(new OnFailureListener() { 136 | @Override 137 | public void onFailure(@NonNull Exception e) { 138 | Toast.makeText(Upload_Recipe.this, e.getMessage().toString(), Toast.LENGTH_SHORT).show(); 139 | } 140 | }); 141 | 142 | 143 | 144 | 145 | } 146 | 147 | 148 | } 149 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_upload_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arsltech/Recipe-Android-App/a2e952bd7126721ddc27c90625ee2c1425accb6d/app/src/main/res/drawable/image.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/image2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arsltech/Recipe-Android-App/a2e952bd7126721ddc27c90625ee2c1425accb6d/app/src/main/res/drawable/image2.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/image3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arsltech/Recipe-Android-App/a2e952bd7126721ddc27c90625ee2c1425accb6d/app/src/main/res/drawable/image3.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/image4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arsltech/Recipe-Android-App/a2e952bd7126721ddc27c90625ee2c1425accb6d/app/src/main/res/drawable/image4.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arsltech/Recipe-Android-App/a2e952bd7126721ddc27c90625ee2c1425accb6d/app/src/main/res/drawable/index.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 27 | 35 | 48 | 51 |