diff --git a/TwitterApp/DBScript.sql b/TwitterApp/DBScript.sql new file mode 100644 index 000000000000..7d3572311151 --- /dev/null +++ b/TwitterApp/DBScript.sql @@ -0,0 +1,39 @@ +drop database twitter; +create database twitter; +use twitter; + +create table login( + user_id int AUTO_INCREMENT PRIMARY KEY, + first_name varchar(50), + email varchar(50), + password varchar(50), + picture_path varchar(350) + ); +describe login; + +create table following( + user_id int , + following_user_id int, + FOREIGN KEY (user_id) REFERENCES login(user_id), + FOREIGN KEY (following_user_id) REFERENCES login(user_id) + ); +describe following; + +create table tweets( + tweet_id int AUTO_INCREMENT PRIMARY KEY, + user_id int , + tweet_text varchar(50), + tweet_picture varchar(350), + tweet_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES login(user_id) + ); +describe tweets; + +CREATE VIEW user_tweets AS +SELECT tweets.tweet_id ,tweets.tweet_text,tweets.tweet_picture, +tweets.tweet_date,tweets.user_id,login.first_name,login.picture_path +FROM tweets +inner join login +on tweets.user_id =login.user_id; +describe user_tweets; + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.gitignore b/TwitterApp/TwitterDem/.gitignore new file mode 100644 index 000000000000..39fb081a42a8 --- /dev/null +++ b/TwitterApp/TwitterDem/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/TwitterApp/TwitterDem/.idea/compiler.xml b/TwitterApp/TwitterDem/.idea/compiler.xml new file mode 100644 index 000000000000..96cc43efa6a0 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml b/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000000..e7bedf3377d4 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/encodings.xml b/TwitterApp/TwitterDem/.idea/encodings.xml new file mode 100644 index 000000000000..97626ba45445 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/gradle.xml b/TwitterApp/TwitterDem/.idea/gradle.xml new file mode 100644 index 000000000000..0e23f8edad75 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/misc.xml b/TwitterApp/TwitterDem/.idea/misc.xml new file mode 100644 index 000000000000..84cfd6708077 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/modules.xml b/TwitterApp/TwitterDem/.idea/modules.xml new file mode 100644 index 000000000000..2bc9a4255897 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/runConfigurations.xml b/TwitterApp/TwitterDem/.idea/runConfigurations.xml new file mode 100644 index 000000000000..7f68460d8b38 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/.gitignore b/TwitterApp/TwitterDem/app/.gitignore new file mode 100644 index 000000000000..796b96d1c402 --- /dev/null +++ b/TwitterApp/TwitterDem/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/TwitterApp/TwitterDem/app/build.gradle b/TwitterApp/TwitterDem/app/build.gradle new file mode 100644 index 000000000000..8d0f545bf74c --- /dev/null +++ b/TwitterApp/TwitterDem/app/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.0" + defaultConfig { + applicationId "com.alrubaye.twitterdem" + minSdkVersion 12 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.0.0' + testCompile 'junit:junit:4.12' + compile 'com.google.firebase:firebase-core:9.6.1' + compile 'com.google.firebase:firebase-storage:9.6.1' + compile 'com.google.firebase:firebase-auth:9.6.1' + compile 'com.squareup.picasso:picasso:2.5.2' +} +apply plugin: 'com.google.gms.google-services' diff --git a/TwitterApp/TwitterDem/app/google-services.json b/TwitterApp/TwitterDem/app/google-services.json new file mode 100644 index 000000000000..cc9148e82ceb --- /dev/null +++ b/TwitterApp/TwitterDem/app/google-services.json @@ -0,0 +1,125 @@ +{ + "project_info": { + "project_number": "21845150751", + "firebase_url": "https://firbasedemo-6228f.firebaseio.com", + "project_id": "firbasedemo-6228f", + "storage_bucket": "firbasedemo-6228f.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:8592e90db472ebb7", + "android_client_info": { + "package_name": "com.hussienalrubaye.androidfirebase" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-tiq6jqsk2ndfvlvgtnlc659jsakg5csn.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.hussienalrubaye.androidfirebase", + "certificate_hash": "76A07B52241638F10FB6D3CF8F6B855F929169DC" + } + }, + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:679da90dbe15c5b2", + "android_client_info": { + "package_name": "com.alrubye.firstapp" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-5tk4fg7c1k9l81ll5q8lihmtnp1olt0c.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.alrubye.firstapp", + "certificate_hash": "76A07B52241638F10FB6D3CF8F6B855F929169DC" + } + }, + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:3162a499db69de48", + "android_client_info": { + "package_name": "com.alrubaye.twitterdem" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/proguard-rules.pro b/TwitterApp/TwitterDem/app/proguard-rules.pro new file mode 100644 index 000000000000..c0625ce1e770 --- /dev/null +++ b/TwitterApp/TwitterDem/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/hussienalrubaye/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java b/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java new file mode 100644 index 000000000000..37deba417ec4 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.alrubaye.twitterdem; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.alrubaye.twitterdem", appContext.getPackageName()); + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml b/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..d4bcc45e3f0d --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java new file mode 100644 index 000000000000..f0e468343362 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java @@ -0,0 +1,27 @@ +package com.alrubaye.twitterdem; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class AdapterItems { + public String tweet_id; + public String tweet_text; + public String tweet_picture; + public String tweet_date; + public String user_id; + public String first_name; + public String picture_path; + //for news details + AdapterItems( String tweet_id, String tweet_text,String tweet_picture, + String tweet_date,String user_id,String first_name ,String picture_path) + { + this. tweet_id=tweet_id; + this. tweet_text=tweet_text; + this. tweet_picture=tweet_picture; + this. user_id=user_id; + this. first_name=first_name; + this. picture_path=picture_path; + this.tweet_date=tweet_date; + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java new file mode 100644 index 000000000000..4c1213e9b0bf --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java @@ -0,0 +1,347 @@ +package com.alrubaye.twitterdem; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Login extends AppCompatActivity { +EditText etName; + EditText etEmail; + EditText etPassword; + ImageView ivUserImage; + int RESULT_LOAD_IMAGE=111; //any number for tag + //1- define + private static final String TAG = "AnonymousAuth"; + + // [START declare_auth] + private FirebaseAuth mAuth; + // [END declare_auth] + + // [START declare_auth_listener] + private FirebaseAuth.AuthStateListener mAuthListener; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + etName=(EditText)findViewById(R.id.etName); + etEmail=(EditText)findViewById(R.id.etEmail); + etPassword=(EditText)findViewById(R.id.etPassword); + ivUserImage=(ImageView) findViewById(R.id.ivUserImage); + ivUserImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + CheckUserPermsions(); + } + }); + + //2- initiailze OnCreate() + // [START initialize_auth] + mAuth = FirebaseAuth.getInstance(); + // [END initialize_auth] + + // [START auth_state_listener] + mAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + // User is signed in + Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); + } else { + // User is signed out + Log.d(TAG, "onAuthStateChanged:signed_out"); + } + + } + }; + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { + Uri selectedImage = data.getData(); + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + + Cursor cursor = getContentResolver().query(selectedImage, + filePathColumn, null, null, null); + cursor.moveToFirst(); + + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + ivUserImage.setImageBitmap(BitmapFactory.decodeFile(picturePath)); + + } + } + + public void buLogin(View view) { + showProgressDialog(); + FirebaseStorage storage=FirebaseStorage.getInstance(); + // Create a storage reference from our app + StorageReference storageRef = storage.getReferenceFromUrl("gs://firbasedemo-6228f.appspot.com"); + DateFormat df = new SimpleDateFormat("ddMMyyHHmmss"); + Date dateobj = new Date(); + // System.out.println(df.format(dateobj)); +// Create a reference to "mountains.jpg" + final String ImagePath= df.format(dateobj) +".jpg"; + StorageReference mountainsRef = storageRef.child("images/"+ ImagePath); + ivUserImage.setDrawingCacheEnabled(true); + ivUserImage.buildDrawingCache(); + // Bitmap bitmap = imageView.getDrawingCache(); + BitmapDrawable drawable=(BitmapDrawable)ivUserImage.getDrawable(); + Bitmap bitmap =drawable.getBitmap(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + byte[] data = baos.toByteArray(); + + UploadTask uploadTask = mountainsRef.putBytes(data); + uploadTask.addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + // Handle unsuccessful uploads + } + }).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { + // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. + String downloadUrl = taskSnapshot.getDownloadUrl().toString(); + String name=""; + try { + //for space with name + name = java.net.URLEncoder.encode( etName.getText().toString() , "UTF-8"); + downloadUrl= java.net.URLEncoder.encode(downloadUrl , "UTF-8"); + } catch (UnsupportedEncodingException e) { + + } + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/register.php?first_name="+name+"&email="+etEmail.getText().toString()+"&password="+etPassword.getText().toString()+"&picture_path="+ downloadUrl; + + new MyAsyncTaskgetNews().execute(url); + + } + }); + } + + // get news from server + public class MyAsyncTaskgetNews extends AsyncTask { + @Override + protected void onPreExecute() { + //before works + } + @Override + protected String doInBackground(String... params) { + // TODO Auto-generated method stub + try { + String NewsData; + //define the url we have to connect with + URL url = new URL(params[0]); + //make connect with url and send request + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + //waiting for 7000ms for response + urlConnection.setConnectTimeout(7000);//set timeout to 5 seconds + + try { + //getting the response data + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + //convert the stream to string + Operations operations=new Operations(getApplicationContext()); + NewsData = operations.ConvertInputToStringNoChange(in); + //send to display data + publishProgress(NewsData); + } finally { + //end connection + urlConnection.disconnect(); + } + + }catch (Exception ex){} + return null; + } + protected void onProgressUpdate(String... progress) { + + try { + JSONObject json= new JSONObject(progress[0]); + //display response data + if (json.getString("msg")==null) + return; + if (json.getString("msg").equalsIgnoreCase("user is added")) { + Toast.makeText(getApplicationContext(), json.getString("msg"), Toast.LENGTH_LONG).show(); +//login + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/login.php?email="+etEmail.getText().toString()+"&password="+etPassword.getText().toString() ; + + new MyAsyncTaskgetNews().execute(url); + } + + if (json.getString("msg").equalsIgnoreCase("Pass Login")) { + JSONArray UserInfo=new JSONArray( json.getString("info")); + JSONObject UserCreintal= UserInfo.getJSONObject(0); + //Toast.makeText(getApplicationContext(),UserCreintal.getString("user_id"),Toast.LENGTH_LONG).show(); + hideProgressDialog(); + SaveSettings saveSettings= new SaveSettings(getApplicationContext()); + saveSettings.SaveData(UserCreintal.getString("user_id")); + finish(); //close this activity + } + + } catch (Exception ex) { + Log.d("er", ex.getMessage()); + } + + + } + + protected void onPostExecute(String result2){ + + + } + + + + + } + + // [START on_start_add_listener] + @Override + public void onStart() { + super.onStart(); + mAuth.addAuthStateListener(mAuthListener); + signInAnonymously(); + } + // [END on_start_add_listener] + + // [START on_stop_remove_listener] + @Override + public void onStop() { + super.onStop(); + if (mAuthListener != null) { + mAuth.removeAuthStateListener(mAuthListener); + } + hideProgressDialog(); + } + private void signInAnonymously() { + // [START signin_anonymously] + mAuth.signInAnonymously() + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + Log.d(TAG, "signInAnonymously:onComplete:" + task.isSuccessful()); + + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Log.w(TAG, "signInAnonymously", task.getException()); + + } + + } + }); + // [END signin_anonymously] + } + + + @VisibleForTesting + public ProgressDialog mProgressDialog; + + public void showProgressDialog() { + if (mProgressDialog == null) { + mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage("loading"); + mProgressDialog.setIndeterminate(true); + } + + mProgressDialog.show(); + } + + public void hideProgressDialog() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + } + + + void CheckUserPermsions(){ + if ( Build.VERSION.SDK_INT >= 23){ + if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != + PackageManager.PERMISSION_GRANTED ){ + requestPermissions(new String[]{ + android.Manifest.permission.READ_EXTERNAL_STORAGE}, + REQUEST_CODE_ASK_PERMISSIONS); + return ; + } + } + + LoadImage();// init the contact list + + } + //get acces to location permsion + final private int REQUEST_CODE_ASK_PERMISSIONS = 123; + + + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + switch (requestCode) { + case REQUEST_CODE_ASK_PERMISSIONS: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + LoadImage();// init the contact list + } else { + // Permission Denied + Toast.makeText( this,"your message" , Toast.LENGTH_SHORT) + .show(); + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + void LoadImage(){ + Intent i = new Intent( + Intent.ACTION_PICK, + android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + + startActivityForResult(i, RESULT_LOAD_IMAGE); + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java new file mode 100644 index 000000000000..b01021be377e --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java @@ -0,0 +1,537 @@ +package com.alrubaye.twitterdem; + +import android.app.ProgressDialog; +import android.app.SearchManager; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.BaseAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.SearchView; + +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; +import com.squareup.picasso.Picasso; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class MainActivity extends AppCompatActivity { + //adapter class + ArrayList listnewsData = new ArrayList(); + MyCustomAdapter myadapter; + int totalItemCountVisible=0; //totalItems visible + LinearLayout ChannelInfo; + TextView txtnamefollowers; + int SelectedUserID=0; + Button buFollow; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + ChannelInfo=(LinearLayout)findViewById(R.id.ChannelInfo) ; + ChannelInfo.setVisibility(View.GONE); + txtnamefollowers=(TextView)findViewById(R.id.txtnamefollowers) ; + buFollow=(Button)findViewById(R.id.buFollow); + SaveSettings saveSettings= new SaveSettings(getApplicationContext()); + saveSettings.LoadData(); + + //add data and view it + // listnewsData.add(new AdapterItems( null, null,null,"add",null,null ,null)); + myadapter=new MyCustomAdapter(this,listnewsData); + ListView lsNews=(ListView)findViewById(R.id.LVNews); + lsNews.setAdapter(myadapter);//intisal with data + LoadTweets(0,SearchType.MyFollowing); + // list view scrool + lsNews.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { +// scroll up loading + + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + //firstVisibleItem it have been seen + //visibleItemCount visible now + totalItemCountVisible=firstVisibleItem + visibleItemCount; + if(totalItemCountVisible== totalItemCount) + { + + if (listnewsData.size()>5) + if (!listnewsData.get(listnewsData.size()-1).tweet_date.equals("loading") + && !listnewsData.get(0).tweet_date.equals("loading")) + LoadTweets(listnewsData.size()-1,UserOperation); + + } + + + } + }); + + + } + + public void buFollowers(View view) { + + int Operation; // 1- subsribe 2- unsubscribe + String Follow=buFollow.getText().toString(); + if (Follow.equalsIgnoreCase("Follow")) { + Operation = 1; + buFollow.setText("Un Follow"); + } + else { + Operation = 2; + buFollow.setText("Follow"); + } + + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/userfollowing.php?user_id="+SaveSettings.UserID +"&following_user_id="+SelectedUserID+"&op="+ Operation; + new MyAsyncTaskgetNews().execute(url); + + } + + + private class MyCustomAdapter extends BaseAdapter { + public ArrayList listnewsDataAdpater ; +Context context; + public MyCustomAdapter(Context context,ArrayList listnewsDataAdpater) { + this.listnewsDataAdpater=listnewsDataAdpater; + this.context=context; + } + + + @Override + public int getCount() { + return listnewsDataAdpater.size(); + } + + @Override + public String getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + + final AdapterItems s = listnewsDataAdpater.get(position); + + if(s.tweet_date.equals("add")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_add, null); + + final EditText etPost = (EditText) myView.findViewById(R.id.etPost); + ImageView iv_post=(ImageView) myView.findViewById(R.id.iv_post) ; + + + ImageView iv_attach=(ImageView) myView.findViewById(R.id.iv_attach) ; + iv_attach.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + LoadImage(); + } + }); + iv_post.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String tweets=null; + try { + //for space with name + tweets = java.net.URLEncoder.encode( etPost.getText().toString() , "UTF-8"); + downloadUrl= java.net.URLEncoder.encode(downloadUrl , "UTF-8"); + } catch (UnsupportedEncodingException e) { + tweets="."; + } + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetadd.php?user_id="+ SaveSettings.UserID +"&tweet_text="+ tweets +"&tweet_picture="+ downloadUrl; + new MyAsyncTaskgetNews().execute(url); + etPost.setText(""); + + } + }); + + return myView; + } + else if(s.tweet_date.equals("loading")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_loading, null); + return myView; + } + else if(s.tweet_date.equals("notweet")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_msg, null); + return myView; + } + + + else { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_item, null); + + TextView txtUserName = (TextView) myView.findViewById(R.id.txtUserName); + txtUserName.setText(s.first_name); + txtUserName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + LoadTweets(0,SearchType.OnePerson); + txtnamefollowers.setText(s.first_name); + SelectedUserID=Integer.parseInt(s.user_id); + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/isfollowing.php?user_id="+SaveSettings.UserID +"&following_user_id="+SelectedUserID; + new MyAsyncTaskgetNews().execute(url); + + } + }); + TextView txt_tweet = (TextView) myView.findViewById(R.id.txt_tweet); + txt_tweet.setText(s.tweet_text); + + TextView txt_tweet_date = (TextView) myView.findViewById(R.id.txt_tweet_date); + txt_tweet_date.setText(s.tweet_date); + + ImageView tweet_picture=(ImageView)myView.findViewById(R.id.tweet_picture); + Picasso.with(context).load(s.tweet_picture).into(tweet_picture); + ImageView picture_path=(ImageView)myView.findViewById(R.id.picture_path); + Picasso.with(context).load(s.picture_path).into(picture_path); + return myView; + } + } + + } + + + // get news from server + public class MyAsyncTaskgetNews extends AsyncTask { + @Override + protected void onPreExecute() { + //before works + } + @Override + protected String doInBackground(String... params) { + // TODO Auto-generated method stub + try { + String NewsData; + //define the url we have to connect with + URL url = new URL(params[0]); + //make connect with url and send request + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + //waiting for 7000ms for response + urlConnection.setConnectTimeout(7000);//set timeout to 5 seconds + + try { + //getting the response data + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + //convert the stream to string + Operations operations=new Operations(getApplicationContext()); + NewsData = operations.ConvertInputToStringNoChange(in); + //send to display data + publishProgress(NewsData); + } finally { + //end connection + urlConnection.disconnect(); + } + + }catch (Exception ex){} + return null; + } + protected void onProgressUpdate(String... progress) { + + + try { + JSONObject json= new JSONObject(progress[0]); + //display response data + if (json.getString("msg")==null) + return; + + if (json.getString("msg").equalsIgnoreCase("tweet is added")) { + LoadTweets(1,UserOperation); + } + else if (json.getString("msg").equalsIgnoreCase("has tweet")) { + if(StartFrom==0) { + listnewsData.clear(); + listnewsData.add(new AdapterItems(null, null, null, + "add", null, null, null)); + + } + else { + //remove we are loading now + listnewsData.remove(listnewsData.size()-1); + } + JSONArray tweets=new JSONArray( json.getString("info")); + + for (int i = 0; i () { + @Override + public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { + // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. + downloadUrl = taskSnapshot.getDownloadUrl().toString(); + hideProgressDialog(); + } + }); + } + + + + + protected void onResume(){ + super.onResume(); + // LoadTweets(); + } + int StartFrom=0; + int UserOperation=SearchType.MyFollowing; // 0 my followers post 2- specifc user post 3- search post + String Searchquery; + void LoadTweets(int StartFrom,int UserOperation){ + this.StartFrom=StartFrom; + this.UserOperation=UserOperation; + //display loading + if(StartFrom==0) // add loading at beggining + listnewsData.add(0,new AdapterItems(null, null, null, + "loading", null, null, null)); + else // add loading at end + listnewsData.add(new AdapterItems(null, null, null, + "loading", null, null, null)); + + myadapter.notifyDataSetChanged(); + + + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetlist.php?user_id="+ SaveSettings.UserID + "&StartFrom="+StartFrom + "&op="+ UserOperation; + if (UserOperation==3) + url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetlist.php?user_id="+ SaveSettings.UserID + "&StartFrom="+StartFrom + "&op="+ UserOperation + "&query="+ Searchquery; + + new MyAsyncTaskgetNews().execute(url); + + if (UserOperation==SearchType.OnePerson) + ChannelInfo.setVisibility(View.VISIBLE); + else + ChannelInfo.setVisibility(View.GONE); + + + } + +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java new file mode 100644 index 000000000000..ad1aaf6c32a2 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java @@ -0,0 +1,38 @@ +package com.alrubaye.twitterdem; + +import android.content.Context; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class Operations { + Context context; + public Operations(Context context){ + this.context=context; + } + // this method convert any stream to string + public static String ConvertInputToStringNoChange(InputStream inputStream) { + + BufferedReader bureader=new BufferedReader( new InputStreamReader(inputStream)); + String line ; + String linereultcal=""; + + try{ + while((line=bureader.readLine())!=null) { + + linereultcal+=line; + + } + inputStream.close(); + + + }catch (Exception ex){} + + return linereultcal; + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java new file mode 100644 index 000000000000..3544ed2b970a --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java @@ -0,0 +1,41 @@ +package com.alrubaye.twitterdem; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class SaveSettings { + public static String UserID=""; + //https://firebasestorage.googleapis.com/v0/b/firbasedemo-6228f.appspot.com/o/images%2F32_131116124812.jpg?alt=media&token=0287e868-557b-431c-bccc-7245d5fe8fc6 + public static String ServerImages=""; + + + Context context; + SharedPreferences ShredRef; + public SaveSettings(Context context){ + this.context=context; + ShredRef=context.getSharedPreferences("myRef",Context.MODE_PRIVATE); + } + + void SaveData(String UserID){ + + SharedPreferences.Editor editor=ShredRef.edit(); + editor.putString("UserID",UserID); + editor.commit(); + } + + void LoadData(){ + UserID= ShredRef.getString("UserID","0"); + if (UserID.equals("0")){ + + Intent intent=new Intent(context, Login.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java new file mode 100644 index 000000000000..287ffaa04588 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java @@ -0,0 +1,11 @@ +package com.alrubaye.twitterdem; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class SearchType { + public static int MyFollowing=1; + public static int OnePerson=2; + public static int SearchIn=3; +} diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/add.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/add.png new file mode 100644 index 000000000000..d32de2967e84 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/add.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/background.xml b/TwitterApp/TwitterDem/app/src/main/res/drawable/background.xml new file mode 100644 index 000000000000..9f17c5cc164e --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/res/drawable/background.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml b/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml new file mode 100644 index 000000000000..1f6177139f47 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png new file mode 100644 index 000000000000..c6b56c3443bc Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png new file mode 100644 index 000000000000..620226d32093 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png new file mode 100644 index 000000000000..96e0b9e76065 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png new file mode 100644 index 000000000000..04e2b26ff139 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_white_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_white_24dp.png new file mode 100644 index 000000000000..6f8464af582d Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_white_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png new file mode 100644 index 000000000000..761929f4319e Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png new file mode 100644 index 000000000000..018e9aba2b40 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg b/TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg new file mode 100644 index 000000000000..6bc7cd4ff727 Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg differ diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml new file mode 100644 index 000000000000..e9c3a5d6712d --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + +