diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 560ef041d..2ba93bc8b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -324,6 +324,10 @@
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
+
+
diff --git a/res/layout/conversation_activity.xml b/res/layout/conversation_activity.xml
index 7a92c24e2..3b27beb4e 100644
--- a/res/layout/conversation_activity.xml
+++ b/res/layout/conversation_activity.xml
@@ -1,98 +1,105 @@
-
-
-
-
+
+ android:scaleType="centerCrop"/>
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
-
+
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/conversation_fragment.xml b/res/layout/conversation_fragment.xml
index 20a00c691..0cd82029a 100644
--- a/res/layout/conversation_fragment.xml
+++ b/res/layout/conversation_fragment.xml
@@ -2,7 +2,7 @@
diff --git a/res/layout/conversation_input_panel.xml b/res/layout/conversation_input_panel.xml
index ea34d9620..46e0e8143 100644
--- a/res/layout/conversation_input_panel.xml
+++ b/res/layout/conversation_input_panel.xml
@@ -14,7 +14,8 @@
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:clipChildren="false"
- android:clipToPadding="false">
+ android:clipToPadding="false"
+ android:background="@color/white">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java
index c8db55907..4482ac569 100644
--- a/src/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/org/thoughtcrime/securesms/ConversationActivity.java
@@ -27,6 +27,7 @@ import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@@ -57,6 +58,7 @@ import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.ImageButton;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -227,6 +229,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
protected HidingLinearLayout quickAttachmentToggle;
private QuickAttachmentDrawer quickAttachmentDrawer;
private InputPanel inputPanel;
+ private ImageView imageView;
private Recipient recipient;
private ApplicationDcContext dcContext;
@@ -997,6 +1000,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
quickAttachmentDrawer = ViewUtil.findById(this, R.id.quick_attachment_drawer);
quickAttachmentToggle = ViewUtil.findById(this, R.id.quick_attachment_toggle);
inputPanel = ViewUtil.findById(this, R.id.bottom_panel);
+ imageView = ViewUtil.findById(this, R.id.background_imageview);
ImageButton quickCameraToggle = ViewUtil.findById(this, R.id.quick_camera_toggle);
@@ -1042,6 +1046,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
quickCameraToggle.setVisibility(View.GONE);
quickCameraToggle.setEnabled(false);
}
+
+ String backgroundImagePath = TextSecurePreferences.getBackgroundImagePath(this);
+ Drawable image = Drawable.createFromPath(backgroundImagePath);
+ imageView.setImageDrawable(image);
}
protected void initializeActionBar() {
diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java
index fea95676a..7b1e20b1d 100644
--- a/src/org/thoughtcrime/securesms/ConversationFragment.java
+++ b/src/org/thoughtcrime/securesms/ConversationFragment.java
@@ -21,7 +21,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Build;
@@ -41,10 +40,8 @@ import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.text.ClipboardManager;
import android.text.Editable;
-import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
-import android.view.Display;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -55,25 +52,22 @@ import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.EditText;
-import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
-import android.widget.ViewSwitcher;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEventCenter;
import com.b44t.messenger.DcMsg;
-import com.bumptech.glide.request.RequestOptions;
import org.thoughtcrime.securesms.ConversationAdapter.HeaderViewHolder;
import org.thoughtcrime.securesms.ConversationAdapter.ItemClickListener;
import org.thoughtcrime.securesms.connect.ApplicationDcContext;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DcMsgListLoader;
+import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.contactshare.ContactUtil;
import org.thoughtcrime.securesms.contactshare.SharedContactDetailsActivity;
-import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
@@ -82,12 +76,10 @@ import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
import org.thoughtcrime.securesms.util.CommunicationActions;
-import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.ViewUtil;
-import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
@@ -124,7 +116,6 @@ public class ConversationFragment extends Fragment
private RecyclerView.ItemDecoration lastSeenDecoration;
private View scrollToBottomButton;
private TextView scrollDateHeader;
- private FrameLayout frameLayout;
private ApplicationDcContext dcContext;
@@ -148,7 +139,6 @@ public class ConversationFragment extends Fragment
list = ViewUtil.findById(view, android.R.id.list);
scrollToBottomButton = ViewUtil.findById(view, R.id.scroll_to_bottom_button);
scrollDateHeader = ViewUtil.findById(view, R.id.scroll_date_header);
- frameLayout = ViewUtil.findById(view, R.id.conversation_container);
scrollToBottomButton.setOnClickListener(v -> scrollToBottom());
@@ -163,10 +153,6 @@ public class ConversationFragment extends Fragment
{
list.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
-
- String backgroundImagePath = TextSecurePreferences.getBackgroundImagePath(getContext());
- Drawable image = Drawable.createFromPath(backgroundImagePath);
- frameLayout.setBackground(image);
return view;
}
diff --git a/src/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
index 63e98264d..ac7b0cb1a 100644
--- a/src/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
+++ b/src/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
@@ -1,31 +1,20 @@
package org.thoughtcrime.securesms.preferences;
-import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Matrix;
import android.graphics.Point;
-import android.graphics.drawable.Drawable;
-import android.media.ExifInterface;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
-import android.provider.MediaStore;
-import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
-import android.util.Log;
import android.view.Display;
-import android.view.WindowManager;
import android.widget.Toast;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy;
-import com.bumptech.glide.request.target.SimpleTarget;
-import com.bumptech.glide.request.transition.Transition;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.R;
@@ -33,15 +22,9 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.channels.FileChannel;
import java.util.Arrays;
-import java.util.Objects;
import java.util.concurrent.ExecutionException;
import static android.app.Activity.RESULT_OK;
@@ -82,51 +65,6 @@ public class AppearancePreferenceFragment extends ListSummaryPreferenceFragment
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener((ApplicationPreferencesActivity) getActivity());
}
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (data != null && getContext() != null && resultCode == RESULT_OK && requestCode == ApplicationPreferencesActivity.REQUEST_CODE_SET_BACKGROUND) {
- Uri imageUri = data.getData();
- if (imageUri != null) {
- Thread thread = new Thread(){
- @Override
- public void run() {
- try {
- Display display = ServiceUtil.getWindowManager(getContext()).getDefaultDisplay();
- Point size = new Point();
- display.getSize(size);
- Bitmap scaledBitmap = GlideApp.with(getContext())
- .asBitmap()
- .load(imageUri)
- .centerCrop()
- .skipMemoryCache(true)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .submit(size.x, size.y)
- .get();
- String destination = getContext().getFilesDir().getAbsolutePath() + "background";
- FileOutputStream outStream = new FileOutputStream(destination);
- scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 85, outStream);
- } catch (InterruptedException e) {
- e.printStackTrace();
- showBackgroundSaveError();
- } catch (ExecutionException e) {
- e.printStackTrace();
- showBackgroundSaveError();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- showBackgroundSaveError();
- }
- }
- };
- thread.start();
- }
- }
-
- }
-
- private void showBackgroundSaveError() {
- Toast.makeText(getActivity(), R.string.AppearancePreferencesFragment_background_save_error, Toast.LENGTH_LONG).show();
- }
-
public static CharSequence getSummary(Context context) {
String[] languageEntries = context.getResources().getStringArray(R.array.language_entries);
String[] languageEntryValues = context.getResources().getStringArray(R.array.language_values);
@@ -147,11 +85,8 @@ public class AppearancePreferenceFragment extends ListSummaryPreferenceFragment
private class BackgroundClickListener implements Preference.OnPreferenceClickListener {
@Override
public boolean onPreferenceClick(Preference preference) {
- Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
- intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setType("image/*");
- getActivity().startActivityForResult(intent, ApplicationPreferencesActivity.REQUEST_CODE_SET_BACKGROUND);
-
+ Intent intent = new Intent(getContext(), ChatBackgroundDialogFragment.class);
+ getActivity().startActivity(intent);
return true;
}
}
diff --git a/src/org/thoughtcrime/securesms/preferences/ChatBackgroundDialogFragment.java b/src/org/thoughtcrime/securesms/preferences/ChatBackgroundDialogFragment.java
new file mode 100644
index 000000000..e9a12fc5c
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/preferences/ChatBackgroundDialogFragment.java
@@ -0,0 +1,196 @@
+package org.thoughtcrime.securesms.preferences;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+
+import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
+import org.thoughtcrime.securesms.BaseActionBarActivity;
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.mms.GlideApp;
+import org.thoughtcrime.securesms.util.ServiceUtil;
+import org.thoughtcrime.securesms.util.TextSecurePreferences;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.concurrent.ExecutionException;
+
+public class ChatBackgroundDialogFragment extends BaseActionBarActivity {
+
+ Button galleryButton;
+ Button defaultButton;
+ FrameLayout layoutContainer;
+ MenuItem acceptMenuItem;
+
+ String tempDestinationPath;
+ Uri imageUri;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.select_chat_background_dialog);
+
+ defaultButton = findViewById(R.id.set_default_button);
+ galleryButton = findViewById(R.id.from_gallery_button);
+ layoutContainer = findViewById(R.id.layout_container);
+
+ defaultButton.setOnClickListener(new DefaultClickListener());
+ galleryButton.setOnClickListener(new GalleryClickListener());
+
+ String backgroundImagePath = TextSecurePreferences.getBackgroundImagePath(this);
+ setLayoutBackgroundImage(backgroundImagePath);
+
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ MenuInflater inflater = this.getMenuInflater();
+ menu.clear();
+ inflater.inflate(R.menu.group_create, menu);
+ acceptMenuItem = menu.findItem(R.id.menu_create_group);
+ acceptMenuItem.setEnabled(false);
+ super.onPrepareOptionsMenu(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+
+ if (id == R.id.menu_create_group) {
+ // handle confirmation button click here
+ Context context = getApplicationContext();
+ if(imageUri != null){
+ Thread thread = new Thread(){
+ @Override
+ public void run() {
+ String destination = context.getFilesDir().getAbsolutePath() + "/background";
+ scaleAndSaveImage(context, destination);
+ TextSecurePreferences.setBackgroundImagePath(context, destination);
+ }
+ };
+ thread.start();
+ }
+ else {
+ TextSecurePreferences.setBackgroundImagePath(context, "");
+ }
+ finish();
+ return true;
+ } else if (id == android.R.id.home) {
+ // handle close button click here
+ finish();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void scaleAndSaveImage(Context context, String destinationPath) {
+ try{
+ Display display = ServiceUtil.getWindowManager(context).getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+ Bitmap scaledBitmap = GlideApp.with(context)
+ .asBitmap()
+ .load(imageUri)
+ .centerCrop()
+ .skipMemoryCache(true)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .submit(size.x, size.y)
+ .get();
+ FileOutputStream outStream = new FileOutputStream(destinationPath);
+ scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 85, outStream);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ showBackgroundSaveError();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ showBackgroundSaveError();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ showBackgroundSaveError();
+ }
+ }
+
+ private void setLayoutBackgroundImage(String backgroundImagePath) {
+ Drawable image = Drawable.createFromPath(backgroundImagePath);
+ layoutContainer.setBackground(image);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ final Context context = getApplicationContext();
+ if (data != null && context != null && resultCode == RESULT_OK && requestCode == ApplicationPreferencesActivity.REQUEST_CODE_SET_BACKGROUND) {
+ imageUri = data.getData();
+ if (imageUri != null) {
+ acceptMenuItem.setEnabled(true);
+ Thread thread = new Thread(){
+ @Override
+ public void run() {
+ tempDestinationPath = context.getFilesDir().getAbsolutePath() + "/background-temp";
+ scaleAndSaveImage(context, tempDestinationPath);
+ runOnUiThread(() -> {
+ // Stuff that updates the UI
+ setLayoutBackgroundImage(tempDestinationPath);
+ });
+ }
+ };
+ thread.start();
+ }
+ }
+ }
+
+ private void showBackgroundSaveError() {
+ Toast.makeText(this, R.string.AppearancePreferencesFragment_background_save_error, Toast.LENGTH_LONG).show();
+ }
+
+ private void enableMenuItem() {
+ acceptMenuItem.setEnabled(true);
+ }
+ private class DefaultClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View view) {
+ imageUri = null;
+ tempDestinationPath = "";
+ setLayoutBackgroundImage("");
+ enableMenuItem();
+ }
+
+ }
+
+ private class GalleryClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("image/*");
+ startActivityForResult(intent, ApplicationPreferencesActivity.REQUEST_CODE_SET_BACKGROUND);
+ }
+ }
+}