Mobile Phone Se Android Notepad Application Kaise Banaye (Sketchware Pro)
Aaj hum apne mobile phone ki madad se ek simple aur professional Android Notepad Application banana sikhne wale hain.
Is tutorial me hum Android application kaise banayi jaati hai, woh bhi step by step detail ke saath samjhenge, taaki beginners ko samajhne me koi dikkat na ho.
Step 1: Sketchware Pro Me Naya Project Banana
Sabse pehle hum Sketchware Pro application ko open karenge. App open hone ke baad plus (+) icon par click karke ek naya project create karenge.
Project create karte waqt application ka naam Notepad rakhenge aur package name com.my.notepad set karenge. Uske baad Save Changes button par click kar denge.
Step 2: Main Screen Ka XML Layout Banana
Project create ho jaane ke baad, screen ke right niche ki taraf ek option dikhai dega. Us option par click karna hai. Iske baad Direct XML Editor par click karenge aur niche diya gaya code wahan paste kar denge.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F8F9FA">
<RelativeLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="#FFFFFF"
android:elevation="4dp"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<TextView
android:id="@+id/textTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pro Note"
android:textSize="22sp"
android:textStyle="bold"
android:textColor="#1C1B1F"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/btnDeleteSelected"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@android:drawable/ic_delete"
android:layout_marginEnd="12dp"
android:tint="#D32F2F"
android:visibility="gone"
android:contentDescription="DeleteSelected"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true" />
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewNotes"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:clipToPadding="false"
android:layout_below="@id/topBar" />
<ImageView
android:id="@+id/fabAdd"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="24dp"
android:background="@drawable/bg_fab"
android:src="@drawable/icon_plus_round"
android:scaleType="center"
android:tint="@android:color/white"
android:contentDescription="AddNote"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
Step 3: Edit Note Screen Banana
Ab hum ek dusri screen banayenge jiska naam edit_note.xml rakhenge. Pehle ki tarah hi is screen ke Direct XML Editor me niche diya gaya code paste kar denge.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFFFFF">
<RelativeLayout
android:id="@+id/relativelayout6"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="#FFFFFF"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<TextView
android:id="@+id/textview8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Edit Note"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#1C1B1F"
android:layout_centerVertical="true" />
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:background="@drawable/rounded_button_purple"
android:text="Save"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:textAllCaps="false"
android:minWidth="72dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true" />
</RelativeLayout>
<View
android:id="@+id/view29"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#E0E0E0" />
<EditText
android:id="@+id/editTextNote"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="20dp"
android:gravity="top"
android:textSize="16sp"
android:textColor="#1C1B1F"
android:hint="Start writing your note..."
android:textColorHint="#9E9E9E"
android:layout_weight="1"
android:background="@null"
android:inputType="textMultiLine"
android:lineSpacingExtra="4dp"
android:capitalize="sentences"
android:scrollbars="vertical" />
</LinearLayout>Step 4: Custom Note Item View Banana
Ab hum ek custom view banayenge jiska naam note_item.xml rakhenge. Iske andar bhi niche diya gaya code paste karna hai.
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
app:cardCornerRadius="12dp"
app:cardElevation="2dp"
app:cardBackgroundColor="@android:color/white">
<LinearLayout
android:id="@+id/linear2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="14dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/indicatorSelected"
android:layout_width="35dp"
android:layout_height="match_parent"
android:background="@drawable/indicator_selected"
android:gravity="center_horizontal|center_vertical"
android:visibility="gone">
<ImageView
android:id="@+id/imageview1"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/select"
android:scaleType="fitCenter" />
</LinearLayout>
<TextView
android:id="@+id/textViewTitle"
android:focusable="false"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#1C1B1F"
android:layout_weight="1"
android:layout_marginStart="12dp"
android:lineSpacingExtra="4dp"
android:maxLines="3"
android:ellipsize="end" />
<ImageButton
android:id="@+id/buttonDelete"
android:focusable="false"
android:layout_width="36dp"
android:layout_height="36dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@android:drawable/ic_delete"
android:tint="#757575"
android:contentDescription="Delete" />
</LinearLayout>
</androidx.cardview.widget.CardView>Step 5: Java Files Banana
Itna sab hone ke baad, upar ki taraf jo 3 dot option hai us par click karenge. Fir Java/Kotlin Manager par click karenge.
Yahan humein total 4 Java files banani hongi:
- EditNoteActivity.java
- MainActivity.java
- Note.java
- NoteAdapter.java
Ab in sabhi files me unke naam ke according niche diya gaya code paste kar dena hai. Dhyan rahe, har file me usi ka related code paste ho.
package com.my.notepad;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity
implements NoteAdapter.OnNoteActionListener {
private RecyclerView recyclerViewNotes;
private NoteAdapter noteAdapter;
private List<Note> notes;
private ImageView btnDeleteSelected;
private static final int REQUEST_CODE_ADD_NOTE = 100;
private static final int REQUEST_CODE_EDIT_NOTE = 101;
private static final String FILE_NAME = "notes_data.json";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
notes = new ArrayList<>();
// Load saved notes when app starts
loadNotes();
recyclerViewNotes = findViewById(R.id.recyclerViewNotes);
btnDeleteSelected = findViewById(R.id.btnDeleteSelected);
noteAdapter = new NoteAdapter(notes, this, this);
recyclerViewNotes.setLayoutManager(new LinearLayoutManager(this));
recyclerViewNotes.setAdapter(noteAdapter);
// ADD NOTE BUTTON
findViewById(R.id.fabAdd).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, EditNoteActivity.class);
startActivityForResult(intent, REQUEST_CODE_ADD_NOTE);
}
});
// DELETE SELECTED BUTTON (TOP RIGHT)
btnDeleteSelected.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
noteAdapter.deleteSelected();
btnDeleteSelected.setVisibility(View.GONE);
}
});
}
@Override
protected void onPause() {
super.onPause();
saveNotes(); // Save when app goes to background
}
@Override
protected void onStop() {
super.onStop();
saveNotes(); // Save when app stops
}
// SAVE NOTES TO FILE
private void saveNotes() {
try {
Gson gson = new Gson();
String json = gson.toJson(notes);
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
fos.write(json.getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// LOAD NOTES FROM FILE
private void loadNotes() {
try {
FileInputStream fis = openFileInput(FILE_NAME);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
reader.close();
fis.close();
String json = stringBuilder.toString();
Gson gson = new Gson();
Type type = new TypeToken<List<Note>>(){}.getType();
List<Note> savedNotes = gson.fromJson(json, type);
if (savedNotes != null) {
notes.clear();
notes.addAll(savedNotes);
}
} catch (Exception e) {
// First time app run, no file exists
notes = new ArrayList<>();
}
}
// NOTE CLICK → OPEN EDIT
@Override
public void onNoteClicked(int position) {
if (position >= 0 && position < notes.size()) {
Intent intent = new Intent(this, EditNoteActivity.class);
intent.putExtra("note_index", position);
intent.putExtra("note_content", notes.get(position).getContent());
startActivityForResult(intent, REQUEST_CODE_EDIT_NOTE);
}
}
// SHOW / HIDE DELETE ICON
@Override
public void onSelectionChanged() {
if (noteAdapter.isAnySelected()) {
btnDeleteSelected.setVisibility(View.VISIBLE);
} else {
btnDeleteSelected.setVisibility(View.GONE);
noteAdapter.exitSelectionMode();
}
}
// NEW METHOD FOR ADAPTER TO CALL
@Override
public void saveNotesFromAdapter() {
saveNotes();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
String savedNote = data.getStringExtra("saved_note");
if (savedNote == null) savedNote = "";
if (requestCode == REQUEST_CODE_ADD_NOTE) {
if (!savedNote.trim().isEmpty()) {
notes.add(new Note(savedNote));
noteAdapter.notifyItemInserted(notes.size() - 1);
saveNotes(); // Save new note
}
} else if (requestCode == REQUEST_CODE_EDIT_NOTE) {
int noteIndex = data.getIntExtra("note_index", -1);
if (noteIndex >= 0 && noteIndex < notes.size()) {
notes.get(noteIndex).setContent(savedNote);
noteAdapter.notifyItemChanged(noteIndex);
saveNotes(); // Save edited note
}
}
}
}
}
package com.my.notepad;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class EditNoteActivity extends AppCompatActivity {
private EditText editTextNote;
private int noteIndex = -1;
private String originalContent = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_note);
editTextNote = findViewById(R.id.editTextNote);
Button btnSave = findViewById(R.id.btnSave);
Intent intent = getIntent();
if (intent != null) {
originalContent = intent.getStringExtra("note_content");
noteIndex = intent.getIntExtra("note_index", -1);
if (originalContent != null) {
editTextNote.setText(originalContent);
editTextNote.setSelection(originalContent.length());
}
}
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = editTextNote.getText().toString();
Intent result = new Intent();
result.putExtra("saved_note", content);
result.putExtra("note_index", noteIndex);
setResult(RESULT_OK, result);
finish();
}
});
}
@Override
public void onBackPressed() {
String current = editTextNote.getText().toString();
if (!current.equals(originalContent)) {
Intent result = new Intent();
result.putExtra("saved_note", current);
result.putExtra("note_index", noteIndex);
setResult(RESULT_OK, result);
}
super.onBackPressed();
}
}
package com.my.notepad;
public class Note {
private String content;
private boolean selected;
// Default constructor required by Gson
public Note() {
}
public Note(String content) {
this.content = content;
this.selected = false;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
package com.my.notepad;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.NoteViewHolder> {
private List<Note> notes;
private Context context;
private boolean selectionMode = false;
private OnNoteActionListener listener;
public interface OnNoteActionListener {
void onNoteClicked(int position);
void onSelectionChanged();
void saveNotesFromAdapter(); // NEW METHOD ADDED
}
public NoteAdapter(List<Note> notes, Context context, OnNoteActionListener listener) {
this.notes = notes;
this.context = context;
this.listener = listener;
}
@Override
public NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.note_item, parent, false);
return new NoteViewHolder(view);
}
@Override
public void onBindViewHolder(final NoteViewHolder holder, final int position) {
if (position < 0 || position >= notes.size()) return;
final Note note = notes.get(position);
String preview = note.getContent();
if (preview == null) preview = "";
if (preview.length() > 50) {
preview = preview.substring(0, 50) + "...";
}
holder.textViewTitle.setText(preview);
holder.indicatorSelected.setVisibility(note.isSelected() ? View.VISIBLE : View.GONE);
// CLICK
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getAdapterPosition();
if (pos == RecyclerView.NO_POSITION) return;
if (selectionMode) {
toggleSelection(pos);
} else {
listener.onNoteClicked(pos);
}
}
});
// LONG CLICK → SELECTION MODE
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = holder.getAdapterPosition();
if (pos == RecyclerView.NO_POSITION) return true;
selectionMode = true;
toggleSelection(pos);
listener.onSelectionChanged();
return true;
}
});
// SINGLE DELETE BUTTON (SAFE)
holder.buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getAdapterPosition();
if (pos == RecyclerView.NO_POSITION) return;
notes.remove(pos);
notifyItemRemoved(pos);
// Call save notes through listener
listener.saveNotesFromAdapter();
if (notes.isEmpty()) {
selectionMode = false;
listener.onSelectionChanged();
}
}
});
}
private void toggleSelection(int position) {
if (position < 0 || position >= notes.size()) return;
Note note = notes.get(position);
note.setSelected(!note.isSelected());
notifyItemChanged(position);
listener.onSelectionChanged();
}
public void exitSelectionMode() {
for (Note note : notes) {
note.setSelected(false);
}
selectionMode = false;
notifyDataSetChanged();
}
// 🔥 SAFE MULTI DELETE (NO CRASH)
public void deleteSelected() {
for (int i = notes.size() - 1; i >= 0; i--) {
if (notes.get(i).isSelected()) {
notes.remove(i);
}
}
selectionMode = false;
notifyDataSetChanged();
listener.onSelectionChanged();
// Call save notes through listener
listener.saveNotesFromAdapter();
}
public boolean isAnySelected() {
for (Note note : notes) {
if (note.isSelected()) return true;
}
return false;
}
@Override
public int getItemCount() {
return notes == null ? 0 : notes.size();
}
static class NoteViewHolder extends RecyclerView.ViewHolder {
TextView textViewTitle;
View indicatorSelected;
ImageButton buttonDelete;
NoteViewHolder(View itemView) {
super(itemView);
textViewTitle = itemView.findViewById(R.id.textViewTitle);
indicatorSelected = itemView.findViewById(R.id.indicatorSelected);
buttonDelete = itemView.findViewById(R.id.buttonDelete);
}
}
}Ab aapko ek dependency bhi add karni padegi right side mein three dot per click karo uske bad library manager per click karo uske bad local library per click karo fir yah dependency add karo
com.google.code.gson:gson:2.10.1
Dependency add karne ke bad ab hamen drawable folder ke andar kuchh filein banani honge
1 bg_fab.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#4361EE"/>
<gradient
android:startColor="#4361EE"
android:endColor="#3A56D4"
android:angle="45"/>
</shape>
2 btn_delete_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp">
<shape android:shape="rectangle">
<solid android:color="#80000000" />
<corners android:radius="24dp" />
</shape>
</item>
<item android:top="0dp" android:left="0dp" android:right="0dp" android:bottom="0dp">
<shape android:shape="rectangle">
<solid android:color="#B3261E" />
<corners android:radius="24dp" />
<stroke android:width="1dp" android:color="#9A0007" />
</shape>
</item>
</layer-list>
3 gradient_top_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#4361EE"
android:endColor="#3A56D4"
android:angle="90"/>
</shape>
4 indicator_selected.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#6750A4"/>
<size android:width="4dp"/>
<corners android:radius="2dp"/>
</shape>
5 rounded_button_purple.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#6750A4" />
<corners android:radius="18dp" />
</shape>
6 rounded_button_red.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#B3261E" />
<corners android:radius="24dp" />
</shape>
select
Ab aap apna project ran karo uske bad application install karo Mubarak ho aapka application Bankar ready ho gaya
Ab Ham janenge notepad application kya hota hai kaise kam karta hai
Notepad Application क्या होता है? Notepad App कैसे काम करता है – Complete Guide (Sketchware Hub)
Notepad Application एक बहुत ही simple लेकिन powerful Android application होती है, जिसका इस्तेमाल text, notes, ideas, reminders और daily important information लिखने और save करने के लिए किया जाता है। आज के digital time में हर user को एक fast, lightweight और easy notepad app की जरूरत होती है।
इस पोस्ट में हम detail में जानेंगे कि Notepad Application क्या होता है, Notepad App कैसे काम करता है, और Sketchware और Sketchware Hub की मदद से अपना खुद का Notepad App कैसे बनाया जा सकता है।
Notepad Application क्या होता है?
Notepad Application एक ऐसा mobile app होता है जिसमें user simple text format में अपने notes लिख सकता है। यह app specially उन लोगों के लिए useful होती है जो mobile पर जल्दी से कुछ लिखना चाहते हैं, जैसे:
- Daily to-do list बनाना
- Important ideas save करना
- Study notes लिखना
- Office या business notes maintain करना
- Temporary text copy-paste करना
Notepad App बहुत ही lightweight होती है और phone की memory ज्यादा consume नहीं करती। यही कारण है कि Android users में Notepad Application बहुत popular है।
Notepad Application कैसे काम करता है?
Notepad Application का working process बहुत simple होता है। जब user app open करता है, तो उसे एक text area दिखाई देता है जहाँ वह freely text लिख सकता है। यह text normally phone की internal storage या app database में save होता है।
Sketchware से बनाए गए Notepad App में आमतौर पर ये components use होते हैं:
- EditText – text लिखने के लिए
- Button – save, delete या update के लिए
- SharedPreferences या File Storage – data save करने के लिए
- ListView या RecyclerView – saved notes दिखाने के लिए
Sketchware से Notepad Application क्यों बनाएं?
Sketchware एक powerful Android app development tool है, जिसकी मदद से बिना coding knowledge के भी Android app बनाई जा सकती है। Sketchware beginners और students के लिए सबसे best platform माना जाता है।
अगर आप Sketchware Hub follow करते हैं, तो आपको Notepad Application से related ready-made blocks, examples और tutorials बहुत आसानी से मिल जाते हैं।
Sketchware Hub क्या है और Notepad App में इसका role
Sketchware Hub एक learning platform है जहाँ Sketchware users को:
- Sketchware tutorials
- Android app ideas
- Ready blocks codes
- Real app examples
Sketchware Hub की मदद से आप आसानी से Notepad Application का: design, logic और data storage system समझ सकते हैं।
Notepad App के मुख्य features
एक professional Notepad Application में निम्न features होने चाहिए:
- Create new note
- Edit existing note
- Delete note
- Auto save option
- Simple and clean UI
- Fast loading
Sketchware से बने Notepad App में ये सारे features बहुत आसानी से add किए जा सकते हैं। Sketchware Hub पर इन features के लिए step-by-step guide available है।
Notepad Application का real life use
Notepad Application का use students, teachers, business owners और developers सभी करते हैं। Sketchware सीखने वाले beginners के लिए Notepad App सबसे best practice project माना जाता है।
Sketchware Hub पर Notepad Application tutorial follow करके आप Android app development की strong foundation बना सकते हैं।
SEO के लिए Notepad App क्यों best topic है?
"Notepad Application", "Notepad App कैसे बनाएं", "Sketchware Notepad App", "Sketchware Hub tutorial" जैसे keywords Google पर बहुत ज्यादा search किए जाते हैं।
अगर आप अपनी website पर इस तरह का detailed content publish करते हैं, तो आपकी website SEO में grow कर सकती है और organic traffic मिल सकता है।
Conclusion – Sketchware Hub के साथ Notepad App बनाएं
Notepad Application एक simple लेकिन powerful Android app है। अगर आप Sketchware सीख रहे हैं, तो Notepad App बनाना आपके लिए best starting point है।
Sketchware Hub की मदद से आप आसानी से Sketchware में Notepad Application बनाना सीख सकते हैं। इस तरह का SEO optimized content आपकी website के लिए भी बहुत useful साबित होगा।
teg
sketchware hub, sketchware, sketchware.in, sketchware projects, sketchware pro,sketchware project,
sketchware project store 0 2
sketchware pro download apk 0 1
sketchware help 0 1
sketchware codes


0 Comments