diff --git a/PhotoMessage/.classpath b/PhotoMessage/.classpath deleted file mode 100644 index 7bc01d9..0000000 --- a/PhotoMessage/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/PhotoMessage/.gitignore b/PhotoMessage/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/PhotoMessage/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/PhotoMessage/.idea/.name b/PhotoMessage/.idea/.name new file mode 100644 index 0000000..16832ff --- /dev/null +++ b/PhotoMessage/.idea/.name @@ -0,0 +1 @@ +PhotoMessage \ No newline at end of file diff --git a/PhotoMessage/.idea/compiler.xml b/PhotoMessage/.idea/compiler.xml new file mode 100644 index 0000000..9a8b7e5 --- /dev/null +++ b/PhotoMessage/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/copyright/profiles_settings.xml b/PhotoMessage/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/PhotoMessage/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/encodings.xml b/PhotoMessage/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/PhotoMessage/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/gradle.xml b/PhotoMessage/.idea/gradle.xml new file mode 100644 index 0000000..d390b65 --- /dev/null +++ b/PhotoMessage/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/misc.xml b/PhotoMessage/.idea/misc.xml new file mode 100644 index 0000000..dae7a60 --- /dev/null +++ b/PhotoMessage/.idea/misc.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7 + + + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/modules.xml b/PhotoMessage/.idea/modules.xml new file mode 100644 index 0000000..e33e357 --- /dev/null +++ b/PhotoMessage/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/runConfigurations.xml b/PhotoMessage/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/PhotoMessage/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.idea/vcs.xml b/PhotoMessage/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/PhotoMessage/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PhotoMessage/.project b/PhotoMessage/.project deleted file mode 100644 index c07f811..0000000 --- a/PhotoMessage/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - PhotoMessage - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/PhotoMessage/.settings/org.eclipse.jdt.core.prefs b/PhotoMessage/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b080d2d..0000000 --- a/PhotoMessage/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/PhotoMessage/app/.gitignore b/PhotoMessage/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/PhotoMessage/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/PhotoMessage/app/build.gradle b/PhotoMessage/app/build.gradle new file mode 100644 index 0000000..b8ce0a1 --- /dev/null +++ b/PhotoMessage/app/build.gradle @@ -0,0 +1,28 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + defaultConfig { + applicationId "edu.rosehulman.photomessage" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:design:23.1.1' + compile 'com.github.clans:fab:1.6.2' +} diff --git a/PhotoMessage/proguard-project.txt b/PhotoMessage/app/proguard-rules.pro similarity index 62% rename from PhotoMessage/proguard-project.txt rename to PhotoMessage/app/proguard-rules.pro index f2fe155..3041cc7 100644 --- a/PhotoMessage/proguard-project.txt +++ b/PhotoMessage/app/proguard-rules.pro @@ -1,11 +1,8 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. +# in C:\Users\boutell\AppData\Local\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 diff --git a/PhotoMessage/app/src/androidTest/java/edu/rosehulman/photomessage/ApplicationTest.java b/PhotoMessage/app/src/androidTest/java/edu/rosehulman/photomessage/ApplicationTest.java new file mode 100644 index 0000000..557fac0 --- /dev/null +++ b/PhotoMessage/app/src/androidTest/java/edu/rosehulman/photomessage/ApplicationTest.java @@ -0,0 +1,13 @@ +package edu.rosehulman.photomessage; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/PhotoMessage/AndroidManifest.xml b/PhotoMessage/app/src/main/AndroidManifest.xml similarity index 53% rename from PhotoMessage/AndroidManifest.xml rename to PhotoMessage/app/src/main/AndroidManifest.xml index 393fa0c..f636a11 100644 --- a/PhotoMessage/AndroidManifest.xml +++ b/PhotoMessage/app/src/main/AndroidManifest.xml @@ -1,21 +1,19 @@ + package="edu.rosehulman.photomessage"> - + + android:supportsRtl="true" + android:theme="@style/AppTheme"> + android:name=".MainActivity" + android:label="@string/app_name" + android:theme="@style/AppTheme.NoActionBar"> @@ -23,10 +21,9 @@ - - \ No newline at end of file + diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/AddMessageDialogFragment.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/AddMessageDialogFragment.java similarity index 96% rename from PhotoMessage/src/edu/rosehulman/photomessage/AddMessageDialogFragment.java rename to PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/AddMessageDialogFragment.java index f301d3e..8f9a936 100644 --- a/PhotoMessage/src/edu/rosehulman/photomessage/AddMessageDialogFragment.java +++ b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/AddMessageDialogFragment.java @@ -4,10 +4,10 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; -import android.app.DialogFragment; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; +import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java similarity index 71% rename from PhotoMessage/src/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java rename to PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java index 80cf467..f360523 100644 --- a/PhotoMessage/src/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java +++ b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/DisplayLabeledPhotoActivity.java @@ -3,11 +3,14 @@ import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; import android.widget.TextView; +import java.io.FileNotFoundException; + public class DisplayLabeledPhotoActivity extends Activity { @Override @@ -19,7 +22,15 @@ protected void onCreate(Bundle savedInstanceState) { Log.d(MainActivity.LOG, "Photo message received: " + photoMessage); ImageView imageView = (ImageView) findViewById(R.id.labeled_image_view); - Bitmap bitmap = BitmapFactory.decodeFile(photoMessage.getPhotoPath()); + + Bitmap bitmap = null; + try { + Uri uri = Uri.parse(photoMessage.getPath()); + bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); + } catch (FileNotFoundException e) { + Log.e(MainActivity.LOG, "Error: " + e); + } + // Bitmap bitmap = BitmapFactory.decodeFile(photoMessage.getUri()); imageView.setImageBitmap(bitmap); TextView messageTextView = (TextView) findViewById(R.id.labeled_text_view); diff --git a/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/MainActivity.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/MainActivity.java new file mode 100644 index 0000000..c39aa10 --- /dev/null +++ b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/MainActivity.java @@ -0,0 +1,261 @@ +package edu.rosehulman.photomessage; + +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.CursorLoader; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.github.clans.fab.FloatingActionButton; + +public class MainActivity extends AppCompatActivity { + + static final String LOG = "LOG"; + static final String KEY_MESSAGE = "KEY_MESSAGE"; + static final String KEY_IMAGE_FILENAME = "KEY_IMAGE_FILENAME"; + static final String KEY_PHOTO_MESSAGE = "KEY_PHOTO_MESSAGE"; + static final String KEY_SOON_NOTIFICATION_ID = "KEY_SOON_NOTIFICATION_ID"; + static final String KEY_NOTIFICATION = "KEY_NOTIFICATION"; + private static final int RC_PHOTO_ACTIVITY = 1; + private static final int PICK_FROM_GALLERY_REQUEST = 2; + private static PhotoMessage mPhotoMessage = null; + private boolean mCanSavePhoto = false; + private Bitmap mBitmap; + private GestureDetector mGestureDetector; + private TextView mMessageTextView = null; + private ImageView mImageView; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + addFabListeners(); + + // Set initial image + mImageView = (ImageView) findViewById(R.id.image_view); + mBitmap = BitmapFactory.decodeResource(getResources(), + R.mipmap.ic_launcher); + mBitmap = Bitmap.createScaledBitmap(mBitmap, 2048, 2048, true); + mImageView.setImageBitmap(mBitmap); + mCanSavePhoto = true; + + + mPhotoMessage = new PhotoMessage(); + mGestureDetector = new GestureDetector(this, + new MessageGestureListener()); + Log.d(LOG, "onCreate() completed"); + + } + + private void addFabListeners() { + FloatingActionButton fabCamera = (FloatingActionButton) findViewById(R.id.fab_camera); + fabCamera.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + takePhoto(); + } + }); + + FloatingActionButton fabGallery = (FloatingActionButton) findViewById(R.id.fab_gallery); + fabGallery.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + loadFromGallery(); + } + }); + + FloatingActionButton fabText = (FloatingActionButton) findViewById(R.id.fab_text); + fabText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + addMessage(); + } + }); + + FloatingActionButton fabNotifyNow = (FloatingActionButton) findViewById(R.id.fab_notify_now); + fabNotifyNow.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + notifyNow(); + } + }); + + FloatingActionButton fabNotifyLater = (FloatingActionButton) findViewById(R.id.fab_notify_later); + fabNotifyLater.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + notifyLater(); + } + }); + + FloatingActionButton fabSavePhoto = (FloatingActionButton) findViewById(R.id.fab_save_photo); + fabSavePhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + savePhoto(); + } + }); + } + + + @Override + public boolean onTouchEvent(MotionEvent event) { + mGestureDetector.onTouchEvent(event); + return super.onTouchEvent(event); + } + + private void takePhoto() { + Log.d(LOG, "takePhoto() started"); + // TODO: Launch an activity using the camera intent + } + + private void loadFromGallery() { + Log.d(LOG, "loadFromGallery() started"); + // TODO: Launch the gallery to pick a photo from it. + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode != RESULT_OK) { + return; + } + + if (requestCode == RC_PHOTO_ACTIVITY) { + Log.d(LOG, "back from taking a photo"); + // TODO: Get and show the bitmap + + } + + if (requestCode == MainActivity.PICK_FROM_GALLERY_REQUEST) { + Log.d(LOG, "Back from the gallery"); + // TODO: Get and show the bitmap + + } + + } + + private void addMessage() { + Log.d(LOG, "addMessage() started"); + DialogFragment df = new AddMessageDialogFragment(); + df.show(getSupportFragmentManager(), "add message"); + } + + public void setMessage(String message) { + Log.d(LOG, "Got message " + message); + mPhotoMessage.setMessage(message); + if (mMessageTextView == null) { + mMessageTextView = new TextView(this); + mMessageTextView.setTextSize(32); + RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_main_relative_layout); + layout.addView(mMessageTextView); + } + mMessageTextView.setText(message); + } + + private void notifyNow() { + Log.d(LOG, "notifyNow() started"); + if (mPhotoMessage != null && mPhotoMessage.getPath() != null) { + Intent displayIntent = new Intent(this, + DisplayLabeledPhotoActivity.class); + displayIntent.putExtra(KEY_PHOTO_MESSAGE, mPhotoMessage); + Log.d(MainActivity.LOG, "Photo message to send: " + mPhotoMessage); + + // TODO: Replace this with a notification. + startActivity(displayIntent); + } + } + + private void notifyLater() { + Log.d(LOG, "showLater() started"); + DialogFragment df = new SetAlarmDialogFragment(); + df.show(getSupportFragmentManager(), "set alarm"); + } + + public void setSoonAlarm() { + Intent displayIntent = new Intent(this, + DisplayLabeledPhotoActivity.class); + displayIntent.putExtra(KEY_PHOTO_MESSAGE, mPhotoMessage); + Log.d(MainActivity.LOG, "Photo message to send: " + mPhotoMessage); + + // TODO: Replace this with a notification that launches via a timer. + startActivity(displayIntent); + } + + public void setFixedAlarm(int hour, int minute) { + // Pleaceholder if you wanted to try this out (totally optional) + } + + private void savePhoto() { + if (mCanSavePhoto) { + SavePhotoTask task = new SavePhotoTask(this); + task.execute(mBitmap); + mCanSavePhoto = false; + } else { + Log.d(LOG, "Can't save this photo now."); + } + } + + // From + // http://android-er.blogspot.com/2013/08/convert-between-uri-and-file-path-and.html + private String getRealPathFromUri(Uri contentUri) { + String[] projection = {MediaStore.Images.Media.DATA}; + CursorLoader cursorLoader = new CursorLoader(this, contentUri, + projection, null, null, null); + Cursor cursor = cursorLoader.loadInBackground(); + cursor.moveToFirst(); + int columnIndex = cursor + .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + return cursor.getString(columnIndex); + } + + class MessageGestureListener extends + GestureDetector.SimpleOnGestureListener { + + private boolean moveMessage = false; + + @Override + public boolean onDown(MotionEvent e) { + moveMessage = inMessageBounds(e); + return true; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + if (moveMessage) { + float x = e2.getX(); + float y = e2.getY(); + mPhotoMessage.setLeft(x); + mPhotoMessage.setTop(y); + mMessageTextView.setX(x); + mMessageTextView.setY(y); + } + return true; + } + + private boolean inMessageBounds(MotionEvent e) { + return true; + // CONSIDER: Determine if I'm actually in the bounds of the message. + } + } + + +} diff --git a/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/PhotoMessage.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/PhotoMessage.java new file mode 100644 index 0000000..5cfe2de --- /dev/null +++ b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/PhotoMessage.java @@ -0,0 +1,90 @@ +package edu.rosehulman.photomessage; + +import android.annotation.SuppressLint; +import android.os.Parcel; +import android.os.Parcelable; + +public class PhotoMessage implements Parcelable { + + private String message; + private String path; + private float left; + private float top; + + protected PhotoMessage(Parcel in) { + message = in.readString(); + path = in.readString(); + left = in.readFloat(); + top = in.readFloat(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public PhotoMessage createFromParcel(Parcel in) { + return new PhotoMessage(in); + } + + @Override + public PhotoMessage[] newArray(int size) { + return new PhotoMessage[size]; + } + }; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public float getLeft() { + return left; + } + + public void setLeft(float left) { + this.left = left; + } + + public float getTop() { + return top; + } + + public void setTop(float top) { + this.top = top; + } + + public PhotoMessage() { + // empty + } + + + @SuppressLint("DefaultLocale") + @Override + public String toString() { + return String.format( + "Photomessage: message=[%s], photo=[%s], location=(%.1f,%.1f)", + message, path, left, top); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(message); + dest.writeString(path); + dest.writeFloat(left); + dest.writeFloat(top); + } +} diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/PhotoUtils.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/PhotoUtils.java similarity index 100% rename from PhotoMessage/src/edu/rosehulman/photomessage/PhotoUtils.java rename to PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/PhotoUtils.java diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/SavePhotoTask.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/SavePhotoTask.java similarity index 100% rename from PhotoMessage/src/edu/rosehulman/photomessage/SavePhotoTask.java rename to PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/SavePhotoTask.java diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/SetAlarmDialogFragment.java b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/SetAlarmDialogFragment.java similarity index 92% rename from PhotoMessage/src/edu/rosehulman/photomessage/SetAlarmDialogFragment.java rename to PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/SetAlarmDialogFragment.java index a110daa..6ad0dc9 100644 --- a/PhotoMessage/src/edu/rosehulman/photomessage/SetAlarmDialogFragment.java +++ b/PhotoMessage/app/src/main/java/edu/rosehulman/photomessage/SetAlarmDialogFragment.java @@ -4,7 +4,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; -import android.app.DialogFragment; +import android.support.v4.app.DialogFragment; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; @@ -41,7 +41,7 @@ public void onClick(View v) { } }); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + builder.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int hour = picker.getCurrentHour(); diff --git a/PhotoMessage/app/src/main/res/drawable/ic_add.png b/PhotoMessage/app/src/main/res/drawable/ic_add.png new file mode 100644 index 0000000..d0305f0 Binary files /dev/null and b/PhotoMessage/app/src/main/res/drawable/ic_add.png differ diff --git a/PhotoMessage/res/layout/activity_display_labeled_photo.xml b/PhotoMessage/app/src/main/res/layout/activity_display_labeled_photo.xml similarity index 100% rename from PhotoMessage/res/layout/activity_display_labeled_photo.xml rename to PhotoMessage/app/src/main/res/layout/activity_display_labeled_photo.xml diff --git a/PhotoMessage/app/src/main/res/layout/activity_main.xml b/PhotoMessage/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..32323e5 --- /dev/null +++ b/PhotoMessage/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PhotoMessage/app/src/main/res/layout/content_main.xml b/PhotoMessage/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..bb68297 --- /dev/null +++ b/PhotoMessage/app/src/main/res/layout/content_main.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/PhotoMessage/res/layout/dialog_add_message.xml b/PhotoMessage/app/src/main/res/layout/dialog_add_message.xml similarity index 100% rename from PhotoMessage/res/layout/dialog_add_message.xml rename to PhotoMessage/app/src/main/res/layout/dialog_add_message.xml diff --git a/PhotoMessage/res/layout/dialog_set_time.xml b/PhotoMessage/app/src/main/res/layout/dialog_set_time.xml similarity index 100% rename from PhotoMessage/res/layout/dialog_set_time.xml rename to PhotoMessage/app/src/main/res/layout/dialog_set_time.xml diff --git a/PhotoMessage/app/src/main/res/menu/menu_main.xml b/PhotoMessage/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..51b1aee --- /dev/null +++ b/PhotoMessage/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,10 @@ + + + diff --git a/PhotoMessage/app/src/main/res/mipmap-hdpi/ic_launcher.png b/PhotoMessage/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..cde69bc Binary files /dev/null and b/PhotoMessage/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/PhotoMessage/app/src/main/res/mipmap-mdpi/ic_launcher.png b/PhotoMessage/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c133a0c Binary files /dev/null and b/PhotoMessage/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/PhotoMessage/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/PhotoMessage/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..bfa42f0 Binary files /dev/null and b/PhotoMessage/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/PhotoMessage/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/PhotoMessage/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..324e72c Binary files /dev/null and b/PhotoMessage/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/PhotoMessage/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/PhotoMessage/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..aee44e1 Binary files /dev/null and b/PhotoMessage/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/PhotoMessage/app/src/main/res/values-v21/styles.xml b/PhotoMessage/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..251fb9f --- /dev/null +++ b/PhotoMessage/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,9 @@ +> + + + diff --git a/PhotoMessage/res/values-w820dp/dimens.xml b/PhotoMessage/app/src/main/res/values-w820dp/dimens.xml similarity index 70% rename from PhotoMessage/res/values-w820dp/dimens.xml rename to PhotoMessage/app/src/main/res/values-w820dp/dimens.xml index f3e7020..63fc816 100644 --- a/PhotoMessage/res/values-w820dp/dimens.xml +++ b/PhotoMessage/app/src/main/res/values-w820dp/dimens.xml @@ -1,10 +1,6 @@ - - + would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp - diff --git a/PhotoMessage/app/src/main/res/values/colors.xml b/PhotoMessage/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..3ab3e9c --- /dev/null +++ b/PhotoMessage/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/PhotoMessage/res/values/dimens.xml b/PhotoMessage/app/src/main/res/values/dimens.xml similarity index 83% rename from PhotoMessage/res/values/dimens.xml rename to PhotoMessage/app/src/main/res/values/dimens.xml index 55c1e59..812cb7b 100644 --- a/PhotoMessage/res/values/dimens.xml +++ b/PhotoMessage/app/src/main/res/values/dimens.xml @@ -1,7 +1,6 @@ - 16dp 16dp - + 16dp diff --git a/PhotoMessage/res/values/strings.xml b/PhotoMessage/app/src/main/res/values/strings.xml similarity index 95% rename from PhotoMessage/res/values/strings.xml rename to PhotoMessage/app/src/main/res/values/strings.xml index 75f694a..0b4970c 100644 --- a/PhotoMessage/res/values/strings.xml +++ b/PhotoMessage/app/src/main/res/values/strings.xml @@ -1,6 +1,4 @@ - - PhotoMessage Hello world! Settings @@ -15,4 +13,5 @@ Set alarm to go off soon Or + diff --git a/PhotoMessage/app/src/main/res/values/styles.xml b/PhotoMessage/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..545b9c6 --- /dev/null +++ b/PhotoMessage/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + - - diff --git a/PhotoMessage/res/values-v14/styles.xml b/PhotoMessage/res/values-v14/styles.xml deleted file mode 100644 index a91fd03..0000000 --- a/PhotoMessage/res/values-v14/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/PhotoMessage/res/values/styles.xml b/PhotoMessage/res/values/styles.xml deleted file mode 100644 index 6ce89c7..0000000 --- a/PhotoMessage/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/PhotoMessage/settings.gradle b/PhotoMessage/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/PhotoMessage/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/MainActivity.java b/PhotoMessage/src/edu/rosehulman/photomessage/MainActivity.java deleted file mode 100644 index 57e08b1..0000000 --- a/PhotoMessage/src/edu/rosehulman/photomessage/MainActivity.java +++ /dev/null @@ -1,251 +0,0 @@ -package edu.rosehulman.photomessage; - -import android.app.Activity; -import android.app.AlarmManager; -import android.app.DialogFragment; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.CursorLoader; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.os.Bundle; -import android.os.SystemClock; -import android.provider.MediaStore; -import android.util.Log; -import android.view.GestureDetector; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -public class MainActivity extends Activity implements OnClickListener { - - private static final int TAKE_PHOTO_ACTIVITY_REQUEST = 1; - private static final int PICK_FROM_GALLERY_REQUEST = 2; - static final String LOG = "LOG"; - static final String KEY_MESSAGE = "KEY_MESSAGE"; - static final String KEY_IMAGE_FILENAME = "KEY_IMAGE_FILENAME"; - static final String KEY_PHOTO_MESSAGE = "KEY_PHOTO_MESSAGE"; - static final String KEY_SOON_NOTIFICATION_ID = "KEY_SOON_NOTIFICATION_ID"; - static final String KEY_NOTIFICATION = "KEY_NOTIFICATION"; - - private static PhotoMessage mPhotoMessage = null; - private boolean mCanSavePhoto = false; - private Bitmap mBitmap; - private GestureDetector mGestureDetector; - private TextView mMessageTextView = null; - private ImageView mImageView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - findViewById(R.id.photo_button).setOnClickListener(this); - findViewById(R.id.gallery_button).setOnClickListener(this); - mImageView = (ImageView) findViewById(R.id.image_view); - - // Set the initial image to be the launcher icon (feel free to add your - // own drawable) - mBitmap = BitmapFactory.decodeResource(getResources(), - R.drawable.ic_launcher); - mImageView.setImageBitmap(mBitmap); - mCanSavePhoto = true; - - mPhotoMessage = new PhotoMessage(); - mGestureDetector = new GestureDetector(this, - new MessageGestureListener()); - Log.d(LOG, "onCreate() completed"); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - mGestureDetector.onTouchEvent(event); - return super.onTouchEvent(event); - } - - class MessageGestureListener extends - GestureDetector.SimpleOnGestureListener { - - private boolean moveMessage = false; - - @Override - public boolean onDown(MotionEvent e) { - moveMessage = inMessageBounds(e); - return true; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - if (moveMessage && mMessageTextView != null) { - float x = e2.getX(); - float y = e2.getY(); - mPhotoMessage.setLeft(x); - mPhotoMessage.setTop(y); - mMessageTextView.setX(x); - mMessageTextView.setY(y); - } - return true; - } - - private boolean inMessageBounds(MotionEvent e) { - return true; - // CONSIDER: Determine if I'm actually in the bounds of the message. - } - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.photo_button: - takePhoto(); - return; - case R.id.gallery_button: - loadFromGallery(); - return; - } - } - - private void takePhoto() { - Log.d(LOG, "takePhoto() started"); - // TODO: Launch an activity using the camera intent - - } - - private void loadFromGallery() { - Log.d(LOG, "loadFromGallery() started"); - // TODO: Launch the gallery to pick a photo from it. - - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode != RESULT_OK) { - return; - } - - if (requestCode == TAKE_PHOTO_ACTIVITY_REQUEST) { - Log.d(LOG, "back from taking a photo"); - // TODO: Get and show the bitmap - - } - - if (requestCode == MainActivity.PICK_FROM_GALLERY_REQUEST) { - Log.d(LOG, "Back from the gallery"); - // TODO: Get and show the bitmap - - } - - } - - // From - // http://android-er.blogspot.com/2013/08/convert-between-uri-and-file-path-and.html - private String getRealPathFromUri(Uri contentUri) { - String[] projection = { MediaStore.Images.Media.DATA }; - CursorLoader cursorLoader = new CursorLoader(this, contentUri, - projection, null, null, null); - Cursor cursor = cursorLoader.loadInBackground(); - cursor.moveToFirst(); - int columnIndex = cursor - .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); - return cursor.getString(columnIndex); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - switch (item.getItemId()) { - case R.id.action_add_message: - addMessage(); - return true; - case R.id.action_notify_now: - notifyNow(); - return true; - case R.id.action_show_later: - notifyLater(); - return true; - case R.id.action_save_photo: - savePhoto(); - return true; - } - return super.onOptionsItemSelected(item); - } - - private void addMessage() { - Log.d(LOG, "addMessage() started"); - DialogFragment df = new AddMessageDialogFragment(); - df.show(getFragmentManager(), "add message"); - } - - public void setMessage(String message) { - Log.d(LOG, "Got message " + message); - mPhotoMessage.setMessage(message); - if (mMessageTextView == null) { - mMessageTextView = new TextView(this); - mMessageTextView.setTextSize(32); - RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_main_relative_layout); - layout.addView(mMessageTextView); - } - mMessageTextView.setText(message); - } - - private void notifyNow() { - Log.d(LOG, "notifyNow() started"); - Intent displayIntent = new Intent(this, - DisplayLabeledPhotoActivity.class); - displayIntent.putExtra(KEY_PHOTO_MESSAGE, mPhotoMessage); - Log.d(MainActivity.LOG, "Photo message to send: " + mPhotoMessage); - - // TODO: Replace this with a notification. - startActivity(displayIntent); - } - - private void notifyLater() { - Log.d(LOG, "showLater() started"); - DialogFragment df = new SetAlarmDialogFragment(); - df.show(getFragmentManager(), "set alarm"); - } - - public void setSoonAlarm() { - Intent displayIntent = new Intent(this, - DisplayLabeledPhotoActivity.class); - displayIntent.putExtra(KEY_PHOTO_MESSAGE, mPhotoMessage); - Log.d(MainActivity.LOG, "Photo message to send: " + mPhotoMessage); - - // TODO: Replace this with a notification that launches via a timer. - startActivity(displayIntent); - } - - public void setFixedAlarm(int hour, int minute) { - // Pleaceholder if you wanted to try this out (totally optional) - } - - private void savePhoto() { - if (mCanSavePhoto) { - SavePhotoTask task = new SavePhotoTask(this); - task.execute(mBitmap); - mCanSavePhoto = false; - } else { - Log.d(LOG, "Can't save this photo now."); - } - } - -} diff --git a/PhotoMessage/src/edu/rosehulman/photomessage/PhotoMessage.java b/PhotoMessage/src/edu/rosehulman/photomessage/PhotoMessage.java deleted file mode 100644 index cd50866..0000000 --- a/PhotoMessage/src/edu/rosehulman/photomessage/PhotoMessage.java +++ /dev/null @@ -1,88 +0,0 @@ -package edu.rosehulman.photomessage; - -import android.annotation.SuppressLint; -import android.os.Parcel; -import android.os.Parcelable; - -public class PhotoMessage implements Parcelable { - - private String mMessage; - private String mPhotoPath; - private float mLeft; - private float mTop; - - @Override - public int describeContents() { - return 0; - } - - public PhotoMessage() { - // empty - } - - public PhotoMessage(Parcel src) { - - mMessage = src.readString(); - mPhotoPath = src.readString(); - mLeft = src.readFloat(); - mTop = src.readFloat(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mMessage); - dest.writeString(mPhotoPath); - dest.writeFloat(mLeft); - dest.writeFloat(mTop); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public PhotoMessage createFromParcel(Parcel in) { - return new PhotoMessage(in); - } - - public PhotoMessage[] newArray(int size) { - return new PhotoMessage[size]; - } - }; - - public String getMessage() { - return mMessage; - } - - public void setMessage(String mMessage) { - this.mMessage = mMessage; - } - - public String getPhotoPath() { - return mPhotoPath; - } - - public void setPhotoPath(String mPhotoPath) { - this.mPhotoPath = mPhotoPath; - } - - public float getTop() { - return mTop; - } - - public void setTop(float mTop) { - this.mTop = mTop; - } - - public float getLeft() { - return mLeft; - } - - public void setLeft(float mLeft) { - this.mLeft = mLeft; - } - - @SuppressLint("DefaultLocale") - @Override - public String toString() { - return String.format( - "Photomessage: message=[%s], photo=[%s], location=(%.1f,%.1f)", - mMessage, mPhotoPath, mLeft, mTop); - } -}