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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/activity_main.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000000..4b8702ebe051
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_add.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_add.xml
new file mode 100644
index 000000000000..b3df8b257ecd
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_add.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_item.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_item.xml
new file mode 100644
index 000000000000..e046dd4e027e
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_item.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_loading.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_loading.xml
new file mode 100644
index 000000000000..ff12037eaad4
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_loading.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_msg.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_msg.xml
new file mode 100644
index 000000000000..0106fb1a605d
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/layout/tweet_msg.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/app/src/main/res/menu/menu_main.xml b/TwitterApp/TwitterDem/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 000000000000..b3d3a4d75a1f
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,21 @@
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/mipmap-hdpi/ic_launcher.png b/TwitterApp/TwitterDem/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000000..cde69bcccec6
Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDem/app/src/main/res/mipmap-mdpi/ic_launcher.png b/TwitterApp/TwitterDem/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000000..c133a0cbd379
Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDem/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000000..bfa42f0e7b91
Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000000..324e72cdd748
Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000000..aee44e138434
Binary files /dev/null and b/TwitterApp/TwitterDem/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDem/app/src/main/res/values-w820dp/dimens.xml b/TwitterApp/TwitterDem/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 000000000000..63fc81644461
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/values/colors.xml b/TwitterApp/TwitterDem/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000000..e8feb14de348
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/values/colors.xml
@@ -0,0 +1,37 @@
+
+
+ #FF33B5E5
+ #FF33B5E5
+ #FF4081
+- #FF33B5E5
+- #FFAA66CC
+- #FF99CC00
+- #FFFFBB33
+- #FFFF4444
+- #FF0099CC
+- #FF9933CC
+- #FF669900
+- #FFFF8800
+- #FFCC0000
+- #3b5998
+- #5D070E07
+- #ffffff
+- #f9f9f9
+- #d4d3d3
+- #FF040303
+
+ - @color/blue
+ - @color/purple
+ - @color/green
+ - @color/orange
+ - @color/red
+ - @color/darkblue
+ - @color/darkpurple
+ - @color/darkgreen
+ - @color/darkorange
+ - @color/darkred
+ - @color/customeblue
+ - @color/lowDarkfont
+ - @color/white
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/app/src/main/res/values/dimens.xml b/TwitterApp/TwitterDem/app/src/main/res/values/dimens.xml
new file mode 100644
index 000000000000..47c82246738c
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/values/strings.xml b/TwitterApp/TwitterDem/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000000..e6f2f450eefc
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ My Twitter
+
diff --git a/TwitterApp/TwitterDem/app/src/main/res/values/styles.xml b/TwitterApp/TwitterDem/app/src/main/res/values/styles.xml
new file mode 100644
index 000000000000..9513160707a9
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDem/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java b/TwitterApp/TwitterDem/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java
new file mode 100644
index 000000000000..9b65b6b0a859
--- /dev/null
+++ b/TwitterApp/TwitterDem/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.alrubaye.twitterdem;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/TwitterApp/TwitterDem/build.gradle b/TwitterApp/TwitterDem/build.gradle
new file mode 100644
index 000000000000..2f75666c5f34
--- /dev/null
+++ b/TwitterApp/TwitterDem/build.gradle
@@ -0,0 +1,23 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:2.2.2'
+ classpath 'com.google.gms:google-services:3.0.0'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/TwitterApp/TwitterDem/gradle.properties b/TwitterApp/TwitterDem/gradle.properties
new file mode 100644
index 000000000000..aac7c9b4614c
--- /dev/null
+++ b/TwitterApp/TwitterDem/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.jar b/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000000..13372aef5e24
Binary files /dev/null and b/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.properties b/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000000..04e285f34080
--- /dev/null
+++ b/TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/TwitterApp/TwitterDem/gradlew b/TwitterApp/TwitterDem/gradlew
new file mode 100755
index 000000000000..9d82f7891513
--- /dev/null
+++ b/TwitterApp/TwitterDem/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/TwitterApp/TwitterDem/gradlew.bat b/TwitterApp/TwitterDem/gradlew.bat
new file mode 100644
index 000000000000..8a0b282aa688
--- /dev/null
+++ b/TwitterApp/TwitterDem/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/TwitterApp/TwitterDem/settings.gradle b/TwitterApp/TwitterDem/settings.gradle
new file mode 100644
index 000000000000..e7b4def49cb5
--- /dev/null
+++ b/TwitterApp/TwitterDem/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/TwitterApp/TwitterDemStart/.gitignore b/TwitterApp/TwitterDemStart/.gitignore
new file mode 100644
index 000000000000..39fb081a42a8
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/TwitterApp/TwitterDemStart/.idea/compiler.xml b/TwitterApp/TwitterDemStart/.idea/compiler.xml
new file mode 100644
index 000000000000..96cc43efa6a0
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/copyright/profiles_settings.xml b/TwitterApp/TwitterDemStart/.idea/copyright/profiles_settings.xml
new file mode 100644
index 000000000000..e7bedf3377d4
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/encodings.xml b/TwitterApp/TwitterDemStart/.idea/encodings.xml
new file mode 100644
index 000000000000..97626ba45445
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/gradle.xml b/TwitterApp/TwitterDemStart/.idea/gradle.xml
new file mode 100644
index 000000000000..0e23f8edad75
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/misc.xml b/TwitterApp/TwitterDemStart/.idea/misc.xml
new file mode 100644
index 000000000000..84cfd6708077
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/misc.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/modules.xml b/TwitterApp/TwitterDemStart/.idea/modules.xml
new file mode 100644
index 000000000000..2bc9a4255897
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/.idea/runConfigurations.xml b/TwitterApp/TwitterDemStart/.idea/runConfigurations.xml
new file mode 100644
index 000000000000..7f68460d8b38
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/.gitignore b/TwitterApp/TwitterDemStart/app/.gitignore
new file mode 100644
index 000000000000..796b96d1c402
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/TwitterApp/TwitterDemStart/app/build.gradle b/TwitterApp/TwitterDemStart/app/build.gradle
new file mode 100644
index 000000000000..1ba8b0362b36
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/build.gradle
@@ -0,0 +1,34 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 25
+ buildToolsVersion "25.0.0"
+ defaultConfig {
+ applicationId "com.alrubaye.twitterdemstart"
+ 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'
+
+}
+apply plugin: 'com.google.gms.google-services'
diff --git a/TwitterApp/TwitterDemStart/app/proguard-rules.pro b/TwitterApp/TwitterDemStart/app/proguard-rules.pro
new file mode 100644
index 000000000000..c0625ce1e770
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java b/TwitterApp/TwitterDemStart/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java
new file mode 100644
index 000000000000..37deba417ec4
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/AndroidManifest.xml b/TwitterApp/TwitterDemStart/app/src/main/AndroidManifest.xml
new file mode 100644
index 000000000000..29e935dfda52
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java
new file mode 100644
index 000000000000..f0e468343362
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Login.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Login.java
new file mode 100644
index 000000000000..d6f2cb5515ca
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Login.java
@@ -0,0 +1,99 @@
+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;
+
+ @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) {
+//TODO: load photo from gallary
+ // CheckUserPermsions();
+ }
+ });
+
+//TODO: user register into firebase
+
+ }
+
+ public void buLogin(View view) {
+//TODO: user login
+ }
+
+
+ // [START on_start_add_listener]
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ }
+ // [END on_start_add_listener]
+
+ // [START on_stop_remove_listener]
+ @Override
+ public void onStop() {
+ super.onStop();
+
+ }
+
+
+
+
+
+}
diff --git a/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java
new file mode 100644
index 000000000000..655a74f96fa5
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java
@@ -0,0 +1,150 @@
+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();
+ int StartFrom=0;
+ int UserOperation=SearchType.MyFollowing; // 0 my followers post 2- specifc user post 3- search post
+ String Searchquery;
+ 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);
+ //TODO: load user data setting
+ //SaveSettings saveSettings= new SaveSettings(getApplicationContext());
+ // saveSettings.LoadData();
+ //TODO: set the adapter
+
+ ListView lsNews=(ListView)findViewById(R.id.LVNews);
+ // lsNews.setAdapter(myadapter);//intisal with data
+
+
+ }
+
+ public void buFollowers(View view) {
+//TODO: add code s=for subscribe and un subscribe
+
+
+ }
+
+
+ SearchView searchView;
+ Menu myMenu;
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ myMenu=menu;
+ // Associate searchable configuration with the SearchView
+ SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+ searchView = (android.widget.SearchView) menu.findItem(R.id.searchbar).getActionView();
+ searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+ //final Context co=this;
+ searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ // Toast.makeText(co, query, Toast.LENGTH_LONG).show();
+ Searchquery=null;
+ try {
+ //for space with name
+ Searchquery = java.net.URLEncoder.encode(query , "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+
+ }
+ //TODO: search in posts
+ //LoadTweets(0,SearchType.SearchIn);// seearch
+ return false;
+ }
+
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ return false;
+ }
+ });
+ // searchView.setOnCloseListener(this);
+ return true;
+ }
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle item selection
+ switch (item.getItemId()) {
+ case R.id.home:
+ //TODO: main search
+ // LoadTweets(0,SearchType.MyFollowing);
+ return true;
+
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+
+
+
+
+
+
+}
diff --git a/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Operations.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Operations.java
new file mode 100644
index 000000000000..ad1aaf6c32a2
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java
new file mode 100644
index 000000000000..8b18ffa7a320
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java
@@ -0,0 +1,38 @@
+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="";
+
+ 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/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SearchType.java b/TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SearchType.java
new file mode 100644
index 000000000000..287ffaa04588
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/res/drawable/add.png b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/add.png
new file mode 100644
index 000000000000..d32de2967e84
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/add.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/background.xml b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/background.xml
new file mode 100644
index 000000000000..9f17c5cc164e
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/background.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/barcolor.xml b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/barcolor.xml
new file mode 100644
index 000000000000..1f6177139f47
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/barcolor.xml
@@ -0,0 +1,37 @@
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_account_circle_black_24dp.png b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/res/drawable/ic_account_circle_black_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_attach_file_black_24dp.png b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/res/drawable/ic_attach_file_black_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_favorite_border_black_24dp.png b/TwitterApp/TwitterDemStart/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/TwitterDemStart/app/src/main/res/drawable/ic_favorite_border_black_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_black_24dp.png b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_black_24dp.png
new file mode 100644
index 000000000000..04e2b26ff139
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_black_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_white_24dp.png b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_white_24dp.png
new file mode 100644
index 000000000000..6f8464af582d
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_white_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_send_black_24dp.png b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_send_black_24dp.png
new file mode 100644
index 000000000000..761929f4319e
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_send_black_24dp.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/tweets.png b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/tweets.png
new file mode 100644
index 000000000000..018e9aba2b40
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/tweets.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/drawable/twitter.jpg b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/twitter.jpg
new file mode 100644
index 000000000000..6bc7cd4ff727
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/drawable/twitter.jpg differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_login.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 000000000000..e9c3a5d6712d
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_main.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000000..4b8702ebe051
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_add.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_add.xml
new file mode 100644
index 000000000000..b3df8b257ecd
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_add.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_item.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_item.xml
new file mode 100644
index 000000000000..e046dd4e027e
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_item.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_loading.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_loading.xml
new file mode 100644
index 000000000000..ff12037eaad4
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_loading.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_msg.xml b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_msg.xml
new file mode 100644
index 000000000000..0106fb1a605d
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_msg.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/menu/menu_main.xml b/TwitterApp/TwitterDemStart/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 000000000000..b3d3a4d75a1f
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,21 @@
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-hdpi/ic_launcher.png b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000000..cde69bcccec6
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-mdpi/ic_launcher.png b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000000..c133a0cbd379
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000000..bfa42f0e7b91
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000000..324e72cdd748
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000000..aee44e138434
Binary files /dev/null and b/TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/values-w820dp/dimens.xml b/TwitterApp/TwitterDemStart/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 000000000000..63fc81644461
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/values/colors.xml b/TwitterApp/TwitterDemStart/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000000..e8feb14de348
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/values/colors.xml
@@ -0,0 +1,37 @@
+
+
+ #FF33B5E5
+ #FF33B5E5
+ #FF4081
+- #FF33B5E5
+- #FFAA66CC
+- #FF99CC00
+- #FFFFBB33
+- #FFFF4444
+- #FF0099CC
+- #FF9933CC
+- #FF669900
+- #FFFF8800
+- #FFCC0000
+- #3b5998
+- #5D070E07
+- #ffffff
+- #f9f9f9
+- #d4d3d3
+- #FF040303
+
+ - @color/blue
+ - @color/purple
+ - @color/green
+ - @color/orange
+ - @color/red
+ - @color/darkblue
+ - @color/darkpurple
+ - @color/darkgreen
+ - @color/darkorange
+ - @color/darkred
+ - @color/customeblue
+ - @color/lowDarkfont
+ - @color/white
+
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/values/dimens.xml b/TwitterApp/TwitterDemStart/app/src/main/res/values/dimens.xml
new file mode 100644
index 000000000000..47c82246738c
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/values/strings.xml b/TwitterApp/TwitterDemStart/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000000..e6f2f450eefc
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ My Twitter
+
diff --git a/TwitterApp/TwitterDemStart/app/src/main/res/values/styles.xml b/TwitterApp/TwitterDemStart/app/src/main/res/values/styles.xml
new file mode 100644
index 000000000000..9513160707a9
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/TwitterApp/TwitterDemStart/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java b/TwitterApp/TwitterDemStart/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java
new file mode 100644
index 000000000000..9b65b6b0a859
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.alrubaye.twitterdem;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/TwitterApp/TwitterDemStart/build.gradle b/TwitterApp/TwitterDemStart/build.gradle
new file mode 100644
index 000000000000..2f75666c5f34
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/build.gradle
@@ -0,0 +1,23 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:2.2.2'
+ classpath 'com.google.gms:google-services:3.0.0'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/TwitterApp/TwitterDemStart/gradle.properties b/TwitterApp/TwitterDemStart/gradle.properties
new file mode 100644
index 000000000000..aac7c9b4614c
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.jar b/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000000..13372aef5e24
Binary files /dev/null and b/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.properties b/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000000..04e285f34080
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/TwitterApp/TwitterDemStart/gradlew b/TwitterApp/TwitterDemStart/gradlew
new file mode 100755
index 000000000000..9d82f7891513
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/TwitterApp/TwitterDemStart/gradlew.bat b/TwitterApp/TwitterDemStart/gradlew.bat
new file mode 100644
index 000000000000..8a0b282aa688
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/TwitterApp/TwitterDemStart/settings.gradle b/TwitterApp/TwitterDemStart/settings.gradle
new file mode 100644
index 000000000000..e7b4def49cb5
--- /dev/null
+++ b/TwitterApp/TwitterDemStart/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/TwitterApp/TwitterServer/IsFollowing.php b/TwitterApp/TwitterServer/IsFollowing.php
new file mode 100644
index 000000000000..1e2fb7549631
--- /dev/null
+++ b/TwitterApp/TwitterServer/IsFollowing.php
@@ -0,0 +1,34 @@
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterServer/Register.php b/TwitterApp/TwitterServer/Register.php
new file mode 100644
index 000000000000..8d1024393190
--- /dev/null
+++ b/TwitterApp/TwitterServer/Register.php
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterServer/TweetAdd.php b/TwitterApp/TwitterServer/TweetAdd.php
new file mode 100644
index 000000000000..4091ea0283eb
--- /dev/null
+++ b/TwitterApp/TwitterServer/TweetAdd.php
@@ -0,0 +1,25 @@
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterServer/TweetList.php b/TwitterApp/TwitterServer/TweetList.php
new file mode 100644
index 000000000000..32d9691ee817
--- /dev/null
+++ b/TwitterApp/TwitterServer/TweetList.php
@@ -0,0 +1,47 @@
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterServer/UserFollowing.php b/TwitterApp/TwitterServer/UserFollowing.php
new file mode 100644
index 000000000000..1a96fdf64f00
--- /dev/null
+++ b/TwitterApp/TwitterServer/UserFollowing.php
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/TwitterApp/TwitterServer/login.php b/TwitterApp/TwitterServer/login.php
new file mode 100644
index 000000000000..0051b867b8cf
--- /dev/null
+++ b/TwitterApp/TwitterServer/login.php
@@ -0,0 +1,34 @@
+
\ No newline at end of file