Created
November 18, 2014 14:43
-
-
Save umarniz/323a885e4fc3edce9488 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.nerdiacs.forcemobiledatatest; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.net.ConnectivityManager; | |
import android.net.NetworkInfo; | |
import android.os.Bundle; | |
import android.text.TextUtils; | |
import android.util.Log; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.net.InetAddress; | |
import java.net.UnknownHostException; | |
import twitter4j.StatusUpdate; | |
import twitter4j.Twitter; | |
import twitter4j.TwitterException; | |
import twitter4j.TwitterFactory; | |
import twitter4j.conf.Configuration; | |
import twitter4j.conf.ConfigurationBuilder; | |
public class MyActivity extends Activity { | |
private static final String TAG = "ForceMobile"; | |
private static Twitter twitter; | |
private Context mContext; | |
private InputStream mImage; | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_my); | |
mContext = getApplicationContext(); | |
// load image | |
try { | |
mImage = mContext.getAssets().open("Logo512.png"); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
new Thread(new Runnable() { | |
@Override | |
public void run() { | |
forceMobileConnectionForAddress(mContext, "199.59.150.41"); | |
PostToTwitter(); | |
} | |
}).start(); | |
} | |
private void PostToTwitter() { | |
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); | |
configurationBuilder.setDebugEnabled(true); | |
configurationBuilder.setOAuthConsumerKey(Const.CONSUMER_KEY); | |
configurationBuilder.setOAuthConsumerSecret(Const.CONSUMER_SECRET); | |
configurationBuilder.setOAuthAccessToken("22230020-Enpe38a42CTF0MU9gFKo5TERfSKyWzt2XHf8I9vN2"); | |
configurationBuilder.setOAuthAccessTokenSecret("n96wOEDGnVpEQA5kNYjhpAKgTOZPjBsGth7AzB2I5U8ys"); | |
Configuration configuration = configurationBuilder.build(); | |
twitter = new TwitterFactory(configuration).getInstance(); | |
try { | |
StatusUpdate status = new StatusUpdate("Testing #twitter4j"); | |
status.setMedia("Logo", mImage); | |
twitter.updateStatus(status); | |
//twitter.updateStatus("test"); | |
} catch (TwitterException e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* Enable mobile connection for a specific address | |
* @param context a Context (application or activity) | |
* @param address the address to enable | |
* @return true for success, else false | |
*/ | |
private boolean forceMobileConnectionForAddress(Context context, String address) { | |
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); | |
if (null == connectivityManager) { | |
Log.d(TAG, "ConnectivityManager is null, cannot try to force a mobile connection"); | |
return false; | |
} | |
//check if mobile connection is available and connected | |
NetworkInfo.State state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState(); | |
Log.d(TAG, "TYPE_MOBILE_HIPRI network state: " + state); | |
if (0 == state.compareTo(NetworkInfo.State.CONNECTED) || 0 == state.compareTo(NetworkInfo.State.CONNECTING)) { | |
return true; | |
} | |
//activate mobile connection in addition to other connection already activated | |
int resultInt = connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI"); | |
Log.d(TAG, "startUsingNetworkFeature for enableHIPRI result: " + resultInt); | |
//-1 means errors | |
// 0 means already enabled | |
// 1 means enabled | |
// other values can be returned, because this method is vendor specific | |
if (-1 == resultInt) { | |
Log.e(TAG, "Wrong result of startUsingNetworkFeature, maybe problems"); | |
return false; | |
} | |
if (0 == resultInt) { | |
Log.d(TAG, "No need to perform additional network settings"); | |
return true; | |
} | |
//find the host name to route | |
String hostName = extractAddressFromUrl(address); | |
Log.d(TAG, "Source address: " + address); | |
Log.d(TAG, "Destination host address to route: " + hostName); | |
if (TextUtils.isEmpty(hostName)) hostName = address; | |
//create a route for the specified address | |
int hostAddress = lookupHost(hostName); | |
if (-1 == hostAddress) { | |
Log.e(TAG, "Wrong host address transformation, result was -1"); | |
return false; | |
} | |
//wait some time needed to connection manager for waking up | |
try { | |
for (int counter=0; counter<30; counter++) { | |
NetworkInfo.State checkState = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState(); | |
if (0 == checkState.compareTo(NetworkInfo.State.CONNECTED)) | |
break; | |
Thread.sleep(2000); | |
} | |
} catch (InterruptedException e) { | |
//nothing to do | |
} | |
boolean resultBool = connectivityManager.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress); | |
Log.d(TAG, "requestRouteToHost result: " + resultBool); | |
if (!resultBool) | |
Log.e(TAG, "Wrong requestRouteToHost result: expected true, but was false"); | |
return resultBool; | |
} | |
/** | |
* This method extracts from address the hostname | |
* @param url eg. http://some.where.com:8080/sync | |
* @return some.where.com | |
*/ | |
public static String extractAddressFromUrl(String url) { | |
String urlToProcess = null; | |
//find protocol | |
int protocolEndIndex = url.indexOf("://"); | |
if(protocolEndIndex>0) { | |
urlToProcess = url.substring(protocolEndIndex + 3); | |
} else { | |
urlToProcess = url; | |
} | |
// If we have port number in the address we strip everything | |
// after the port number | |
int pos = urlToProcess.indexOf(':'); | |
if (pos >= 0) { | |
urlToProcess = urlToProcess.substring(0, pos); | |
} | |
// If we have resource location in the address then we strip | |
// everything after the '/' | |
pos = urlToProcess.indexOf('/'); | |
if (pos >= 0) { | |
urlToProcess = urlToProcess.substring(0, pos); | |
} | |
// If we have ? in the address then we strip | |
// everything after the '?' | |
pos = urlToProcess.indexOf('?'); | |
if (pos >= 0) { | |
urlToProcess = urlToProcess.substring(0, pos); | |
} | |
return urlToProcess; | |
} | |
/** | |
* Transform host name in int value used | |
* method | |
* | |
* @param hostname | |
* @return -1 if the host doesn't exists, elsewhere its translation | |
* to an integer | |
*/ | |
private static int lookupHost(String hostname) { | |
InetAddress inetAddress; | |
try { | |
inetAddress = InetAddress.getByName(hostname); | |
} catch (UnknownHostException e) { | |
return -1; | |
} | |
byte[] addrBytes; | |
int addr; | |
addrBytes = inetAddress.getAddress(); | |
addr = ((addrBytes[3] & 0xff) << 24) | |
| ((addrBytes[2] & 0xff) << 16) | |
| ((addrBytes[1] & 0xff) << 8 ) | |
| (addrBytes[0] & 0xff); | |
return addr; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment