-
-
Save haerulmuttaqin/762b4f041cf562ba6fd72cac1c1221cc to your computer and use it in GitHub Desktop.
| <?xml version="1.0" encoding="utf-8"?> | |
| <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:tools="http://schemas.android.com/tools" | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| xmlns:app="http://schemas.android.com/apk/res-auto" | |
| tools:context=".activity.editor.EditorActivity"> | |
| <RelativeLayout | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| android:layout_marginLeft="16dp" | |
| android:layout_marginRight="16dp" | |
| android:layout_marginTop="20dp"> | |
| <EditText | |
| android:id="@+id/title" | |
| android:hint="@string/to_do" | |
| android:textSize="25sp" | |
| android:inputType="textCapSentences" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" | |
| tools:ignore="Autofill" /> | |
| <EditText | |
| android:id="@+id/note" | |
| android:layout_below="@id/title" | |
| android:hint="@string/enter_note" | |
| android:inputType="textMultiLine" | |
| android:minLines="6" | |
| android:gravity="top|start" | |
| android:layout_marginTop="20dp" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" | |
| tools:ignore="Autofill" /> | |
| <com.thebluealliance.spectrum.SpectrumPalette | |
| android:id="@+id/palette" | |
| android:layout_below="@id/note" | |
| android:layout_marginTop="20dp" | |
| android:layout_marginBottom="20dp" | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| app:spectrum_colors="@array/demo_colors"/> | |
| </RelativeLayout> | |
| </android.support.v4.widget.NestedScrollView> |
| <?xml version="1.0" encoding="utf-8"?> | |
| <android.support.design.widget.CoordinatorLayout | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:tools="http://schemas.android.com/tools" | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| tools:context=".activity.main.MainActivity"> | |
| <android.support.v4.widget.SwipeRefreshLayout | |
| android:id="@+id/swipe_refresh" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content"> | |
| <android.support.v7.widget.RecyclerView | |
| android:id="@+id/recycler_view" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content"/> | |
| </android.support.v4.widget.SwipeRefreshLayout> | |
| <android.support.design.widget.FloatingActionButton | |
| android:id="@+id/add" | |
| android:layout_margin="16dp" | |
| android:layout_gravity="bottom|end" | |
| android:layout_width="wrap_content" | |
| android:layout_height="wrap_content" | |
| android:src="@drawable/ic_add"/> | |
| </android.support.design.widget.CoordinatorLayout> |
| import retrofit2.Retrofit; | |
| import retrofit2.converter.gson.GsonConverterFactory; | |
| public class ApiClient { | |
| private static final String BASE_URL = "http://your-domain-name.000webhostapp.com/"; | |
| private static Retrofit retrofit; | |
| public static Retrofit getApiClient() { | |
| if (retrofit == null) { | |
| retrofit = new Retrofit.Builder() | |
| .baseUrl(BASE_URL) | |
| .addConverterFactory(GsonConverterFactory.create()) | |
| .build(); | |
| } | |
| return retrofit; | |
| } | |
| } |
| import com.haerulmuttaqin.mynotesapp.model.Note; | |
| import java.util.List; | |
| import retrofit2.Call; | |
| import retrofit2.http.Field; | |
| import retrofit2.http.FormUrlEncoded; | |
| import retrofit2.http.GET; | |
| import retrofit2.http.POST; | |
| public interface ApiInterface { | |
| @FormUrlEncoded | |
| @POST("save.php") | |
| Call<Note> saveNote( | |
| @Field("title") String title, | |
| @Field("note") String note, | |
| @Field("color") int color | |
| ); | |
| @GET("notes.php") | |
| Call<List<Note>> getNotes(); | |
| @FormUrlEncoded | |
| @POST("update.php") | |
| Call<Note> updateNote( | |
| @Field("id") int id, | |
| @Field("title") String title, | |
| @Field("note") String note, | |
| @Field("color") int color | |
| ); | |
| @FormUrlEncoded | |
| @POST("delete.php") | |
| Call<Note> deleteNote( @Field("id") int id ); | |
| } |
| implementation 'com.android.support:design:27.1.1' | |
| implementation 'com.android.support:recyclerview-v7:27.1.1' | |
| implementation 'com.android.support:cardview-v7:27.1.1' | |
| implementation 'com.squareup.retrofit2:retrofit:2.4.0' | |
| implementation 'com.squareup.retrofit2:converter-gson:2.4.0' | |
| implementation 'com.thebluealliance:spectrum:0.7.1' |
| <?xml version="1.0" encoding="utf-8"?> | |
| <resources> | |
| <color name="colorPrimary">#1d1f2d</color> | |
| <color name="colorPrimaryDark">#15161e</color> | |
| <color name="colorAccent">#189be7</color> | |
| <!--color palete--> | |
| <color name="white">#dde6ec</color> | |
| <color name="blue">#7ec4ed</color> | |
| <color name="yellow">#d0fc7d</color> | |
| <color name="pink">#ed579a</color> | |
| <color name="green">#2aed76</color> | |
| <array name="demo_colors"> | |
| <item>@color/white</item> | |
| <item>@color/blue</item> | |
| <item>@color/yellow</item> | |
| <item>@color/pink</item> | |
| <item>@color/green</item> | |
| </array> | |
| </resources> |
| import android.app.AlertDialog; | |
| import android.app.ProgressDialog; | |
| import android.content.DialogInterface; | |
| import android.content.Intent; | |
| import android.support.annotation.NonNull; | |
| import android.support.v7.app.AppCompatActivity; | |
| import android.os.Bundle; | |
| import android.view.Menu; | |
| import android.view.MenuInflater; | |
| import android.view.MenuItem; | |
| import android.widget.EditText; | |
| import android.widget.Toast; | |
| import com.haerulmuttaqin.mynotesapp.R; | |
| import com.haerulmuttaqin.mynotesapp.api.ApiClient; | |
| import com.haerulmuttaqin.mynotesapp.api.ApiInterface; | |
| import com.haerulmuttaqin.mynotesapp.model.Note; | |
| import com.thebluealliance.spectrum.SpectrumPalette; | |
| import retrofit2.Call; | |
| import retrofit2.Callback; | |
| import retrofit2.Response; | |
| public class EditorActivity extends AppCompatActivity implements EditorView { | |
| EditText et_title, et_note; | |
| ProgressDialog progressDialog; | |
| SpectrumPalette palette; | |
| EditorPresenter presenter; | |
| int color, id; | |
| String title, note; | |
| Menu actionMenu; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.activity_editor); | |
| et_title = findViewById(R.id.title); | |
| et_note = findViewById(R.id.note); | |
| palette = findViewById(R.id.palette); | |
| palette.setOnColorSelectedListener( | |
| clr -> color = clr | |
| ); | |
| // Progress Dialog | |
| progressDialog = new ProgressDialog(this); | |
| progressDialog.setMessage("Please wait..."); | |
| presenter = new EditorPresenter(this); | |
| Intent intent = getIntent(); | |
| id = intent.getIntExtra("id", 0); | |
| title = intent.getStringExtra("title"); | |
| note = intent.getStringExtra("note"); | |
| color = intent.getIntExtra("color", 0); | |
| setDataFromIntentExtra(); | |
| } | |
| @Override | |
| public boolean onCreateOptionsMenu(Menu menu) { | |
| MenuInflater inflater = getMenuInflater(); | |
| inflater.inflate(R.menu.menu_editor, menu); | |
| actionMenu = menu; | |
| if (id != 0) { | |
| actionMenu.findItem(R.id.edit).setVisible(true); | |
| actionMenu.findItem(R.id.delete).setVisible(true); | |
| actionMenu.findItem(R.id.save).setVisible(false); | |
| actionMenu.findItem(R.id.update).setVisible(false); | |
| } else { | |
| actionMenu.findItem(R.id.edit).setVisible(false); | |
| actionMenu.findItem(R.id.delete).setVisible(false); | |
| actionMenu.findItem(R.id.save).setVisible(true); | |
| actionMenu.findItem(R.id.update).setVisible(false); | |
| } | |
| return true; | |
| } | |
| @Override | |
| public boolean onOptionsItemSelected(MenuItem item) { | |
| String title = et_title.getText().toString().trim(); | |
| String note = et_note.getText().toString().trim(); | |
| int color = this.color; | |
| switch (item.getItemId()) { | |
| case R.id.save: | |
| //Save | |
| if (title.isEmpty()) { | |
| et_title.setError("Please enter a title"); | |
| } else if (note.isEmpty()) { | |
| et_note.setError("Please enter a note"); | |
| } else { | |
| presenter.saveNote(title, note, color); | |
| } | |
| return true; | |
| case R.id.edit: | |
| editMode(); | |
| actionMenu.findItem(R.id.edit).setVisible(false); | |
| actionMenu.findItem(R.id.delete).setVisible(false); | |
| actionMenu.findItem(R.id.save).setVisible(false); | |
| actionMenu.findItem(R.id.update).setVisible(true); | |
| return true; | |
| case R.id.update: | |
| //Update | |
| if (title.isEmpty()) { | |
| et_title.setError("Please enter a title"); | |
| } else if (note.isEmpty()) { | |
| et_note.setError("Please enter a note"); | |
| } else { | |
| presenter.updateNote(id, title, note, color); | |
| } | |
| return true; | |
| case R.id.delete: | |
| AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); | |
| alertDialog.setTitle("Confirm !"); | |
| alertDialog.setMessage("Are you sure?"); | |
| alertDialog.setNegativeButton("Yes", (dialog, which) -> { | |
| dialog.dismiss(); | |
| presenter.deleteNote(id); | |
| }); | |
| alertDialog.setPositiveButton("Cencel", | |
| (dialog, which) -> dialog.dismiss()); | |
| alertDialog.show(); | |
| return true; | |
| default: | |
| return super.onOptionsItemSelected(item); | |
| } | |
| } | |
| @Override | |
| public void showProgress() { | |
| progressDialog.show(); | |
| } | |
| @Override | |
| public void hideProgress() { | |
| progressDialog.hide(); | |
| } | |
| @Override | |
| public void onRequestSuccess(String message) { | |
| Toast.makeText(EditorActivity.this, | |
| message, | |
| Toast.LENGTH_SHORT).show(); | |
| setResult(RESULT_OK); | |
| finish(); //back to main activity | |
| } | |
| @Override | |
| public void onRequestError(String message) { | |
| Toast.makeText(EditorActivity.this, | |
| message, | |
| Toast.LENGTH_SHORT).show(); | |
| } | |
| private void setDataFromIntentExtra() { | |
| if (id != 0) { | |
| et_title.setText(title); | |
| et_note.setText(note); | |
| palette.setSelectedColor(color); | |
| getSupportActionBar().setTitle("Update Note"); | |
| readMode(); | |
| } else { | |
| palette.setSelectedColor(getResources().getColor(R.color.white)); | |
| color = getResources().getColor(R.color.white); | |
| editMode(); | |
| } | |
| } | |
| private void editMode() { | |
| et_title.setFocusableInTouchMode(true); | |
| et_note.setFocusableInTouchMode(true); | |
| palette.setEnabled(true); | |
| } | |
| private void readMode() { | |
| et_title.setFocusableInTouchMode(false); | |
| et_note.setFocusableInTouchMode(false); | |
| et_title.setFocusable(false); | |
| et_note.setFocusable(false); | |
| palette.setEnabled(false); | |
| } | |
| } |
| <?xml version="1.0" encoding="utf-8"?> | |
| <android.support.v7.widget.CardView | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:app="http://schemas.android.com/apk/res-auto" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" | |
| android:layout_marginLeft="10dp" | |
| android:layout_marginRight="10dp" | |
| android:layout_marginTop="4dp" | |
| android:layout_marginBottom="4dp" | |
| app:cardCornerRadius="2dp" | |
| app:cardElevation="1dp" | |
| android:clickable="true" | |
| android:focusable="true" | |
| android:foreground="?attr/selectableItemBackground" | |
| android:id="@+id/card_item"> | |
| <LinearLayout | |
| android:id="@+id/line" | |
| android:layout_width="10dp" | |
| android:layout_height="match_parent" | |
| android:orientation="vertical" | |
| android:background="#49000000"/> | |
| <RelativeLayout | |
| android:padding="10dp" | |
| android:layout_marginStart="10dp" | |
| android:layout_marginLeft="10dp" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content"> | |
| <TextView | |
| android:id="@+id/title" | |
| android:text="@string/to_do" | |
| android:textSize="18sp" | |
| android:textColor="@android:color/black" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" /> | |
| <TextView | |
| android:id="@+id/note" | |
| android:layout_below="@id/title" | |
| android:text="@string/enter_note" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" | |
| android:layout_marginTop="5dp"/> | |
| <TextView | |
| android:id="@+id/date" | |
| android:layout_below="@id/note" | |
| android:text="@string/date" | |
| android:layout_width="match_parent" | |
| android:layout_height="wrap_content" | |
| android:layout_marginTop="10dp" | |
| android:gravity="end"/> | |
| </RelativeLayout> | |
| </android.support.v7.widget.CardView> |
| import android.content.Intent; | |
| import android.support.design.widget.FloatingActionButton; | |
| import android.support.v4.widget.SwipeRefreshLayout; | |
| import android.support.v7.app.AppCompatActivity; | |
| import android.os.Bundle; | |
| import android.support.v7.widget.LinearLayoutManager; | |
| import android.support.v7.widget.RecyclerView; | |
| import android.widget.Toast; | |
| import com.haerulmuttaqin.mynotesapp.R; | |
| import com.haerulmuttaqin.mynotesapp.activity.editor.EditorActivity; | |
| import com.haerulmuttaqin.mynotesapp.model.Note; | |
| import java.util.List; | |
| public class MainActivity extends AppCompatActivity implements MainView { | |
| private static final int INTENT_ADD = 100; | |
| private static final int INTENT_EDIT = 200; | |
| FloatingActionButton fab; | |
| RecyclerView recyclerView; | |
| SwipeRefreshLayout swipeRefresh; | |
| MainPresenter presenter; | |
| MainAdapter adapter; | |
| MainAdapter.ItemClickListener itemClickListener; | |
| List<Note> note; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.activity_main); | |
| swipeRefresh = findViewById(R.id.swipe_refresh); | |
| recyclerView = findViewById(R.id.recycler_view); | |
| recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |
| fab = findViewById(R.id.add); | |
| fab.setOnClickListener(view -> | |
| startActivityForResult( | |
| new Intent(this, EditorActivity.class), | |
| INTENT_ADD) | |
| ); | |
| presenter = new MainPresenter(this); | |
| presenter.getData(); | |
| swipeRefresh.setOnRefreshListener( | |
| () -> presenter.getData() | |
| ); | |
| itemClickListener = ((view, position) -> { | |
| int id = note.get(position).getId(); | |
| String title = note.get(position).getTitle(); | |
| String notes = note.get(position).getNote(); | |
| int color = note.get(position).getColor(); | |
| Intent intent = new Intent(this, EditorActivity.class); | |
| intent.putExtra("id", id); | |
| intent.putExtra("title", title); | |
| intent.putExtra("note", notes); | |
| intent.putExtra("color", color); | |
| startActivityForResult(intent, INTENT_EDIT); | |
| }); | |
| } | |
| @Override | |
| protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
| super.onActivityResult(requestCode, resultCode, data); | |
| if (requestCode == INTENT_ADD && resultCode == RESULT_OK) { | |
| presenter.getData(); //reload data | |
| } | |
| else if (requestCode == INTENT_EDIT && resultCode == RESULT_OK) { | |
| presenter.getData(); //reload data | |
| } | |
| } | |
| @Override | |
| public void showLoading() { | |
| swipeRefresh.setRefreshing(true); | |
| } | |
| @Override | |
| public void hideLoading() { | |
| swipeRefresh.setRefreshing(false); | |
| } | |
| @Override | |
| public void onGetResult(List<Note> notes) { | |
| adapter = new MainAdapter(this, notes, itemClickListener); | |
| adapter.notifyDataSetChanged(); | |
| recyclerView.setAdapter(adapter); | |
| note = notes; | |
| } | |
| @Override | |
| public void onErrorLoading(String message) { | |
| Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); | |
| } | |
| } |
| import com.google.gson.annotations.Expose; | |
| import com.google.gson.annotations.SerializedName; | |
| public class Note { | |
| @Expose | |
| @SerializedName("id") private int id; | |
| @Expose | |
| @SerializedName("title") private String title; | |
| @Expose | |
| @SerializedName("note") private String note; | |
| @Expose | |
| @SerializedName("color") private int color; | |
| @Expose | |
| @SerializedName("date") private String date; | |
| @Expose | |
| @SerializedName("success") private Boolean success; | |
| @Expose | |
| @SerializedName("message") private String message; | |
| public int getId() { | |
| return id; | |
| } | |
| public void setId(int id) { | |
| this.id = id; | |
| } | |
| public String getTitle() { | |
| return title; | |
| } | |
| public void setTitle(String title) { | |
| this.title = title; | |
| } | |
| public String getNote() { | |
| return note; | |
| } | |
| public void setNote(String note) { | |
| this.note = note; | |
| } | |
| public int getColor() { | |
| return color; | |
| } | |
| public void setColor(int color) { | |
| this.color = color; | |
| } | |
| public String getDate() { | |
| return date; | |
| } | |
| public void setDate(String date) { | |
| this.date = date; | |
| } | |
| public Boolean getSuccess() { | |
| return success; | |
| } | |
| public void setSuccess(Boolean success) { | |
| this.success = success; | |
| } | |
| public String getMessage() { | |
| return message; | |
| } | |
| public void setMessage(String message) { | |
| this.message = message; | |
| } | |
| } |
how to do that
Where is MainAdapter bro?
What is EditorPresenter ????
Hello pls it is not sorting the note post by descending, when i add it goes down, it does not show at the up(latest post).
you're missing multiple files:
MainPresenter
EditorPresenter
MainView ??
Thank you,
have small error is when get color no data get, but when i delete select color line from note.php data get without error...why?
and how can be get color and set as cardview background?
thanks again!
I keep on getting this error "Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $". Anyone who can help? Thanks in advance.
can you send me the php files for this project
thank you
After adding INTENT_ADD, my application force close when I click the add data button Can anyone help?
I keep on getting this error "Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $". Anyone who can help? Thanks in advance.
Please check your json output from php code