From 59f0d289566cb5a35da75c40027d41f26fb72e20 Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Mon, 8 Jun 2015 15:18:25 +0300 Subject: [PATCH 1/7] [Lab_55] Created Constants --- .../BooksListActivityFragment.java | 30 +++++++++++++++++++ .../personallibrarycatalogue/Constants.java | 18 +++++++++++ app/src/main/res/layout/fragment_add_book.xml | 4 +-- app/src/main/res/layout/prompt.xml | 22 ++++++++++++++ app/src/main/res/menu/context_menu.xml | 6 ++++ app/src/main/res/values/dimens.xml | 1 - app/src/main/res/values/strings.xml | 5 ++++ 7 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java create mode 100644 app/src/main/res/layout/prompt.xml diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java index 7472840..e358fff 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java @@ -1,7 +1,10 @@ package com.example.admin.personallibrarycatalogue; +import android.app.AlertDialog; import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.support.v4.app.LoaderManager; @@ -26,6 +29,7 @@ import com.example.admin.personallibrarycatalogue.data.DatabaseContract; import com.example.admin.personallibrarycatalogue.data.LibraryDatabaseHelper; +import java.security.AlgorithmParameterGenerator; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -41,6 +45,7 @@ public class BooksListActivityFragment extends Fragment implements android.suppo private ListView listView_; private BooksListAdapter booksListAdapter_; private LibraryDatabaseHelper helper_; + private EditText editTextMainScreen_; private static final String[] BOOK_COLUMNS = { @@ -130,6 +135,8 @@ public boolean onContextItemSelected(MenuItem item) { deleteBook(cursor); booksListAdapter_.notifyDataSetChanged(); break; + case R.id.share_in_twitter: + askOAuth(); default: return super.onContextItemSelected(item); @@ -158,4 +165,27 @@ public void deleteBook(Cursor cursor) { // Delete from database with help of Content Provider getActivity().getContentResolver().delete(bookWithIdUri, null, null); } + + public void lauchPrompt(Context context){ + LayoutInflater layoutInflater = LayoutInflater.from(context); + View promptView = layoutInflater.inflate(R.layout.prompt, null); + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); + alertDialogBuilder.setView(promptView); + final EditText inputText = (EditText) promptView.findViewById(R.id.share_input); + + // setup a dialog window + alertDialogBuilder.setCancelable(false) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // get user input and set it to result + editTextMainScreen_.setText(inputText.getText()); + } + }) + .setNegativeButton("Cancel", + new DialogInterface.OnClickListener(){ + public void onClick(DialogInterface dialog, int id){ + dialog.cancel(); + } + }); + } } diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java new file mode 100644 index 0000000..94cdfe9 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java @@ -0,0 +1,18 @@ +package com.example.admin.personallibrarycatalogue; + +/** + * Created by Mikhail Valuyskiy on 08.06.2015. + */ +public class Constants { + + public static final String CONSUMER_KEY = ""; + public static final String CONSUMER_SECRET = ""; + + public static final String REQUEST_URL = "http://api.twitter.com/oauth/request_token"; + public static final String ACCESS_URL = "http://api.twitter.com/oauth/access_token"; + public static final String AUTHORIZE_URL = "http://api.twitter.com/oauth/authorize"; + + + + +} diff --git a/app/src/main/res/layout/fragment_add_book.xml b/app/src/main/res/layout/fragment_add_book.xml index 4baae82..2241ec0 100644 --- a/app/src/main/res/layout/fragment_add_book.xml +++ b/app/src/main/res/layout/fragment_add_book.xml @@ -115,7 +115,7 @@ android:layout_width="@dimen/width" android:layout_height="wrap_content" android:layout_gravity="left" - android:layout_weight="@dimen/weight" + android:layout_weight="1" android:onClick="onSaveButtonClick" android:text="@string/cancel_button" /> @@ -124,7 +124,7 @@ android:layout_width="@dimen/width" android:layout_height="wrap_content" android:layout_gravity="right" - android:layout_weight="@dimen/weight" + android:layout_weight="1" android:onClick="onCancelButtonClick" android:text="@string/apply_button" /> diff --git a/app/src/main/res/layout/prompt.xml b/app/src/main/res/layout/prompt.xml new file mode 100644 index 0000000..450a02f --- /dev/null +++ b/app/src/main/res/layout/prompt.xml @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/context_menu.xml b/app/src/main/res/menu/context_menu.xml index df07304..13f62af 100644 --- a/app/src/main/res/menu/context_menu.xml +++ b/app/src/main/res/menu/context_menu.xml @@ -12,4 +12,10 @@ android:orderInCategory="100" app:showAsAction="never" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 2c3279c..723e2e9 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -18,6 +18,5 @@ 0dp 0dp - 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9cb4d63..1109b13 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,5 +27,10 @@ Menu Edit Delete + Share in twitter + + + Let your friends know what's going on! + From c7dad6c38baf251c56382f67e709d7a6a4e30bb7 Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Mon, 8 Jun 2015 15:22:32 +0300 Subject: [PATCH 2/7] no message --- .gitignore | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index ccf2efe..379e14e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,6 @@ -# Built application files -*.apk -*.ap_ - -# Files for the Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ - -# Gradle files -.gradle/ -build/ -/*/build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build \ No newline at end of file From 49a50ffc8be8e87b2f599e7fc8bebd4f345d18dc Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Mon, 8 Jun 2015 16:03:51 +0300 Subject: [PATCH 3/7] no message --- .../personallibrarycatalogue/BooksListActivityFragment.java | 2 +- app/src/main/res/layout/prompt.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java index e358fff..7f11eed 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java @@ -136,7 +136,7 @@ public boolean onContextItemSelected(MenuItem item) { booksListAdapter_.notifyDataSetChanged(); break; case R.id.share_in_twitter: - askOAuth(); + // askOAuth(); default: return super.onContextItemSelected(item); diff --git a/app/src/main/res/layout/prompt.xml b/app/src/main/res/layout/prompt.xml index 450a02f..cad17af 100644 --- a/app/src/main/res/layout/prompt.xml +++ b/app/src/main/res/layout/prompt.xml @@ -15,7 +15,7 @@ android:id="@+id/share_input" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layoutType="text" /> + android:inputType="text" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1109b13..7f60e21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,7 +30,7 @@ Share in twitter - Let your friends know what's going on! + Let your friends know what\'s going on! From 5db436e2926e708487d639a02630a6a033925675 Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Tue, 9 Jun 2015 14:43:35 +0300 Subject: [PATCH 4/7] [lab_52_http] Created new features, but doesn't work --- app/src/main/AndroidManifest.xml | 11 ++ .../BooksListActivityFragment.java | 78 +++++++++++-- .../personallibrarycatalogue/Constants.java | 9 +- .../OAuthRequestTokenTask.java | 51 +++++++++ .../PrepareRequestTokenActivity.java | 105 ++++++++++++++++++ .../TwitterUtils.java | 49 ++++++++ 6 files changed, 287 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26ad95c..7a072bb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,10 +19,12 @@ + + @@ -32,6 +34,15 @@ android:name=".data.BooksProvider" android:authorities="com.example.admin.personallibrarycatalogue.app" /> + > + + + + + + + + diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java index 7f11eed..13bfc9c 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java @@ -6,7 +6,9 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.database.Cursor; +import android.preference.PreferenceManager; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; @@ -24,6 +26,8 @@ import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; +import android.os.Handler; +import android.widget.Toast; import com.example.admin.personallibrarycatalogue.data.Book; import com.example.admin.personallibrarycatalogue.data.DatabaseContract; @@ -33,6 +37,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.logging.LogRecord; + +import twitter4j.Twitter; /** @@ -44,8 +51,9 @@ public class BooksListActivityFragment extends Fragment implements android.suppo private final static String ID = "id"; private ListView listView_; private BooksListAdapter booksListAdapter_; - private LibraryDatabaseHelper helper_; - private EditText editTextMainScreen_; + private SharedPreferences preferences_; + private final Handler twitterHandler_ = new Handler(); + private static final String[] BOOK_COLUMNS = { @@ -83,12 +91,22 @@ public void onLoaderReset(Loader cursorLoader) { booksListAdapter_.swapCursor(null); } + final Runnable updateTwitterNotification = new Runnable() { + public void run() { + Toast.makeText(getActivity(), "Tweet sent !", Toast.LENGTH_LONG).show(); + } + }; + + @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_books_list, container, false); + this.preferences_=PreferenceManager.getDefaultSharedPreferences(getActivity()); + + listView_ = (ListView) rootView.findViewById(R.id.books_list_view); booksListAdapter_ = new BooksListAdapter(getActivity(), null, 0); listView_.setAdapter(booksListAdapter_); @@ -135,8 +153,9 @@ public boolean onContextItemSelected(MenuItem item) { deleteBook(cursor); booksListAdapter_.notifyDataSetChanged(); break; + case R.id.share_in_twitter: - // askOAuth(); + lauchPrompt(getActivity()); default: return super.onContextItemSelected(item); @@ -173,19 +192,54 @@ public void lauchPrompt(Context context){ alertDialogBuilder.setView(promptView); final EditText inputText = (EditText) promptView.findViewById(R.id.share_input); + this.preferences_ = PreferenceManager.getDefaultSharedPreferences(getActivity()); + // setup a dialog window alertDialogBuilder.setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // get user input and set it to result - editTextMainScreen_.setText(inputText.getText()); - } - }) + public void onClick(DialogInterface dialog, int id) { + // get user input and set it to result + String twit = (inputText.getText().toString()); + if (TwitterUtils.isAuthenticated(preferences_)) { + sendTweet(); + } else { + Intent intent = new Intent(getActivity(),PrepareRequestTokenActivity.class); + intent.putExtra("tweet_msg",getTweetMsg()); + startActivity(intent); + } + } + }) .setNegativeButton("Cancel", - new DialogInterface.OnClickListener(){ - public void onClick(DialogInterface dialog, int id){ - dialog.cancel(); + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + + + // create an alert dialog + AlertDialog alertDialog = alertDialogBuilder.create(); + alertDialog.show(); + } + + private String getTweetMsg() { + // final EditText inputText = (EditText) getActivity().findViewById(R.id.share_input); + // String twit = (inputText.getText().toString()); + String twit = "Hello World!!"; + return twit; + } + + public void sendTweet(){ + Thread t = new Thread(){ + public void run(){ + try { + TwitterUtils.sendTweet(preferences_,getTweetMsg()); + twitterHandler_.post(updateTwitterNotification); + } catch (Exception ex){ + ex.printStackTrace(); + } } - }); + }; + t.start(); } } diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java index 94cdfe9..5fa0f3b 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java @@ -5,14 +5,15 @@ */ public class Constants { - public static final String CONSUMER_KEY = ""; - public static final String CONSUMER_SECRET = ""; + public static final String CONSUMER_KEY = "RO9WR8PmKG5G8IUFDruZjf4CX"; + public static final String CONSUMER_SECRET = "zfXLmbBb1LjrOyugs5nRyxTz0CWbRdv8XPclsXigV3ThH41ZY7"; public static final String REQUEST_URL = "http://api.twitter.com/oauth/request_token"; public static final String ACCESS_URL = "http://api.twitter.com/oauth/access_token"; public static final String AUTHORIZE_URL = "http://api.twitter.com/oauth/authorize"; - - + public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; + public static final String OAUTH_CALLBACK_HOST = "callback"; + public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; } diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java new file mode 100644 index 0000000..c27a3a0 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java @@ -0,0 +1,51 @@ +package com.example.admin.personallibrarycatalogue; + +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.util.Log; + +import oauth.signpost.OAuthConsumer; +import oauth.signpost.OAuthProvider; + +/** + * Created by Mikhail Valuyskiy on 08.06.2015. + */ +public class OAuthRequestTokenTask extends AsyncTask{ + + final String TAG = getClass().getName(); + private Context context; + private OAuthProvider provider; + private OAuthConsumer consumer; + + public OAuthRequestTokenTask(Context context, OAuthConsumer consumer, OAuthProvider provider){ + this.context = context; + this.consumer = consumer; + this.provider = provider; + } + + /** + * + * Retrieve the OAuth Request Token and present a browser to the user to authorize the token. + * + */ + + @Override + protected Void doInBackground(Void... params){ + try { + Log.i(TAG, "Retrieving request token from G servers"); + final String url = provider.retrieveRequestToken(consumer,Constants.OAUTH_CALLBACK_URL); + Log.i(TAG,"Popping a browser with the authorize URL: " + url); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP + | Intent.FLAG_ACTIVITY_NO_HISTORY + | Intent.FLAG_FROM_BACKGROUND); + + context.startActivity(intent); + } catch (Exception e){ + Log.e(TAG,"Error during OAUth retrieve request token",e); + } + return null; + } +} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java new file mode 100644 index 0000000..81e1563 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java @@ -0,0 +1,105 @@ +package com.example.admin.personallibrarycatalogue; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; + +import oauth.signpost.OAuth; +import oauth.signpost.OAuthConsumer; +import oauth.signpost.OAuthProvider; +import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; +import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; + +/** + * Created by Mikhail Valuyskiy on 08.06.2015. + */ +public class PrepareRequestTokenActivity extends Activity { + final String TAG = getClass().getName(); + + private OAuthConsumer authConsumer_; + private OAuthProvider authProvider_; + + @Override + public void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + try { + this.authConsumer_ = new CommonsHttpOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); + this.authProvider_ = new CommonsHttpOAuthProvider(Constants.REQUEST_URL, Constants.ACCESS_URL, Constants.AUTHORIZE_URL); + }catch (Exception e){ + Log.e(TAG, "Error creating consumer_ or provider_",e); + } + Log.i(TAG,"Starting task to retrieve request token."); + new OAuthRequestTokenTask(this, authConsumer_, authProvider_).execute(); + } + + @Override + public void onNewIntent(Intent intent){ + super.onNewIntent(intent); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + final Uri uri = intent.getData(); + if (uri != null && uri.getScheme().equals(Constants.OAUTH_CALLBACK_HOST)){ + Log.i(TAG,"Callback received :" + uri); + Log.i(TAG,"Retrieving Access Token"); + new RetrieveAccessTokenTask(this, authConsumer_, authProvider_,preferences).execute(uri); + } + } + + public class RetrieveAccessTokenTask extends AsyncTask{ + private Context context_; + private OAuthProvider provider_; + private OAuthConsumer consumer_; + private SharedPreferences preferences_; + + public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences preferences){ + this.context_ = context; + this.consumer_ = consumer; + this.provider_ = provider; + this.preferences_ = preferences; + + } + + @Override + protected Void doInBackground(Uri... params){ + final Uri uri = params[0]; + final String oauthVerifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); + + try { + provider_.retrieveAccessToken(consumer_, oauthVerifier); + + final SharedPreferences.Editor preferencesEditor = preferences_.edit(); + preferencesEditor.putString(OAuth.OAUTH_TOKEN, consumer_.getToken()); + preferencesEditor.putString(OAuth.OAUTH_TOKEN_SECRET, consumer_.getTokenSecret()); + preferencesEditor.commit(); + + String token = preferences_.getString(OAuth.OAUTH_TOKEN, ""); + String secret = preferences_.getString(OAuth.OAUTH_TOKEN_SECRET, ""); + + consumer_.setTokenWithSecret(token, secret); + context_.startActivity(new Intent(context_, BooksListActivityFragment.class)); + + executeAfterAccessTokenRetrieval(); + Log.i(TAG, "OAuth - Access token retrieved"); + } catch (Exception e){ + Log.e(TAG, "OAuth - Access Token Retrieval Error",e); + + } + return null; + } + + private void executeAfterAccessTokenRetrieval(){ + String msg = getIntent().getExtras().getString("tweet_msg"); + try { + TwitterUtils.sendTweet(preferences_, msg); + } catch (Exception e){ + Log.e(TAG,"OAuth - Error sending to Twitter",e); + } + } + } + +} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java new file mode 100644 index 0000000..a459d55 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java @@ -0,0 +1,49 @@ +package com.example.admin.personallibrarycatalogue; + +import android.content.SharedPreferences; +import android.os.StrictMode; + +import oauth.signpost.OAuth; +import twitter4j.Twitter; +import twitter4j.TwitterException; +import twitter4j.TwitterFactory; +import twitter4j.auth.AccessToken; + +/** + * Created by Mikhail Valuyskiy on 08.06.2015. + */ +public class TwitterUtils { + + public static boolean isAuthenticated(SharedPreferences preferences){ + + String token = preferences.getString(OAuth.OAUTH_TOKEN,""); + String secret = preferences.getString(OAuth.OAUTH_TOKEN_SECRET,""); + + AccessToken accessToken = new AccessToken(token,secret); + Twitter twitter = new TwitterFactory().getInstance(); + twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); + twitter.setOAuthAccessToken(accessToken); + + try { + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() + .permitAll().build(); + StrictMode.setThreadPolicy(policy); + + twitter.getAccountSettings(); + return true; + } catch (TwitterException e){ + return false; + } + } + + public static void sendTweet(SharedPreferences preferences, String message) throws Exception{ + String token = preferences.getString(OAuth.OAUTH_TOKEN,""); + String secret = preferences.getString(OAuth.OAUTH_TOKEN_SECRET,""); + + AccessToken a = new AccessToken(token,secret); + Twitter twitter = new TwitterFactory().getInstance(); + twitter.setOAuthConsumer(Constants.CONSUMER_KEY,Constants.CONSUMER_SECRET); + twitter.setOAuthAccessToken(a); + twitter.updateStatus(message); + } +} From 98f6ba026dee5dc10d849da30c37729215a69e9e Mon Sep 17 00:00:00 2001 From: MikhailSkiyAtWork Date: Tue, 9 Jun 2015 17:19:23 +0300 Subject: [PATCH 5/7] Update Constants.java --- .../com/example/admin/personallibrarycatalogue/Constants.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java index 5fa0f3b..5d8bdaf 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java @@ -5,8 +5,7 @@ */ public class Constants { - public static final String CONSUMER_KEY = "RO9WR8PmKG5G8IUFDruZjf4CX"; - public static final String CONSUMER_SECRET = "zfXLmbBb1LjrOyugs5nRyxTz0CWbRdv8XPclsXigV3ThH41ZY7"; + public static final String REQUEST_URL = "http://api.twitter.com/oauth/request_token"; public static final String ACCESS_URL = "http://api.twitter.com/oauth/access_token"; From 01cd34f337890d04f573e281edba12f12e96e6d1 Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Tue, 16 Jun 2015 13:21:07 +0300 Subject: [PATCH 6/7] [lab_52_http(twitter)] Integrated twiiter api into app, created checking for length of twit --- app/app.iml | 1 + app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 19 +-- .../BooksListActivity.java | 22 +++ .../BooksListActivityFragment.java | 136 +++++++++++------- .../ConstantValues.java | 15 ++ .../personallibrarycatalogue/Constants.java | 19 --- .../OAuthRequestTokenTask.java | 51 ------- .../PrepareRequestTokenActivity.java | 105 -------------- .../TwitterGetAccessTokenTask.java | 60 ++++++++ .../TwitterUpdateStatusTask.java | 50 +++++++ .../personallibrarycatalogue/TwitterUtil.java | 63 ++++++++ .../TwitterUtils.java | 49 ------- app/src/main/res/layout/prompt.xml | 9 +- app/src/main/res/values/strings.xml | 1 + 15 files changed, 317 insertions(+), 284 deletions(-) create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/ConstantValues.java delete mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java delete mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java delete mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterGetAccessTokenTask.java create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUpdateStatusTask.java create mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtil.java delete mode 100644 app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java diff --git a/app/app.iml b/app/app.iml index 12fb8ae..dee7099 100644 --- a/app/app.iml +++ b/app/app.iml @@ -129,6 +129,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index b96838a..fd0a9bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,4 +24,5 @@ dependencies { compile 'com.android.support:appcompat-v7:22.1.1' compile 'com.android.support:support-v4:22.1.1' compile 'com.google.android.gms:play-services:7.3.0' + compile(group: 'org.twitter4j', name: 'twitter4j-core', version: '4.0.3') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7a072bb..e4c0aef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,8 @@ package="com.example.admin.personallibrarycatalogue" > - + + + + + + + + + + - > - - - - - - - diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivity.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivity.java index c790a27..3989320 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivity.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivity.java @@ -1,6 +1,8 @@ package com.example.admin.personallibrarycatalogue; +import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.ContextMenu; @@ -8,14 +10,20 @@ import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; +import android.widget.EditText; public class BooksListActivity extends ActionBarActivity { + public static Context contextOfApplication; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_books_list); + + contextOfApplication = getApplicationContext(); + if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.fragment, new BooksListActivityFragment()) @@ -23,6 +31,20 @@ protected void onCreate(Bundle savedInstanceState) { } } + public static Context getContextOfApplication(){ + return contextOfApplication; + } + + @Override + public void onResume(){ + super.onResume(); + Uri uri = getIntent().getData(); + if (uri != null && uri.toString().startsWith(ConstantValues.TWITTER_CALLBACK_URL)) { + String verifier = uri.getQueryParameter(ConstantValues.URL_PARAMETER_TWITTER_OAUTH_VERIFIER); + String status = ((BooksListActivityFragment) getSupportFragmentManager().findFragmentById(R.id.fragment)).getStatus(); + new TwitterGetAccessTokenTask().execute(verifier,status); + } + } @Override public boolean onCreateOptionsMenu(Menu menu) { diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java index 13bfc9c..78cbdeb 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java @@ -2,44 +2,38 @@ import android.app.AlertDialog; -import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; +import android.graphics.Color; +import android.os.AsyncTask; import android.preference.PreferenceManager; -import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.net.Uri; import android.support.v4.app.Fragment; import android.os.Bundle; -import android.support.v7.internal.widget.AdapterViewCompat; +import android.text.Editable; +import android.text.TextWatcher; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; -import android.os.Handler; +import android.widget.TextView; import android.widget.Toast; import com.example.admin.personallibrarycatalogue.data.Book; import com.example.admin.personallibrarycatalogue.data.DatabaseContract; import com.example.admin.personallibrarycatalogue.data.LibraryDatabaseHelper; -import java.security.AlgorithmParameterGenerator; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.logging.LogRecord; - -import twitter4j.Twitter; +import twitter4j.auth.RequestToken; /** @@ -48,11 +42,13 @@ public class BooksListActivityFragment extends Fragment implements android.support.v4.app.LoaderManager.LoaderCallbacks { private static final int LIBRARY_LOADER = 0; + private static final String SPACE = " "; + private static final String I_HAVE_BOOK = "I have book"; + private static final String AND_WANT_TO_LET_KNOW = "and want to let world about it!"; private final static String ID = "id"; private ListView listView_; + private static String status_ = ""; private BooksListAdapter booksListAdapter_; - private SharedPreferences preferences_; - private final Handler twitterHandler_ = new Handler(); private static final String[] BOOK_COLUMNS = { @@ -91,12 +87,6 @@ public void onLoaderReset(Loader cursorLoader) { booksListAdapter_.swapCursor(null); } - final Runnable updateTwitterNotification = new Runnable() { - public void run() { - Toast.makeText(getActivity(), "Tweet sent !", Toast.LENGTH_LONG).show(); - } - }; - @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, @@ -104,9 +94,6 @@ public View onCreateView(final LayoutInflater inflater, ViewGroup container, View rootView = inflater.inflate(R.layout.fragment_books_list, container, false); - this.preferences_=PreferenceManager.getDefaultSharedPreferences(getActivity()); - - listView_ = (ListView) rootView.findViewById(R.id.books_list_view); booksListAdapter_ = new BooksListAdapter(getActivity(), null, 0); listView_.setAdapter(booksListAdapter_); @@ -155,7 +142,8 @@ public boolean onContextItemSelected(MenuItem item) { break; case R.id.share_in_twitter: - lauchPrompt(getActivity()); + statusBuilder(cursor); + launchPrompt(getActivity()); default: return super.onContextItemSelected(item); @@ -185,28 +173,70 @@ public void deleteBook(Cursor cursor) { getActivity().getContentResolver().delete(bookWithIdUri, null, null); } - public void lauchPrompt(Context context){ + // Returns the typed message + public String getStatus() { + return status_; + } + + public void statusBuilder(Cursor cursor){ + Book book = LibraryDatabaseHelper.getBook(cursor); + status_ = I_HAVE_BOOK + SPACE + book.getTitle() + SPACE + book.getYear() + SPACE + book.getAuthor() + SPACE + AND_WANT_TO_LET_KNOW; + } + + + // Set up subwindow, where user can type the message + public void launchPrompt(Context context) { LayoutInflater layoutInflater = LayoutInflater.from(context); View promptView = layoutInflater.inflate(R.layout.prompt, null); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); alertDialogBuilder.setView(promptView); + + final TextView info = (TextView)promptView.findViewById(R.id.length_info); + final EditText inputText = (EditText) promptView.findViewById(R.id.share_input); + inputText.setText(status_); + + inputText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + int accessibleLength = 140 - inputText.getText().toString().length(); + info.setText( Integer.toString(accessibleLength)); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!inputText.getText().toString().equalsIgnoreCase("")){ + int accessibleLength = 140 - inputText.getText().toString().length(); + if ((accessibleLength<140)&&(accessibleLength>10)) { + info.setTextColor(Color.GREEN); + info.setText(Integer.toString(accessibleLength)); + } else { + info.setTextColor(Color.RED); + info.setText(Integer.toString(accessibleLength)); + } + + } + } + }); - this.preferences_ = PreferenceManager.getDefaultSharedPreferences(getActivity()); // setup a dialog window alertDialogBuilder.setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { + // get user input and set it to result - String twit = (inputText.getText().toString()); - if (TwitterUtils.isAuthenticated(preferences_)) { - sendTweet(); - } else { - Intent intent = new Intent(getActivity(),PrepareRequestTokenActivity.class); - intent.putExtra("tweet_msg",getTweetMsg()); - startActivity(intent); - } + status_ = (inputText.getText().toString()); + if (status_.length() > 140) { + Toast.makeText(getActivity(), "The length of tweet must be less 140", Toast.LENGTH_LONG).show(); + } else if (status_.length()>0){ + logIn(); + } else Toast.makeText(getActivity(), "Please fill the field", Toast.LENGTH_LONG).show(); } }) .setNegativeButton("Cancel", @@ -222,24 +252,30 @@ public void onClick(DialogInterface dialog, int id) { alertDialog.show(); } - private String getTweetMsg() { - // final EditText inputText = (EditText) getActivity().findViewById(R.id.share_input); - // String twit = (inputText.getText().toString()); - String twit = "Hello World!!"; - return twit; + private void logIn() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + if (!sharedPreferences.getBoolean(ConstantValues.PREFERENCE_TWITTER_IS_LOGGED_IN, false)) { + new TwitterAuthenticateTask().execute(); + } else { + new TwitterUpdateStatusTask().execute(getStatus()); + } } - public void sendTweet(){ - Thread t = new Thread(){ - public void run(){ - try { - TwitterUtils.sendTweet(preferences_,getTweetMsg()); - twitterHandler_.post(updateTwitterNotification); - } catch (Exception ex){ - ex.printStackTrace(); - } + class TwitterAuthenticateTask extends AsyncTask { + + @Override + protected void onPostExecute(RequestToken requestToken) { + if (requestToken != null) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())); + startActivity(intent); } - }; - t.start(); + } + + @Override + protected RequestToken doInBackground(String... params) { + return TwitterUtil.getInstance().getRequestToken(); + } } + + } diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/ConstantValues.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/ConstantValues.java new file mode 100644 index 0000000..cbf524a --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/ConstantValues.java @@ -0,0 +1,15 @@ +package com.example.admin.personallibrarycatalogue; + +/** + * Created by Mikhail Valuyskiy on 08.06.2015. + */ +public class ConstantValues { + public static String TWITTER_CONSUMER_KEY = "RO9WR8PmKG5G8IUFDruZjf4CX"; + public static String TWITTER_CONSUMER_SECRET = "zfXLmbBb1LjrOyugs5nRyxTz0CWbRdv8XPclsXigV3ThH41ZY7"; + public static String TWITTER_CALLBACK_URL = "app://ruswizaradlab.com"; + public static String URL_PARAMETER_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; + public static String PREFERENCE_TWITTER_OAUTH_TOKEN="TWITTER_OAUTH_TOKEN"; + public static String PREFERENCE_TWITTER_OAUTH_TOKEN_SECRET="TWITTER_OAUTH_TOKEN_SECRET"; + public static String PREFERENCE_TWITTER_IS_LOGGED_IN="TWITTER_IS_LOGGED_IN"; + public static String STRING_EXTRA_AUTHENCATION_URL = "AuthencationUrl"; +} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java deleted file mode 100644 index 5fa0f3b..0000000 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/Constants.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.admin.personallibrarycatalogue; - -/** - * Created by Mikhail Valuyskiy on 08.06.2015. - */ -public class Constants { - - public static final String CONSUMER_KEY = "RO9WR8PmKG5G8IUFDruZjf4CX"; - public static final String CONSUMER_SECRET = "zfXLmbBb1LjrOyugs5nRyxTz0CWbRdv8XPclsXigV3ThH41ZY7"; - - public static final String REQUEST_URL = "http://api.twitter.com/oauth/request_token"; - public static final String ACCESS_URL = "http://api.twitter.com/oauth/access_token"; - public static final String AUTHORIZE_URL = "http://api.twitter.com/oauth/authorize"; - - public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; - public static final String OAUTH_CALLBACK_HOST = "callback"; - public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; - -} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java deleted file mode 100644 index c27a3a0..0000000 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/OAuthRequestTokenTask.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.example.admin.personallibrarycatalogue; - -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.AsyncTask; -import android.util.Log; - -import oauth.signpost.OAuthConsumer; -import oauth.signpost.OAuthProvider; - -/** - * Created by Mikhail Valuyskiy on 08.06.2015. - */ -public class OAuthRequestTokenTask extends AsyncTask{ - - final String TAG = getClass().getName(); - private Context context; - private OAuthProvider provider; - private OAuthConsumer consumer; - - public OAuthRequestTokenTask(Context context, OAuthConsumer consumer, OAuthProvider provider){ - this.context = context; - this.consumer = consumer; - this.provider = provider; - } - - /** - * - * Retrieve the OAuth Request Token and present a browser to the user to authorize the token. - * - */ - - @Override - protected Void doInBackground(Void... params){ - try { - Log.i(TAG, "Retrieving request token from G servers"); - final String url = provider.retrieveRequestToken(consumer,Constants.OAUTH_CALLBACK_URL); - Log.i(TAG,"Popping a browser with the authorize URL: " + url); - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP - | Intent.FLAG_ACTIVITY_NO_HISTORY - | Intent.FLAG_FROM_BACKGROUND); - - context.startActivity(intent); - } catch (Exception e){ - Log.e(TAG,"Error during OAUth retrieve request token",e); - } - return null; - } -} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java deleted file mode 100644 index 81e1563..0000000 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/PrepareRequestTokenActivity.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.example.admin.personallibrarycatalogue; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.util.Log; - -import oauth.signpost.OAuth; -import oauth.signpost.OAuthConsumer; -import oauth.signpost.OAuthProvider; -import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; -import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; - -/** - * Created by Mikhail Valuyskiy on 08.06.2015. - */ -public class PrepareRequestTokenActivity extends Activity { - final String TAG = getClass().getName(); - - private OAuthConsumer authConsumer_; - private OAuthProvider authProvider_; - - @Override - public void onCreate(Bundle savedInstanceState){ - super.onCreate(savedInstanceState); - try { - this.authConsumer_ = new CommonsHttpOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); - this.authProvider_ = new CommonsHttpOAuthProvider(Constants.REQUEST_URL, Constants.ACCESS_URL, Constants.AUTHORIZE_URL); - }catch (Exception e){ - Log.e(TAG, "Error creating consumer_ or provider_",e); - } - Log.i(TAG,"Starting task to retrieve request token."); - new OAuthRequestTokenTask(this, authConsumer_, authProvider_).execute(); - } - - @Override - public void onNewIntent(Intent intent){ - super.onNewIntent(intent); - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); - final Uri uri = intent.getData(); - if (uri != null && uri.getScheme().equals(Constants.OAUTH_CALLBACK_HOST)){ - Log.i(TAG,"Callback received :" + uri); - Log.i(TAG,"Retrieving Access Token"); - new RetrieveAccessTokenTask(this, authConsumer_, authProvider_,preferences).execute(uri); - } - } - - public class RetrieveAccessTokenTask extends AsyncTask{ - private Context context_; - private OAuthProvider provider_; - private OAuthConsumer consumer_; - private SharedPreferences preferences_; - - public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences preferences){ - this.context_ = context; - this.consumer_ = consumer; - this.provider_ = provider; - this.preferences_ = preferences; - - } - - @Override - protected Void doInBackground(Uri... params){ - final Uri uri = params[0]; - final String oauthVerifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); - - try { - provider_.retrieveAccessToken(consumer_, oauthVerifier); - - final SharedPreferences.Editor preferencesEditor = preferences_.edit(); - preferencesEditor.putString(OAuth.OAUTH_TOKEN, consumer_.getToken()); - preferencesEditor.putString(OAuth.OAUTH_TOKEN_SECRET, consumer_.getTokenSecret()); - preferencesEditor.commit(); - - String token = preferences_.getString(OAuth.OAUTH_TOKEN, ""); - String secret = preferences_.getString(OAuth.OAUTH_TOKEN_SECRET, ""); - - consumer_.setTokenWithSecret(token, secret); - context_.startActivity(new Intent(context_, BooksListActivityFragment.class)); - - executeAfterAccessTokenRetrieval(); - Log.i(TAG, "OAuth - Access token retrieved"); - } catch (Exception e){ - Log.e(TAG, "OAuth - Access Token Retrieval Error",e); - - } - return null; - } - - private void executeAfterAccessTokenRetrieval(){ - String msg = getIntent().getExtras().getString("tweet_msg"); - try { - TwitterUtils.sendTweet(preferences_, msg); - } catch (Exception e){ - Log.e(TAG,"OAuth - Error sending to Twitter",e); - } - } - } - -} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterGetAccessTokenTask.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterGetAccessTokenTask.java new file mode 100644 index 0000000..e599be1 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterGetAccessTokenTask.java @@ -0,0 +1,60 @@ +package com.example.admin.personallibrarycatalogue; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.preference.PreferenceManager; + +import twitter4j.Twitter; +import twitter4j.TwitterException; +import twitter4j.auth.AccessToken; +import twitter4j.auth.RequestToken; + +/** + * Created by Mikhail Valuyskiy on 16.06.2015. + */ +class TwitterGetAccessTokenTask extends AsyncTask { + + @Override + protected void onPostExecute(String status) { + new TwitterUpdateStatusTask().execute(status); + } + + @Override + protected String doInBackground(String... params) { + + Context context = BooksListActivity.getContextOfApplication(); + + Twitter twitter = TwitterUtil.getInstance().getTwitter(); + RequestToken requestToken = TwitterUtil.getInstance().getRequestToken(); + if ((params[0]!=null)) { + try { + + AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, params[0]); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN, accessToken.getToken()); + editor.putString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN_SECRET, accessToken.getTokenSecret()); + editor.putBoolean(ConstantValues.PREFERENCE_TWITTER_IS_LOGGED_IN, true); + editor.commit(); + + return params[1]; + } catch (TwitterException e) { + e.printStackTrace(); + } + } else { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + String accessTokenString = sharedPreferences.getString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN, ""); + String accessTokenSecret = sharedPreferences.getString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN_SECRET, ""); + AccessToken accessToken = new AccessToken(accessTokenString, accessTokenSecret); + try { + TwitterUtil.getInstance().setTwitterFactory(accessToken); + return params[1]; + } catch (Exception e) { + e.printStackTrace(); + } + } + + return null; + } +} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUpdateStatusTask.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUpdateStatusTask.java new file mode 100644 index 0000000..26c62c7 --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUpdateStatusTask.java @@ -0,0 +1,50 @@ +package com.example.admin.personallibrarycatalogue; + +/** + * Created by Mikhail Valuyskiy on 16.06.2015. + */ +import android.content.Context; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.preference.PreferenceManager; +import android.widget.Toast; + +import twitter4j.TwitterException; +import twitter4j.auth.AccessToken; + +/** + * Created by Mikhail on 15.06.2015. + */ +class TwitterUpdateStatusTask extends AsyncTask { + + @Override + protected void onPostExecute(Boolean result) { + Context context = BooksListActivity.getContextOfApplication(); + if (result) + Toast.makeText(context, "Tweet successfully", Toast.LENGTH_SHORT).show(); + else + Toast.makeText(context, "Tweet failed", Toast.LENGTH_SHORT).show(); + } + + @Override + protected Boolean doInBackground(String... params) { + + Context context = BooksListActivity.getContextOfApplication(); + try { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + String accessTokenString = sharedPreferences.getString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN, ""); + String accessTokenSecret = sharedPreferences.getString(ConstantValues.PREFERENCE_TWITTER_OAUTH_TOKEN_SECRET, ""); + + if ((accessTokenString!=null) && accessTokenSecret!=null) { + AccessToken accessToken = new AccessToken(accessTokenString, accessTokenSecret); + twitter4j.Status status = TwitterUtil.getInstance().getTwitterFactory().getInstance(accessToken).updateStatus(params[0]); + return true; + } + + } catch (TwitterException e) { + e.printStackTrace(); + } + return false; + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtil.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtil.java new file mode 100644 index 0000000..610e53e --- /dev/null +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtil.java @@ -0,0 +1,63 @@ +package com.example.admin.personallibrarycatalogue; + +import twitter4j.Twitter; +import twitter4j.TwitterException; +import twitter4j.TwitterFactory; +import twitter4j.auth.AccessToken; +import twitter4j.auth.RequestToken; +import twitter4j.conf.ConfigurationBuilder; + +/** + * Created by Mikhail on 15.06.2015. + */ +public final class TwitterUtil { + + private RequestToken requestToken_ = null; + private TwitterFactory twitterFactory_ = null; + private Twitter twitter_; + + private TwitterUtil() { + ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); + configurationBuilder.setOAuthConsumerKey(ConstantValues.TWITTER_CONSUMER_KEY); + configurationBuilder.setOAuthConsumerSecret(ConstantValues.TWITTER_CONSUMER_SECRET); + twitter4j.conf.Configuration configuration = configurationBuilder.build(); + twitterFactory_ = new TwitterFactory(configuration); + twitter_ = twitterFactory_.getInstance(); + } + + public TwitterFactory getTwitterFactory() + { + return twitterFactory_; + } + + public void setTwitterFactory(AccessToken accessToken) + { + twitter_ = twitterFactory_.getInstance(accessToken); + } + + public Twitter getTwitter() + { + return twitter_; + } + public RequestToken getRequestToken() { + if (requestToken_ == null) { + try { + requestToken_ = twitterFactory_.getInstance().getOAuthRequestToken(ConstantValues.TWITTER_CALLBACK_URL); + } catch (TwitterException e) { + e.printStackTrace(); + } + } + return requestToken_; + } + + static TwitterUtil instance = new TwitterUtil(); + + public static TwitterUtil getInstance() { + return instance; + } + + + public void reset() { + instance = new TwitterUtil(); + } +} diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java deleted file mode 100644 index a459d55..0000000 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/TwitterUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.example.admin.personallibrarycatalogue; - -import android.content.SharedPreferences; -import android.os.StrictMode; - -import oauth.signpost.OAuth; -import twitter4j.Twitter; -import twitter4j.TwitterException; -import twitter4j.TwitterFactory; -import twitter4j.auth.AccessToken; - -/** - * Created by Mikhail Valuyskiy on 08.06.2015. - */ -public class TwitterUtils { - - public static boolean isAuthenticated(SharedPreferences preferences){ - - String token = preferences.getString(OAuth.OAUTH_TOKEN,""); - String secret = preferences.getString(OAuth.OAUTH_TOKEN_SECRET,""); - - AccessToken accessToken = new AccessToken(token,secret); - Twitter twitter = new TwitterFactory().getInstance(); - twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); - twitter.setOAuthAccessToken(accessToken); - - try { - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() - .permitAll().build(); - StrictMode.setThreadPolicy(policy); - - twitter.getAccountSettings(); - return true; - } catch (TwitterException e){ - return false; - } - } - - public static void sendTweet(SharedPreferences preferences, String message) throws Exception{ - String token = preferences.getString(OAuth.OAUTH_TOKEN,""); - String secret = preferences.getString(OAuth.OAUTH_TOKEN_SECRET,""); - - AccessToken a = new AccessToken(token,secret); - Twitter twitter = new TwitterFactory().getInstance(); - twitter.setOAuthConsumer(Constants.CONSUMER_KEY,Constants.CONSUMER_SECRET); - twitter.setOAuthAccessToken(a); - twitter.updateStatus(message); - } -} diff --git a/app/src/main/res/layout/prompt.xml b/app/src/main/res/layout/prompt.xml index cad17af..67b2127 100644 --- a/app/src/main/res/layout/prompt.xml +++ b/app/src/main/res/layout/prompt.xml @@ -5,7 +5,7 @@ android:orientation="vertical"> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7f60e21..b4c65c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,7 @@ Let your friends know what\'s going on! + Please write less then 140 symbols From 94eabe00fc1f1054e4c417908bd7c9a658f653e0 Mon Sep 17 00:00:00 2001 From: Mikhail Valuyskiy Date: Tue, 14 Jul 2015 11:55:41 +0300 Subject: [PATCH 7/7] [lab_52_http] Replace EXTRA_ID on ID --- app/build.gradle | 2 +- .../personallibrarycatalogue/BooksListActivityFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4c3b09f..f516866 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.example.admin.personallibrarycatalogue" - minSdkVersion 21 + minSdkVersion 16 targetSdkVersion 22 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java index 0d754c9..64f49f8 100644 --- a/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java +++ b/app/src/main/java/com/example/admin/personallibrarycatalogue/BooksListActivityFragment.java @@ -165,7 +165,7 @@ public boolean onContextItemSelected(MenuItem item) { */ public void updateBook(Book book) { Intent intent = new Intent(getActivity(), AddBookActivity.class); - intent.putExtra(EXTRA_ID, book.getId()); + intent.putExtra(ID, book.getId()); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); }