اذهب إلى المحتوى

Mohamd Imran

الأعضاء
  • المساهمات

    1070
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    15

إجابات الأسئلة

  1. إجابة Mohamd Imran سؤال في شيفرة لإيقاف تشغيل هاتف أندرويد كانت الإجابة المقبولة   
    مرحباً بك @دانا دلول
    أتوقع لا يمكن ذلك في أنظمة أندرويد لكن يوجد طريقة قريبة لكن تظهر للمستخدم طلب غلق الهاتف يمكنك إستخدام Intent هكذا 
    Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN"); i.putExtra("android.intent.extra.KEY_CONFIRM", true); startActivity(i); عند تنفيذ الكود أعلاه سيظهر لك نافذة طلب إغلاق الهاتف ,يمكنك إستخدام الكود في ال onCreate() ميثود
  2. إجابة Mohamd Imran سؤال في حطأ بسيط فى تثبيت navigition 5 فى ريأكت ناتيف كانت الإجابة المقبولة   
    السلام عليكم @Ahmed Sawy
    بالنسبة للخطأ الأول ENOENT: no such file or directory جرب حذف ملف node_moduls ثم نفذ الأمر 
    npm install والخطأ الأخر باللون الأحمر معناه أنه أنه يوجد مشكلة بالصلاحيات جرب تشغيل ال CMD أو التيرمنال بصلاحيات المسؤول وغير ذلك يوجد خطأ أخر لكنه في كتابة الأكواد يوجد لديك خطأ أصلحه وأعد تنفيذ الأمر 
  3. إجابة Mohamd Imran سؤال في كيف يمكن مشاركة اكتفتي محدد من التطبيق اندرويد كانت الإجابة المقبولة   
    السلام عليكم أخي @مروان مروان3
    حسب ما فهمت إنك تريد عند ضغط رابط المشاركة يتم فتح أكتفيتي معين في تطبيقك؟, إن كان كذلك ما يجب التعديل عليه هو ملف mainfest وقم بإضافة الوهست الهاص بك وكذلك المسار ما أقصده بالمسار هو مثلا فليكن رابط المشاركة الخاص بك هكذا 
    http://www.example.com/whatsshare?img=img.png إذا المسار الخاص بك هكذا whatsshare الأن أضف التالي في ملف ال mainfest 
    <activity android:name="Activity_Name_here" android:label="activitytitile" android:theme="yourtheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="www.example.com" android:path="/whatsshare" android:scheme="http" /> </intent-filter> </activity> وإستبدل Activity_Name_here بإسم الأكتيفتي المراد فتحه ,وكذلك إستبدل ال host في الأسفل بالوهست الخاص بك بدون التشفير (http) وأيضاً المسار بدل whatsshare 
  4. إجابة Mohamd Imran سؤال في مساعدة بخصوص عمل صفحة في الووردبريس كانت الإجابة المقبولة   
    أهلا بك @mansour_tech
    يمكنك عمل صفحة لكن إعطها إسم أخر غير index بعد ذلك قم بإضافة الهيدر والسايدبار والفوتر وفي قسم الbody قم بإضافة المنشورات في الصفحة وإن كنت لا تريدها أن تظهر في الصفحة الرئيسية index.php يمكنك إزالة ذلك القسم ويكون عادة يبدأ ب for لووب 
  5. إجابة Mohamd Imran سؤال في كيف يمكن حماية تطبيق الاندرويد من الهندسة العكسية كانت الإجابة المقبولة   
    وعليكم السلام أخي @مروان مروان3
    دعنا نقسم ال api إلى قسم وحماية التطبيق بشكل عام إلى قسم أخر ,لحماية التطبيق مثلاً من التفكيك أو سرقة السورس كود لا يمكن الحماية ١٠٠٪ لكن بنسبة ٩٥٪ الطريقة التالية فعالة هي بإستخدام ProGuard وسيقوم بتشفير تطبيقك بالكامل وأيضاً تسريعه لتفعيل ذلك في تطبيقك إذهب إلى ملف  build.gradle الخاص بتطبيقك ثم إبحث عن minifyEnabled وقم بتغيير القيمة إلى true وأيضاً إبحث عن shrinkResources وقم بتغيير القيمة إلى true وتحت shrinkResources  أضف التالي 
    proguardFiles getDefaultProguardFile('proguard-android.txt') ثم أعد بناء التطبيق ,هكذا إنتهينا من هذا القسم ,الأن بخصوص قسم حماية ال api يوجد عدة طرق  وعدة مكتبات لحماية الطلبات مثل JWT سأذكر طريقة سهل عملها وشرحها هنا  ,وهي إرسالة توكن مع ال request يوجد عدة طرق لكن هذه إحداها ,في الأندرويد نقوم بالحصوص على id الهاتف هكذا
    String UniqueID=Secure.getString(getActivity().getContentResolver(),Secure.ANDROID_ID); بعد ذلك نقوم بإرسال ذلك مع ال api هكذا
    http://example.com/api/get_info.php?par=request&id=UniqueID بعد ذلك  في جهة السيرفر نقوم بالتأكد من أن الطلب قادم من جهاز موبايل من خلال التأكد من ال id مثال
    if($_REQUEST['UniqueID']=="" || strlen($_REQUEST['UniqueID'])<9){ //هنا الid خاطئ قم بعمل شيء مثل إلغاء الطلب الخ.. }else{ //هنا ال id صالح قم بتمرير الطلب }  
  6. إجابة Mohamd Imran سؤال في كيفية تعيين زر اعادة ارسال رمز OTP من firebase كانت الإجابة المقبولة   
    أهلا بك @مروان مروان3
    يمكنك عمل ذلك من خلال عمل متغير فليكن بإسم mToken ثم عدل الميثود التالية إلى 
    @Override public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) { super.onCodeSent(s, forceResendingToken); verificationId = s; mToken = forceResendingToken; } ثم نقوم بإستخدام الميثود التالية لإعادة إرسال الرمز مرة أخرى 
    private void resendVerificationCode(String phoneNumber, PhoneAuthProvider.ForceResendingToken token) { PhoneAuthProvider.getInstance().verifyPhoneNumber( phoneNumber, 60, TimeUnit.SECONDS, this, mCallback, token); } ثم قم بعمل onClickListener ,وإستدعي الميثود عند ضغط الزر لإعادة إرسال الرمز  ونقوم بإستدعاء الميثود هكذا مع تمرير الرقم ومتغير mToken إليها 
    resendVerificationCode(phonenumber,mToken);  
  7. إجابة Mohamd Imran سؤال في قبل انشاء برنامج تسير مبيعات سطح مكتب كانت الإجابة المقبولة   
    إن كان كذلك تفضل هذه برنامج جافا مفتوح المصدر متوفر على github هو InventoryManagementSystem متقدم متوفر هنا 
  8. إجابة Mohamd Imran سؤال في كيف يمكن عمل نظام تقيم المنتج اندرويد كانت الإجابة المقبولة   
    أهلا بك أخي @مروان مروان3
    تمام أولا نحتاج إلى عمل ال api الخاص بإستلام البيانات القادمة من التطبيق وهي عدد النجمات في قسم السيرفر ,نقوم بعمل ملف php بسيط 
    <?php include 'Config.php'; $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName); $s_count = $_POST['stars_count']; $Sql_Query = "insert into Userd (stars_count) values ('$s_count')"; if(mysqli_query($con,$Sql_Query)){ echo 'Stars Count Inserted Successfully'; } else{ echo 'Try Again'; } mysqli_close($con); ?> ملاحظة لا تنسى تغيير include 'config.php' بالملف الخاص بك ,تمام هنا إنتهينا من جهة السيرفر قم بإعطاء الملف إسم مثلاً insert_stars.php نذهب إلى أندرويد إستديو 
    نقوم بعمل requestqueue في الكلاس MainActivity مثلا  
    RequestQueue requestQueue; وأيضا نقوم بعمل متغير من نوع string ونقوم بإعطائه الرابط للسيرفر الخاص بنا مع إسم الملف مثال
    String HttpUrl = "http://test.com/insert_stars.php"; والأن في ال onCreate ميثود نقوم بعمل طلب Volly جديد هكذا
    requestQueue = Volley.newRequestQueue(MainActivity.this); ونقوم بعمل ميثود من نوع StringRequest خارج ال onCreate ميثود هكذا
    StringRequest stringRequest = new StringRequest(Request.Method.POST, HttpUrl, new Response.Listener<String>() { @Override public void onResponse(String ServerResponse) { // Showing Server response coming from server. Toast.makeText(MainActivity.this, ServerResponse, Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { // Showing Server Error message . Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show(); } }) { قمت بإضافة توست لإظهار الرسالة القادمة من السيرفر في حالة نجاح إدخال البيانات وكذلك توست أخر في حالة حدوث خطأ وأيضا نقوم بعمل ميثود أخرى تقوم بإرجاع عدد النجمات أسفل الميثود الأولى
    @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); // Adding AllStars value to Params. params.put("stars_count", starsparam); return params; } }; لكن قم بتغيير الجزر الأول هنا
    params.put("stars_count", starsparam); وهو stars_count إلى إسم الحقل في قاعدة البيانات والجزء الثاني المتغير الخاص بعدد النجوم ,الأن جزء ال Volly 
    نقوم بعمل طلب volly جديد ونقوم بتمرير الميثود الأولى له هكذا
    // Creating RequestQueue. RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this); // Add the stars StringRequest object into requestQueue. requestQueue.add(stringRequest); يمكنك إضافة السطرين إلى الميثود onCreate  هكذا إنتهينا  ,ولا تنسى إضافة ال internet permıssıon إلى ملف mainfest 
    <uses-permission android:name="android.permission.INTERNET"/> الجزء أعلاه لإدخال عدد النجوم إلى قاعدة البيانات ,الأن بخصوص جزء إستعادة عدد النجوم من قاعدة البيانات ووضعها في ال ratingbar نبدأ سبق لك إستخدام volly لإرجاع البيانات هذا الجزء أتوقع سهل نقوم بعمل ميثود لذلك
    /** * Method to make json object request where json response to get StarsCount via Server { * */ private void starsCountJsonRequest() { JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, urlJsonObj, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); try { // Parsing json object response // response will be a json object String starscount = response.getString("starsC"); jsonResponse = ""; jsonResponse += starscount; starsbar.numStars(jsonResponse); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); Toast.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show(); } }); // Adding request to request queue AppController.getInstance().addToRequestQueue(jsonObjReq); } طبعاً هنا  starsbar هو ال RatingBar فيو هنا
    starsbar.numStars(jsonResponse);  
  9. إجابة Mohamd Imran سؤال في كيف يمكن تعبئة materialBetterSpinner من خلال البيانات المنقوله من اكتفتي اخر كانت الإجابة المقبولة   
    السلام عليكم أخي @مروان مروان3
    الجزء المسؤول على إضافة البيانات هو المصفوفة SPINNER_DATA2 في الكود الخاص بك  ,تأكد منها إن كانت تحوي بيانات يمكنك عمل المصفوفة وإضافة البيانات لها مثل 
    ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("text"); arrayList.add("text1"); arrayList.add("text2"); arrayList.add("text3"); arrayList.add("text4"); arrayList.add("text5"); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList); لاحظ هنا في ال arrayAdapter نقوم بتمرير المصفوفة هنا إسمها arrayList
    new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList);  وبخصوص الخطأ الذي يظهر لك معناه أن ال textview فارغ null   
    android.widget.TextView.setText تأكد من أنك قمت بتعريفه في ال onCreate ميثود 
  10. إجابة Mohamd Imran سؤال في setVisibility لا تعمل لدى tabLayout كانت الإجابة المقبولة   
    السلام عليكم أخي @مروان مروان3
    سبب الخطأ هو أنك لم تقم بتمرير View معين أي فارغ null لحل المشكلة جرب التالي
    tabCalls = (View) findViewById(R.id.tabCalls);  
  11. إجابة Mohamd Imran سؤال في هل يمكن اخفاء TabLayout في بعض صفحات BottomNavigationView كانت الإجابة المقبولة   
    أهلا بك أخي @مروان مروان3
    بالطبع يمكنك ذلك من خلال عمل ميثود للإخفاء وميثود للإظهار وإستدعاء مثلاً الميثود الخاص بالإخفاء في الزر الثاني والثالث وقمت بعمل الميثودز لك 
    public void showTabLayout() { parentTabs.setVisibility(View.VISIBLE); } public void hideTabLayout() { parentTabs.setVisibility(View.GONE); } ويمكنك إستدعاء الميثود التي تريد مثلا لإظهار tablayout  نستدعي الميثود showTabLayout والعكس  
  12. إجابة Mohamd Imran سؤال في كيفية الانتقال من Bottom Navigation Bar الى Activity كانت الإجابة المقبولة   
    @مروان مروان3 
    لم أنتنبه إلى الكلاس الخاص بك هنا 
    extends FragmentPagerAdapter أعتقدت إنها تستخدم activity على كل حال لحل المشكلة
    new Intent() يتطلب context وليس Activity ,نقوم بتمرير الcontext إلى الPageAdapter هكذا 
     
    PageAdapter(Context context,FragmentManager fm, int numOfTabs) { super(fm); this.mContext = context; this.numOfTabs = numOfTabs; } ونقوم بإستخدام ال context في  ال intent هكذا 
    Intent intent = new Intent(this.mContext, Home.class);  
     
  13. إجابة Mohamd Imran سؤال في مشكلة تكرار اخر اشعار من قاعدة البيانات للمستخدم كانت الإجابة المقبولة   
    وعليكم السلام أخي @مروان مروان3
     
    يبدو أن سبب المشكلة هو عند ضغط زر الرجوع يتم تشغيل السيرفيس مرة أخرى لحل المشكلة نقوم أولا بالتأكد من أن السيرفيس الخاصة بنا تعمل مسبقاً أم لا  في الخلفية وبناء على ذلك نقوم بتشغيلها عند الضغط على زر الرجوع  قمت بعمل ميثود تقوم بإرجاع true أو false لحالة السيرفيس ضعها تحت ال onCreate ميثود 
    private boolean isMyServiceRunning(Class<?> serviceClass) { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { return true; } } return false; } ونقوم بإستخدامها هكذا في الكود الخاص بك 
    public void onBackPressed() { if(!isMyServiceRunning(MyService.class)){ Intent sr =new Intent(this, MyService.class); startService(sr); } Toast.makeText(this, "Exit", Toast.LENGTH_SHORT).show(); finish(); run_loop(); super.onBackPressed(); }  وأيضا هنا لديك خطأ تستدعي ال فنكشن run_loop مرتين حيث يتم تشغيل التايمر أو اللوب عند تشغيل السيرفيس أي لا يوجد داعي لإضافتها مرة أخرى في ال onBackPressed وعدل هذا الجزء من السيرفيس لكي يشغل الفنكشن الخاص بك
    @Override public int onStartCommand(Intent intent,int flags,int startId){ Toast.makeText(this, "Start myServis", Toast.LENGTH_LONG).show(); run_loop(); return START_STICKY; } وقم بإزالتها من onBackPressed أي هكذا 
    public void onBackPressed() { if(!isMyServiceRunning(MyService.class)){ Intent sr =new Intent(this, MyService.class); startService(sr); } Toast.makeText(this, "Exit", Toast.LENGTH_SHORT).show(); finish(); super.onBackPressed(); } وأيضا لماذا تستخدم  finish(); هنا ؟
  14. إجابة Mohamd Imran سؤال في كيفية اضافة الاشعارات او التنبيهات في تطبيقي كانت الإجابة المقبولة   
    صحيح ,لعمل إشعار لجميع إصدرات أندرويد قمت بعمل الكود التالي لك ,سيتفحص إصدار الأندرويد لديك وسيتم إطلاق الإشعار بالطريقة المناسبة للإصدار الجديد
    final int NOTIFY_ID = 1002; String name = "my_package_channel"; String id = "my_package_channel_1"; // يمكنك إبقائه كماهوid القناة String description = "my_package_first_channel"; // يمكنك إبقائه كما هو وصف القناة Intent intent; PendingIntent pendingIntent; NotificationCompat.Builder builder; if (notifManager == null) { notifManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel mChannel = notifManager.getNotificationChannel(id); if (mChannel == null) { mChannel = new NotificationChannel(id, name, importance); mChannel.setDescription(description); //تفعيل الرجاج mChannel.enableVibration(true); mChannel.setLightColor(Color.GREEN); //تشغيل الرجاج mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}); notifManager.createNotificationChannel(mChannel); } builder = new NotificationCompat.Builder(this, id); intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentTitle("تعليق جديد") .setSmallIcon(android.R.drawable.ic_popup_reminder) // هنا ضع أيقونة من مجلد drawable .setContentText("قام مستخدم بالتعليق على منشورك") .setDefaults(Notification.DEFAULT_ALL) .setAutoCancel(true) .setContentIntent(pendingIntent) .setTicker(title) .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}); } else { builder = new NotificationCompat.Builder(this); intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentTitle("تعليق جديد") .setSmallIcon(android.R.drawable.ic_popup_reminder) // هنا ضع أيقونة من مجلد drawable .setContentText("لديك تعليق جديد") .setDefaults(Notification.DEFAULT_ALL) .setAutoCancel(true) .setContentIntent(pendingIntent) .setTicker(title) .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}) .setPriority(Notification.PRIORITY_HIGH); } Notification notification = builder.build(); notifManager.notify(NOTIFY_ID, notification);  
  15. إجابة Mohamd Imran سؤال في كيف استطيع عمل تحديث للا activity بعد طلب اذن GPS كانت الإجابة المقبولة   
    اهلا بك @مروان مروان3
    أنت تريد تفقد إذا المستخدم مفعل ال GPS أو لا إذا كذلك ,قمت بعمل فنكشن بسيط سيتفحص إذا ال GPS مفعل أو لا إن غير مفعل نظهر للمستخدم خيار تفعيل ال GPS 
    private void CheckEnableGPS(){ String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if(!provider.equals("")){ //GPS مفعل نبدأ الأكتيفتي Toast.makeText(this, "GPS Enabled: " + provider, Toast.LENGTH_LONG).show(); }else{ //نطلب تفعيله من المستخدم Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); startActivity(intent); } } ثم نقوم بإستخدام الفنكشن في ال onCreate ميثود هكذا 
    @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CheckEnableGPS(); }  
  16. إجابة Mohamd Imran سؤال في ممكن شرح تحويل هذا الكود الي الاصدار php7 كانت الإجابة المقبولة   
    الطريقة سهلة ,بعد تنزيل الأداة من الرابط المرفق  ثم فك الضغط عنها ,بعد ذلك قم بفتح ال cmd في الويندوز أو ال Terminal في الماك , ثم إذهب إلى المسار الذي قمت بتنزيل الأداة في من خلال تنفيذ الأمر التالي في مجلد الأداة مع إستبدال testcases.php بإسم الملف الخاص بك الذي تريد فحصه ,ملاحظة الملف الخاص بك الذي تريد فحصه إنسخه إلى مجلد الأداة 
    php mar.php -f="testcases.php"  
  17. إجابة Mohamd Imran سؤال في تطبيق إلكتروني كانت الإجابة المقبولة   
    مرحباً @Med Zarrad
    يمكنك إنشاء موقع إلكتروني بدون وجود خبرة برمجية مسبقة بإستخدام ووردبريس أنشأ حساب مجانا وأكمل عملية التسجيل(عملية بسيطة) وإملأ البيانات المطلوبة من هنا ولا تحتاج إلى مال التسجيل مجاناً وستحصل على دومين فرعي في موقع ووردبريس بالإسم الذي تختاره   
  18. إجابة Mohamd Imran سؤال في اريد ان اتأكد من حلي في هذا سؤال كانت الإجابة المقبولة   
    السلام عليكم @محمد الحربي13

    الإجابة خاطِئة الصحيح هكذا 

     
    $person = [ 'malak' => '130 cm', 'hamad' => '126 cm', 'maisa' => '150 cm', 'ali' => '140 cm']; //Loop through person array //start loop foreach ($person as $key => $value) { echo 'Person name : ' . $key . ' his heights is : ' . $value . '<br/>'; }  
    تحياتي
  19. إجابة Mohamd Imran سؤال في خطأ في الكود بلغة c++ كانت الإجابة المقبولة   
    بعد المراجعة 
    الخطا هو لم يتم تعريف نوع الstacke   هل هو int او string 
    gلذلك الحل الصحيح هكذا 
    stack<int> stack1; stack1 (int size) } int Stk_ptr,Max_len; Stk_ptr = new int [size]; Max_len= stack1.top();  
     تفضلي قمت باجابته مسبقا هنا
     
  20. إجابة Mohamd Imran سؤال في كتابة برنامج بلغة c++ كانت الإجابة المقبولة   
    السلام عليكم @Nadia الجهني
    تفضلي قمت بعمله لك وقمت بوضع comments  توضح. اجزاء الكود ,ان احتجت شرح لاي جزء من الكود انا جاهز    
    #include <iostream> using namespace std; //constructor Class class courserc{ public: string courses[3] = {"Math", "Physics" , "Arabic"}; courserc() { cout<<"Array elements are as follows:"<<endl; } }; int main() { //make constructor object courserc obj; for(int i=0;i<3;i++) { //use the obj; cout<<"Courses "<<i<<"= "<<obj.courses[i]<<endl; } return 0; } تحياتي
    شكرا لك
  21. إجابة Mohamd Imran سؤال في مشكلة عدم تحميل الموقع كامل كانت الإجابة المقبولة   
    العفو   

    اي خدمة اخرى ,جاهزين 
    تحياتي 
    شكرا على وقتك
×
×
  • أضف...