diff --git a/Render/.gitignore b/Render/.gitignore new file mode 100644 index 0000000..43c5496 --- /dev/null +++ b/Render/.gitignore @@ -0,0 +1,7 @@ +build/ +.idea +.gradle +*.iml +local.properties +.DS_Store +app/libs diff --git a/Render/app/.gitignore b/Render/app/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/Render/app/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/Render/app/build.gradle b/Render/app/build.gradle new file mode 100644 index 0000000..c6d096e --- /dev/null +++ b/Render/app/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.2" + + defaultConfig { + applicationId "com.example.android.mobileperf.render" + minSdkVersion 9 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:21.0.0' + compile 'com.squareup.picasso:picasso:2.2.0' +} \ No newline at end of file diff --git a/Render/app/proguard-rules.pro b/Render/app/proguard-rules.pro new file mode 100644 index 0000000..ec87fa0 --- /dev/null +++ b/Render/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/shailentuli/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/Render/app/src/main/AndroidManifest.xml b/Render/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..fcb4e13 --- /dev/null +++ b/Render/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/Chat.java b/Render/app/src/main/java/com/example/android/mobileperf/render/Chat.java new file mode 100644 index 0000000..dd83636 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/Chat.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import java.util.Date; + +/** + * Describes a Chat message written by a Droid author, consisting of some text and a timestamp. + */ +public class Chat { + /** + * The author of the chat. + */ + private Droid author; + + /** + * The chat content. This is hardcoded in this sample (see ChatsFragment.java). + */ + private String text; + + /** + * The time a chat was posted to the chat board. + */ + private Date datetime; + + public Chat(Droid author, String text, Date datetime) { + this.author = author; + this.text = text; + this.datetime = datetime; + } + + public Droid getAuthor() {return author;} + public String getText() {return text;} + public Date getDatetime() {return datetime;} +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/ChatAdapter.java b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatAdapter.java new file mode 100644 index 0000000..9406281 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatAdapter.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.content.Context; +import android.graphics.Color; +import android.text.format.DateUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.Date; + +/** + * A custom adapter that is backed by an array of Chat objects. References a TextView with the name + * of a chat author (a Droid), a TextView with a chat's text, another TextView with the chat's + * timestamp, and an ImageView for the chat author's avatar. + */ +public class ChatAdapter extends ArrayAdapter { + public ChatAdapter(Context context, ArrayList chats) { + super(context, 0, chats); + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + + Chat chat = getItem(position); + if (view == null) { + view = LayoutInflater.from(getContext()).inflate( + R.layout.chat_item, parent, false); + } + + // Find the UI widgets for a chat item. + TextView chat_author_name = (TextView) view.findViewById(R.id.chat_author_name); + TextView chat_text = (TextView) view.findViewById(R.id.chat_text); + TextView chat_datetime = (TextView) view.findViewById(R.id.chat_datetime); + ImageView chat_author_avatar = (ImageView) view.findViewById(R.id.chat_author_avatar); + + // Display the author's name using the color associated with the author. + chat_author_name.setText(chat.getAuthor().getName()); + chat_author_name.setTextColor(chat.getAuthor().getColor()); + + // Display the chat text. + chat_text.setText(chat.getText()); + + // Set the timestamp for the chat in "x minutes ago" format. + chat_datetime.setText(DateUtils.getRelativeTimeSpanString( + chat.getDatetime().getTime(), + new Date().getTime(), + DateUtils.MINUTE_IN_MILLIS, + DateUtils.FORMAT_ABBREV_RELATIVE)); + + + // Display the chat author's avatar (a droid image). For authors without an avatar, simply + // show a background color associated with the author. + if (chat.getAuthor().getAvatarId() == 0) { + Picasso.with(getContext()).load(android.R.color.transparent).into(chat_author_avatar); + chat_author_avatar.setBackgroundColor(chat.getAuthor().getColor()); + } else { + Picasso.with(getContext()).load(chat.getAuthor().getAvatarId()).into( + chat_author_avatar); + chat_author_avatar.setBackgroundColor(Color.TRANSPARENT); + } + + return view; + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/ChatsFragment.java b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatsFragment.java new file mode 100644 index 0000000..142a3df --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatsFragment.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.content.res.Resources; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import java.util.ArrayList; +import java.util.Date; + + +/** + * Fragment that encapsulates creating {@link Chat} objects and displaying them using a + * {@link ListView} layout. + * Creates seed data consisting of a handful of chats authored by a few authors. + */ +public class ChatsFragment extends Fragment { + protected static int MILLISECONDS_PER_SECOND = 1000; + protected static int SECONDS_PER_MINUTE = 60; + + public ChatsFragment() {} + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + // Create a list of chats and populate it with hardcoded data. + ArrayList chats = new ArrayList(); + populateChats(chats); + + // Create the adapter that provides values to the UI Widgets. + ChatAdapter adapter = new ChatAdapter(getActivity(), chats); + + View rootView = inflater.inflate(R.layout.fragment_chats, container, false); + + // Find the ListView that holds all the chat messages and attach it to the adapter, + ListView listView = (ListView) rootView.findViewById(R.id.listview_chats); + listView.setAdapter(adapter); + + return rootView; + } + + private Date getTimeInPast(int minutesAgo) { + return new Date(new Date().getTime() - + (minutesAgo * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND)); + } + + // Creates hardcoded chat objects. + private void populateChats(ArrayList chats) { + Resources res = getResources(); + Droid alex = new Droid("alex", res.getColor(R.color.alex_color)); + Droid joanna = new Droid("joanna", res.getColor(R.color.joanna_color), R.drawable.joanna); + Droid shailen = new Droid("shailen", res.getColor(R.color.shailen_color), + R.drawable.shailen); + + chats.add(new Chat(alex, "Lorem ipsum dolor sit amet, orci nullam cra", + getTimeInPast(15))); + + chats.add(new Chat(joanna, "Omnis aptent magnis suspendisse ipsum, semper egestas " + + "magna auctor maecenas", + getTimeInPast(11))); + + chats.add(new Chat(shailen, "eu nibh, rhoncus wisi posuere lacus, ad erat egestas " + + "quam, magna ante ultricies sem", + getTimeInPast(9))); + + chats.add(new Chat(alex, "rhoncus wisi posuere lacus, ad erat egestas quam, magna " + + "ante ultricies sem lacus", + getTimeInPast(8))); + + chats.add(new Chat(shailen, "Enim justo nisl sit proin, quis vestibulum vivamus " + + "suscipit penatibus et id, tempus mauris a lacus blandit, aenean praesent " + + "arcu scelerisque sociosqu. Nonummy at ut ullamcorper nulla, ligula id, " + + "nullam donec nisl ante turpis duis mauris, dolor imperdiet a inceptos aliquam", + getTimeInPast(8))); + + chats.add(new Chat(joanna, "Omnis aptent magnis.", + getTimeInPast(7))); + + chats.add(new Chat(alex, "Metus tincidunt sit in urna.", + getTimeInPast(6))); + + chats.add(new Chat(shailen, "Non blandit nulla dapibus, vitae quisque sed cras mi " + + "leo condimentum sociosqu quis sed pharetra", + getTimeInPast(4))); + + chats.add(new Chat(joanna, "Enim justo nisl sit proin, quis vestibulum vivamus " + + "suscipit penatibus et id, tempus mauris a lacus blandit, aenean praesent " + + "arcu scelerisque sociosqu. Nonummy at ut ullamcorper nulla, ligula id, " + + "nullam donec nisl ante turpis duis mauris, dolor imperdiet a inceptos.", + getTimeInPast(3))); + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/ChatumLatinumActivity.java b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatumLatinumActivity.java new file mode 100644 index 0000000..b9abf52 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/ChatumLatinumActivity.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; + +/** + * Displays a fragment that contains a ListView holding several Chat objects. Used in this lesson + * to show a) how to reduce overdraws, and b) how to flatten needlessly nested hierarchies. + */ +public class ChatumLatinumActivity extends ActionBarActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chatum_latinum); + + // The Theme's windowBackground is masked by the opaque background of the activity, and + // the windowBackground causes an unnecessary overdraw. Nullifying the windowBackground + // removes that overdraw. + getWindow().setBackgroundDrawable(null); + + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .add(R.id.activity_chatum_latinum_container, new ChatsFragment()) + .commit(); + } + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/CompareLayoutsActivity.java b/Render/app/src/main/java/com/example/android/mobileperf/render/CompareLayoutsActivity.java new file mode 100644 index 0000000..78a7b53 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/CompareLayoutsActivity.java @@ -0,0 +1,24 @@ +package com.example.android.mobileperf.render; + +import android.support.v7.app.ActionBarActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.ImageView; + +import com.squareup.picasso.Picasso; + + +public class CompareLayoutsActivity extends ActionBarActivity { + protected static final String TAG = "CompareLayoutActivity"; + + ImageView chat_author_avatar1; + ImageView chat_author_avatar2; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_compare_layouts); + } +} diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/Droid.java b/Render/app/src/main/java/com/example/android/mobileperf/render/Droid.java new file mode 100644 index 0000000..97e7961 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/Droid.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +/** + * Class for Droid objects. Each Droid has a name and is associated with a color and + * (optionally) an image. Droid images generated via http://androidify.com. + */ +public class Droid { + /** + * The Droid's name. + */ + private String name; + + /** + * The color associated with a droid. + */ + private int color; + + /** + * The id of a drawable associated with a Droid. + */ + private int imageId; + + + public Droid(String name, int color) { + this.name = name; + this.color = color; + } + + public Droid(String name, int color, int imageId) { + this.name = name; + this.color = color; + this.imageId = imageId; + } + + public String getName() {return name;} + public int getColor() {return color;} + public int getAvatarId() {return imageId;} +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCard.java b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCard.java new file mode 100644 index 0000000..c5132e2 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCard.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.graphics.Bitmap; + +/** + * Class for creating droid cards, which feature a droid's name and image. + **/ +class DroidCard { + + protected static final float SPACE_AROUND_IMAGE = 20f; + + protected static final float BITMAP_HEIGHT_HEADER_HEIGHT_RATIO = .25f; + + private Droid mDroid; + private Bitmap mBitmap; + + private float mHeaderHeight; + private float mBodyHeight; + private float mTitleSize; + + DroidCard(Droid droid, Bitmap bitmap) { + mDroid = droid; + mBitmap = bitmap; + + mBodyHeight = mBitmap.getHeight() + SPACE_AROUND_IMAGE; + mHeaderHeight = mBitmap.getHeight() * BITMAP_HEIGHT_HEADER_HEIGHT_RATIO; + mTitleSize = mHeaderHeight / 2; + } + + private String logDimensions() { + return "mBodyHeight = " + mBodyHeight + + ", mHeaderHeight = " + mHeaderHeight + + ", mTitleSize = " + mTitleSize + + ", getWidth() = " + String.valueOf(getWidth()); + } + + protected float getWidth() { + return mBitmap.getWidth() + (2 * SPACE_AROUND_IMAGE); + } + + protected float getBodyHeight() { + return mBodyHeight; + } + + protected float getHeaderHeight() { + return mHeaderHeight; + } + + protected float getHeight() { + return getBodyHeight() + getHeaderHeight(); + } + + protected float getTitleSize() { + return mTitleSize; + } + + protected Bitmap getBitmap() { + return mBitmap; + } + + protected Droid getDroid() { + return mDroid; + } + + protected float getTitleXOffset() { + return SPACE_AROUND_IMAGE; + } + + protected float getTitleYOffset() { + return SPACE_AROUND_IMAGE; + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsActivity.java b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsActivity.java new file mode 100644 index 0000000..f2b432b --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsActivity.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.widget.RelativeLayout; + +/** + * Activity to show the custom view, DroidCardsView. Used to demonstrate how clipping a view's + * drawing area is an effective way of reducing overdraws. + */ +public class DroidCardsActivity extends ActionBarActivity { + public static final String TAG = "droid-cards-activity"; + + // For this sample, we simply hard code the size of the droid image. A real app might prefer + // to dynamically calculate this value based on the activity's dimensions. + protected static final float DROID_IMAGE_WIDTH = 420f; + + // The distance between the left edges of two adjacent cards. The cards overlap horizontally. + protected static final float CARD_SPACING = DROID_IMAGE_WIDTH / 3; + + /** + * The container for the custom view. + */ + private RelativeLayout mdroidCardsContainer; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_droid_cards); + + // Find the container. + mdroidCardsContainer = (RelativeLayout) findViewById(R.id.activity_droid_cards_container); + + Droid[] droids = { + new Droid("Joanna", R.color.joanna_color, R.drawable.joanna), + new Droid("Shailen", R.color.shailen_color, R.drawable.shailen), + new Droid("Chris", R.color.chris_color, R.drawable.chris) + }; + + // Create the DroidCardsView object. + final DroidCardsView droidCardView = new DroidCardsView( + this, + droids, + DROID_IMAGE_WIDTH, + CARD_SPACING + ); + + droidCardView.setLayoutParams(new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.MATCH_PARENT)); + + // Add the view to the container. + mdroidCardsContainer.addView(droidCardView); + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsView.java b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsView.java new file mode 100644 index 0000000..5be5c67 --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/DroidCardsView.java @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.os.AsyncTask; +import android.view.View; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * A custom view that displays a stacked collection of droid cards. See onDraw() for use of a + * clipRect() to restrict the drawing area to avoid partial overdraws. + */ +class DroidCardsView extends View { + /** + * The list of droids displayed in this view. + */ + private Droid[] mDroids; + + /** + * The width of the droid image. In this sample, we hard code an image width in + * DroidCardsActivity and pass it as an argument to this view. + */ + float mDroidImageWidth; + + /** + * The distance between the left edges of two adjacent cards. The cards overlap horizontally. + */ + protected float mCardSpacing; + + /** + * Keeps track of the left coordinate for each card. + */ + private float mCardLeft; + + /** + * A list of DroidCards objected. We use Asynctasks to populate the contents of this list. See + * the DroidCardWorkerTask class that extends AsyncTask. + */ + private ArrayList mDroidCards = new ArrayList(); + + /** + * + * @param context The app context. + * @param droids The Droid objects associated with DroidCards. + * @param droidImageWidth The width of each Droid image. Hardcoded in DroidCardsActivity. + * @param cardSpacing The distance between the left edges of two adjacent cards. + */ + public DroidCardsView(Context context, Droid[] droids, float droidImageWidth, + float cardSpacing) { + super(context); + + mDroids = droids; + mDroidImageWidth = droidImageWidth; + mCardSpacing = cardSpacing; + + // Fire AsyncTasks to fetch and scale the bitmaps. + for (int i = 0; i < mDroids.length; i++) { + new DroidCardWorkerTask().execute(mDroids[i]); + } + } + + /** + * Custom implementation to do drawing in this view. Waits for the AsyncTasks to fetch + * bitmaps for each Droid and populate mDroidCards, a list of DroidCard objects. Then, draws + * overlapping droid cards. + */ + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // Don't draw anything until all the Asynctasks are done and all the DroidCards are ready. + if (mDroids.length > 0 && mDroidCards.size() == mDroids.length) { + // Loop over all the droids, except the last one. + int i; + for (i = 0; i < mDroidCards.size() - 1; i++) { + + // Each card is laid out a little to the right of the previous one. + mCardLeft = i * mCardSpacing; + + // Save the canvas state. + canvas.save(); + + // Restrict the drawing area to only what will be visible. + canvas.clipRect( + mCardLeft, + 0, + mCardLeft + mCardSpacing, + mDroidCards.get(i).getHeight() + ); + + // Draw the card. Only the parts of the card that lie within the bounds defined by + // the clipRect() get drawn. + drawDroidCard(canvas, mDroidCards.get(i), mCardLeft, 0); + + // Revert canvas to non-clipping state. + canvas.restore(); + } + + // Draw the final card. This one doesn't get clipped. + drawDroidCard(canvas, mDroidCards.get(mDroidCards.size() - 1), + mCardLeft + mCardSpacing, 0); + } + + // Invalidate the whole view. Doing this calls onDraw() if the view is visible. + invalidate(); + } + + /** + * Draws a droid card to a canvas at the specified position. + */ + protected void drawDroidCard(Canvas canvas, DroidCard droidCard, float left, float top) { + Paint paint = new Paint(); + Bitmap bm = droidCard.getBitmap(); + Droid droid = droidCard.getDroid(); + + // Draw outer rectangle. + paint.setAntiAlias(true); + Rect cardRect = new Rect( + (int)left, + (int)top, + (int)left + (int) droidCard.getWidth(), + (int)top + (int) droidCard.getHeight() + ); + paint.setStyle(Paint.Style.STROKE); + paint.setColor(Color.DKGRAY); + canvas.drawRect(cardRect, paint); + + // Draw the bitmap centered in the card body. + canvas.drawBitmap( + bm, + (cardRect.left + (droidCard.getWidth() / 2)) - (bm.getWidth() / 2), + (cardRect.top + (int) droidCard.getHeaderHeight() + (droidCard.getBodyHeight() / 2) + - (bm.getHeight() / 2)), + null + ); + + // Write the droid's name in the header. + paint.setTextSize(droidCard.getTitleSize()); + paint.setColor(getResources().getColor(droid.getColor())); + paint.setStyle(Paint.Style.STROKE); + + // Calculate the the left and top offsets for the title. + int titleLeftOffset = cardRect.left + (int) droidCard.getTitleXOffset(); + int titleTopOffset = cardRect.top + (int) droidCard.getTitleYOffset() + + (int) droidCard.getTitleSize(); + + // Draw the title text. + canvas.drawText(droid.getName(), titleLeftOffset, titleTopOffset, paint); + } + + /** + * Creates and returns a bitmap from a drawable resource. + */ + public Bitmap makeBitmap(Resources res, int resId, int reqWidth) { + // First decode with inJustDecodeBounds=true to check dimensions + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(res, resId, options); + + // Calculate inSampleSize. + options.inSampleSize = calculateInSampleSize(options, reqWidth); + + // Decode bitmap with inSampleSize set. + options.inJustDecodeBounds = false; + + // Decode bitmap. + return BitmapFactory.decodeResource(res, resId, options); + } + + /** + * Returns a bitmap scaled to a specific width. + */ + private Bitmap getScaledBitmap(Bitmap bitmap, float width) { + float scale = width / bitmap.getWidth(); + return Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * scale), + (int) (bitmap.getHeight() * scale), false); + } + + /** + * Requests the decoder to subsample the original image, possibly returning a smaller image to + * save memory. + */ + private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth) { + // Get the raw width of image. + final int width = options.outWidth; + int inSampleSize = 1; + + // Calculate the best inSampleSize. + if (width > reqWidth) { + final int halfWidth = width / 2; + while ((halfWidth / inSampleSize) > reqWidth) { + inSampleSize *= 2; + } + } + return inSampleSize; + } + + /** + * Worker that fetches bitmaps in the background and stores them in a list of DroidCards. + * The order of the + */ + class DroidCardWorkerTask extends AsyncTask { + Droid droid; + private final WeakReference> mDroidCardsReference; + + public DroidCardWorkerTask() { + mDroidCardsReference = new WeakReference>(mDroidCards); + } + + // Decode image in background. + @Override + protected Bitmap doInBackground(Droid... params) { + droid = params[0]; + // Scale the bitmap. + return getScaledBitmap( + makeBitmap(getResources(), droid.getAvatarId(), (int) mDroidImageWidth), + mDroidImageWidth + ); + } + + /** + * Creates a DroidCard using the retrieved bitmap and stores it in a DroidCards list. + */ + @Override + protected void onPostExecute(Bitmap bitmap) { + // Check that the list and bitmap are not null. + if (mDroidCardsReference != null && bitmap != null) { + // Create a new DroidCard. + mDroidCards.add(new DroidCard(droid, bitmap)); + } + } + } +} \ No newline at end of file diff --git a/Render/app/src/main/java/com/example/android/mobileperf/render/MainActivity.java b/Render/app/src/main/java/com/example/android/mobileperf/render/MainActivity.java new file mode 100644 index 0000000..f04d6bb --- /dev/null +++ b/Render/app/src/main/java/com/example/android/mobileperf/render/MainActivity.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.mobileperf.render; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +/** + * The main activity for the part of the course dealing with rendering performance. Works + * simply as a table of contents: surfaces buttons that launch the ChatumLatinum and DroidCards + * activities. + */ +public class MainActivity extends ActionBarActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + ViewGroup activityContainer = (ViewGroup) findViewById(R.id.activity_main_container); + + addButton(ChatumLatinumActivity.class, + getString(R.string.title_activity_chatum_latinum), activityContainer); + + addButton(DroidCardsActivity.class, + getString(R.string.title_activity_droid_cards), activityContainer); + + addButton(CompareLayoutsActivity.class, + getString(R.string.title_activity_compare_layouts), activityContainer); + } + + private void addButton(final Class destination, String description, ViewGroup parent) { + Button button = new Button(this); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent problemIntent = new Intent(MainActivity.this, destination); + startActivity(problemIntent); + } + }); + button.setText(description); + parent.addView(button); + } +} diff --git a/Render/app/src/main/res/drawable-hdpi/alex.png b/Render/app/src/main/res/drawable-hdpi/alex.png new file mode 100644 index 0000000..311facc Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/alex.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/chris.png b/Render/app/src/main/res/drawable-hdpi/chris.png new file mode 100644 index 0000000..6fdbd3a Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/chris.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/claire.png b/Render/app/src/main/res/drawable-hdpi/claire.png new file mode 100644 index 0000000..00d791e Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/claire.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/colt.png b/Render/app/src/main/res/drawable-hdpi/colt.png new file mode 100644 index 0000000..f100348 Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/colt.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/ic_launcher.png b/Render/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100755 index 0000000..6dfadfc Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/joanna.png b/Render/app/src/main/res/drawable-hdpi/joanna.png new file mode 100644 index 0000000..e5cc0fb Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/joanna.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/kathryn.png b/Render/app/src/main/res/drawable-hdpi/kathryn.png new file mode 100644 index 0000000..c1bd0f9 Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/kathryn.png differ diff --git a/Render/app/src/main/res/drawable-hdpi/shailen.png b/Render/app/src/main/res/drawable-hdpi/shailen.png new file mode 100644 index 0000000..059a5a2 Binary files /dev/null and b/Render/app/src/main/res/drawable-hdpi/shailen.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/alex.png b/Render/app/src/main/res/drawable-mdpi/alex.png new file mode 100644 index 0000000..fedc7c4 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/alex.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/chris.png b/Render/app/src/main/res/drawable-mdpi/chris.png new file mode 100644 index 0000000..827d672 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/chris.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/claire.png b/Render/app/src/main/res/drawable-mdpi/claire.png new file mode 100644 index 0000000..c255801 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/claire.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/colt.png b/Render/app/src/main/res/drawable-mdpi/colt.png new file mode 100644 index 0000000..f736c9f Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/colt.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/ic_launcher.png b/Render/app/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100755 index 0000000..c63a5c0 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/joanna.png b/Render/app/src/main/res/drawable-mdpi/joanna.png new file mode 100644 index 0000000..0081db7 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/joanna.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/kathryn.png b/Render/app/src/main/res/drawable-mdpi/kathryn.png new file mode 100644 index 0000000..a5e8a94 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/kathryn.png differ diff --git a/Render/app/src/main/res/drawable-mdpi/shailen.png b/Render/app/src/main/res/drawable-mdpi/shailen.png new file mode 100644 index 0000000..6d6d8f4 Binary files /dev/null and b/Render/app/src/main/res/drawable-mdpi/shailen.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/alex.png b/Render/app/src/main/res/drawable-xhdpi/alex.png new file mode 100644 index 0000000..7c63ed6 Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/alex.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/chris.png b/Render/app/src/main/res/drawable-xhdpi/chris.png new file mode 100644 index 0000000..9847833 Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/chris.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/claire.png b/Render/app/src/main/res/drawable-xhdpi/claire.png new file mode 100644 index 0000000..d49b4f4 Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/claire.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/colt.png b/Render/app/src/main/res/drawable-xhdpi/colt.png new file mode 100644 index 0000000..759e10d Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/colt.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/ic_launcher.png b/Render/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100755 index 0000000..cdba0f8 Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/joanna.png b/Render/app/src/main/res/drawable-xhdpi/joanna.png new file mode 100644 index 0000000..a5bd3be Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/joanna.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/kathryn.png b/Render/app/src/main/res/drawable-xhdpi/kathryn.png new file mode 100644 index 0000000..3c5f83a Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/kathryn.png differ diff --git a/Render/app/src/main/res/drawable-xhdpi/shailen.png b/Render/app/src/main/res/drawable-xhdpi/shailen.png new file mode 100644 index 0000000..87781fe Binary files /dev/null and b/Render/app/src/main/res/drawable-xhdpi/shailen.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/alex.png b/Render/app/src/main/res/drawable-xxhdpi/alex.png new file mode 100644 index 0000000..27a80da Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/alex.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/chris.png b/Render/app/src/main/res/drawable-xxhdpi/chris.png new file mode 100644 index 0000000..804f6ae Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/chris.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/claire.png b/Render/app/src/main/res/drawable-xxhdpi/claire.png new file mode 100644 index 0000000..7afb231 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/claire.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/colt.png b/Render/app/src/main/res/drawable-xxhdpi/colt.png new file mode 100644 index 0000000..46d3117 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/colt.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/Render/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100755 index 0000000..67a32a5 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/joanna.png b/Render/app/src/main/res/drawable-xxhdpi/joanna.png new file mode 100644 index 0000000..e181d30 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/joanna.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/kathryn.png b/Render/app/src/main/res/drawable-xxhdpi/kathryn.png new file mode 100644 index 0000000..98e37c7 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/kathryn.png differ diff --git a/Render/app/src/main/res/drawable-xxhdpi/shailen.png b/Render/app/src/main/res/drawable-xxhdpi/shailen.png new file mode 100644 index 0000000..42aae35 Binary files /dev/null and b/Render/app/src/main/res/drawable-xxhdpi/shailen.png differ diff --git a/Render/app/src/main/res/layout/activity_chatum_latinum.xml b/Render/app/src/main/res/layout/activity_chatum_latinum.xml new file mode 100644 index 0000000..b9e6411 --- /dev/null +++ b/Render/app/src/main/res/layout/activity_chatum_latinum.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/Render/app/src/main/res/layout/activity_compare_layouts.xml b/Render/app/src/main/res/layout/activity_compare_layouts.xml new file mode 100644 index 0000000..1fbca3c --- /dev/null +++ b/Render/app/src/main/res/layout/activity_compare_layouts.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Render/app/src/main/res/layout/activity_droid_cards.xml b/Render/app/src/main/res/layout/activity_droid_cards.xml new file mode 100644 index 0000000..acdec98 --- /dev/null +++ b/Render/app/src/main/res/layout/activity_droid_cards.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/Render/app/src/main/res/layout/activity_main.xml b/Render/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..414a456 --- /dev/null +++ b/Render/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/Render/app/src/main/res/layout/chat_item.xml b/Render/app/src/main/res/layout/chat_item.xml new file mode 100644 index 0000000..6694e47 --- /dev/null +++ b/Render/app/src/main/res/layout/chat_item.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/Render/app/src/main/res/layout/fragment_chats.xml b/Render/app/src/main/res/layout/fragment_chats.xml new file mode 100644 index 0000000..bfde14c --- /dev/null +++ b/Render/app/src/main/res/layout/fragment_chats.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/Render/app/src/main/res/menu/menu_compare_layouts.xml b/Render/app/src/main/res/menu/menu_compare_layouts.xml new file mode 100644 index 0000000..1a24e1a --- /dev/null +++ b/Render/app/src/main/res/menu/menu_compare_layouts.xml @@ -0,0 +1,7 @@ + + + diff --git a/Render/app/src/main/res/menu/menu_main.xml b/Render/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..b1cb908 --- /dev/null +++ b/Render/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,6 @@ + + + diff --git a/Render/app/src/main/res/values-w820dp/dimens.xml b/Render/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..63fc816 --- /dev/null +++ b/Render/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ + + + 64dp + diff --git a/Render/app/src/main/res/values/colors.xml b/Render/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..9b0a22f --- /dev/null +++ b/Render/app/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #ff012355 + + #ff3357aa + #ff40aa52 + #ffaa713b + #ffaa3699 + \ No newline at end of file diff --git a/Render/app/src/main/res/values/dimens.xml b/Render/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..709e77c --- /dev/null +++ b/Render/app/src/main/res/values/dimens.xml @@ -0,0 +1,16 @@ + + + 16dp + 16dp + + 30dp + + 6dp + 16dp + + 5dp + + 60dp + 10dp + 10dp + \ No newline at end of file diff --git a/Render/app/src/main/res/values/strings.xml b/Render/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..6fd7cc1 --- /dev/null +++ b/Render/app/src/main/res/values/strings.xml @@ -0,0 +1,18 @@ + + + Render performance + Settings + + Droid cards + Chatum Latinum + Chatum Latinum + Compare Layouts + + + Line 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + Line 2: Excepteur sint occaecat cupidatat non proident + + diff --git a/Render/app/src/main/res/values/styles.xml b/Render/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..94b9b25 --- /dev/null +++ b/Render/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/Render/build.gradle b/Render/build.gradle new file mode 100644 index 0000000..6356aab --- /dev/null +++ b/Render/build.gradle @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.0.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/Render/gradle.properties b/Render/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/Render/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/Render/gradle/wrapper/gradle-wrapper.jar b/Render/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..8c0fb64 Binary files /dev/null and b/Render/gradle/wrapper/gradle-wrapper.jar differ diff --git a/Render/gradle/wrapper/gradle-wrapper.properties b/Render/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0c71e76 --- /dev/null +++ b/Render/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 10 15:27:10 PDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip diff --git a/Render/gradlew b/Render/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/Render/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Render/gradlew.bat b/Render/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/Render/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Render/settings.gradle b/Render/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/Render/settings.gradle @@ -0,0 +1 @@ +include ':app'