├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── GiladMac.xml ├── encodings.xml ├── gradle.xml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── libs │ │ └── demo │ │ └── medge │ │ └── com │ │ └── androidmusthavelibs │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── libs │ │ │ └── demo │ │ │ └── medge │ │ │ └── com │ │ │ └── androidmusthavelibs │ │ │ ├── ActiveAndroidActivity.java │ │ │ ├── ActiveAndroidUserModel.java │ │ │ ├── ButterKnifeActivity.java │ │ │ ├── EventBusPubService.java │ │ │ ├── EventBusSubActivity.java │ │ │ ├── EventBusUserEvent.java │ │ │ ├── LeakCanaryActivity.java │ │ │ ├── MyApplication.java │ │ │ ├── OkHttpService.java │ │ │ ├── PicassoActivity.java │ │ │ └── SelectorActivity.java │ └── res │ │ ├── drawable │ │ ├── bt_logo.png │ │ ├── dowload_failed.jpg │ │ └── placeholder.png │ │ ├── layout │ │ ├── activity_active_android.xml │ │ ├── activity_butter_knife.xml │ │ ├── activity_event_bus_sub.xml │ │ ├── activity_leak_canary.xml │ │ ├── activity_picasso.xml │ │ ├── activity_selector.xml │ │ └── content_selector.xml │ │ ├── menu │ │ └── menu_selector.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── libs │ └── demo │ └── medge │ └── com │ └── androidmusthavelibs │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | .DS_Store 12 | 13 | # Generated files 14 | bin/ 15 | gen/ 16 | out/ 17 | 18 | # Gradle files 19 | .gradle/ 20 | build/ 21 | 22 | # Local configuration file (sdk path, etc) 23 | local.properties 24 | 25 | # Proguard folder generated by Eclipse 26 | proguard/ 27 | 28 | # Log Files 29 | *.log 30 | 31 | .DS_Store 32 | 33 | # Android Studio Navigation editor temp files 34 | .navigation/ 35 | 36 | # Android Studio captures folder 37 | captures/ 38 | 39 | # Intellij 40 | *.iml 41 | .idea/workspace.xml 42 | .idea/libraries 43 | 44 | # Keystore files 45 | *.jks 46 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/dictionaries/GiladMac.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Android 39 | 40 | 41 | Android > Lint > Accessibility 42 | 43 | 44 | Android > Lint > Correctness 45 | 46 | 47 | Android > Lint > Performance 48 | 49 | 50 | Android > Lint > Usability 51 | 52 | 53 | Android > Lint > Usability > Icons 54 | 55 | 56 | Internationalization issuesJava 57 | 58 | 59 | Java 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 81 | 82 | 83 | 84 | 85 | 1.8 86 | 87 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Code Examples for "Guide To Underused Android Libraries", including: 2 | 3 | * ButterKnife – Auto-injected code will help you do away with much of your app’s boilerplate code. It’s the ultimate code injection for Android. Need I say more? 4 | * AndroidAnnotations – Use blazing fast auto-generated classes and name-based code injection to save time with no performance penalty over hand-coded logic. 5 | * EventBus – Decouple components for more robust code, cross-component communication has never been simpler. 6 | * OkHttp – A clever replacement for HttpURLConnection, with support for asynchronous networking, request redirect route query, local cache query, and more. 7 | * Picasso – Streamlined image manipulation that’s so good it’s now used by Google. It’ a major time-saver in media heavy projects and certain legacy projects. 8 | * ActiveAndroid – ORM made easy with no performance overhead. 9 | * LibStreaming – Real-time video streaming, used by major streaming apps. 10 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | 4 | android { 5 | compileSdkVersion 24 6 | buildToolsVersion "24.0.0" 7 | defaultConfig { 8 | applicationId "libs.demo.medge.com.androidmusthavelibs" 9 | minSdkVersion 21 10 | targetSdkVersion 24 11 | versionCode 1 12 | versionName "1.0" 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | repositories { // required for activeandroid compile 24 | mavenCentral() 25 | maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 26 | } 27 | 28 | dependencies { 29 | compile fileTree(dir: 'libs', include: ['*.jar']) 30 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 31 | exclude group: 'com.android.support', module: 'support-annotations' 32 | }) 33 | compile 'com.android.support:appcompat-v7:24.2.1' 34 | compile 'com.android.support:design:24.2.1' 35 | compile 'com.jakewharton:butterknife:8.4.0' 36 | compile 'org.greenrobot:eventbus:3.0.0' 37 | compile 'com.squareup.okhttp3:okhttp:3.4.1' 38 | compile 'com.squareup.picasso:picasso:2.5.2' 39 | 40 | compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' 41 | 42 | debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' 43 | releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 44 | testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 45 | 46 | testCompile 'junit:junit:4.12' 47 | } 48 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/GiladMac/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/libs/demo/medge/com/androidmusthavelibs/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("libs.demo.medge.com.androidmusthavelibs", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/ActiveAndroidActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import com.activeandroid.query.Select; 4 | 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | 8 | public class ActiveAndroidActivity extends AppCompatActivity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_active_android); 14 | } 15 | 16 | @Override 17 | protected void onStart() { 18 | super.onStart(); 19 | // db write 20 | ActiveAndroidUserModel usr = 21 | new ActiveAndroidUserModel("Dave", "2342423", "NY", 28); 22 | usr.save(); 23 | 24 | // and read 25 | ActiveAndroidUserModel result = new Select() 26 | .from(ActiveAndroidUserModel.class) 27 | .where("name = ?", usr.getName()) 28 | .orderBy("Age") 29 | .executeSingle(); 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/ActiveAndroidUserModel.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import com.activeandroid.Model; 4 | import com.activeandroid.annotation.Column; 5 | import com.activeandroid.annotation.Table; 6 | 7 | @Table(name = "Categories") 8 | public class ActiveAndroidUserModel extends Model { 9 | 10 | @Column(name = "Name", index = true) 11 | String name; 12 | @Column(name = "ID", index = true) 13 | String ID; 14 | @Column(name = "Address") 15 | String address; 16 | @Column(name = "Age") 17 | int age; 18 | 19 | 20 | public ActiveAndroidUserModel(String name, String ID, String address, int age) { 21 | this.name = name; 22 | this.ID = ID; 23 | this.address = address; 24 | this.age = age; 25 | } 26 | 27 | public String getName() { 28 | return name; 29 | } 30 | 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | 35 | public String getID() { 36 | return ID; 37 | } 38 | 39 | public void setID(String ID) { 40 | this.ID = ID; 41 | } 42 | 43 | public String getAddress() { 44 | return address; 45 | } 46 | 47 | public void setAddress(String address) { 48 | this.address = address; 49 | } 50 | 51 | public int getAge() { 52 | return age; 53 | } 54 | 55 | public void setAge(int age) { 56 | this.age = age; 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/ButterKnifeActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import android.graphics.drawable.Drawable; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.SeekBar; 9 | import android.widget.TextView; 10 | 11 | import butterknife.BindColor; 12 | import butterknife.BindDimen; 13 | import butterknife.BindDrawable; 14 | import butterknife.BindString; 15 | import butterknife.BindView; 16 | import butterknife.ButterKnife; 17 | import butterknife.OnClick; 18 | 19 | public class ButterKnifeActivity extends AppCompatActivity { 20 | 21 | // View binding 22 | @BindView(R.id.button) 23 | Button actionBtn; 24 | @BindView(R.id.textView) 25 | TextView caption; 26 | @BindView(R.id.textView2) 27 | TextView action; 28 | @BindView(R.id.seekBar) 29 | SeekBar humidityLevel; 30 | 31 | // Resource binding 32 | @BindString(R.string.action_settings) 33 | String settings; 34 | @BindDrawable(R.drawable.bt_logo) 35 | Drawable logo; 36 | @BindColor(R.color.colorAccent) 37 | int accentColor; 38 | @BindDimen(R.dimen.fab_margin) 39 | Float margins; 40 | 41 | @Override 42 | protected void onCreate(Bundle savedInstanceState) { 43 | super.onCreate(savedInstanceState); 44 | setContentView(R.layout.activity_butter_knife); 45 | ButterKnife.bind(this); 46 | 47 | //from here - can access binded fields: 48 | 49 | caption.setText("NY"); 50 | caption.setBackgroundColor(accentColor); 51 | } 52 | 53 | @OnClick(R.id.button) 54 | public void onActionPerformed(View view) { 55 | action.setText("Button clicked!"); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/EventBusPubService.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import org.greenrobot.eventbus.EventBus; 4 | 5 | import android.app.Service; 6 | import android.content.Intent; 7 | import android.os.IBinder; 8 | 9 | public class EventBusPubService extends Service { 10 | 11 | @Override 12 | public IBinder onBind(Intent intent) { 13 | return null; 14 | } 15 | 16 | @Override 17 | public void onCreate() { 18 | super.onCreate(); 19 | EventBus.getDefault().register(this); 20 | } 21 | 22 | @Override 23 | public int onStartCommand(Intent intent, int flags, int startId) { 24 | // notify user state chqnge to activity 25 | EventBus.getDefault().post(new EventBusUserEvent("Sam", "NY", 44.33f)); 26 | return Service.START_STICKY; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/EventBusSubActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import org.greenrobot.eventbus.EventBus; 4 | import org.greenrobot.eventbus.Subscribe; 5 | import org.greenrobot.eventbus.ThreadMode; 6 | 7 | import android.content.Intent; 8 | import android.os.Bundle; 9 | import android.support.v7.app.AppCompatActivity; 10 | import android.widget.Toast; 11 | 12 | public class EventBusSubActivity extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_event_bus_sub); 18 | startService(new Intent(this, EventBusPubService.class)); 19 | } 20 | 21 | @Override 22 | protected void onStart() { 23 | super.onStart(); 24 | EventBus.getDefault().register(this); 25 | } 26 | 27 | @Override 28 | public void onStop() { 29 | super.onStop(); 30 | EventBus.getDefault().unregister(this); 31 | } 32 | 33 | @Subscribe(threadMode = ThreadMode.MAIN) 34 | public void onMessageEvent(EventBusUserEvent event) { 35 | Toast.makeText(this, "New event for user " + event.getUserName(), 36 | Toast.LENGTH_SHORT).show();; 37 | }; 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/EventBusUserEvent.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | 4 | public class EventBusUserEvent { 5 | 6 | private final String userName; 7 | private final String userAddress; 8 | private final float userRatings; 9 | 10 | public EventBusUserEvent(String userName, String userAddress, float userRatings) { 11 | this.userName = userName; 12 | this.userAddress = userAddress; 13 | this.userRatings = userRatings; 14 | } 15 | 16 | 17 | public String getUserName() { 18 | return userName; 19 | } 20 | 21 | public String getUserAddress() { 22 | return userAddress; 23 | } 24 | 25 | public float getUserRatings() { 26 | return userRatings; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/LeakCanaryActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import com.squareup.leakcanary.RefWatcher; 4 | 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | 8 | public class LeakCanaryActivity extends AppCompatActivity { 9 | 10 | private String[] nameArr; 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_leak_canary); 16 | nameArr = new String[1024]; // allocate memory 17 | } 18 | 19 | @Override 20 | protected void onDestroy() { 21 | super.onDestroy(); 22 | RefWatcher refWatcher = MyApplication.getRefWatcher(); 23 | refWatcher.watch(nameArr); // verify allocated memory indeed reclaimed 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/MyApplication.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import com.squareup.leakcanary.LeakCanary; 4 | import com.squareup.leakcanary.RefWatcher; 5 | 6 | import android.app.Application; 7 | 8 | public class MyApplication extends Application { 9 | 10 | private static RefWatcher refWatcher; // leakCanary "memory watcher" 11 | 12 | @Override 13 | public void onCreate() { 14 | super.onCreate(); 15 | if (LeakCanary.isInAnalyzerProcess(this)) { 16 | // This process is dedicated to LeakCanary for heap analysis. 17 | // You should not init your app in this process. 18 | return; 19 | } 20 | refWatcher = LeakCanary.install(this); 21 | // go on with app init.. 22 | } 23 | 24 | public static RefWatcher getRefWatcher() { 25 | return refWatcher; 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/OkHttpService.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.os.IBinder; 6 | 7 | import java.io.IOException; 8 | 9 | import okhttp3.MediaType; 10 | import okhttp3.OkHttpClient; 11 | import okhttp3.Request; 12 | import okhttp3.RequestBody; 13 | import okhttp3.Response; 14 | 15 | public class OkHttpService extends Service { 16 | 17 | private static final String JSOT_STR = "TODO"; 18 | private static final String PEER_URL = "TODO"; 19 | 20 | public OkHttpService() { 21 | } 22 | 23 | @Override 24 | public IBinder onBind(Intent intent) { 25 | return null; 26 | } 27 | 28 | @Override 29 | public int onStartCommand(Intent intent, int flags, int startId) { 30 | new Thread() { // TODO replace with smarter threading model (Executer?) 31 | @Override 32 | public void run() { 33 | sendRequestToServer(true); 34 | } 35 | }.start(); 36 | sendRequestToServer(true); 37 | return Service.START_STICKY; 38 | } 39 | 40 | private String sendRequestToServer(boolean getMode) { 41 | OkHttpClient client = new OkHttpClient(); 42 | Request request; 43 | Response response; 44 | 45 | if (getMode) { 46 | request = new Request.Builder() 47 | .url(PEER_URL) 48 | .build(); 49 | } 50 | else { 51 | // pose 52 | MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 53 | RequestBody body = RequestBody.create(JSON, JSOT_STR); 54 | request = new Request.Builder() 55 | .url(PEER_URL) 56 | .post(body) 57 | .build(); 58 | } 59 | try { 60 | response = client.newCall(request).execute(); 61 | return response.body().string(); 62 | } catch (IOException e) { 63 | e.printStackTrace(); 64 | } 65 | return null; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/PicassoActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import com.squareup.picasso.Picasso; 4 | 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.widget.ImageView; 8 | 9 | public class PicassoActivity extends AppCompatActivity { 10 | 11 | private static final int TARGET_WIDTH = 120; 12 | private static final int TARGET_HEIGHT = 120; 13 | private static final String IMG_URL = "http://i.imgur.com/DvpvklR.png"; 14 | 15 | private ImageView imageView; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_picasso); 21 | imageView = (ImageView) findViewById(R.id.imageView); 22 | } 23 | 24 | @Override 25 | protected void onStart() { 26 | super.onStart(); 27 | Picasso.with(this) 28 | .load(IMG_URL) 29 | .resize(TARGET_WIDTH, TARGET_HEIGHT) 30 | .centerCrop() 31 | .placeholder(R.drawable.placeholder) 32 | .error(R.drawable.dowload_failed) 33 | .into(imageView); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/libs/demo/medge/com/androidmusthavelibs/SelectorActivity.java: -------------------------------------------------------------------------------- 1 | package libs.demo.medge.com.androidmusthavelibs; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.FloatingActionButton; 5 | import android.support.design.widget.Snackbar; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.Toolbar; 8 | import android.view.View; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | 12 | public class SelectorActivity extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_selector); 18 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 19 | setSupportActionBar(toolbar); 20 | 21 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 22 | fab.setOnClickListener(new View.OnClickListener() { 23 | @Override 24 | public void onClick(View view) { 25 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 26 | .setAction("Action", null).show(); 27 | } 28 | }); 29 | } 30 | 31 | @Override 32 | public boolean onCreateOptionsMenu(Menu menu) { 33 | // Inflate the menu; this adds items to the action bar if it is present. 34 | getMenuInflater().inflate(R.menu.menu_selector, menu); 35 | return true; 36 | } 37 | 38 | @Override 39 | public boolean onOptionsItemSelected(MenuItem item) { 40 | // Handle action bar item clicks here. The action bar will 41 | // automatically handle clicks on the Home/Up button, so long 42 | // as you specify a parent activity in AndroidManifest.xml. 43 | int id = item.getItemId(); 44 | 45 | //noinspection SimplifiableIfStatement 46 | if (id == R.id.action_settings) { 47 | return true; 48 | } 49 | 50 | return super.onOptionsItemSelected(item); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bt_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giladHaimov/AndroidMustHaveLibs/4cf01265032b757886fd9b048e8777630c477593/app/src/main/res/drawable/bt_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dowload_failed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giladHaimov/AndroidMustHaveLibs/4cf01265032b757886fd9b048e8777630c477593/app/src/main/res/drawable/dowload_failed.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/giladHaimov/AndroidMustHaveLibs/4cf01265032b757886fd9b048e8777630c477593/app/src/main/res/drawable/placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_active_android.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_butter_knife.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 |