diff --git a/vlc-android/AndroidManifest.xml b/vlc-android/AndroidManifest.xml index cf0f399d648d287643a01dfb05403a3e53cf58b4..540c0b2378769d8a624b32c66dcf35bf58557f35 100644 --- a/vlc-android/AndroidManifest.xml +++ b/vlc-android/AndroidManifest.xml @@ -32,6 +32,9 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> + <activity + android:name=".gui.CompatErrorActivity" + android:theme="@android:style/Theme.NoTitleBar" /> <activity android:name=".gui.SearchActivity" android:configChanges="orientation|screenSize" diff --git a/vlc-android/res/layout/no_neon.xml b/vlc-android/res/layout/no_neon.xml new file mode 100644 index 0000000000000000000000000000000000000000..89d8ef81a4ba001501397dd137a6b897bf47c92a --- /dev/null +++ b/vlc-android/res/layout/no_neon.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#000"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <ImageView + android:id="@+id/logo" + android:layout_width="130dp" + android:layout_height="wrap_content" + android:scaleType="centerInside" + android:layout_gravity="center_horizontal" + android:contentDescription="@string/info" + android:src="@drawable/cone" /> + + <TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="@string/error_no_neon" + android:textColor="#FF0000" + android:textSize="20dp" /> + + </LinearLayout> + +</ScrollView> \ No newline at end of file diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml index 3cdac27b0aab499ea0380a9ca67259ce0ff907aa..427096e2e90f82dde4061449a17614195e74d1b0 100644 --- a/vlc-android/res/values/strings.xml +++ b/vlc-android/res/values/strings.xml @@ -131,4 +131,5 @@ <item>@string/aout_audiotrack</item> <item>@string/aout_opensles</item> </string-array> + <string name="error_no_neon">Sorry, but your device is currently not supported by this version of VLC for Androidâ„¢</string> </resources> diff --git a/vlc-android/src/org/videolan/vlc/LibVLC.java b/vlc-android/src/org/videolan/vlc/LibVLC.java index c96017ec4b8c4f18089069152e67f05bc48865b1..cd9444f685f55e690af62ecb5996dd7bd7bab1e8 100644 --- a/vlc-android/src/org/videolan/vlc/LibVLC.java +++ b/vlc-android/src/org/videolan/vlc/LibVLC.java @@ -20,6 +20,8 @@ package org.videolan.vlc; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import org.videolan.vlc.gui.video.VideoPlayerActivity; @@ -178,6 +180,10 @@ public class LibVLC { private void init() throws LibVlcException { Log.v(TAG, "Initializing LibVLC"); if (!mIsInitialized) { + if (!Util.hasNeon()) { + Log.e(TAG, "Required CPU feature is missing."); + return; + } Context context = VLCApplication.getAppContext(); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); nativeInit(pref.getBoolean("enable_verbose_mode", true)); diff --git a/vlc-android/src/org/videolan/vlc/Util.java b/vlc-android/src/org/videolan/vlc/Util.java index 1e7573ca578a5a73b3c27dec65e06fe68d90984e..55b92ab551a91cb417676bd08432983fe88f377e 100644 --- a/vlc-android/src/org/videolan/vlc/Util.java +++ b/vlc-android/src/org/videolan/vlc/Util.java @@ -184,4 +184,26 @@ public class Util { { return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH; } + + public static boolean hasNeon() + { + ProcessBuilder cmd; + + try { + String[] args = {"/system/bin/cat", "/proc/cpuinfo"}; + cmd = new ProcessBuilder(args); + + Process process = cmd.start(); + InputStream in = process.getInputStream(); + byte[] re = new byte[1024]; + while(in.read(re) != -1){ + if (new String(re).contains("neon")) + return true; + } + in.close(); + } catch(IOException ex){ + ex.printStackTrace(); + } + return false; + } } diff --git a/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java b/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..964096d92ecffff431342e859a0b6ce5376cb49b --- /dev/null +++ b/vlc-android/src/org/videolan/vlc/gui/CompatErrorActivity.java @@ -0,0 +1,68 @@ +package org.videolan.vlc.gui; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.videolan.vlc.R; +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; + +public class CompatErrorActivity extends Activity { + public final static String TAG = "VLC/CompatErrorActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + setContentView(R.layout.no_neon); + super.onCreate(savedInstanceState); + + AsyncHttpRequest asyncHttpRequest = new AsyncHttpRequest(); + asyncHttpRequest.execute(Build.MODEL, Build.DEVICE); + } + + public class AsyncHttpRequest extends AsyncTask<String, String, Boolean> { + + public AsyncHttpRequest() { } + + @Override + protected Boolean doInBackground(String... params) { + if (params[0].length() == 0) + return false; + HttpClient httpClient = new DefaultHttpClient(); + HttpPost httpPost = new HttpPost("http://people.videolan.org/~jb/blacklist/vlc-devices.php"); + + try { + List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); + nameValuePairs.add(new BasicNameValuePair("model", params[0])); + nameValuePairs.add(new BasicNameValuePair("device", params[1])); + httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); + + httpClient.execute(httpPost); + } catch (ClientProtocolException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + Log.d(TAG, "Device model sent."); + return true; + } + + @Override + protected void onPostExecute(Boolean result) { + + } + } +} diff --git a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java index 0f27ea703f07f922dce0ea28ac79fd3b7ff963a0..f9720b0596315e216d01192b02ac383bb7c79115 100644 --- a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java +++ b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import org.videolan.vlc.AudioService; import org.videolan.vlc.AudioServiceController; import org.videolan.vlc.LibVLC; +import org.videolan.vlc.LibVlcException; import org.videolan.vlc.MediaLibrary; import org.videolan.vlc.R; import org.videolan.vlc.Util; @@ -97,6 +98,15 @@ public class MainActivity extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { + if (!Util.hasNeon()) { + Log.e(TAG, "CPU is missing NEON."); + super.onCreate(savedInstanceState); + Intent i = new Intent(this, CompatErrorActivity.class); + startActivity(i); + finish(); + return; + } + if (Util.isICSOrLater()) /* Bug on pre-ICS, the progress bar is always present */ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); @@ -210,7 +220,9 @@ public class MainActivity extends SherlockFragmentActivity { @Override protected void onDestroy() { - unregisterReceiver(messageReceiver); + try { + unregisterReceiver(messageReceiver); + } catch (IllegalArgumentException e) {} super.onDestroy(); }