/* * This is the source code of Telegram for Android v. 1.3.2. * It is licensed under GNU GPL v. 2 or later. * You should have received a copy of the license in this archive (see LICENSE). * * Copyright Nikolai Kudashov, 2013. */ package org.telegram.ui; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import org.telegram.android.AndroidUtilities; import org.telegram.android.LocaleController; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.android.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.RPCRequest; import org.telegram.messenger.Utilities; import org.telegram.objects.PhotoObject; import org.telegram.ui.Adapters.BaseFragmentAdapter; import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.ActionBar.BaseFragment; import org.telegram.ui.Views.HorizontalListView; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; public class SettingsWallpapersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private HorizontalListView listView; private ListAdapter listAdapter; private ImageView backgroundImage; private ProgressBar progressBar; private int selectedBackground; private int selectedColor; private ArrayList wallPapers = new ArrayList(); private HashMap wallpappersByIds = new HashMap(); private View doneButton; private String loadingFile = null; private File loadingFileObject = null; private TLRPC.PhotoSize loadingSize = null; private String currentPicturePath; @Override public boolean onFragmentCreate() { super.onFragmentCreate(); NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidFailedLoad); NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidLoaded); NotificationCenter.getInstance().addObserver(this, FileLoader.FileLoadProgressChanged); NotificationCenter.getInstance().addObserver(this, MessagesStorage.wallpapersDidLoaded); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); selectedBackground = preferences.getInt("selectedBackground", 1000001); selectedColor = preferences.getInt("selectedColor", 0); MessagesStorage.getInstance().getWallpapers(); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); toFile.delete(); return true; } @Override public void onFragmentDestroy() { super.onFragmentDestroy(); NotificationCenter.getInstance().removeObserver(this, FileLoader.FileDidFailedLoad); NotificationCenter.getInstance().removeObserver(this, FileLoader.FileDidLoaded); NotificationCenter.getInstance().removeObserver(this, FileLoader.FileLoadProgressChanged); NotificationCenter.getInstance().removeObserver(this, MessagesStorage.wallpapersDidLoaded); } @Override public View createView(LayoutInflater inflater, ViewGroup container) { if (fragmentView == null) { actionBarLayer.setCustomView(R.layout.settings_do_action_layout); Button cancelButton = (Button)actionBarLayer.findViewById(R.id.cancel_button); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finishFragment(); } }); doneButton = actionBarLayer.findViewById(R.id.done_button); doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { boolean done; TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); if (wallPaper != null && wallPaper.id != 1000001 && wallPaper instanceof TLRPC.TL_wallPaper) { int width = AndroidUtilities.displaySize.x; int height = AndroidUtilities.displaySize.y; if (width > height) { int temp = width; width = height; height = temp; } TLRPC.PhotoSize size = PhotoObject.getClosestPhotoSizeWithSize(wallPaper.sizes, width, height); String fileName = size.location.volume_id + "_" + size.location.local_id + ".jpg"; File f = new File(AndroidUtilities.getCacheDir(), fileName); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); try { done = Utilities.copyFile(f, toFile); } catch (Exception e) { done = false; FileLog.e("tmessages", e); } } else { if (selectedBackground == -1) { File fromFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); done = fromFile.renameTo(toFile); } else { done = true; } } if (done) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putInt("selectedBackground", selectedBackground); editor.putInt("selectedColor", selectedColor); editor.commit(); ApplicationLoader.cachedWallpaper = null; } finishFragment(); } }); cancelButton.setText(LocaleController.getString("Cancel", R.string.Cancel).toUpperCase()); TextView textView = (TextView)doneButton.findViewById(R.id.done_button_text); textView.setText(LocaleController.getString("Set", R.string.Set).toUpperCase()); fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, container, false); listAdapter = new ListAdapter(getParentActivity()); progressBar = (ProgressBar)fragmentView.findViewById(R.id.action_progress); backgroundImage = (ImageView)fragmentView.findViewById(R.id.background_image); listView = (HorizontalListView)fragmentView.findViewById(R.id.listView); listView.setAdapter(listAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { if (i == 0) { if (getParentActivity() == null) { return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); CharSequence[] items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("Cancel", R.string.Cancel)}; builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if (i == 0) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File image = Utilities.generatePicturePath(); if (image != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); currentPicturePath = image.getAbsolutePath(); } getParentActivity().startActivityForResult(takePictureIntent, 10); } else if (i == 1) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); getParentActivity().startActivityForResult(photoPickerIntent, 11); } } }); showAlertDialog(builder); } else { TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); selectedBackground = wallPaper.id; listAdapter.notifyDataSetChanged(); processSelectedBackground(); } } }); processSelectedBackground(); } else { ViewGroup parent = (ViewGroup)fragmentView.getParent(); if (parent != null) { parent.removeView(fragmentView); } } return fragmentView; } @Override public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == 10) { Utilities.addMediaToGallery(currentPicturePath); try { Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, null, AndroidUtilities.dp(320), AndroidUtilities.dp(480)); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); FileOutputStream stream = new FileOutputStream(toFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); selectedBackground = -1; selectedColor = 0; backgroundImage.setImageBitmap(bitmap); } catch (Exception e) { FileLog.e("tmessages", e); } currentPicturePath = null; } else if (requestCode == 11) { if (data == null || data.getData() == null) { return; } try { Bitmap bitmap = FileLoader.loadBitmap(null, data.getData(), AndroidUtilities.dp(320), AndroidUtilities.dp(480)); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); FileOutputStream stream = new FileOutputStream(toFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); selectedBackground = -1; selectedColor = 0; backgroundImage.setImageBitmap(bitmap); } catch (Exception e) { FileLog.e("tmessages", e); } } } } @Override public void saveSelfArgs(Bundle args) { if (currentPicturePath != null) { args.putString("path", currentPicturePath); } } @Override public void restoreSelfArgs(Bundle args) { currentPicturePath = args.getString("path"); } private void processSelectedBackground() { TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); if (selectedBackground != -1 && selectedBackground != 1000001 && wallPaper != null && wallPaper instanceof TLRPC.TL_wallPaper) { int width = AndroidUtilities.displaySize.x; int height = AndroidUtilities.displaySize.y; if (width > height) { int temp = width; width = height; height = temp; } TLRPC.PhotoSize size = PhotoObject.getClosestPhotoSizeWithSize(wallPaper.sizes, width, height); String fileName = size.location.volume_id + "_" + size.location.local_id + ".jpg"; File f = new File(AndroidUtilities.getCacheDir(), fileName); if (!f.exists()) { progressBar.setProgress(0); loadingFile = fileName; loadingFileObject = f; doneButton.setEnabled(false); progressBar.setVisibility(View.VISIBLE); loadingSize = size; selectedColor = 0; FileLoader.getInstance().loadFile(null, size, null, null); backgroundImage.setBackgroundColor(0); } else { if (loadingFile != null) { FileLoader.getInstance().cancelLoadFile(null, loadingSize, null, null); } loadingFileObject = null; loadingFile = null; loadingSize = null; backgroundImage.setImageURI(Uri.fromFile(f)); backgroundImage.setBackgroundColor(0); selectedColor = 0; doneButton.setEnabled(true); progressBar.setVisibility(View.GONE); } } else { if (loadingFile != null) { FileLoader.getInstance().cancelLoadFile(null, loadingSize, null, null); } if (selectedBackground == 1000001) { backgroundImage.setImageResource(R.drawable.background_hd); backgroundImage.setBackgroundColor(0); selectedColor = 0; } else if (selectedBackground == -1) { File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); if (!toFile.exists()) { toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); } if (toFile.exists()) { backgroundImage.setImageURI(Uri.fromFile(toFile)); } else { selectedBackground = 1000001; processSelectedBackground(); } } else { if (wallPaper == null) { return; } if (wallPaper instanceof TLRPC.TL_wallPaperSolid) { backgroundImage.setImageBitmap(null); selectedColor = 0xff000000 | wallPaper.bg_color; backgroundImage.setBackgroundColor(selectedColor); } } loadingFileObject = null; loadingFile = null; loadingSize = null; doneButton.setEnabled(true); progressBar.setVisibility(View.GONE); } } @SuppressWarnings("unchecked") @Override public void didReceivedNotification(int id, final Object... args) { if (id == FileLoader.FileDidFailedLoad) { String location = (String)args[0]; if (loadingFile != null && loadingFile.equals(location)) { loadingFileObject = null; loadingFile = null; loadingSize = null; progressBar.setVisibility(View.GONE); doneButton.setEnabled(false); } } else if (id == FileLoader.FileDidLoaded) { String location = (String)args[0]; if (loadingFile != null && loadingFile.equals(location)) { backgroundImage.setImageURI(Uri.fromFile(loadingFileObject)); progressBar.setVisibility(View.GONE); backgroundImage.setBackgroundColor(0); doneButton.setEnabled(true); loadingFileObject = null; loadingFile = null; loadingSize = null; } } else if (id == FileLoader.FileLoadProgressChanged) { String location = (String)args[0]; if (loadingFile != null && loadingFile.equals(location)) { Float progress = (Float)args[1]; progressBar.setProgress((int)(progress * 100)); } } else if (id == MessagesStorage.wallpapersDidLoaded) { Utilities.RunOnUIThread(new Runnable() { @Override public void run() { wallPapers = (ArrayList)args[0]; wallpappersByIds.clear(); for (TLRPC.WallPaper wallPaper : wallPapers) { wallpappersByIds.put(wallPaper.id, wallPaper); } if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } if (!wallPapers.isEmpty() && backgroundImage != null) { processSelectedBackground(); } loadWallpapers(); } }); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); fixLayout(); } private void loadWallpapers() { TLRPC.TL_account_getWallPapers req = new TLRPC.TL_account_getWallPapers(); long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(final TLObject response, TLRPC.TL_error error) { if (error != null) { return; } Utilities.RunOnUIThread(new Runnable() { @Override public void run() { wallPapers.clear(); TLRPC.Vector res = (TLRPC.Vector)response; wallpappersByIds.clear(); for (Object obj : res.objects) { wallPapers.add((TLRPC.WallPaper)obj); wallpappersByIds.put(((TLRPC.WallPaper)obj).id, (TLRPC.WallPaper)obj); } listAdapter.notifyDataSetChanged(); if (backgroundImage != null) { processSelectedBackground(); } MessagesStorage.getInstance().putWallpapers(wallPapers); } }); } }); ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid); } private void fixLayout() { ViewTreeObserver obs = fragmentView.getViewTreeObserver(); obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { fragmentView.getViewTreeObserver().removeOnPreDrawListener(this); if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } if (listView != null) { listView.post(new Runnable() { @Override public void run() { listView.scrollTo(0); } }); } return false; } }); } @Override public void onResume() { super.onResume(); if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } processSelectedBackground(); fixLayout(); } private class ListAdapter extends BaseFragmentAdapter { private Context mContext; public ListAdapter(Context context) { mContext = context; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEnabled(int i) { return true; } @Override public int getCount() { return 1 + wallPapers.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return i; } @Override public boolean hasStableIds() { return true; } @Override public View getView(int i, View view, ViewGroup viewGroup) { int type = getItemViewType(i); if (type == 0) { if (view == null) { LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.settings_wallpapers_my_row, viewGroup, false); } View parentView = view.findViewById(R.id.parent); ImageView imageView = (ImageView)view.findViewById(R.id.image); View selection = view.findViewById(R.id.selection); if (i == 0) { if (selectedBackground == -1 || selectedColor != 0 || selectedBackground == 1000001) { imageView.setBackgroundColor(0x5A475866); } else { imageView.setBackgroundColor(0x5A000000); } imageView.setImageResource(R.drawable.ic_gallery_background); if (selectedBackground == -1) { selection.setVisibility(View.VISIBLE); } else { selection.setVisibility(View.INVISIBLE); } } else { imageView.setImageBitmap(null); TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); imageView.setBackgroundColor(0xff000000 | wallPaper.bg_color); if (wallPaper.id == selectedBackground) { selection.setVisibility(View.VISIBLE); } else { selection.setVisibility(View.INVISIBLE); } } } else if (type == 1) { if (view == null) { LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.settings_wallpapers_other_row, viewGroup, false); } BackupImageView image = (BackupImageView)view.findViewById(R.id.image); View selection = view.findViewById(R.id.selection); TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); TLRPC.PhotoSize size = PhotoObject.getClosestPhotoSizeWithSize(wallPaper.sizes, AndroidUtilities.dp(100), AndroidUtilities.dp(100)); if (size != null && size.location != null) { image.setImage(size.location, "100_100", 0); } if (wallPaper.id == selectedBackground) { selection.setVisibility(View.VISIBLE); } else { selection.setVisibility(View.INVISIBLE); } } return view; } @Override public int getItemViewType(int i) { if (i == 0) { return 0; } TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); if (wallPaper instanceof TLRPC.TL_wallPaperSolid) { return 0; } return 1; } @Override public int getViewTypeCount() { return 2; } @Override public boolean isEmpty() { return false; } } }