From 5e40051659ab2c91256c449bc583a2f76f59cad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kalle=20Kniivil=C3=A4?= Date: Mon, 19 Dec 2022 04:49:42 +0100 Subject: [PATCH 01/68] Translated using Weblate (Esperanto) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 5.0% (3 of 59 strings) Co-authored-by: Kalle Kniivilä Translate-URL: https://hosted.weblate.org/projects/fedilab/description/eo/ Translation: Fedilab/description --- src/fdroid/fastlane/metadata/android/eo/title.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/fdroid/fastlane/metadata/android/eo/title.txt diff --git a/src/fdroid/fastlane/metadata/android/eo/title.txt b/src/fdroid/fastlane/metadata/android/eo/title.txt new file mode 100644 index 00000000..e6f369e8 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/eo/title.txt @@ -0,0 +1 @@ +Fedilab From c0f103b97cdb0cb5427cac39c1912a0c1fb36131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Jel=C3=ADnek?= Date: Mon, 19 Dec 2022 05:50:35 +0100 Subject: [PATCH 02/68] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.3% (986 of 992 strings) Co-authored-by: Lukáš Jelínek Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/cs/ Translation: Fedilab/Strings --- app/src/main/res/values-cs/strings.xml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 64c9420c..f8461e2e 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -49,7 +49,7 @@ Otevřít v prohlížeči Přeložit - Domů + Domov Místní časová osa Ztlumení uživatelé Blokovaní uživatelé @@ -59,8 +59,8 @@ Poslat e-mail Naplánované zprávy Níže uvedené informace mohou popisovat uživatelský profil neúplně. - Vložit smajlík - Aplikace prozatím nenačetla uživatelské smajlíky. + Vložit emoji + Aplikace prozatím nenasbírala uživatelské emoji. Opravdu se chcete odhlásit od @%1$s@%2$s\? Žádné zprávy k zobrazení @@ -341,7 +341,7 @@ Hlavička profilu Kontaktovat administrátora instance Logo MastoHost - Výběr emotikonů + Výběr emoji Ukázat celou konverzaci Uživatelský výběr emoji Favicon @@ -367,7 +367,7 @@ Žádný Kterékoliv slovo (odělené mezerami) Všechna slova (oddělená mezerami) - Add some words to filter (space-separated) + Přidejte do filtru nějaká slova (oddělená mezerami) Změnit název sloupce Instance Misskey Populární @@ -478,7 +478,7 @@ Zrušit pozastavení Zvuk Hlasová zpráva - Během časového úseku budu aplikace posílat upozornění. Můžete to pro tento úsek změnit (tzn. ztišit) pomocí ovládacího prvku vpravo. + Během časového úseku bude aplikace posílat upozornění. Můžete to pro tento úsek změnit (tzn. ztišit) pomocí ovládacího prvku vpravo. Náhledy nebudou v časových osách oříznuty Automaticky vkládat zalomení řádku za zmínku, aby bylo první písmeno velké Umožňuje tvůrcům obsahu sdílet statusy do jejich kanálů RSS @@ -492,7 +492,7 @@ \n \nMůžete přidat dodatečný obsah. Děkuji! Viditelnost - Disable custom animated emojis + Vypnout vlastní animované emoji Nahlásit účet %d hlasující @@ -794,7 +794,7 @@ Návrhy Zapamatovat pozici v časových osách Zpráva byla připnuta - Přeložit zprávy + Překládat zprávy Moderátor Administrátor Potvrzeno @@ -910,7 +910,7 @@ Umožňuje omezit seznam jazyků ve výběru při vytváření zprávy. Změnit logo aplikace na vašem zařízení Přizpůsobuje tonalitu barevného schématu podle vaší osobní tapety. - Zprávy v cache pro domovskou časovou osu + Zprávy v cache pro domov Distributor pro push Upravil(a) zprávu Vyberte, kterou akci provést, pokud bude příspěvek vyhovovat filtru @@ -935,7 +935,9 @@ Ztlumit všechny Domácí ztlumení uživatelé Účet ztišen - Ztlumit pro domovskou časovou osu - Zrušit ztlumení pro domovskou časovou osu + Ztlumit pro domov + Zrušit ztlumení pro domov Všechny účtu budou na domovské časové ose ztlumeny. + Importovat data + Přidat všechny uživatele pro ztlumený domov \ No newline at end of file From 867f5dbae7f35f7affd84cb2a8912e0591189c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kalle=20Kniivil=C3=A4?= Date: Mon, 19 Dec 2022 05:50:35 +0100 Subject: [PATCH 03/68] Translated using Weblate (Esperanto) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.1% (636 of 992 strings) Co-authored-by: Kalle Kniivilä Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/eo/ Translation: Fedilab/Strings --- app/src/main/res/values-eo/strings.xml | 46 ++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 21cd5d07..fc932c5e 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -35,8 +35,8 @@ Malfermi per Validigu Aŭdovidaĵoj - Konigi kun - Komuna tra Fedilab + Konigi per + Konigita per Fedilab Respondoj Uzantnomo Malnetoj @@ -45,7 +45,7 @@ Mencioj Diskonigoj Montri diskonigojn - Montri la respondojn + Montri respondojn Malfermu en retumilo Traduku @@ -56,12 +56,12 @@ Sciigoj Petoj de sekvado Agordoj - Sendi per retmesaĝo + Sendi retpoŝton Planitaj hupoj Subaj informoj povas nekomplete prezenti la profilon de la uzanto. Enmeti emoĝion - The app did not collect custom emojis for the moment. - Are you sure you want to logout @%1$s@%2$s? + La apo ne havas adaptitajn emoĝiojn ĉi-okaze. + Ĉu vi certas ke vi volas elsaluti\? @%1$s@%2$s\? Neniu hupo por montri Aldoni hupon al viajn stelumajn\? @@ -75,7 +75,7 @@ Kopii Konigi Mencii - Timed mute + Tempumita silentigo Forigi kaj reskribi Silentigi ĉi-tiun konton? @@ -125,38 +125,42 @@ Via hupo estas malplena! La hupo estis sendita! Tikla enhavo? - Neniu malnetoj! - Elekti kontojn - Elekti kelkaj kontoj - Forigi malneto? - Describe for the visually impaired + Neniu malneto! + Elekti konton + Elektu kelkajn kontojn + Forigi malneton\? + Priskribu por vidhandikapitoj Neniu priskribo havebla! - Release %1$s + Eldono %1$s Programistoj: Permesilo: GNU GPL V3 Kodo: - Serĉi instencoj: + Serĉi instancojn: Neniu konto por montri - Ne sekva peton + Neniu peto pri sekvado Hupoj \n %1$s - Sekvante \n %1$s - Sekvante \n %1$s + Sekvas +\n %1$s + Sekvantoj +\n %1$s Malakcepti Neniu planitaj hupoj por montri! Forigi planita mesaĝon? La mesaĝo estis planita! - La planita dato devas pli granda ol la nunhoro! + La planita dato devas pli malfrua ol la nuna horo! - The time for muting should be greater than one minute. - %1$s has been muted until %2$s.\n You can unmute this account from their profile page. - %1$s is muted until %2$s.\n Tap here to unmute the account. + La tempo por silentigo devas esti pli longa ol unu minuto. + %1$s silentigita ĝis %2$s. +\nVi povas malsilentigi ĉi tiun konton en ĝia profilpaĝo. + %1$s silentigita ĝis %2$s. +\nKlaku ĉi tie por malsilentigi la konton. Neniun sciigon por montri menciis vin From d0171236a84ea9b89c0af6f233ccf88a2f87b395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Mon, 19 Dec 2022 05:50:35 +0100 Subject: [PATCH 04/68] Translated using Weblate (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (992 of 992 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/tr/ Translation: Fedilab/Strings --- app/src/main/res/values-tr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index dd7ccea5..2e16484e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -932,4 +932,5 @@ Ana sayfa için susturmaktan vazgeç Tüm kullanıcıları ana sayfada susturmaya ekle Ana sayfa için sustur + Verileri içe aktar \ No newline at end of file From 625f15fb328a09b404fc2cb17cc3a83f23065cdc Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Dec 2022 12:42:29 +0100 Subject: [PATCH 05/68] Allow to get a quote --- app/src/main/assets/quotes/famous.json | 8206 +++++++++++++++++ .../themes/contributors/Fedilab_theme_ACN.csv | 15 - .../Fedilab_theme_Breeze_Dark_Yellow.csv | 13 - .../Fedilab_theme_Cyberpunk_Neon.csv | 15 - .../Fedilab_theme_Dark_Elephant.csv | 15 - .../Fedilab_theme_Grey_Orange.csv | 15 - .../Fedilab_theme_Gruvbox_OLED.csv | 15 - .../Fedilab_theme_Less_Angry_Orange.csv | 15 - .../Fedilab_theme_Mondstern_Fedilab.csv | 15 - .../contributors/Fedilab_theme_Nocturnal.csv | 13 - .../Fedilab_theme_Photon_Dark.csv | 15 - .../Fedilab_theme_Solarized_Cyan_Accent.csv | 15 - .../Fedilab_theme_Solarized_Dark_Purple.csv | 15 - app/src/main/assets/themes/cyanea_themes.json | 47 - .../android/client/entities/app/Quotes.java | 34 + .../android/ui/drawer/ComposeAdapter.java | 68 + 16 files changed, 8308 insertions(+), 223 deletions(-) create mode 100644 app/src/main/assets/quotes/famous.json delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_ACN.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Breeze_Dark_Yellow.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Cyberpunk_Neon.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Dark_Elephant.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Grey_Orange.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Gruvbox_OLED.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Less_Angry_Orange.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Mondstern_Fedilab.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Nocturnal.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Photon_Dark.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Cyan_Accent.csv delete mode 100644 app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Dark_Purple.csv delete mode 100644 app/src/main/assets/themes/cyanea_themes.json create mode 100644 app/src/main/java/app/fedilab/android/client/entities/app/Quotes.java diff --git a/app/src/main/assets/quotes/famous.json b/app/src/main/assets/quotes/famous.json new file mode 100644 index 00000000..9de67faa --- /dev/null +++ b/app/src/main/assets/quotes/famous.json @@ -0,0 +1,8206 @@ +[ + { + "content": "In the depth of winter, I finally learned that there was within me an invincible summer.", + "author": "Albert Camus" + }, + { + "content": "To follow, without halt, one aim: There is the secret of success.", + "author": "Anna Pavlova" + }, + { + "content": "Focusing your life solely on making a buck shows a poverty of ambition. It asks too little of yourself. And it will leave you unfulfilled.", + "author": "Barack Obama" + }, + { + "content": "You cannot travel the path until you have become the path itself.", + "author": "Buddha" + }, + { + "content": "It is never too late to be what you might have been.", + "author": "George Eliot" + }, + { + "content": "Pick battles big enough to matter, small enough to win.", + "author": "Jonathan Kozol" + }, + { + "content": "Who sows virtue reaps honor.", + "author": "Leonardo da Vinci" + }, + { + "content": "Nobody will believe in you unless you believe in yourself.", + "author": "Liberace" + }, + { + "content": "Each day provides its own gifts.", + "author": "Marcus Aurelius" + }, + { + "content": "Don't wait. The time will never be just right.", + "author": "Napoleon Hill" + }, + { + "content": "If I am not for myself, who will be for me? If I am not for others, what am I? And if not now, when?", + "author": "Rabbi Hillel" + }, + { + "content": "Do not go where the path may lead, go instead where there is no path and leave a trail.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Nothing great was ever achieved without enthusiasm.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "If you love someone, set them free. If they come back, they're yours; if they don't, they never were.", + "author": "Richard Bach" + }, + { + "content": "There is no duty we so underrate as the duty of being happy. By being happy we sow anonymous benefits upon the world.", + "author": "Robert Louis Stevenson" + }, + { + "content": "These days people seek knowledge, not wisdom. Knowledge is of the past; wisdom is of the future.", + "author": "Vernon Cooper" + }, + { + "content": "This is the final test of a gentleman: his respect for those who can be of no possible value to him.", + "author": "William Lyon Phelps" + }, + { + "_id": "EBX5NXqc-R6-", + "content": "Six essential qualities that are the key to success: Sincerity, personal integrity, humility, courtesy, wisdom, charity.", + "author": "William C. Menninger" + }, + { + "content": "Short words are best and the old words when short are best of all.", + "author": "Winston Churchill" + }, + { + "content": "Applause is a receipt, not a bill.", + "author": "Dale Carnegie" + }, + { + "content": "Talent is God-given; be humble. Fame is man-given; be thankful. Conceit is self-given; be careful.", + "author": "Harvey Mackay" + }, + { + "content": "Never interrupt someone doing what you said couldn't be done.", + "author": "Amelia Earhart" + }, + { + "content": "Some of the best lessons we ever learn are learned from past mistakes. The error of the past is the wisdom and success of the future.", + "author": "Dale Turner" + }, + { + "content": "Many sophisticated, intelligent people lack wisdom and common sense.", + "author": "Joyce Meyer" + }, + { + "content": "Every friendship goes through ups and downs. Dysfunctional patterns set in; external situations cause internal friction; you grow apart and then bounce back together.", + "author": "Mariella Frostrup" + }, + { + "content": "Friendship, like love, is destroyed by long absence, though it may be increased by short intermissions.", + "author": "Samuel Johnson" + }, + { + "content": "Do something wonderful, people may imitate it.", + "author": "Albert Schweitzer" + }, + { + "content": "There surely is in human nature an inherent propensity to extract all the good out of all the evil.", + "author": "Benjamin Haydon" + }, + { + "content": "As you think, so shall you become.", + "author": "Bruce Lee" + }, + { + "content": "Genuine sincerity opens people's hearts, while manipulation causes them to close.", + "author": "Daisaku Ikeda" + }, + { + "content": "The universe is full of magical things, patiently waiting for our wits to grow sharper.", + "author": "Eden Phillpotts" + }, + { + "content": "Those who cannot learn from history are doomed to repeat it.", + "author": "George Santayana" + }, + { + "content": "Ability is what you're capable of doing. Motivation determines what you do. Attitude determines how well you do it.", + "author": "Lou Holtz" + }, + { + "content": "The thoughts we choose to think are the tools we use to paint the canvas of our lives.", + "author": "Louise Hay" + }, + { + "content": "Every adversity, every failure, every heartache carries with it the seed of an equal or greater benefit.", + "author": "Napoleon Hill" + }, + { + "content": "Strong beliefs win strong men, and then make them stronger.", + "author": "Richard Bach" + }, + { + "content": "Do you want to know who you are? Don't ask. Act! Action will delineate and define you.", + "author": "Thomas Jefferson" + }, + { + "content": "A wise man is superior to any insults which can be put upon him, and the best reply to unseemly behavior is patience and moderation.", + "author": "Molière" + }, + { + "content": "Well done is better than well said.", + "author": "Benjamin Franklin" + }, + { + "content": "We must not allow ourselves to become like the system we oppose.", + "author": "Desmond Tutu" + }, + { + "content": "You will not be punished for your anger; you will be punished by your anger.", + "author": "Buddha" + }, + { + "content": "The key to transforming our hearts and minds is to have an understanding of how our thoughts and emotions work.", + "author": "Dalai Lama" + }, + { + "content": "Do not give your attention to what others do or fail to do; give it to what you do or fail to do.", + "author": "Dhammapada" + }, + { + "content": "People grow through experience if they meet life honestly and courageously. This is how character is built.", + "author": "Eleanor Roosevelt" + }, + { + "content": "If you wish to be a writer, write.", + "author": "Epictetus" + }, + { + "content": "Not every difficult and dangerous thing is suitable for training, but only that which is conducive to success in achieving the object of our effort.", + "author": "Epictetus" + }, + { + "content": "But man is not made for defeat. A man can be destroyed but not defeated.", + "author": "Ernest Hemingway" + }, + { + "content": "Character cannot be developed in ease and quiet. Only through experience of trial and suffering can the soul be strengthened, vision cleared, ambition inspired, and success achieved.", + "author": "Helen Keller" + }, + { + "content": "You can't shake hands with a clenched fist.", + "author": "Indira Gandhi" + }, + { + "content": "There are things so deep and complex that only intuition can reach it in our stage of development as human beings.", + "author": "John Astin" + }, + { + "content": "You can't stop the waves, but you can learn to surf.", + "author": "Jon Kabat-Zinn" + }, + { + "content": "If you correct your mind, the rest of your life will fall into place.", + "author": "Laozi" + }, + { + "content": "Imagination is the highest kite one can fly.", + "author": "Lauren Bacall" + }, + { + "content": "I never see what has been done; I only see what remains to be done.", + "author": "Marie Curie" + }, + { + "content": "Those who are blessed with the most talent don't necessarily outperform everyone else. It's the people with follow-through who excel.", + "author": "Mary Kay Ash" + }, + { + "content": "No man can succeed in a line of endeavor which he does not like.", + "author": "Napoleon Hill" + }, + { + "content": "Here is one quality that one must possess to win, and that is definiteness of purpose, the knowledge of what one wants, and a burning desire to possess it.", + "author": "Napoleon Hill" + }, + { + "content": "By believing passionately in something that does not yet exist, we create it.", + "author": "Nikos Kazantzakis" + }, + { + "content": "The meaning I picked, the one that changed my life: Overcome fear, behold wonder.", + "author": "Richard Bach" + }, + { + "content": "It's so simple to be wise. Just think of something stupid to say and then don't say it.", + "author": "Sam Levenson" + }, + { + "content": "Leaders aren't born they are made. And they are made just like anything else, through hard work. And that's the price we'll have to pay to achieve that goal, or any goal.", + "author": "Vince Lombardi" + }, + { + "content": "Everything you are against weakens you. Everything you are for empowers you.", + "author": "Wayne Dyer" + }, + { + "content": "Do more than dream: work.", + "author": "William Arthur Ward" + }, + { + "content": "The function of wisdom is to discriminate between good and evil.", + "author": "Cicero" + }, + { + "content": "Genius unrefined resembles a flash of lightning, but wisdom is like the sun.", + "author": "Franz Grillparzer" + }, + { + "content": "The greatest healing therapy is friendship and love.", + "author": "Hubert Humphrey" + }, + { + "content": "Those that know, do. Those that understand, teach.", + "author": "Aristotle" + }, + { + "content": "We need to find the courage to say NO to the things and people that are not serving us if we want to rediscover ourselves and live our lives with authenticity.", + "author": "Barbara De Angelis" + }, + { + "content": "We must learn our limits. We are all something, but none of us are everything.", + "author": "Blaise Pascal" + }, + { + "content": "Choose a job you love, and you will never have to work a day in your life.", + "author": "Confucius" + }, + { + "content": "They must often change, who would be constant in happiness or wisdom.", + "author": "Confucius" + }, + { + "content": "Respect should be earned by actions, and not acquired by years.", + "author": "Frank Lloyd Wright" + }, + { + "content": "We are all inclined to judge ourselves by our ideals; others, by their acts.", + "author": "Harold Nicolson" + }, + { + "content": "Correction does much, but encouragement does more.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "All the great performers I have worked with are fueled by a personal dream.", + "author": "John Eliot" + }, + { + "content": "Beauty is not in the face; beauty is a light in the heart.", + "author": "Kahlil Gibran" + }, + { + "content": "You were not born a winner, and you were not born a loser. You are what you make yourself be.", + "author": "Lou Holtz" + }, + { + "content": "How wonderful that we have met with a paradox. Now we have some hope of making progress.", + "author": "Niels Bohr" + }, + { + "content": "What we achieve inwardly will change outer reality.", + "author": "Plutarch" + }, + { + "content": "Our strength grows out of our weaknesses.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Can miles truly separate you from friends... If you want to be with someone you love, aren't you already there?", + "author": "Richard Bach" + }, + { + "content": "Things that were hard to bear are sweet to remember.", + "author": "Seneca the Younger" + }, + { + "content": "The supreme art of war is to subdue the enemy without fighting.", + "author": "Sun Tzu" + }, + { + "content": "The most formidable weapon against errors of every kind is reason.", + "author": "Thomas Paine" + }, + { + "content": "When people are like each other they tend to like each other.", + "author": "Tony Robbins" + }, + { + "content": "You have enemies? Good. That means you've stood up for something, sometime in your life.", + "author": "Winston Churchill" + }, + { + "content": "The three great essentials to achieve anything worthwhile are: Hard work, Stick-to-itiveness, and Common sense.", + "author": "Thomas Edison" + }, + { + "content": "If you were to offer a thirsty man all wisdom, you would not please him more than if you gave him a drink.", + "author": "Sophocles" + }, + { + "_id": "y2-XO-7xRg", + "content": "Love is the attempt to form a friendship inspired by beauty.", + "author": "Cicero" + }, + { + "content": "To hell with circumstances, I create opportunities.", + "author": "Bruce Lee" + }, + { + "content": "True happiness means forging a strong spirit that is undefeated, no matter how trying our circumstances.", + "author": "Daisaku Ikeda" + }, + { + "content": "When fate hands us a lemon, let's try to make lemonade.", + "author": "Dale Carnegie" + }, + { + "content": "One must be fond of people and trust them if one is not to make a mess of life.", + "author": "E. M. Forster" + }, + { + "content": "Nobody made a greater mistake than he who did nothing because he could do only a little.", + "author": "Edmund Burke" + }, + { + "content": "All serious daring starts from within.", + "author": "Harriet Beecher Stowe" + }, + { + "content": "Trouble is only opportunity in work clothes.", + "author": "Henry J. Kaiser" + }, + { + "content": "Freedom is what you do with what's been done to you.", + "author": "Jean-Paul Sartre" + }, + { + "content": "Love is the flower you've got to let grow.", + "author": "John Lennon" + }, + { + "content": "Quality is never an accident; it is always the result of intelligent effort.", + "author": "John Ruskin" + }, + { + "content": "All that is necessary is to accept the impossible, do without the indispensable, and bear the intolerable.", + "author": "Kathleen Norris" + }, + { + "content": "Everything that exists is in a manner the seed of that which will be.", + "author": "Marcus Aurelius" + }, + { + "content": "Waste no more time arguing about what a good man should be. Be one.", + "author": "Marcus Aurelius" + }, + { + "content": "We shall never know all the good that a simple smile can do.", + "author": "Mother Teresa" + }, + { + "content": "Fear not for the future, weep not for the past.", + "author": "Percy Bysshe Shelley" + }, + { + "content": "The best way to pay for a lovely moment is to enjoy it.", + "author": "Richard Bach" + }, + { + "content": "The only Zen you find on the tops of mountains is the Zen you bring up there.", + "author": "Robert M. Pirsig" + }, + { + "content": "Everyone has been made for some particular work, and the desire for that work has been put in every heart.", + "author": "Rumi" + }, + { + "content": "Memory is the mother of all wisdom.", + "author": "Samuel Johnson" + }, + { + "content": "Can you imagine what I would do if I could do all I can?", + "author": "Sun Tzu" + }, + { + "content": "Life is the flower for which love is the honey.", + "author": "Victor Hugo" + }, + { + "content": "Courage is what it takes to stand up and speak; courage is also what it takes to sit down and listen.", + "author": "Winston Churchill" + }, + { + "content": "Never, never, never give up.", + "author": "Winston Churchill" + }, + { + "content": "Consult not your fears but your hopes and your dreams. Think not about your frustrations, but about your unfulfilled potential. Concern yourself not with what you tried and failed in, but with what it is still possible for you to do.", + "author": "Pope John XXIII" + }, + { + "content": "The key is to keep company only with people who uplift you, whose presence calls forth your best.", + "author": "Epictetus" + }, + { + "content": "It's the little details that are vital. Little things make big things happen.", + "author": "John Wooden" + }, + { + "content": "If you don't know where you are going, any road will get you there.", + "author": "Lewis Carroll" + }, + { + "content": "You can only learn so much from books. You can only learn so much from education. Ultimately, it is the wisdom of God that will carry you through in the toughest situations of life.", + "author": "Ravi Zacharias" + }, + { + "content": "Habit, if not resisted, soon becomes necessity.", + "author": "Augustine of Hippo" + }, + { + "content": "A youth, when at home, should be filial and, abroad, respectful to his elders. He should be earnest and truthful. He should overflow in love to all and cultivate the friendship of the good. When he has time and opportunity, after the performance of these things, he should employ them in polite studies.", + "author": "Confucius" + }, + { + "content": "However rare true love may be, it is less so than true friendship.", + "author": "François de La Rochefoucauld" + }, + { + "content": "True friendship is like sound health; the value of it is seldom known until it is lost.", + "author": "Charles Caleb Colton" + }, + { + "content": "Neatness begets order; but from order to taste there is the same difference as from taste to genius, or from love to friendship.", + "author": "Johann Kaspar Lavater" + }, + { + "content": "When I dare to be powerful, to use my strength in the service of my vision, then it becomes less and less important whether I am afraid.", + "author": "Audre Lorde" + }, + { + "content": "Take no thought of who is right or wrong or who is better than. Be not for or against.", + "author": "Bruce Lee" + }, + { + "content": "What you do not want done to yourself, do not do to others.", + "author": "Confucius" + }, + { + "content": "When you see a man of worth, think of how you may emulate him. When you see one who is unworthy, examine yourself.", + "author": "Confucius" + }, + { + "content": "Most of the important things in the world have been accomplished by people who have kept on trying when there seemed to be no hope at all.", + "author": "Dale Carnegie" + }, + { + "content": "A successful person is one who can lay a firm foundation with the bricks that others throw at him or her.", + "author": "David Brinkley" + }, + { + "content": "You must do the things you think you cannot do.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Three things in human life are important. The first is to be kind. The second is to be kind. The third is to be kind.", + "author": "Henry James" + }, + { + "content": "Be less curious about people and more curious about ideas.", + "author": "Marie Curie" + }, + { + "content": "Happiness is as a butterfly which, when pursued, is always beyond our grasp, but which if you will sit down quietly, may alight upon you.", + "author": "Nathaniel Hawthorne" + }, + { + "content": "By nature, man hates change; seldom will he quit his old home till it has actually fallen around his ears.", + "author": "Thomas Carlyle" + }, + { + "content": "Minds are like parachutes. They only function when open.", + "author": "Thomas Dewar" + }, + { + "content": "Meditation is the dissolution of thoughts in eternal awareness or Pure consciousness without objectification, knowing without thinking, merging finitude in infinity.", + "author": "Voltaire" + }, + { + "content": "I can't imagine a person becoming a success who doesn't give this game of life everything he's got.", + "author": "Walter Cronkite" + }, + { + "content": "What you get by achieving your goals is not as important as what you become by achieving your goals.", + "author": "Zig Ziglar" + }, + { + "content": "Adopt the pace of nature: her secret is patience.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The only true wisdom is in knowing you know nothing.", + "author": "Isocrates" + }, + { + "content": "Nature and books belong to the eyes that see them.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "When written in Chinese, the word 'crisis' is composed of two characters. One represents danger and the other represents opportunity.", + "author": "John F. Kennedy" + }, + { + "content": "Science investigates; religion interprets. Science gives man knowledge which is power; religion gives man wisdom which is control.", + "author": "Martin Luther King Jr." + }, + { + "content": "Be true to yourself, help others, make each day your masterpiece, make friendship a fine art, drink deeply from good books - especially the Bible, build a shelter against a rainy day, give thanks for your blessings and pray for guidance every day.", + "author": "John Wooden" + }, + { + "content": "A friend is someone who gives you total freedom to be yourself.", + "author": "Jim Morrison" + }, + { + "content": "I don't need a friend who changes when I change and who nods when I nod; my shadow does that much better.", + "author": "Plutarch" + }, + { + "content": "Appreciation is the highest form of prayer, for it acknowledges the presence of good wherever you shine the light of your thankful thoughts.", + "author": "Alan Cohen" + }, + { + "content": "Speak when you are angry, and you will make the best speech you will ever regret.", + "author": "Ambrose Bierce" + }, + { + "content": "It all depends on how we look at things, and not how they are in themselves.", + "author": "Carl Jung" + }, + { + "content": "Happiness does not come about only due to external circumstances; it mainly derives from inner attitudes.", + "author": "Dalai Lama" + }, + { + "content": "Be your own hero, it's cheaper than a movie ticket.", + "author": "Doug Horton" + }, + { + "content": "If a man does his best, what else is there?", + "author": "George S. Patton" + }, + { + "content": "It's not what you look at that matters, it's what you see.", + "author": "Henry David Thoreau" + }, + { + "content": "You won't skid if you stay in a rut.", + "author": "Kin Hubbard" + }, + { + "content": "Doing nothing is better than being busy doing nothing.", + "author": "Laozi" + }, + { + "content": "Great acts are made up of small deeds.", + "author": "Laozi" + }, + { + "content": "All achievements, all earned riches, have their beginning in an idea.", + "author": "Napoleon Hill" + }, + { + "content": "Anybody can make history. Only a great man can write it.", + "author": "Oscar Wilde" + }, + { + "content": "Knowledge has three degrees: opinion, science, illumination. The means or instrument of the first is sense; of the second, dialectic; of the third, intuition.", + "author": "Plotinus" + }, + { + "content": "What the caterpillar calls the end of the world, the master calls a butterfly.", + "author": "Richard Bach" + }, + { + "content": "It requires wisdom to understand wisdom: the music is nothing if the audience is deaf.", + "author": "Walter Lippmann" + }, + { + "content": "Knowledge is proud that it knows so much; wisdom is humble that it knows no more.", + "author": "William Cowper" + }, + { + "content": "So much technology, so little talent.", + "author": "Vernor Vinge" + }, + { + "content": "I define friendship as a bond that transcends all barriers. When you are ready to expect anything and everything from friends, good, bad or ugly... that's what I call true friendship.", + "author": "Harbhajan Singh" + }, + { + "content": "It is not a lack of love, but a lack of friendship that makes unhappy marriages.", + "author": "Friedrich Nietzsche" + }, + { + "content": "A man's growth is seen in the successive choirs of his friends", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Never make friends with people who are above or below you in status. Such friendships will never give you any happiness.", + "author": "Chanakya" + }, + { + "content": "Be slow in choosing a friend, slower in changing.", + "author": "Benjamin Franklin" + }, + { + "content": "Friendship is a strong and habitual inclination in two persons to promote the good and happiness of one another.", + "author": "Eustace Budgell" + }, + { + "content": "Marriage: A friendship recognized by the police.", + "author": "Robert Louis Stevenson" + }, + { + "content": "What is necessary to change a person is to change his awareness of himself.", + "author": "Abraham Maslow" + }, + { + "content": "Peace cannot be kept by force. It can only be achieved by understanding.", + "author": "Albert Einstein" + }, + { + "content": "If you can't explain it simply, you don't understand it well enough.", + "author": "Albert Einstein" + }, + { + "content": "The first step to getting the things you want out of life is this: decide what you want.", + "author": "Ben Stein" + }, + { + "content": "Happiness comes when your work and words are of benefit to yourself and others.", + "author": "Buddha" + }, + { + "content": "Thousands of candles can be lighted from a single candle, and the life of the candle will not be shortened. Happiness never decreases by being shared.", + "author": "Buddha" + }, + { + "content": "An idea that is developed and put into action is more important than an idea that exists only as an idea.", + "author": "Buddha" + }, + { + "content": "How many cares one loses when one decides not to be something but to be someone.", + "author": "Coco Chanel" + }, + { + "content": "Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so.", + "author": "Douglas Adams" + }, + { + "content": "I cannot give you the formula for success, but I can give you the formula for failure: which is: Try to please everybody.", + "author": "Herbert Bayard Swope" + }, + { + "content": "Sadness flies away on the wings of time.", + "author": "Jean de La Fontaine" + }, + { + "content": "There are two kinds of failures: those who thought and never did, and those who did and never thought.", + "author": "Laurence J. Peter" + }, + { + "content": "Do not be too timid and squeamish about your reactions. All life is an experiment. The more experiments you make the better.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Only those who dare to fail greatly can ever achieve greatly.", + "author": "Robert F. Kennedy" + }, + { + "content": "Change your life today. Don't gamble on the future, act now, without delay.", + "author": "Simone de Beauvoir" + }, + { + "content": "Independence is happiness.", + "author": "Susan B. Anthony" + }, + { + "content": "There is nothing on this earth more to be prized than true friendship.", + "author": "Thomas Aquinas" + }, + { + "content": "What we think determines what happens to us, so if we want to change our lives, we need to stretch our minds.", + "author": "Wayne Dyer" + }, + { + "content": "Look up at the stars and not down at your feet. Try to make sense of what you see, and wonder about what makes the universe exist. Be curious.", + "author": "Stephen Hawking" + }, + { + "content": "People usually compare the computer to the head of the human being. I would say that hardware is the bone of the head, the skull. The semiconductor is the brain within the head. The software is the wisdom. And data is the knowledge.", + "author": "Masayoshi Son" + }, + { + "content": "The doors of wisdom are never shut.", + "author": "Benjamin Franklin" + }, + { + "content": "The strong bond of friendship is not always a balanced equation; friendship is not always about giving and taking in equal shares. Instead, friendship is grounded in a feeling that you know exactly who will be there for you when you need something, no matter what or when.", + "author": "Simon Sinek" + }, + { + "content": "Rare as is true love, true friendship is rarer.", + "author": "Jean de La Fontaine" + }, + { + "content": "When the solution is simple, God is answering.", + "author": "Albert Einstein" + }, + { + "content": "Blessed is the man who expects nothing, for he shall never be disappointed.", + "author": "Alexander Pope" + }, + { + "content": "The art of progress is to preserve order amid change, and to preserve change amid order.", + "author": "Alfred North Whitehead" + }, + { + "content": "Kind words do not cost much. Yet they accomplish much.", + "author": "Blaise Pascal" + }, + { + "content": "You can only grow if you're willing to feel awkward and uncomfortable when you try something new.", + "author": "Brian Tracy" + }, + { + "content": "Don't leave a stone unturned. It's always something, to know you have done the most you could.", + "author": "Charles Dickens" + }, + { + "content": "It does not matter how slowly you go as long as you do not stop.", + "author": "Confucius" + }, + { + "content": "Fine words and an insinuating appearance are seldom associated with true virtue", + "author": "Confucius" + }, + { + "content": "The superior man acts before he speaks, and afterwards speaks according to his action.", + "author": "Confucius" + }, + { + "content": "Reality does not conform to the ideal but confirms it.", + "author": "Gustave Flaubert" + }, + { + "content": "Things do not change; we change.", + "author": "Henry David Thoreau" + }, + { + "content": "A thing well said will be wit in all languages.", + "author": "John Dryden" + }, + { + "content": "I have an everyday religion that works for me. Love yourself first, and everything else falls into line.", + "author": "Lucille Ball" + }, + { + "content": "Decision is a risk rooted in the courage of being free.", + "author": "Paul Tillich" + }, + { + "content": "To make no mistakes is not in the power of man; but from their errors and mistakes the wise and good learn wisdom for the future.", + "author": "Plutarch" + }, + { + "_id": "z-hDjBf4spF-", + "content": "Make the most of yourself, for that is all there is of you.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Peace is not something you wish for. It's something you make, something you do, something you are, and something you give away.", + "author": "Robert Fulghum" + }, + { + "content": "We can change our lives. We can do, have, and be exactly what we wish.", + "author": "Tony Robbins" + }, + { + "content": "Your talent is God's gift to you. What you do with it is your gift back to God.", + "author": "Leo Buscaglia" + }, + { + "content": "True wisdom comes to each of us when we realize how little we understand about life, ourselves, and the world around us.", + "author": "Isocrates" + }, + { + "content": "Technological progress has merely provided us with more efficient means for going backwards.", + "author": "Aldous Huxley" + }, + { + "_id": "J-47k8g-i", + "content": "Love is a friendship set to music.", + "author": "Joseph Campbell" + }, + { + "author": "Woody Allen", + "content": "Interestingly, according to modern astronomers, space is finite. This is a very comforting thought-- particularly for people who can never remember where they have left things." + }, + { + "content": "All men have a sweetness in their life. That is what helps them go on. It is towards that they turn when they feel too worn out.", + "author": "Albert Camus" + }, + { + "content": "You will never be happy if you continue to search for what happiness consists of. You will never live if you are looking for the meaning of life.", + "author": "Albert Camus" + }, + { + "content": "Life is a gift, and it offers us the privilege, opportunity, and responsibility to give something back by becoming more", + "author": "Tony Robbins" + }, + { + "content": "Whatever we expect with confidence becomes our own self-fulfilling prophecy.", + "author": "Brian Tracy" + }, + { + "content": "The winds and waves are always on the side of the ablest navigators.", + "author": "Edward Gibbon" + }, + { + "content": "The wisest men follow their own direction.", + "author": "Euripides" + }, + { + "content": "When you reach the end of your rope, tie a knot in it and hang on.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "He who talks more is sooner exhausted.", + "author": "Laozi" + }, + { + "content": "Very little is needed to make a happy life; it is all within yourself, in your way of thinking.", + "author": "Marcus Aurelius" + }, + { + "content": "If you want a thing done well, do it yourself.", + "author": "Napoleon" + }, + { + "content": "The only journey is the one within.", + "author": "Rainer Maria Rilke" + }, + { + "content": "Good thoughts are no better than good dreams, unless they be executed.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Time changes everything except something within us which is always surprised by change.", + "author": "Thomas Hardy" + }, + { + "content": "The way we communicate with others and with ourselves ultimately determines the quality of our lives.", + "author": "Tony Robbins" + }, + { + "content": "When you discover your mission, you will feel its demand. It will fill you with enthusiasm and a burning desire to get to work on it.", + "author": "W. Clement Stone" + }, + { + "content": "Be great in act, as you have been in thought.", + "author": "William Shakespeare" + }, + { + "content": "I know where I'm going and I know the truth, and I don't have to be what you want me to be. I'm free to be what I want.", + "author": "Muhammad Ali" + }, + { + "content": "The older I get the more wisdom I find in the ancient rule of taking first things first. A process which often reduces the most complex human problem to a manageable proportion.", + "author": "Dwight D. Eisenhower" + }, + { + "content": "Between saying and doing, many a pair of shoes is worn out.", + "author": "Iris Murdoch" + }, + { + "content": "The real problem is not whether machines think but whether men do.", + "author": "B. F. Skinner" + }, + { + "content": "True happiness arises, in the first place, from the enjoyment of oneself, and in the next, from the friendship and conversation of a few select companions.", + "author": "Joseph Addison" + }, + { + "content": "Our most intimate friend is not he to whom we show the worst, but the best of our nature.", + "author": "Nathaniel Hawthorne" + }, + { + "content": "There is no friendship, no love, like that of the parent for the child.", + "author": "Henry Ward Beecher" + }, + { + "content": "Always bear in mind that your own resolution to succeed is more important than any one thing.", + "author": "Abraham Lincoln" + }, + { + "content": "Once we accept our limits, we go beyond them.", + "author": "Albert Einstein" + }, + { + "content": "Feeling and longing are the motive forces behind all human endeavor and human creations.", + "author": "Albert Einstein" + }, + { + "content": "We all live with the objective of being happy; our lives are all different and yet the same.", + "author": "Anne Frank" + }, + { + "content": "There is only one success: to be able to spend your life in your own way.", + "author": "Christopher Morley" + }, + { + "content": "When deeds and words are in accord, the whole world is transformed.", + "author": "Zhuang Zhou" + }, + { + "content": "If you are going to achieve excellence in big things, you develop the habit in little matters. Excellence is not an exception; it is a prevailing attitude.", + "author": "Colin Powell" + }, + { + "content": "Until you make peace with who you are, you'll never be content with what you have.", + "author": "Doris Mortman" + }, + { + "content": "Do what you can. Want what you have. Be who you are.", + "author": "Forrest Church" + }, + { + "content": "If you think you can, you can. And if you think you can't, you're right.", + "author": "Henry Ford" + }, + { + "content": "Silence is a source of great strength.", + "author": "Laozi" + }, + { + "content": "All difficult things have their origin in that which is easy, and great things in that which is small.", + "author": "Laozi" + }, + { + "content": "Always be smarter than the people who hire you.", + "author": "Lena Horne" + }, + { + "content": "Although there may be tragedy in your life, there's always a possibility to triumph. It doesn't matter who you are, where you come from. The ability to triumph begins with you. Always.", + "author": "Oprah Winfrey" + }, + { + "content": "Most of the shadows of life are caused by standing in our own sunshine.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The mark of your ignorance is the depth of your belief in injustice and tragedy. What the caterpillar calls the end of the world, the Master calls the butterfly.", + "author": "Richard Bach" + }, + { + "content": "All perceiving is also thinking, all reasoning is also intuition, all observation is also invention.", + "author": "Rudolf Arnheim" + }, + { + "content": "No one has a finer command of language than the person who keeps his mouth shut.", + "author": "Sam Rayburn" + }, + { + "content": "It is impossible to escape the impression that people commonly use false standards of measurement — that they seek power, success and wealth for themselves and admire them in others, and that they underestimate what is of true value in life.", + "author": "Sigmund Freud" + }, + { + "content": "It is time to remember that old wisdom our soldiers will never forget: that whether we are black or brown or white, we all bleed the same red blood of patriots, we all enjoy the same glorious freedoms, and we all salute the same great American Flag.", + "author": "Donald Trump" + }, + { + "content": "In dwelling, live close to the ground. In thinking, keep to the simple. In conflict, be fair and generous. In governing, don't try to control. In work, do what you enjoy. In family life, be completely present.", + "author": "Laozi" + }, + { + "content": "You've got to go out on a limb sometimes because that's where the fruit is.", + "author": "Will Rogers" + }, + { + "content": "Always be a first-rate version of yourself, instead of a second-rate version of somebody else.", + "author": "Judy Garland" + }, + { + "content": "Cleverness is not wisdom.", + "author": "Euripides" + }, + { + "content": "It is better to travel well than to arrive.", + "author": "Buddha" + }, + { + "content": "Nothing happens unless first we dream.", + "author": "Carl Sandburg" + }, + { + "content": "Every great advance in science has issued from a new audacity of the imagination.", + "author": "John Dewey" + }, + { + "content": "He who knows that enough is enough will always have enough.", + "author": "Laozi" + }, + { + "content": "Know that although in the eternal scheme of things you are small, you are also unique and irreplaceable, as are all your fellow humans everywhere in the world.", + "author": "Margaret Laurence" + }, + { + "content": "Change your thoughts and you change your world.", + "author": "Norman Vincent Peale" + }, + { + "content": "Always seek out the seed of triumph in every adversity.", + "author": "Og Mandino" + }, + { + "content": "Something opens our wings. Something makes boredom and hurt disappear. Someone fills the cup in front of us: We taste only sacredness.", + "author": "Rumi" + }, + { + "content": "We are Divine enough to ask and we are important enough to receive.", + "author": "Wayne Dyer" + }, + { + "content": "Just as treasures are uncovered from the earth, so virtue appears from good deeds, and wisdom appears from a pure and peaceful mind. To walk safely through the maze of human life, one needs the light of wisdom and the guidance of virtue.", + "author": "Buddha" + }, + { + "content": "Avoid having your ego so close to your position that when your position falls, your ego goes with it.", + "author": "Colin Powell" + }, + { + "content": "Wise men make more opportunities than they find.", + "author": "Francis Bacon" + }, + { + "content": "The key to wisdom is this - constant and frequent questioning, for by doubting we are led to question and by questioning we arrive at the truth.", + "author": "Peter Abelard" + }, + { + "content": "Vanity can easily overtake wisdom. It usually overtakes common sense.", + "author": "Julian Casablancas" + }, + { + "content": "Technology… the knack of so arranging the world that we don't have to experience it.", + "author": "Max Frisch" + }, + { + "content": "Be slow to fall into friendship; but when thou art in, continue firm and constant.", + "author": "Isocrates" + }, + { + "content": "One friend in a lifetime is much; two are many; three are hardly possible. Friendship needs a certain parallelism of life, a community of thought, a rivalry of aim.", + "author": "Brooks Adams" + }, + { + "content": "He has no enemies, but is intensely disliked by his friends.", + "author": "Oscar Wilde" + }, + { + "content": "If you live to be a hundred, I want to live to be a hundred minus one day, so I never have to live without you.", + "author": "A. A. Milne" + }, + { + "content": "A man should look for what is, and not for what he thinks should be.", + "author": "Albert Einstein" + }, + { + "content": "It is easier to live through someone else than to become complete yourself.", + "author": "Betty Friedan" + }, + { + "content": "To want to be what one can be is purpose in life.", + "author": "Cynthia Ozick" + }, + { + "content": "Compassion and happiness are not a sign of weakness but a sign of strength.", + "author": "Dalai Lama" + }, + { + "content": "Difficulties are things that show a person what they are.", + "author": "Epictetus" + }, + { + "content": "Practice yourself, for heaven's sake in little things, and then proceed to greater.", + "author": "Epictetus" + }, + { + "content": "A true friend is the most precious of all possessions and the one we take the least thought about acquiring.", + "author": "François de La Rochefoucauld" + }, + { + "content": "Think like a man of action; act like a man of thought.", + "author": "Henri Bergson" + }, + { + "content": "A leader or a man of action in a crisis almost always acts subconsciously and then thinks of the reasons for his action.", + "author": "Jawaharlal Nehru" + }, + { + "content": "Patience and perseverance have a magical effect before which difficulties disappear and obstacles vanish.", + "author": "John Adams" + }, + { + "content": "Yeah, we all shine on, like the moon, and the stars, and the sun.", + "author": "John Lennon" + }, + { + "content": "Intuition will tell the thinking mind where to look next.", + "author": "Jonas Salk" + }, + { + "content": "A little knowledge that acts is worth infinitely more than much knowledge that is idle.", + "author": "Kahlil Gibran" + }, + { + "content": "By letting it go it all gets done. The world is won by those who let it go. But when you try and try. The world is beyond the winning.", + "author": "Laozi" + }, + { + "content": "Bodily exercise, when compulsory, does no harm to the body; but knowledge which is acquired under compulsion obtains no hold on the mind.", + "author": "Plato" + }, + { + "_id": "tpmH-IxHDP-I", + "content": "Strong people make as many mistakes as weak people. Difference is that strong people admit their mistakes, laugh at them, learn from them. That is how they become strong.", + "author": "Richard Needham" + }, + { + "content": "The more light you allow within you, the brighter the world you live in will be.", + "author": "Shakti Gawain" + }, + { + "content": "Numberless are the worlds wonders, but none more wonderful than man.", + "author": "Sophocles" + }, + { + "content": "Opportunity is missed by most because it is dressed in overalls and looks like work.", + "author": "Thomas Edison" + }, + { + "content": "Fortune favors the brave.", + "author": "Virgil" + }, + { + "content": "Anything you really want, you can attain, if you really go after it.", + "author": "Wayne Dyer" + }, + { + "content": "Knowledge is of no value unless you put it into practice.", + "author": "Anton Chekhov" + }, + { + "content": "With pride, there are many curses. With humility, there come many blessings.", + "author": "Ezra Taft Benson" + }, + { + "content": "Never find fault with the absent.", + "author": "Alexander Pope" + }, + { + "content": "In action a great heart is the chief qualification. In work, a great head.", + "author": "Arthur Schopenhauer" + }, + { + "content": "Programs must be written for people to read, and only incidentally for machines to execute.", + "author": "Hal Abelson" + }, + { + "content": "Share your smile with the world. It's a symbol of friendship and peace.", + "author": "Christie Brinkley" + }, + { + "content": "I have learned that to be with those I like is enough.", + "author": "Walt Whitman" + }, + { + "content": "I think somehow, we learn who we really are and then live with that decision.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Wherever a man may happen to turn, whatever a man may undertake, he will always end up by returning to the path which nature has marked out for him.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Time you enjoyed wasting was not wasted.", + "author": "John Lennon" + }, + { + "content": "I believe in one thing only, the power of human will.", + "author": "Joseph Stalin" + }, + { + "content": "He who is contented is rich.", + "author": "Laozi" + }, + { + "content": "He who lives in harmony with himself lives in harmony with the universe.", + "author": "Marcus Aurelius" + }, + { + "content": "You really can change the world if you care enough.", + "author": "Marian Wright Edelman" + }, + { + "content": "The simplest things are often the truest.", + "author": "Richard Bach" + }, + { + "content": "Don't turn away from possible futures before you're certain you don't have anything to learn from them.", + "author": "Richard Bach" + }, + { + "content": "The pessimist complains about the wind; the optimist expects it to change; the realist adjusts the sails.", + "author": "William Arthur Ward" + }, + { + "content": "The price of greatness is responsibility.", + "author": "Winston Churchill" + }, + { + "content": "Neither a lofty degree of intelligence nor imagination nor both together go to the making of genius. Love, love, love, that is the soul of genius.", + "author": "Wolfgang Amadeus Mozart" + }, + { + "content": "He who learns must suffer. And even in our sleep pain that cannot forget falls drop by drop upon the heart, and in our own despair, against our will, comes wisdom to us by the awful grace of God.", + "author": "Aeschylus" + }, + { + "content": "The wisdom of the wise, and the experience of ages, may be preserved by quotation.", + "author": "Isaac D'Israeli" + }, + { + "content": "You always have two choices: your commitment versus your fear.", + "author": "Sammy Davis Jr." + }, + { + "content": "Friendship improves happiness and abates misery, by the doubling of our joy and the dividing of our grief.", + "author": "Cicero" + }, + { + "content": "Let there be no purpose in friendship save the deepening of the spirit.", + "author": "Kahlil Gibran" + }, + { + "content": "I believe that a simple and unassuming manner of life is best for everyone, best both for the body and the mind.", + "author": "Albert Einstein" + }, + { + "content": "If one way be better than another, that you may be sure is nature's way.", + "author": "Aristotle" + }, + { + "content": "Yesterday I dared to struggle. Today I dare to win.", + "author": "Bernadette Devlin" + }, + { + "content": "I will not be concerned at other men's not knowing me; I will be concerned at my own want of ability.", + "author": "Confucius" + }, + { + "content": "Real success is finding your lifework in the work that you love.", + "author": "David McCullough" + }, + { + "content": "Happiness cannot be travelled to, owned, earned, worn or consumed. Happiness is the spiritual experience of living every minute with love, grace and gratitude.", + "author": "Denis Waitley" + }, + { + "content": "It is not uncommon for people to spend their whole life waiting to start living.", + "author": "Eckhart Tolle" + }, + { + "content": "Nature gave us one tongue and two ears so we could hear twice as much as we speak.", + "author": "Epictetus" + }, + { + "content": "It is very easy to forgive others their mistakes; it takes more grit to forgive them for having witnessed your own.", + "author": "Jessamyn West" + }, + { + "content": "Love yourself first and everything else falls into line. You really have to love yourself to get anything done in this world.", + "author": "Lucille Ball" + }, + { + "content": "The weak can never forgive. Forgiveness is the attribute of the strong.", + "author": "Mahatma Gandhi" + }, + { + "content": "If you can't feed a hundred people, then feed just one.", + "author": "Mother Teresa" + }, + { + "content": "Love is the master key that opens the gates of happiness.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Follow effective action with quiet reflection. From the quiet reflection will come even more effective action.", + "author": "Peter Drucker" + }, + { + "content": "You have to believe in yourself.", + "author": "Sun Tzu" + }, + { + "content": "The path to success is to take massive, determined action.", + "author": "Tony Robbins" + }, + { + "content": "We never live; we are always in the expectation of living.", + "author": "Voltaire" + }, + { + "content": "Hope arouses, as nothing else can arouse, a passion for the possible.", + "author": "William Sloane Coffin" + }, + { + "content": "Be Impeccable with Your Word. Speak with integrity. Say only what you mean. Avoid using the word to speak against yourself or to gossip about others. Use the power of your word in the direction of truth and love.", + "author": "Don Miguel Ruiz" + }, + { + "content": "The time to repair the roof is when the sun is shining.", + "author": "John F. Kennedy" + }, + { + "content": "Wise kings generally have wise counselors; and he must be a wise man himself who is capable of distinguishing one.", + "author": "Diogenes" + }, + { + "content": "I know that inner wisdom is more precious than wealth. The more you spend it, the more you gain.", + "author": "Oprah Winfrey" + }, + { + "content": "The extreme limit of wisdom, that's what the public calls madness.", + "author": "Jean Cocteau" + }, + { + "content": "Life has no blessing like a prudent friend.", + "author": "Euripides" + }, + { + "content": "Great ideas often receive violent opposition from mediocre minds.", + "author": "Albert Einstein" + }, + { + "content": "Your worst enemy cannot harm you as much as your own unguarded thoughts.", + "author": "Buddha" + }, + { + "content": "Your vision will become clear only when you look into your heart. Who looks outside, dreams. Who looks inside, awakens.", + "author": "Carl Jung" + }, + { + "content": "Happiness is not something ready-made. It comes from your own actions.", + "author": "Dalai Lama" + }, + { + "content": "Until you make peace with who you are, you will never be content with what you have.", + "author": "Doris Mortman" + }, + { + "content": "There is nothing permanent except change.", + "author": "Heraclitus" + }, + { + "content": "Believe deep down in your heart that you're destined to do great things.", + "author": "Joe Paterno" + }, + { + "content": "You're not obligated to win. You're obligated to keep trying to do the best you can every day.", + "author": "Marian Wright Edelman" + }, + { + "content": "To fly, we have to have resistance.", + "author": "Maya Lin" + }, + { + "content": "A man may fulfil the object of his existence by asking a question he cannot answer and attempting a task he cannot achieve.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Write your plans in pencil and give God the eraser.", + "author": "Paulo Coelho" + }, + { + "_id": "hv83OL-O-fTP", + "content": "It is only when the mind and character slumber that the dress can be seen.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The first requisite for success is the ability to apply your physical and mental energies to one problem incessantly without growing weary.", + "author": "Thomas Edison" + }, + { + "content": "We can only be said to be alive in those moments when our hearts are conscious of our treasures.", + "author": "Thornton Wilder" + }, + { + "content": "Your mind will answer most questions if you learn to relax and wait for the answer.", + "author": "William Burroughs" + }, + { + "content": "To climb steep hills requires a slow pace at first.", + "author": "William Shakespeare" + }, + { + "content": "And I love that even in the toughest moments, when we're all sweating it - when we're worried that the bill won't pass, and it seems like all is lost - Barack never lets himself get distracted by the chatter and the noise. Just like his grandmother, he just keeps getting up and moving forward... with patience and wisdom, and courage and grace.", + "author": "Michelle Obama" + }, + { + "content": "Always keep an open mind and a compassionate heart.", + "author": "Phil Jackson" + }, + { + "content": "There are three classes of men; lovers of wisdom, lovers of honor, and lovers of gain.", + "author": "Plato" + }, + { + "content": "Each friend represents a world in us, a world not born until they arrive, and it is only by this meeting that a new world is born.", + "author": "Anaïs Nin" + }, + { + "content": "Acquaintances we meet, enjoy, and can easily leave behind; but friendship grows deep roots.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "I want my friend to miss me as long as I miss him.", + "author": "Augustine of Hippo" + }, + { + "content": "You have to do your own growing no matter how tall your grandfather was.", + "author": "Abraham Lincoln" + }, + { + "content": "Learn from yesterday, live for today, hope for tomorrow.", + "author": "Albert Einstein" + }, + { + "content": "To accomplish great things, we must not only act, but also dream; not only plan, but also believe.", + "author": "Anatole France" + }, + { + "content": "We know the truth, not only by the reason, but by the heart.", + "author": "Blaise Pascal" + }, + { + "content": "Do not dwell in the past, do not dream of the future, concentrate the mind on the present moment.", + "author": "Buddha" + }, + { + "content": "I endeavor to be wise when I cannot be merry, easy when I cannot be glad, content with what cannot be mended and patient when there is no redress.", + "author": "Elizabeth Montagu" + }, + { + "content": "Our kindness may be the most persuasive argument for that which we believe.", + "author": "Gordon Hinckley" + }, + { + "content": "The smallest flower is a thought, a life answering to some feature of the Great Whole, of whom they have a persistent intuition.", + "author": "Honoré de Balzac" + }, + { + "content": "We never understand how little we need in this world until we know the loss of it.", + "author": "J. M. Barrie" + }, + { + "content": "If you have knowledge, let others light their candles in it.", + "author": "Margaret Fuller" + }, + { + "content": "If you don't like something, change it. If you can't change it, change your attitude.", + "author": "Maya Angelou" + }, + { + "content": "Always do your best. What you plant now, you will harvest later.", + "author": "Og Mandino" + }, + { + "content": "Meaning is not what you start with but what you end up with.", + "author": "Peter Elbow" + }, + { + "content": "To fly as fast as thought, you must begin by knowing that you have already arrived.", + "author": "Richard Bach" + }, + { + "_id": "lcNcja--RmXG", + "content": "There is no scarcity of opportunity to make a living at what you love; there's only scarcity of resolve to make it happen.", + "author": "Wayne Dyer" + }, + { + "content": "When in doubt, don't.", + "author": "Benjamin Franklin" + }, + { + "content": "As you walk in God's divine wisdom, you will surely begin to see a greater measure of victory and good success in your life.", + "author": "Joseph Prince" + }, + { + "content": "Wisdom is the power to put our time and our knowledge to the proper use.", + "author": "Thomas J. Watson" + }, + { + "content": "Even youngish men can acquire wisdom as time goes by.", + "author": "John Bercow" + }, + { + "content": "A friend is one who knows you and loves you just the same.", + "author": "Elbert Hubbard" + }, + { + "content": "No distance of place or lapse of time can lessen the friendship of those who are thoroughly persuaded of each other's worth.", + "author": "Robert Southey" + }, + { + "content": "Give me six hours to chop down a tree and I will spend the first four sharpening the axe.", + "author": "Abraham Lincoln" + }, + { + "content": "All our talents increase in the using, and every faculty, both good and bad, strengthen by exercise.", + "author": "Anne Brontë" + }, + { + "content": "The grand essentials of happiness are: something to do, something to love, and something to hope for.", + "author": "Alexander Chalmers" + }, + { + "content": "Do not mind anything that anyone tells you about anyone else. Judge everyone and everything for yourself.", + "author": "Henry James" + }, + { + "content": "Begin, be bold, and venture to be wise.", + "author": "Horace" + }, + { + "content": "To listen well is as powerful a means of communication and influence as to talk well.", + "author": "John Marshall" + }, + { + "content": "At the center of your being, you have the answer; you know who you are, and you know what you want.", + "author": "Laozi" + }, + { + "content": "Love isn't something you find. Love is something that finds you.", + "author": "Loretta Young" + }, + { + "content": "Our greatness lies not so much in being able to remake the world as being able to remake ourselves.", + "author": "Mahatma Gandhi" + }, + { + "content": "There are basically two types of people. People who accomplish things, and people who claim to have accomplished things. The first group is less crowded.", + "author": "Mark Twain" + }, + { + "content": "I don't believe in failure. It's not failure if you enjoyed the process.", + "author": "Oprah Winfrey" + }, + { + "content": "The pain passes, but the beauty remains.", + "author": "Pierre-Auguste Renoir" + }, + { + "content": "You are always free to change your mind and choose a different future, or a different past.", + "author": "Richard Bach" + }, + { + "content": "Sooner or later, those who win are those who think they can.", + "author": "Richard Bach" + }, + { + "content": "What is new in the world? Nothing. What is old in the world? Nothing. Everything has always been and will always be.", + "author": "Sai Baba" + }, + { + "content": "Never tell people how to do things. Tell them what to do and they will surprise you with their ingenuity.", + "author": "George S. Patton" + }, + { + "content": "People don't notice whether it's winter or summer when they're happy.", + "author": "Anton Chekhov" + }, + { + "content": "I am not the first Buddha who came upon Earth, nor shall I be the last. In due time, another Buddha will arise in the world - a Holy One, a supremely enlightened One, endowed with wisdom in conduct, auspicious, knowing the universe, an incomparable leader of men, a master of angels and mortals.", + "author": "Buddha" + }, + { + "content": "I had three chairs in my house; one for solitude, two for friendship, three for society.", + "author": "Henry David Thoreau" + }, + { + "content": "Friendship is also about liking a person for their failings, their weakness. It's also about mutual help, not about exploitation.", + "author": "Paul Theroux" + }, + { + "content": "It may happen sometimes that a long debate becomes the cause of a longer friendship. Commonly, those who dispute with one another at last agree.", + "author": "Elbert Hubbard" + }, + { + "content": "An optimist is a person who sees a green light everywhere, while the pessimist sees only the red spotlight... The truly wise person is color-blind.", + "author": "Albert Schweitzer" + }, + { + "content": "There are only two mistakes one can make along the road to truth; not going all the way, and not starting.", + "author": "Buddha" + }, + { + "content": "Every man is a volume if you know how to read him.", + "author": "William Ellery Channing" + }, + { + "content": "To be wrong is nothing unless you continue to remember it.", + "author": "Confucius" + }, + { + "content": "Love and compassion open our own inner life, reducing stress, distrust and loneliness.", + "author": "Dalai Lama" + }, + { + "content": "By going beyond your own problems and taking care of others, you gain inner strength, self-confidence, courage, and a greater sense of calm.", + "author": "Dalai Lama" + }, + { + "content": "The universe is transformation; our life is what our thoughts make it.", + "author": "Marcus Aurelius" + }, + { + "content": "If you accept the expectations of others, especially negative ones, then you never will change the outcome.", + "author": "Michael Jordan" + }, + { + "content": "If you want things to be different, perhaps the answer is to become different yourself.", + "author": "Norman Vincent Peale" + }, + { + "content": "Nothing is at last sacred but the integrity of your own mind.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Belief consists in accepting the affirmations of the soul; Unbelief, in denying them.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "It is not in the stars to hold our destiny but in ourselves.", + "author": "William Shakespeare" + }, + { + "content": "In every walk with nature, one receives far more than he seeks.", + "author": "John Muir" + }, + { + "content": "We should not judge people by their peak of excellence; but by the distance they have traveled from the point where they started.", + "author": "Henry Ward Beecher" + }, + { + "_id": "B76--SMLkD", + "content": "Excellence, then, is a state concerned with choice, lying in a mean, relative to us, this being determined by reason and in the way in which the man of practical wisdom would determine it.", + "author": "Aristotle" + }, + { + "content": "Technology made large populations possible; large populations now make technology indispensable.", + "author": "Joseph Wood Krutch" + }, + { + "content": "It is more shameful to distrust our friends than to be deceived by them.", + "author": "Confucius" + }, + { + "content": "Reality is merely an illusion, albeit a very persistent one.", + "author": "Albert Einstein" + }, + { + "content": "The greatest good you can do for another is not just share your riches but reveal to them their own.", + "author": "Benjamin Disraeli" + }, + { + "content": "Our passion is our strength.", + "author": "Billie Armstrong" + }, + { + "content": "No day in which you learn something is a complete loss.", + "author": "David Eddings" + }, + { + "content": "He that respects himself is safe from others; he wears a coat of mail that none can pierce.", + "author": "Henry Wadsworth Longfellow" + }, + { + "content": "Make it a rule of life never to regret and never to look back. Regret is an appalling waste of energy; you can't build on it; it's only for wallowing in.", + "author": "Katherine Mansfield" + }, + { + "content": "He who conquers others is strong; He who conquers himself is mighty.", + "author": "Laozi" + }, + { + "content": "Nothing in life is to be feared. It is only to be understood.", + "author": "Marie Curie" + }, + { + "content": "To do all that one is able to do, is to be a man; to do all that one would like to do, is to be a god.", + "author": "Napoleon" + }, + { + "content": "I will love the light for it shows me the way, yet I will endure the darkness because it shows me the stars.", + "author": "Og Mandino" + }, + { + "content": "Take rest; a field that has rested gives a bountiful crop.", + "author": "Ovid" + }, + { + "content": "Know how to listen, and you will profit even from those who talk badly.", + "author": "Plutarch" + }, + { + "content": "Life is not a problem to be solved, but a reality to be experienced.", + "author": "Søren Kierkegaard" + }, + { + "content": "To go against the dominant thinking of your friends, of most of the people you see every day, is perhaps the most difficult act of heroism you can perform.", + "author": "Theodore H. White" + }, + { + "content": "I have not failed. I've just found 10,000 ways that won't work.", + "author": "Thomas Edison" + }, + { + "content": "Just as much as we see in others, we have in ourselves.", + "author": "William Hazlitt" + }, + { + "content": "We know what we are but know not what we may be.", + "author": "William Shakespeare" + }, + { + "content": "As a technology, the book is like a hammer. That is to say, it is perfect: a tool ideally suited to its task. Hammers can be tweaked and varied but will never go obsolete. Even when builders pound nails by the thousand with pneumatic nail guns, every household needs a hammer.", + "author": "James Gleick" + }, + { + "content": "Friendship is almost always the union of a part of one mind with the part of another; people are friends in spots.", + "author": "George Santayana" + }, + { + "content": "The only real valuable thing is intuition.", + "author": "Albert Einstein" + }, + { + "content": "They say that time changes things, but you actually have to change them yourself.", + "author": "Andy Warhol" + }, + { + "content": "Remember that sometimes not getting what you want is a wonderful stroke of luck.", + "author": "Dalai Lama" + }, + { + "content": "Fear grows in darkness; if you think there's a bogeyman around, turn on the light.", + "author": "Dorothy Thompson" + }, + { + "content": "Freedom is the right to live as we wish.", + "author": "Epictetus" + }, + { + "content": "The only limit to our realization of tomorrow will be our doubts of today.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "Let us resolve to be masters, not the victims, of our history, controlling our own destiny without giving way to blind suspicions and emotions.", + "author": "John F. Kennedy" + }, + { + "content": "If it is not right do not do it; if it is not true do not say it.", + "author": "Marcus Aurelius" + }, + { + "content": "The purpose of learning is growth, and our minds, unlike our bodies, can continue growing as we continue to live.", + "author": "Mortimer J. Adler" + }, + { + "content": "A goal is a dream with a deadline.", + "author": "Napoleon Hill" + }, + { + "content": "Do not waste yourself in rejection, nor bark against the bad, but chant the beauty of the good.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "When we feel love and kindness toward others, it not only makes others feel loved and cared for, but it helps us also to develop inner happiness and peace.", + "author": "Dalai Lama" + }, + { + "content": "Do not be embarrassed by your mistakes. Nothing can teach us better than our understanding of them. This is one of the best ways of self-education.", + "author": "Thomas Carlyle" + }, + { + "content": "We've got to have a dream if we are going to make a dream come true.", + "author": "Walt Disney" + }, + { + "content": "Discipline is the bridge between goals and accomplishment.", + "author": "Jim Rohn" + }, + { + "content": "Talent is God given. Be humble. Fame is man-given. Be grateful. Conceit is self-given. Be careful.", + "author": "John Wooden" + }, + { + "content": "Pain and foolishness lead to great bliss and complete knowledge, for Eternal Wisdom created nothing under the sun in vain.", + "author": "Kahlil Gibran" + }, + { + "content": "Everyone in the world ought to do the things for which he is specially adapted. It is the part of wisdom to recognize what each one of us is best fitted for, and it is the part of education to perfect and utilize such predispositions. Because education can direct and aid nature but can never transform her.", + "author": "Maria Montessori" + }, + { + "content": "Wisdom is nothing but a preparation of the soul, a capacity, a secret art of thinking, feeling and breathing thoughts of unity at every moment of life.", + "author": "Hermann Hesse" + }, + { + "content": "Wisdom alone is the science of other sciences.", + "author": "Plato" + }, + { + "content": "It is good even for old men to learn wisdom.", + "author": "Aeschylus" + }, + { + "content": "It has become appallingly obvious that our technology has exceeded our humanity.", + "author": "Albert Einstein" + }, + { + "content": "True friendship ought never to conceal what it thinks.", + "author": "Jerome" + }, + { + "content": "One's friends are that part of the human race with which one can be human.", + "author": "George Santayana" + }, + { + "content": "You learn to speak by speaking, to study by studying, to run by running, to work by working; in just the same way, you learn to love by loving.", + "author": "Anatole France" + }, + { + "content": "The energy of the mind is the essence of life.", + "author": "Aristotle" + }, + { + "content": "Chaos is inherent in all compounded things. Strive on with diligence.", + "author": "Buddha" + }, + { + "content": "I love my past. I love my present. I'm not ashamed of what I've had, and I'm not sad because I have it no longer.", + "author": "Colette" + }, + { + "content": "The person who lives life fully, glowing with life's energy, is the person who lives a successful life.", + "author": "Daisaku Ikeda" + }, + { + "content": "A dream is your creative vision for your life in the future. You must break out of your current comfort zone and become comfortable with the unfamiliar and the unknown.", + "author": "Denis Waitley" + }, + { + "content": "Sometimes the most important thing in a whole day is the rest we take between two deep breaths.", + "author": "Etty Hillesum" + }, + { + "content": "An ounce of emotion is equal to a ton of facts.", + "author": "John Junor" + }, + { + "content": "Appreciation can make a day, even change a life. Your willingness to put it into words is all that is necessary.", + "author": "Margaret Cousins" + }, + { + "content": "Chance is always powerful. Let your hook be always cast; in the pool where you least expect it, there will be a fish.", + "author": "Ovid" + }, + { + "content": "In skating over thin ice our safety is in our speed.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Let go of your attachment to being right, and suddenly your mind is more open. You're able to benefit from the unique viewpoints of others, without being crippled by your own judgement.", + "author": "Ralph Marston" + }, + { + "content": "Let the beauty of what you love be what you do.", + "author": "Rumi" + }, + { + "content": "Democracy's premise rests on the notion that the collective wisdom of the majority will prove right more often than it's wrong; that given sufficient opportunity in the pursuit of happiness, your population will develop its talents, its intellect, its better judgment; that over time its capacity for discernment and self-correction will be enlarged.", + "author": "Ben Fountain" + }, + { + "content": "Life is a travelling to the edge of knowledge, then a leap taken.", + "author": "Laurence J. Peter" + }, + { + "content": "Tragedy is a tool for the living to gain wisdom, not a guide by which to live.", + "author": "Robert F. Kennedy" + }, + { + "content": "The virtue of justice consists in moderation, as regulated by wisdom.", + "author": "Aristotle" + }, + { + "content": "Remember that the most valuable antiques are dear old friends.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "Remember that a gesture of friendship, no matter how small, is always appreciated.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "Joy is the best makeup.", + "author": "Anne Lamott" + }, + { + "content": "If one is estranged from oneself, then one is estranged from others too. If one is out of touch with oneself, then one cannot touch others.", + "author": "Anne Lindbergh" + }, + { + "content": "We are what we repeatedly do. Excellence, then, is not an act, but a habit.", + "author": "Aristotle" + }, + { + "content": "The least movement is of importance to all nature. The entire ocean is affected by a pebble.", + "author": "Blaise Pascal" + }, + { + "content": "Goals are the fuel in the furnace of achievement.", + "author": "Brian Tracy" + }, + { + "content": "Mistakes are always forgivable, if one has the courage to admit them.", + "author": "Bruce Lee" + }, + { + "content": "The highest stage in moral culture at which we can arrive is when we recognize that we ought to control our thoughts.", + "author": "Charles Darwin" + }, + { + "content": "Life is really simple, but we insist on making it complicated.", + "author": "Confucius" + }, + { + "content": "People take different roads seeking fulfilment and happiness. Just because they're not on your road doesn't mean they've gotten lost.", + "author": "Dalai Lama" + }, + { + "content": "Great minds discuss ideas; average minds discuss events; small minds discuss people.", + "author": "Eleanor Roosevelt" + }, + { + "_id": "pOAcy5-yW-3", + "content": "A prudent question is one half of wisdom.", + "author": "Francis Bacon" + }, + { + "content": "The possibilities are numerous once we decide to act and not react.", + "author": "George Bernard Shaw" + }, + { + "content": "Myths which are believed in tend to become true.", + "author": "George Orwell" + }, + { + "content": "It is far better to be alone, than to be in bad company.", + "author": "George Washington" + }, + { + "content": "Don't compromise yourself. You are all you've got.", + "author": "Janis Joplin" + }, + { + "content": "Give a man a fish and you feed him for a day. Teach him how to fish and you feed him for a lifetime.", + "author": "Laozi" + }, + { + "content": "Happiness is found in doing, not merely possessing.", + "author": "Napoleon Hill" + }, + { + "content": "The biggest adventure you can ever take is to live the life of your dreams.", + "author": "Oprah Winfrey" + }, + { + "content": "It isn't what happens to us that causes us to suffer; it's what we say to ourselves about what happens.", + "author": "Pema Chödrön" + }, + { + "content": "There is nothing so useless as doing efficiently that which should not be done at all.", + "author": "Peter Drucker" + }, + { + "content": "Go put your creed into the deed. Nor speak with double tongue.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "To be what we are, and to become what we are capable of becoming, is the only end of life.", + "author": "Robert Louis Stevenson" + }, + { + "content": "Setting goals is the first step in turning the invisible into the visible.", + "author": "Tony Robbins" + }, + { + "content": "The deepest craving of human nature is the need to be appreciated.", + "author": "William James" + }, + { + "content": "Positive thinking will let you do everything better than negative thinking will.", + "author": "Zig Ziglar" + }, + { + "content": "Quick decisions are unsafe decisions.", + "author": "Sophocles" + }, + { + "content": "Always keep your mind as bright and clear as the vast sky, the great ocean, and the highest peak, empty of all thoughts. Always keep your body filled with light and heat. Fill yourself with the power of wisdom and enlightenment.", + "author": "Morihei Ueshiba" + }, + { + "content": "Commitment is an act, not a word.", + "author": "Jean-Paul Sartre" + }, + { + "content": "I look forward to a great future for America - a future in which our country will match its military strength with our moral restraint, its wealth with our wisdom, its power with our purpose.", + "author": "John F. Kennedy" + }, + { + "content": "A heart well prepared for adversity in bad times hopes, and in good times fears for a change in fortune.", + "author": "Horace" + }, + { + "content": "Friendship is essentially a partnership.", + "author": "Aristotle" + }, + { + "author": "Woody Allen", + "content": "It seemed the world was divided into good and bad people. The good ones slept better... while the bad ones seemed to enjoy the waking hours much more." + }, + { + "_id": "w3Rpf-oD-QF", + "content": "I never think of the future. It comes soon enough.", + "author": "Albert Einstein" + }, + { + "content": "Moral excellence comes about as a result of habit. We become just by doing just acts, temperate by doing temperate acts, brave by doing brave acts.", + "author": "Aristotle" + }, + { + "content": "All I can say about life is, Oh God, enjoy it!", + "author": "Bob Newhart" + }, + { + "content": "He is able who thinks he is able.", + "author": "Buddha" + }, + { + "content": "If you light a lamp for somebody, it will also brighten your path.", + "author": "Buddha" + }, + { + "_id": "lEjcF-a2-Z5w", + "content": "Sincerity is the way of Heaven. The attainment of sincerity is the way of men.", + "author": "Confucius" + }, + { + "content": "There is only one way to happiness and that is to cease worrying about things which are beyond the power of our will.", + "author": "Epictetus" + }, + { + "content": "Adversity has the effect of eliciting talents, which in prosperous circumstances would have lain dormant.", + "author": "Horace" + }, + { + "content": "All our knowledge begins with the senses, proceeds then to the understanding, and ends with reason. There is nothing higher than reason.", + "author": "Immanuel Kant" + }, + { + "content": "Good timber does not grow with ease; the stronger the wind, the stronger the trees.", + "author": "J. Willard Marriott" + }, + { + "content": "Nothing could be worse than the fear that one had given up too soon and left one unexpended effort that might have saved the world.", + "author": "Jane Addams" + }, + { + "content": "Never mistake activity for achievement.", + "author": "John Wooden" + }, + { + "content": "Nothing is softer or more flexible than water, yet nothing can resist it.", + "author": "Laozi" + }, + { + "content": "The power of intuitive understanding will protect you from harm until the end of your days.", + "author": "Laozi" + }, + { + "content": "Always remember that you are absolutely unique. Just like everyone else.", + "author": "Margaret Mead" + }, + { + "content": "When you learn, teach. When you get, give.", + "author": "Maya Angelou" + }, + { + "content": "The beginning of wisdom is found in doubting; by doubting we come to the question, and by seeking we may come upon the truth.", + "author": "Peter Abelard" + }, + { + "content": "Lose an hour in the morning, and you will spend all day looking for it.", + "author": "Richard Whately" + }, + { + "content": "Let yourself be silently drawn by the stronger pull of what you really love.", + "author": "Rumi" + }, + { + "content": "Work for something because it is good, not just because it stands a chance to succeed.", + "author": "Václav Havel" + }, + { + "content": "Nothing diminishes anxiety faster than action.", + "author": "Walter Inglis Anderson" + }, + { + "content": "Remember that failure is an event, not a person.", + "author": "Zig Ziglar" + }, + { + "content": "Start where you are. Use what you have. Do what you can.", + "author": "Arthur Ashe" + }, + { + "content": "To profit from good advice requires more wisdom than to give it.", + "author": "Wilson Mizner" + }, + { + "content": "The most technologically efficient machine that man has ever invented is the book.", + "author": "Northrop Frye" + }, + { + "content": "The language of friendship is not words but meanings.", + "author": "Henry David Thoreau" + }, + { + "content": "A true friend is one who overlooks your failures and tolerates your success!", + "author": "Doug Larson" + }, + { + "content": "A passion for politics stems usually from an insatiable need, either for power, or for friendship and adulation, or a combination of both.", + "author": "Fawn M. Brodie" + }, + { + "author": "Woody Allen", + "content": "Eternal nothingness is fine if you happen to be dressed for it." + }, + { + "author": "Abraham Lincoln", + "content": "I will prepare and someday my chance will come." + }, + { + "content": "All great men are gifted with intuition. They know without reasoning or analysis, what they need to know.", + "author": "Alexis Carrel" + }, + { + "content": "The foot feels the foot when it feels the ground.", + "author": "Buddha" + }, + { + "content": "Knowledge rests not upon truth alone, but upon error also.", + "author": "Carl Jung" + }, + { + "content": "Wisdom is the reward you get for a lifetime of listening when you'd have preferred to talk.", + "author": "Doug Larson" + }, + { + "_id": "WLJJ_y-H-sH0", + "content": "He is a wise man who does not grieve for the things which he has not but rejoices for those which he has.", + "author": "Epictetus" + }, + { + "content": "All is flux; nothing stays still.", + "author": "Heraclitus" + }, + { + "content": "Time you enjoy wasting, was not wasted.", + "author": "John Lennon" + }, + { + "content": "The world has the habit of making room for the man whose actions show that he knows where he is going.", + "author": "Napoleon Hill" + }, + { + "content": "Life is a succession of lessons, which must be lived to be understood.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Creativity comes from trust. Trust your instincts. And never hope more than you work.", + "author": "Rita Mae Brown" + }, + { + "content": "Instead of saying that man is the creature of circumstance, it would be nearer the mark to say that man is the architect of circumstance.", + "author": "Thomas Carlyle" + }, + { + "content": "Yesterday is history, tomorrow is a mystery, today is God's gift, that's why we call it the present.", + "author": "Joan Rivers" + }, + { + "content": "A monarchy conducted with infinite wisdom and infinite benevolence is the most perfect of all possible governments.", + "author": "Ezra Stiles" + }, + { + "content": "Wisdom often times consists of knowing what to do next.", + "author": "Herbert Hoover" + }, + { + "content": "It's supposed to be automatic, but actually you have to push this button.", + "author": "John Brunner" + }, + { + "content": "Experts on romance say for a happy marriage there has to be more than a passionate love. For a lasting union, they insist, there must be a genuine liking for each other. Which, in my book, is a good definition for friendship.", + "author": "Marilyn Monroe" + }, + { + "author": "William Shakespeare", + "content": "Action is eloquence." + }, + { + "content": "Never apologize for showing feeling. When you do so, you apologize for truth.", + "author": "Benjamin Disraeli" + }, + { + "content": "One fails forward toward success.", + "author": "Charles F. Kettering" + }, + { + "content": "If only wed stop trying to be happy wed have a pretty good time.", + "author": "Edith Wharton" + }, + { + "content": "When you are offended at any man's fault, turn to yourself and study your own failings. Then you will forget your anger.", + "author": "Epictetus" + }, + { + "content": "All truths are easy to understand once they are discovered; the point is to discover them.", + "author": "Galileo Galilei" + }, + { + "content": "There is only one happiness in life, to love and be loved.", + "author": "George Sand" + }, + { + "content": "Without some goals and some efforts to reach it, no man can live.", + "author": "John Dewey" + }, + { + "content": "A day of worry is more exhausting than a day of work.", + "author": "John Lubbock" + }, + { + "content": "I have been impressed with the urgency of doing. Knowing is not enough; we must apply. Being willing is not enough; we must do.", + "author": "Leonardo da Vinci" + }, + { + "content": "I'm not afraid of storms, for I'm learning how to sail my ship.", + "author": "Louisa May Alcott" + }, + { + "_id": "OG9-EbvEi-v", + "content": "We must become the change we want to see.", + "author": "Mahatma Gandhi" + }, + { + "content": "The best thing in every noble dream is the dreamer...", + "author": "Moncure D. Conway" + }, + { + "content": "The ladder of success is never crowded at the top.", + "author": "Napoleon Hill" + }, + { + "content": "Experience is simply the name we give our mistakes.", + "author": "Oscar Wilde" + }, + { + "content": "The best way to predict your future is to create it.", + "author": "Peter Drucker" + }, + { + "content": "The greatest remedy for anger is delay.", + "author": "Seneca the Younger" + }, + { + "content": "Ignorant men don't know what good they hold in their hands until they've flung it away.", + "author": "Sophocles" + }, + { + "content": "We must overcome the notion that we must be regular. It robs you of the chance to be extraordinary and leads you to the mediocre.", + "author": "Uta Hagen" + }, + { + "content": "The greatest discovery of our generation is that human beings can alter their lives by altering their attitudes of mind. As you think, so shall you be.", + "author": "William James" + }, + { + "content": "Think as a wise man but communicate in the language of the people.", + "author": "William Butler Yeats" + }, + { + "content": "We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.", + "author": "Swami Vivekananda" + }, + { + "content": "Without freedom of thought, there can be no such thing as wisdom - and no such thing as public liberty without freedom of speech.", + "author": "Benjamin Franklin" + }, + { + "content": "Friendship may, and often does, grow into love, but love never subsides into friendship.", + "author": "Lord Byron" + }, + { + "author": "Woody Allen", + "content": "I took a speed-reading course and read 'War and Peace' in twenty minutes. It involves Russia." + }, + { + "_id": "Dg-s-e2zAXKs", + "content": "One who gains strength by overcoming obstacles possesses the only strength which can overcome adversity.", + "author": "Albert Schweitzer" + }, + { + "content": "Wherever a man turns he can find someone who needs him.", + "author": "Albert Schweitzer" + }, + { + "content": "It is only with the heart that one can see rightly, what is essential is invisible to the eye.", + "author": "Antoine de Saint-Exupéry" + }, + { + "content": "Excellence is to do a common thing in an uncommon way.", + "author": "Booker T. Washington" + }, + { + "content": "There is never enough time to do everything, but there is always enough time to do the most important thing.", + "author": "Brian Tracy" + }, + { + "content": "Let us revere, let us worship, but erect and open-eyed, the highest, not the lowest; the future, not the past!", + "author": "Charlotte Perkins Gilman" + }, + { + "content": "If we look at the world with a love of life, the world will reveal its beauty to us.", + "author": "Daisaku Ikeda" + }, + { + "content": "Knowing is not enough; we must apply!", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "You may say I'm a dreamer, but I'm not the only one, I hope someday you will join us, and the world will live as one.", + "author": "John Lennon" + }, + { + "content": "I believe that every person is born with talent.", + "author": "Maya Angelou" + }, + { + "content": "Wise men talk because they have something to say; fools, because they have to say something.", + "author": "Plato" + }, + { + "content": "Don't judge each day by the harvest you reap but by the seeds that you plant.", + "author": "Robert Louis Stevenson" + }, + { + "content": "The most precious gift we can offer anyone is our attention. When mindfulness embraces those we love, they will bloom like flowers.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "The longer we dwell on our misfortunes, the greater is their power to harm us.", + "author": "Voltaire" + }, + { + "content": "Keep your face always toward the sunshine - and shadows will fall behind you.", + "author": "Walt Whitman" + }, + { + "content": "You are not here merely to make a living. You are here in order to enable the world to live more amply, with greater vision, with a finer spirit of hope and achievement. You are here to enrich the world, and you impoverish yourself if you forget the errand.", + "author": "Woodrow Wilson" + }, + { + "content": "Before we acquire great power, we must acquire wisdom to use it well.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Be courteous to all, but intimate with few, and let those few be well tried before you give them your confidence.", + "author": "George Washington" + }, + { + "content": "True friends stab you in the front.", + "author": "Oscar Wilde" + }, + { + "content": "Whenever you have eliminated the impossible, whatever remains, however improbable, must be the truth.", + "author": "Arthur Conan Doyle" + }, + { + "content": "To give oneself earnestly to the duties due to men, and, while respecting spiritual beings, to keep aloof from them, may be called wisdom.", + "author": "Confucius" + }, + { + "content": "There are two primary choices in life: to accept conditions as they exist or accept responsibility for changing them.", + "author": "Denis Waitley" + }, + { + "content": "Don't ruin the present with the ruined past.", + "author": "Ellen Gilchrist" + }, + { + "content": "When we quit thinking primarily about ourselves and our own self-preservation, we undergo a truly heroic transformation of consciousness.", + "author": "Joseph Campbell" + }, + { + "content": "For it was not into my ear you whispered, but into my heart. It was not my lips you kissed, but my soul.", + "author": "Judy Garland" + }, + { + "content": "Look back over the past, with its changing empires that rose and fell, and you can foresee the future, too.", + "author": "Marcus Aurelius" + }, + { + "content": "Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I have really worked, is mine.", + "author": "Nikola Tesla" + }, + { + "content": "Do all things with love.", + "author": "Og Mandino" + }, + { + "content": "Divide each difficulty into as many parts as is feasible and necessary to resolve it.", + "author": "René Descartes" + }, + { + "content": "There is no great genius without some touch of madness.", + "author": "Seneca the Younger" + }, + { + "content": "From error to error one discovers the entire truth.", + "author": "Sigmund Freud" + }, + { + "content": "He that never changes his opinions, never corrects his mistakes, and will never be wiser on the morrow than he is today.", + "author": "Tryon Edwards" + }, + { + "content": "To choose what is difficult all one's days, as if it were easy, that is faith.", + "author": "W. H. Auden" + }, + { + "content": "The road of excess leads to the palace of wisdom.", + "author": "William Blake" + }, + { + "content": "Friendship is one mind in two bodies.", + "author": "Mencius" + }, + { + "content": "A friendship founded on business is better than a business founded on friendship.", + "author": "John Locke" + }, + { + "content": "My friends are my estate.", + "author": "Emily Dickinson" + }, + { + "content": "When a friend is in trouble, don't annoy him by asking if there is anything you can do. Think up something appropriate and do it.", + "author": "A. Powell Davies" + }, + { + "content": "Life is just a chance to grow a soul.", + "author": "A. Powell Davies" + }, + { + "content": "In separateness lies the world's great misery, in compassion lies the world's true strength.", + "author": "Buddha" + }, + { + "content": "Every human being is the author of his own health or disease.", + "author": "Buddha" + }, + { + "content": "Our greatest glory is not in never falling, but in rising every time we fall.", + "author": "Confucius" + }, + { + "content": "The only real mistake is the one from which we learn nothing.", + "author": "John Powell" + }, + { + "content": "I can't believe that God put us on this earth to be ordinary.", + "author": "Lou Holtz" + }, + { + "content": "It is not the possession of truth, but the success which attends the seeking after it, that enriches the seeker and brings happiness to him.", + "author": "Max Planck" + }, + { + "content": "To succeed, we must first believe that we can.", + "author": "Michael Korda" + }, + { + "content": "The difference between what we do and what we are capable of doing would suffice to solve most of the world's problems.", + "author": "Mahatma Gandhi" + }, + { + "content": "We come to love not by finding a perfect person, but by learning to see an imperfect person perfectly.", + "author": "Sam Keen" + }, + { + "content": "Leave no stone unturned.", + "author": "Euripides" + }, + { + "content": "There is more wisdom in your body than in your deepest philosophy.", + "author": "Friedrich Nietzsche" + }, + { + "content": "Does wisdom perhaps appear on the earth as a raven which is inspired by the smell of carrion?", + "author": "Friedrich Nietzsche" + }, + { + "content": "Science gives us knowledge, but only philosophy can give us wisdom.", + "author": "Will Durant" + }, + { + "content": "Once a new technology rolls over you, if you're not part of the steamroller, you're part of the road.", + "author": "Stewart Brand" + }, + { + "content": "A true friend is someone who is there for you when he'd rather be anywhere else.", + "author": "Len Wein" + }, + { + "content": "Autumn is a second spring when every leaf is a flower.", + "author": "Albert Camus" + }, + { + "content": "The happiness that is genuinely satisfying is accompanied by the fullest exercise of our faculties and the fullest realization of the world in which we live.", + "author": "Bertrand Russell" + }, + { + "content": "See the positive side, the potential, and make an effort.", + "author": "Dalai Lama" + }, + { + "content": "When one door of happiness closes, another opens; but often we look so long at the closed door that we do not see the one which has been opened for us.", + "author": "Helen Keller" + }, + { + "content": "Forgiveness is choosing to love. It is the first skill of self-giving love.", + "author": "Mahatma Gandhi" + }, + { + "content": "Mind is everything: muscle, pieces of rubber. All that I am, I am because of my mind.", + "author": "Paavo Nurmi" + }, + { + "content": "I am always doing that which I cannot do, in order that I may learn how to do it.", + "author": "Pablo Picasso" + }, + { + "content": "Chaos and Order are not enemies, only opposites.", + "author": "Richard Garriott" + }, + { + "content": "The amount of happiness that you have depends on the amount of freedom you have in your heart.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "Four steps to achievement: Plan purposefully. Prepare prayerfully. Proceed positively. Pursue persistently.", + "author": "William Arthur Ward" + }, + { + "content": "The fall of dropping water wears away the Stone.", + "author": "Lucretius" + }, + { + "content": "The art of storytelling is reaching its end because the epic side of truth, wisdom, is dying out.", + "author": "Walter Benjamin" + }, + { + "content": "Knowledge is going to make you stronger. Knowledge is going to let you control your life. Knowledge is going to give you the wisdom to teach their children. Knowledge is the thing that makes you smile in the face of disaster.", + "author": "Avery Brooks" + }, + { + "content": "This is the whole point of technology. It creates an appetite for immortality on the one hand. It threatens universal extinction on the other. Technology is lust removed from nature.", + "author": "Don DeLillo" + }, + { + "content": "I have friends in overalls whose friendship I would not swap for the favor of the kings of the world.", + "author": "Thomas Edison" + }, + { + "content": "Rock n' roll as a genre is different from pop and hip hop: it is about bands, and that for me suggests brotherhood, family, friendship and community.", + "author": "Steven Van Zandt" + }, + { + "author": "Woody Allen", + "content": "I'm astounded by people who want to 'know' the universe when it's hard enough to find your way around Chinatown." + }, + { + "content": "Setting an example is not the main means of influencing another, it is the only means.", + "author": "Albert Einstein" + }, + { + "content": "Life is so constructed that an event does not, cannot, will not, match the expectation.", + "author": "Charlotte Brontë" + }, + { + "content": "Life is a succession of moments. To live each one is to succeed.", + "author": "Corita Kent" + }, + { + "content": "If we have a positive mental attitude, then even when surrounded by hostility, we shall not lack inner peace.", + "author": "Dalai Lama" + }, + { + "content": "Light tomorrow with today!", + "author": "Elizabeth Browning" + }, + { + "content": "When you come to the end of your rope, tie a knot and hang on.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "Face your deficiencies and acknowledge them; but do not let them master you. Let them teach you patience, sweetness, insight.", + "author": "Helen Keller" + }, + { + "content": "The foolish man seeks happiness in the distance, the wise grows it under his feet.", + "author": "James Oppenheim" + }, + { + "content": "The more you care, the stronger you can be.", + "author": "Jim Rohn" + }, + { + "content": "Victory belongs to the most persevering.", + "author": "Napoleon" + }, + { + "content": "With every experience, you alone are painting your own canvas, thought by thought, choice by choice.", + "author": "Oprah Winfrey" + }, + { + "content": "The smallest act of kindness is worth more than the grandest intention.", + "author": "Oscar Wilde" + }, + { + "content": "Every gift from a friend is a wish for your happiness.", + "author": "Richard Bach" + }, + { + "content": "Miracles come in moments. Be ready and willing.", + "author": "Wayne Dyer" + }, + { + "content": "Courage is going from failure to failure without losing enthusiasm.", + "author": "Winston Churchill" + }, + { + "content": "What wisdom can you find that is greater than kindness?", + "author": "Jean-Jacques Rousseau" + }, + { + "content": "To acquire knowledge, one must study; but to acquire wisdom, one must observe.", + "author": "Marilyn vos Savant" + }, + { + "content": "Communications tools don't get socially interesting until they get technologically boring.", + "author": "Clay Shirky" + }, + { + "content": "Technology is anything that wasn't around when you were born.", + "author": "Man Ray" + }, + { + "content": "False friendship, like the ivy, decays and ruins the walls it embraces; but true friendship gives new life and animation to the object it supports.", + "author": "Richard Burton" + }, + { + "content": "The sincere friends of this world are as ship lights in the stormiest of nights.", + "author": "Giotto" + }, + { + "content": "Love does not consist of gazing at each other, but in looking together in the same direction.", + "author": "Antoine de Saint-Exupéry" + }, + { + "content": "Love is composed of a single soul inhabiting two bodies.", + "author": "Aristotle" + }, + { + "content": "To live a pure unselfish life, one must count nothing as one's own in the midst of abundance.", + "author": "Buddha" + }, + { + "content": "The Superior Man is aware of Righteousness, the inferior man is aware of advantage.", + "author": "Confucius" + }, + { + "content": "Just as a flower, which seems beautiful has color but no perfume, so are the fruitless words of a man who speaks them but does them not.", + "author": "Dhammapada" + }, + { + "content": "What do we live for, if it is not to make life less difficult for each other?", + "author": "George Eliot" + }, + { + "content": "Keep yourself to the sunshine and you cannot see the shadow.", + "author": "Helen Keller" + }, + { + "content": "Not all those who wander are lost.", + "author": "J. R. R. Tolkien" + }, + { + "content": "If we could learn to like ourselves, even a little, maybe our cruelties and angers might melt away.", + "author": "John Steinbeck" + }, + { + "content": "You can't let praise or criticism get to you. It's a weakness to get caught up in either one.", + "author": "John Wooden" + }, + { + "content": "Let us be grateful to people who make us happy; they are the charming gardeners who make our souls blossom.", + "author": "Marcel Proust" + }, + { + "content": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.", + "author": "Marie Curie" + }, + { + "content": "The universe is made of stories, not atoms.", + "author": "Muriel Rukeyser" + }, + { + "content": "Wise men speak because they have something to say; Fools because they have to say something.", + "author": "Plato" + }, + { + "content": "We must be as courteous to a man as we are to a picture, which we are willing to give the advantage of a good light.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Intuition is the supra-logic that cuts out all the routine processes of thought and leaps straight from the problem to the answer.", + "author": "Robert Graves" + }, + { + "content": "Liberty, taking the word in its concrete sense, consists in the ability to choose.", + "author": "Simone Weil" + }, + { + "content": "Reason and free inquiry are the only effectual agents against error.", + "author": "Thomas Jefferson" + }, + { + "content": "Go to your bosom: Knock there and ask your heart what it doth know.", + "author": "William Shakespeare" + }, + { + "content": "True knowledge exists in knowing that you know nothing.", + "author": "Isocrates" + }, + { + "content": "And when the world is created, it is created in such a way that those eternal objects of God's loving wisdom become actualities - interacting with one another, relating to God in the finite realm.", + "author": "Rowan Williams" + }, + { + "content": "Ethics change with technology.", + "author": "Larry Niven" + }, + { + "content": "One loyal friend is worth ten thousand relatives.", + "author": "Euripides" + }, + { + "content": "Sweet is the memory of distant friends! Like the mellow rays of the departing sun, it falls tenderly, yet sadly, on the heart.", + "author": "Washington Irving" + }, + { + "author": "Woody Allen", + "content": "His lack of education is more than compensated for by his keenly developed moral bankruptcy." + }, + { + "content": "Without courage, wisdom bears no fruit.", + "author": "Baltasar Gracián" + }, + { + "content": "To know oneself is to study oneself in action with another person.", + "author": "Bruce Lee" + }, + { + "content": "In all chaos there is a cosmos, in all disorder a secret order.", + "author": "Carl Jung" + }, + { + "content": "There are people who have money and people who are rich.", + "author": "Coco Chanel" + }, + { + "content": "You don't choose your family. They are God's gift to you, as you are to them.", + "author": "Desmond Tutu" + }, + { + "content": "There are two ways of spreading light: to be the candle or the mirror that reflects it.", + "author": "Edith Wharton" + }, + { + "content": "Problems are only opportunities with thorns on them.", + "author": "Hugh Miller" + }, + { + "content": "By accepting yourself and being fully what you are, your presence can make others happy.", + "author": "Jane Roberts" + }, + { + "content": "When one tugs at a single thing in nature, he finds it attached to the rest of the world.", + "author": "John Muir" + }, + { + "content": "The two most powerful warriors are patience and time.", + "author": "Leo Tolstoy" + }, + { + "content": "Time stays long enough for anyone who will use it.", + "author": "Leonardo da Vinci" + }, + { + "content": "Let me tell you the secret that has led me to my goal: my strength lies solely in my tenacity.", + "author": "Louis Pasteur" + }, + { + "_id": "l-mD-YbIuRvk", + "content": "The exercise of an extraordinary gift is the supremist pleasure in life.", + "author": "Mark Twain" + }, + { + "content": "Peace begins with a smile.", + "author": "Mother Teresa" + }, + { + "content": "Do not turn back when you are just at the goal.", + "author": "Publilius Syrus" + }, + { + "content": "By living deeply in the present moment we can understand the past better and we can prepare for a better future.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "There are no failures. Just experiences and your reactions to them.", + "author": "Tom Krause" + }, + { + "content": "Be miserable. Or motivate yourself. Whatever has to be done, it's always your choice.", + "author": "Wayne Dyer" + }, + { + "content": "Life is a learning experience, only if you learn.", + "author": "Yogi Berra" + }, + { + "content": "The man of knowledge must be able not only to love his enemies but also to hate his friends.", + "author": "Friedrich Nietzsche" + }, + { + "content": "The most certain sign of wisdom is cheerfulness.", + "author": "Michel de Montaigne" + }, + { + "content": "Nine-tenths of wisdom is being wise in time.", + "author": "Theodore Roosevelt" + }, + { + "content": "Love is the wisdom of the fool and the folly of the wise.", + "author": "Samuel Johnson" + }, + { + "content": "It is a characteristic of wisdom not to do desperate things.", + "author": "Henry David Thoreau" + }, + { + "content": "But friendship is precious, not only in the shade, but in the sunshine of life, and thanks to a benevolent arrangement the greater part of life is sunshine.", + "author": "Thomas Jefferson" + }, + { + "author": "Woody Allen", + "content": "Life is divided into the horrible and the miserable." + }, + { + "content": "There is only one corner of the universe you can be certain of improving, and that's your own self.", + "author": "Aldous Huxley" + }, + { + "content": "Through perseverance many people win success out of what seemed destined to be certain failure.", + "author": "Benjamin Disraeli" + }, + { + "content": "We cannot do everything at once, but we can do something at once.", + "author": "Calvin Coolidge" + }, + { + "content": "Flow with whatever is happening and let your mind be free. Stay centered by accepting whatever you are doing. This is the ultimate.", + "author": "Zhuang Zhou" + }, + { + "content": "Silence is the true friend that never betrays.", + "author": "Confucius" + }, + { + "content": "Everything has beauty, but not everyone sees it.", + "author": "Confucius" + }, + { + "content": "More often than not, anger is actually an indication of weakness rather than of strength.", + "author": "Dalai Lama" + }, + { + "content": "The best preparation for tomorrow is doing your best today.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "No pessimist ever discovered the secrets of the stars, or sailed to an uncharted land, or opened a new heaven to the human spirit.", + "author": "Helen Keller" + }, + { + "content": "Life is movement-we breathe, we eat, we walk, we move!", + "author": "John Pierrakos" + }, + { + "content": "The free man is he who does not fear to go to the end of his thought.", + "author": "Léon Blum" + }, + { + "content": "When in doubt, tell the truth.", + "author": "Mark Twain" + }, + { + "content": "Be faithful in small things because it is in them that your strength lies.", + "author": "Mother Teresa" + }, + { + "content": "Most great people have attained their greatest success just one step beyond their greatest failure.", + "author": "Napoleon Hill" + }, + { + "content": "If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place.", + "author": "Nora Roberts" + }, + { + "content": "Inspiration exists, but it has to find us working.", + "author": "Pablo Picasso" + }, + { + "content": "If the single man plant himself indomitably on his instincts, and there abide, the huge world will come round to him.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Imagination is not a talent of some men but is the health of every man.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "This world, after all our science and sciences, is still a miracle; wonderful, inscrutable, magical and more, to whosoever will think of it.", + "author": "Thomas Carlyle" + }, + { + "content": "There is no way to prosperity, prosperity is the way.", + "author": "Wayne Dyer" + }, + { + "content": "You can't choose up sides on a round world.", + "author": "Wayne Dyer" + }, + { + "content": "Continuous effort - not strength or intelligence - is the key to unlocking our potential.", + "author": "Winston Churchill" + }, + { + "content": "The greater danger for most of us lies not in setting our aim too high and falling short; but in setting our aim too low and achieving our mark.", + "author": "Michelangelo" + }, + { + "content": "I decided that it was not wisdom that enabled poets to write their poetry, but a kind of instinct or inspiration, such as you find in seers and prophets who deliver all their sublime messages without knowing in the least what they mean.", + "author": "Isocrates" + }, + { + "content": "Sorrow is knowledge, those that know the most must mourn the deepest, the tree of knowledge is not the tree of life.", + "author": "Lord Byron" + }, + { + "content": "Much wisdom often goes with fewest words.", + "author": "Sophocles" + }, + { + "content": "Wisdom begins at the end.", + "author": "Daniel Webster" + }, + { + "content": "Friendship is always a sweet responsibility, never an opportunity.", + "author": "Kahlil Gibran" + }, + { + "content": "A friend is a gift you give yourself.", + "author": "Robert Louis Stevenson" + }, + { + "content": "The differences between friends cannot but reinforce their friendship.", + "author": "Mao Zedong" + }, + { + "content": "Friendship at first sight, like love at first sight, is said to be the only truth.", + "author": "Herman Melville" + }, + { + "content": "Love is rarer than genius itself. And friendship is rarer than love.", + "author": "Charles Péguy" + }, + { + "content": "Friendship is like money, easier made than kept.", + "author": "Samuel Butler" + }, + { + "content": "We cannot solve our problems with the same thinking we used when we created them.", + "author": "Albert Einstein" + }, + { + "content": "Ignorance never settles a question.", + "author": "Benjamin Disraeli" + }, + { + "content": "Set your goals high, and don't stop till you get there.", + "author": "Bo Jackson" + }, + { + "content": "Those who will play with cats must expect to be scratched.", + "author": "Miguel de Cervantes" + }, + { + "content": "We are all faced with a series of great opportunities brilliantly disguised as impossible situations.", + "author": "Chuck Swindoll" + }, + { + "content": "Ability will never catch up with the demand for it.", + "author": "Confucius" + }, + { + "content": "Only when we are no longer afraid do we begin to live.", + "author": "Dorothy Thompson" + }, + { + "content": "Only through our connectedness to others can we really know and enhance the self. And only through working on the self can we begin to enhance our connectedness to others.", + "author": "Harriet Lerner" + }, + { + "content": "The world is but a canvas to the imagination.", + "author": "Henry David Thoreau" + }, + { + "content": "We can only learn to love by loving.", + "author": "Iris Murdoch" + }, + { + "content": "Great indeed is the sublimity of the Creative, to which all beings owe their beginning, and which permeates all heaven.", + "author": "Laozi" + }, + { + "content": "He who knows, does not speak. He who speaks, does not know.", + "author": "Laozi" + }, + { + "content": "Spread love everywhere you go. Let no one ever come to you without leaving happier.", + "author": "Mother Teresa" + }, + { + "content": "If you cannot do great things, do small things in a great way.", + "author": "Napoleon Hill" + }, + { + "content": "Let your hook always be cast; in the pool where you least expect it, there will be a fish.", + "author": "Ovid" + }, + { + "content": "Either I will find a way, or I will make one.", + "author": "Philip Sidney" + }, + { + "content": "The greatest way to live with honor in this world is to be what we pretend to be.", + "author": "Socrates" + }, + { + "content": "Judge nothing, you will be happy. Forgive everything, you will be happier. Love everything, you will be happiest.", + "author": "Sri Chinmoy" + }, + { + "content": "The only limit to your impact is your imagination and commitment.", + "author": "Tony Robbins" + }, + { + "content": "No snowflake in an avalanche ever feels responsible.", + "author": "Voltaire" + }, + { + "content": "Our intention creates our reality.", + "author": "Wayne Dyer" + }, + { + "content": "Act as if what you do makes a difference. It does.", + "author": "William James" + }, + { + "content": "Do the one thing you think you cannot do. Fail at it. Try again. Do better the second time. The only people who never tumble are those who never mount the high wire. This is your moment. Own it.", + "author": "Oprah Winfrey" + }, + { + "content": "To enjoy good health, to bring true happiness to one's family, to bring peace to all, one must first discipline and control one's own mind. If a man can control his mind, he can find the way to Enlightenment, and all wisdom and virtue will naturally come to him.", + "author": "Buddha" + }, + { + "content": "There are three methods to gaining wisdom. The first is reflection, which is the highest. The second is limitation, which is the easiest. The third is experience, which is the bitterest.", + "author": "Confucius" + }, + { + "content": "To conquer fear is the beginning of wisdom.", + "author": "Bertrand Russell" + }, + { + "content": "There are three faithful friends - an old wife, an old dog, and ready money.", + "author": "Benjamin Franklin" + }, + { + "content": "Any sufficiently advanced technology is equivalent to magic.", + "author": "Arthur C. Clarke" + }, + { + "content": "Friendship is but another name for an alliance with the follies and the misfortunes of others. Our own share of miseries is sufficient: why enter then as volunteers into those of another?", + "author": "Thomas Jefferson" + }, + { + "content": "I am like a falling star who has finally found her place next to another in a lovely constellation, where we will sparkle in the heavens forever.", + "author": "Amy Tan" + }, + { + "content": "Three things cannot be long hidden: the sun, the moon, and the truth.", + "author": "Buddha" + }, + { + "content": "There is only one success - to be able to spend your life in your own way.", + "author": "Christopher Morley" + }, + { + "content": "You know you're in love when you can't fall asleep because reality is finally better than your dreams.", + "author": "Dr. Seuss" + }, + { + "content": "No man is free who is not master of himself.", + "author": "Epictetus" + }, + { + "content": "If I know what love is, it is because of you.", + "author": "Hermann Hesse" + }, + { + "content": "The bird of paradise alights only upon the hand that does not grasp.", + "author": "John Berry" + }, + { + "content": "What we see depends mainly on what we look for.", + "author": "John Lubbock" + }, + { + "content": "I have done my best: that is about all the philosophy of living one needs.", + "author": "Lin Yutang" + }, + { + "content": "To be fully alive, fully human, and completely awake is to be continually thrown out of the nest.", + "author": "Pema Chödrön" + }, + { + "content": "Every problem has a gift for you in its hands.", + "author": "Richard Bach" + }, + { + "content": "Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.", + "author": "Samuel Beckett" + }, + { + "content": "Where there is charity and wisdom, there is neither fear nor ignorance.", + "author": "Francis of Assisi" + }, + { + "content": "It is a common experience that a problem difficult at night is resolved in the morning after the committee of sleep has worked on it.", + "author": "John Steinbeck" + }, + { + "content": "It is impossible to love and to be wise.", + "author": "Francis Bacon" + }, + { + "content": "Wisdom is a kind of knowledge. It is knowledge of the nature, career, and consequences of human values.", + "author": "Sidney Hook" + }, + { + "content": "The real danger is not that computers will begin to think like men, but that men will begin to think like computers.", + "author": "Sydney J. Harris" + }, + { + "content": "When the world is so complicated, the simple gift of friendship is within all of our hands.", + "author": "Maria Shriver" + }, + { + "content": "Friendship marks a life even more deeply than love. Love risks degenerating into obsession, friendship is never anything but sharing.", + "author": "Elie Wiesel" + }, + { + "content": "Never apologize for showing feelings. When you do so, you apologize for the truth.", + "author": "Benjamin Disraeli" + }, + { + "content": "The person who makes a success of living is the one who see his goal steadily and aims for it unswervingly. That is dedication.", + "author": "Cecil B. DeMille" + }, + { + "content": "Be slow of tongue and quick of eye.", + "author": "Miguel de Cervantes" + }, + { + "content": "The first duty of a human being is to assume the right functional relationship to society - more briefly, to find your real job, and do it.", + "author": "Charlotte Perkins Gilman" + }, + { + "content": "It takes courage to grow up and become who you really are.", + "author": "E. E. Cummings" + }, + { + "content": "All that we see or seem is but a dream within a dream.", + "author": "Edgar Allan Poe" + }, + { + "content": "We love life, not because we are used to living but because we are used to loving.", + "author": "Friedrich Nietzsche" + }, + { + "content": "It has never been my object to record my dreams, just to realize them.", + "author": "Man Ray" + }, + { + "content": "Time is the wisest counsellor of all.", + "author": "Pericles" + }, + { + "content": "We are not animals. We are not a product of what has happened to us in our past. We have the power of choice.", + "author": "Stephen Covey" + }, + { + "content": "History will be kind to me for I intend to write it.", + "author": "Winston Churchill" + }, + { + "content": "Believe in yourself! Have faith in your abilities! Without a humble but reasonable confidence in your own powers you cannot be successful or happy.", + "author": "Norman Vincent Peale" + }, + { + "content": "Do not wait; the time will never be 'just right.' Start where you stand, and work with whatever tools you may have at your command, and better tools will be found as you go along.", + "author": "George Herbert" + }, + { + "content": "Silence at the proper season is wisdom, and better than any speech.", + "author": "Plutarch" + }, + { + "content": "Wisdom is always an overmatch for strength.", + "author": "Phil Jackson" + }, + { + "content": "Being entirely honest with oneself is a good exercise.", + "author": "Sigmund Freud" + }, + { + "content": "I will give you a definition of a proud man: he is a man who has neither vanity nor wisdom one filled with hatreds cannot be vain, neither can he be wise.", + "author": "John Keats" + }, + { + "content": "Wisdom consists of the anticipation of consequences.", + "author": "Norman Cousins" + }, + { + "content": "Value your friendship. Value your relationships.", + "author": "Barbara Bush" + }, + { + "content": "I have no special talent. I am only passionately curious.", + "author": "Albert Einstein" + }, + { + "content": "Life shrinks or expands in proportion to one's courage.", + "author": "Anaïs Nin" + }, + { + "content": "Experience keeps a dear school, but fools will learn in no other.", + "author": "Benjamin Franklin" + }, + { + "content": "Holding on to anger is like grasping a hot coal with the intent of throwing it at someone else; you are the one who gets burned.", + "author": "Buddha" + }, + { + "content": "Imagination will often carry us to worlds that never were. But without it we go nowhere.", + "author": "Carl Sagan" + }, + { + "content": "A lot of people give up just before theyre about to make it. You know you never know when that next obstacle is going to be the last one.", + "author": "Chuck Norris" + }, + { + "content": "The greater part of human pain is unnecessary. It is self-created as long as the unobserved mind runs your life.", + "author": "Eckhart Tolle" + }, + { + "content": "Those who dream by day are cognizant of many things which escape those who dream only by night.", + "author": "Edgar Allan Poe" + }, + { + "content": "If you focus on results, you will never change. If you focus on change, you will get results.", + "author": "Jack Dixon" + }, + { + "content": "In rivers, the water that you touch is the last of what has passed and the first of that which comes; so with present time.", + "author": "Leonardo da Vinci" + }, + { + "content": "Accept the things to which fate binds you and love the people with whom fate brings you together but do so with all your heart.", + "author": "Marcus Aurelius" + }, + { + "content": "The secret of getting ahead is getting started.", + "author": "Mark Twain" + }, + { + "content": "The truest wisdom is a resolute determination.", + "author": "Napoleon" + }, + { + "content": "Imagination rules the world.", + "author": "Napoleon" + }, + { + "content": "Take time to deliberate, but when the time for action has arrived, stop thinking and go in.", + "author": "Napoleon" + }, + { + "content": "Never deny a diagnosis but do deny the negative verdict that may go with it.", + "author": "Norman Cousins" + }, + { + "content": "People are not lazy. They simply have impotent goals - that is, goals that do not inspire them.", + "author": "Tony Robbins" + }, + { + "content": "When you judge another, you do not define them, you define yourself.", + "author": "Wayne Dyer" + }, + { + "content": "Motivation is the art of getting people to do what you want them to do because they want to do it.", + "author": "Dwight D. Eisenhower" + }, + { + "content": "I know not age, nor weariness nor defeat.", + "author": "Rose Kennedy" + }, + { + "content": "There is no passion to be found playing small - in settling for a life that is less than the one you are capable of living.", + "author": "Nelson Mandela" + }, + { + "content": "We are wiser than we know.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Start with what is right rather than what is acceptable.", + "author": "Franz Kafka" + }, + { + "content": "We're born alone, we live alone, we die alone. Only through our love and friendship can we create the illusion for the moment that we're not alone.", + "author": "Orson Welles" + }, + { + "content": "Love is like a friendship caught on fire. In the beginning a flame, very pretty, often hot and fierce, but still only light and flickering. As love grows older, our hearts mature and our love becomes as coals, deep-burning and unquenchable.", + "author": "Bruce Lee" + }, + { + "content": "The essence of true friendship is to make allowance for another's little lapses.", + "author": "Ovid" + }, + { + "content": "A friend in power is a friend lost.", + "author": "Henry Adams" + }, + { + "author": "Woody Allen", + "content": "I can't listen to that much Wagner. I start getting the urge to conquer Poland." + }, + { + "content": "Anyone who doesn't take truth seriously in small matters cannot be trusted in large ones either.", + "author": "Albert Einstein" + }, + { + "content": "It is better to understand a little than to misunderstand a lot.", + "author": "Anatole France" + }, + { + "content": "All know the way; few actually walk it.", + "author": "Bodhidharma" + }, + { + "content": "To keep the body in good health is a duty... otherwise we shall not be able to keep our mind strong and clear.", + "author": "Buddha" + }, + { + "content": "I am not bothered by the fact that I am unknown. I am bothered when I do not know others.", + "author": "Confucius" + }, + { + "content": "It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "If the shoe doesn't fit, must we change the foot?", + "author": "Gloria Steinem" + }, + { + "content": "The moment one gives close attention to anything, it becomes a mysterious, awesome, indescribably magnificent world in itself.", + "author": "Henry Miller" + }, + { + "content": "To free us from the expectations of others, to give us back to ourselves... there lies the great, singular power of self-respect.", + "author": "Joan Didion" + }, + { + "content": "If you have made mistakes, there is always another chance for you. You may have a fresh start any moment you choose.", + "author": "Mary Pickford" + }, + { + "content": "Freedom is not worth having if it does not connote freedom to err.", + "author": "Mahatma Gandhi" + }, + { + "content": "Think how hard physics would be if particles could think.", + "author": "Murray Gell-Mann" + }, + { + "content": "I seek constantly to improve my manners and graces, for they are the sugar to which all are attracted.", + "author": "Og Mandino" + }, + { + "content": "Failure will never overtake me if my determination to succeed is strong enough.", + "author": "Og Mandino" + }, + { + "content": "All action results from thought, so it is thoughts that matter.", + "author": "Sai Baba" + }, + { + "content": "Wisdom begins in wonder.", + "author": "Socrates" + }, + { + "_id": "sXDz-2N4-nnJ", + "content": "An invasion of armies can be resisted, but not an idea whose time has come.", + "author": "Victor Hugo" + }, + { + "content": "When you dance, your purpose is not to get to a certain place on the floor. It's to enjoy each step along the way.", + "author": "Wayne Dyer" + }, + { + "content": "Maxim for life: You get treated in life the way you teach people to treat you.", + "author": "Wayne Dyer" + }, + { + "content": "Speak low, if you speak love.", + "author": "William Shakespeare" + }, + { + "content": "Sometimes I am happy and sometimes not. I am, after all, a human being, you know. And I am glad that we are sometimes happy and sometimes not. You get your wisdom working by having different emotions.", + "author": "Yoko Ono" + }, + { + "content": "Even if you're on the right track, you'll get run over if you just sit there.", + "author": "Will Rogers" + }, + { + "content": "The higher we are placed, the more humbly we should walk.", + "author": "Cicero" + }, + { + "content": "It's easier to resist at the beginning than at the end.", + "author": "Leonardo da Vinci" + }, + { + "content": "It is not so much our friends' help that helps us, as the confidence of their help.", + "author": "Epicurus" + }, + { + "content": "If there is such a thing as a good marriage, it is because it resembles friendship rather than love.", + "author": "Michel de Montaigne" + }, + { + "content": "The industrial landscape is already littered with remains of once successful companies that could not adapt their strategic vision to altered conditions of competition.", + "author": "Ralph Abernathy" + }, + { + "content": "Parents can only give good advice or put them on the right paths, but the final forming of a person's character lies in their own hands.", + "author": "Anne Frank" + }, + { + "content": "Every man takes the limits of his own field of vision for the limits of the world.", + "author": "Arthur Schopenhauer" + }, + { + "content": "Thousands of candles can be lit from a single, and the life of the candle will not be shortened. Happiness never decreases by being shared.", + "author": "Buddha" + }, + { + "content": "If you lose today, win tomorrow. In this never-ending spirit of challenge is the heart of a victor.", + "author": "Daisaku Ikeda" + }, + { + "content": "I can't change the direction of the wind, but I can adjust my sails to always reach my destination.", + "author": "Jimmy Dean" + }, + { + "content": "Your sacred space is where you can find yourself again and again.", + "author": "Joseph Campbell" + }, + { + "content": "Where there is love there is life.", + "author": "Mahatma Gandhi" + }, + { + "content": "Kindness is the language which the deaf can hear and the blind can see.", + "author": "Mark Twain" + }, + { + "content": "To get the full value of joy you must have someone to divide it with.", + "author": "Mark Twain" + }, + { + "content": "For every failure, there's an alternative course of action. You just have to find it. When you come to a roadblock, take a detour.", + "author": "Mary Kay Ash" + }, + { + "content": "Action is the foundational key to all success.", + "author": "Pablo Picasso" + }, + { + "content": "All children are artists. The problem is how to remain an artist once he grows up.", + "author": "Pablo Picasso" + }, + { + "content": "Truth, and goodness, and beauty are but different faces of the same all.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Bad things are not the worst things that can happen to us. Nothing is the worst thing that can happen to us!", + "author": "Richard Bach" + }, + { + "content": "When we are no longer able to change a situation - we are challenged to change ourselves.", + "author": "Viktor Frankl" + }, + { + "content": "You can't cross the sea merely by standing and staring at the water.", + "author": "Rabindranath Tagore" + }, + { + "content": "The sum of wisdom is that time is never lost that is devoted to work.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "If you only have a hammer, you tend to see every problem as a nail.", + "author": "Abraham Maslow" + }, + { + "content": "Friends... they cherish one another's hopes. They are kind to one another's dreams.", + "author": "Henry David Thoreau" + }, + { + "content": "Love is flower like; Friendship is like a sheltering tree.", + "author": "Samuel Taylor Coleridge" + }, + { + "content": "Forgiveness is that subtle thread that binds both love and friendship. Without forgiveness, you may not even have a child one day.", + "author": "George Foreman" + }, + { + "content": "Friendship is the marriage of the soul, and this marriage is liable to divorce.", + "author": "Voltaire" + }, + { + "content": "Fear makes strangers of people who would be friends.", + "author": "Shirley MacLaine" + }, + { + "content": "Friendship is an arrangement by which we undertake to exchange small favors for big ones.", + "author": "Montesquieu" + }, + { + "content": "If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut.", + "author": "Albert Einstein" + }, + { + "content": "Love at first sight is easy to understand; it's when two people have been looking at each other for a lifetime that it becomes a miracle.", + "author": "Amy Bloom" + }, + { + "content": "I know but one freedom and that is the freedom of the mind.", + "author": "Antoine de Saint-Exupéry" + }, + { + "content": "The shoe that fits one person pinches another; there is no recipe for living that suits all cases.", + "author": "Carl Jung" + }, + { + "content": "The man who trusts men will make fewer mistakes than he who distrusts them.", + "author": "Camillo Benso, Count of Cavour" + }, + { + "content": "Beware of missing chances; otherwise it may be altogether too late someday.", + "author": "Franz Liszt" + }, + { + "content": "Be the chief but never the lord.", + "author": "Laozi" + }, + { + "content": "To see things in the seed, that is genius.", + "author": "Laozi" + }, + { + "content": "There is nothing happens to any person but what was in his power to go through with.", + "author": "Marcus Aurelius" + }, + { + "content": "You can do it if you believe you can!", + "author": "Napoleon Hill" + }, + { + "content": "Ask yourself the secret of your success. Listen to your answer and practice it.", + "author": "Richard Bach" + }, + { + "content": "Be as you wish to seem.", + "author": "Socrates" + }, + { + "content": "Smile, breathe and go slowly.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "Successful people ask better questions, and as a result, they get better answers.", + "author": "Tony Robbins" + }, + { + "content": "Doing what you love is the cornerstone of having abundance in your life.", + "author": "Wayne Dyer" + }, + { + "content": "Step with care and great tact and remember that Life's a Great Balancing Act.", + "author": "Dr. Seuss" + }, + { + "content": "Our shared values define us more than our differences. And acknowledging those shared values can see us through our challenges today if we have the wisdom to trust in them again.", + "author": "John McCain" + }, + { + "content": "But what is liberty without wisdom, and without virtue? It is the greatest of all possible evils; for it is folly, vice, and madness, without tuition or restraint.", + "author": "Edmund Burke" + }, + { + "content": "The lure of the distant and the difficult is deceptive. The great opportunity is where you are.", + "author": "John Burroughs" + }, + { + "content": "All wisdom does not reside in Delhi.", + "author": "P. Chidambaram" + }, + { + "content": "Technology is teaching us to be human again.", + "author": "Simon Mainwaring" + }, + { + "content": "Two of man's basic needs are to love and to share. Both of these needs are satisfied in greater or lesser degree by friendship.", + "author": "Mother Angelica" + }, + { + "content": "Important principles may, and must, be inflexible.", + "author": "Abraham Lincoln" + }, + { + "content": "Criticism is something you can easily avoid by saying nothing, doing nothing, and being nothing.", + "author": "Aristotle" + }, + { + "content": "One secret of success in life is for a man to be ready for his opportunity when it comes.", + "author": "Benjamin Disraeli" + }, + { + "content": "If you love life, don't waste time, for time is what life is made up of.", + "author": "Bruce Lee" + }, + { + "content": "Those who are free of resentful thoughts surely find peace.", + "author": "Buddha" + }, + { + "content": "No matter how hard the past, you can always begin again.", + "author": "Buddha" + }, + { + "content": "Meditation brings wisdom, lack of meditation leaves ignorance. Know well what leads you forward and what holds you back and choose the path that leads to wisdom.", + "author": "Buddha" + }, + { + "content": "Error is discipline through which we advance.", + "author": "William Ellery Channing" + }, + { + "content": "It's not what happens to you, but how you react to it that matters.", + "author": "Epictetus" + }, + { + "content": "There is no retirement for an artist, it's your way of living so there is no end to it.", + "author": "Henry Moore" + }, + { + "content": "Fortune befriends the bold.", + "author": "John Dryden" + }, + { + "content": "The minute you settle for less than you deserve, you get even less than you settled for.", + "author": "Maureen Dowd" + }, + { + "content": "Opportunity often comes disguised in the form of misfortune, or temporary defeat.", + "author": "Napoleon Hill" + }, + { + "content": "Education is the most powerful weapon which you can use to change the world.", + "author": "Nelson Mandela" + }, + { + "content": "He can who thinks he can, and he can't who thinks he can't. This is an inexorable, indisputable law.", + "author": "Pablo Picasso" + }, + { + "content": "Self-trust is the first secret of success.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Argue for your limitations, and sure enough they're yours.", + "author": "Richard Bach" + }, + { + "content": "In order to win, you must expect to win.", + "author": "Richard Bach" + }, + { + "content": "Listen to what you know instead of what you fear.", + "author": "Richard Bach" + }, + { + "content": "Work like you don't need the money. Love like you've never been hurt. Dance like nobody's watching.", + "author": "Satchel Paige" + }, + { + "content": "There is no way to happiness, happiness is the way.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "Success is not final; failure is not fatal: it is the courage to continue that counts.", + "author": "Winston Churchill" + }, + { + "content": "Most of our pocket wisdom is conceived for the use of mediocre people, to discourage them from ambitious attempts, and generally console them in their mediocrity.", + "author": "Robert Louis Stevenson" + }, + { + "content": "It is one of the severest tests of friendship to tell your friend his faults. So to love a man that you cannot bear to see a stain upon him, and to speak painful truth through loving words, that is friendship.", + "author": "Henry Ward Beecher" + }, + { + "content": "I destroy my enemies when I make them my friends.", + "author": "Abraham Lincoln" + }, + { + "content": "If we had no winter, the spring would not be so pleasant; if we did not sometimes taste of adversity, prosperity would not be so welcome.", + "author": "Anne Bradstreet" + }, + { + "content": "The mind is everything. What you think you become.", + "author": "Buddha" + }, + { + "content": "If you propose to speak, always ask yourself, is it true, is it necessary, is it kind.", + "author": "Buddha" + }, + { + "content": "Your vision will become clear only when you can look into your own heart. Who looks outside, dreams, who looks inside, awakes.", + "author": "Carl Jung" + }, + { + "content": "The more you know yourself, the more you forgive yourself.", + "author": "Confucius" + }, + { + "content": "The superior man is modest in his speech but exceeds in his actions.", + "author": "Confucius" + }, + { + "content": "When you meet someone better than yourself, turn your thoughts to becoming his equal. When you meet someone not as good as you are, look within and examine your own self.", + "author": "Confucius" + }, + { + "content": "Gratitude is the fairest blossom which springs from the soul.", + "author": "Henry K. Beecher" + }, + { + "content": "The moment one gives close attention to anything, even a blade of grass, it becomes a mysterious, awesome, indescribably magnificent world in itself.", + "author": "Henry Miller" + }, + { + "content": "People may doubt what you say, but they will believe what you do.", + "author": "Lewis Cass" + }, + { + "content": "Stay away from what might have been and look at what will be.", + "author": "Marsha Petrie Sue" + }, + { + "content": "If we learn to open our hearts, anyone, including the people who drive us crazy, can be our teacher.", + "author": "Pema Chödrön" + }, + { + "content": "The world makes way for the man who knows where he is going.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Learning is finding out what you already know.", + "author": "Richard Bach" + }, + { + "content": "Much wisdom often goes with fewer words.", + "author": "Sophocles" + }, + { + "content": "Simply put, you believer that things or people make you unhappy, but this is not accurate. You make yourself unhappy.", + "author": "Wayne Dyer" + }, + { + "content": "If you find yourself in a hole, the first thing to do is stop digging.", + "author": "Will Rogers" + }, + { + "content": "You can observe a lot just by watching.", + "author": "Yogi Berra" + }, + { + "content": "I can, therefore I am.", + "author": "Simone Weil" + }, + { + "content": "Pure, holy simplicity confounds all the wisdom of this world and the wisdom of the flesh.", + "author": "Francis of Assisi" + }, + { + "content": "The ultimate promise of technology is to make us master of a world that we command by the push of a button.", + "author": "Volker Grassmuck" + }, + { + "content": "A real friend is one who walks in when the rest of the world walks out.", + "author": "Walter Winchell" + }, + { + "content": "Love is blind; friendship closes its eyes.", + "author": "Friedrich Nietzsche" + }, + { + "content": "Friendship with oneself is all important, because without it one cannot be friends with anyone else in the world.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Friendship always benefits; love sometimes injures.", + "author": "Seneca the Younger" + }, + { + "author": "Woody Allen", + "content": "How is it possible to find meaning in a finite world, given my waist and shirt size?" + }, + { + "content": "Truth is generally the best vindication against slander.", + "author": "Abraham Lincoln" + }, + { + "content": "To accomplish great things, we must dream as well as act.", + "author": "Anatole France" + }, + { + "content": "No one has ever become poor by giving.", + "author": "Anne Frank" + }, + { + "content": "Without this playing with fantasy no creative work has ever yet come to birth. The debt we owe to the play of the imagination is incalculable.", + "author": "Carl Jung" + }, + { + "content": "The important thing is this: to be able at any moment to sacrifice what we are for what we could become.", + "author": "Charles Du Bos" + }, + { + "content": "Reviewing what you have learned and learning anew, you are fit to be a teacher.", + "author": "Confucius" + }, + { + "content": "The past has no power to stop you from being present now. Only your grievance about the past can do that.", + "author": "Eckhart Tolle" + }, + { + "content": "Without leaps of imagination, or dreaming, we lose the excitement of possibilities. Dreaming, after all, is a form of planning.", + "author": "Gloria Steinem" + }, + { + "content": "Never bend your head. Always hold it high. Look the world right in the eye.", + "author": "Helen Keller" + }, + { + "content": "You cannot step twice into the same river, for other waters are continually flowing in.", + "author": "Heraclitus" + }, + { + "content": "Things turn out best for those who make the best of the way things turn out.", + "author": "Jack Buck" + }, + { + "content": "Man is not sum of what he has already, but rather the sum of what he does not yet have, of what he could have.", + "author": "Jean-Paul Sartre" + }, + { + "content": "Everything that happens as it should, and if you observe carefully, you will find this to be so.", + "author": "Marcus Aurelius" + }, + { + "content": "Everything we hear is an opinion, not a fact. Everything we see is a perspective, not the truth.", + "author": "Marcus Aurelius" + }, + { + "content": "A thing long expected takes the form of the unexpected when at last it comes.", + "author": "Mark Twain" + }, + { + "content": "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do.", + "author": "Mark Twain" + }, + { + "content": "Better be ignorant of a matter than half know it.", + "author": "Publilius Syrus" + }, + { + "content": "Our lives are a sum total of the choices we have made.", + "author": "Wayne Dyer" + }, + { + "content": "Were here for a reason. I believe a bit of the reason is to throw little torches out to lead people through the dark.", + "author": "Whoopi Goldberg" + }, + { + "content": "True silence is the rest of the mind; it is to the spirit what sleep is to the body, nourishment and refreshment.", + "author": "William Penn" + }, + { + "content": "Spectacular achievement is always preceded by unspectacular preparation.", + "author": "Robert Schuller" + }, + { + "content": "The saddest aspect of life right now is that science gathers knowledge faster than society gathers wisdom.", + "author": "Isaac Asimov" + }, + { + "content": "The attempt to combine wisdom and power has only rarely been successful and then only for a short while.", + "author": "Albert Einstein" + }, + { + "content": "True friendship multiplies the good in life and divides its evils. Strive to have friends, for life without friends is like life on a desert island... to find one real friend in a lifetime is good fortune; to keep him is a blessing.", + "author": "Baltasar Gracián" + }, + { + "content": "Read as you taste fruit or savor wine, or enjoy friendship, love or life.", + "author": "George Herbert" + }, + { + "content": "Constant kindness can accomplish much. As the sun makes ice melt, kindness causes misunderstanding, mistrust, and hostility to evaporate.", + "author": "Albert Schweitzer" + }, + { + "content": "How wonderful it is that nobody need wait a single moment before starting to improve the world.", + "author": "Anne Frank" + }, + { + "content": "What we think, we become.", + "author": "Buddha" + }, + { + "content": "Just as a candle cannot burn without fire, men cannot live without a spiritual life.", + "author": "Buddha" + }, + { + "content": "To study and not think is a waste. To think and not study is dangerous.", + "author": "Confucius" + }, + { + "content": "The only person who never makes mistakes is the person who never does anything.", + "author": "Denis Waitley" + }, + { + "content": "The greatest mistake you can make in life is to be continually fearing you will make one.", + "author": "Elbert Hubbard" + }, + { + "content": "The future belongs to those who believe in the beauty of their dreams.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Life is what you make of it. Always has been, always will be.", + "author": "Grandma Moses" + }, + { + "content": "I have just three things to teach: simplicity, patience, compassion. These three are your greatest treasures.", + "author": "Laozi" + }, + { + "content": "Our virtues and our failings are inseparable, like force and matter. When they separate, man is no more.", + "author": "Nikola Tesla" + }, + { + "content": "I am always doing that which I cannot do, in order that I may learn how to do it.", + "author": "Pablo Picasso" + }, + { + "content": "It is one of the blessings of old friends that you can afford to be stupid with them.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Happiness is a perfume you cannot pour on others without getting a few drops on yourself.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The most complicated achievements of thought are possible without the assistance of consciousness.", + "author": "Sigmund Freud" + }, + { + "content": "If you can dream it, you can do it.", + "author": "Walt Disney" + }, + { + "content": "To be happy is to be able to become aware of oneself without fright.", + "author": "Walter Benjamin" + }, + { + "content": "Ideals are an imaginative understanding of that which is desirable in that which is possible.", + "author": "Walter Lippmann" + }, + { + "content": "You are important enough to ask and you are blessed enough to receive back.", + "author": "Wayne Dyer" + }, + { + "content": "We make a living by what we get, but we make a life by what we give.", + "author": "Winston Churchill" + }, + { + "content": "We are made wise not by the recollection of our past, but by the responsibility for our future.", + "author": "Bernard Shaw" + }, + { + "content": "In the sweetness of friendship let there be laughter and sharing of pleasures. For in the dew of little things the heart finds its morning and is refreshed.", + "author": "Kahlil Gibran" + }, + { + "content": "Friendship... is not something you learn in school. But if you haven't learned the meaning of friendship, you really haven't learned anything.", + "author": "Muhammad Ali" + }, + { + "content": "Love, friendship and respect do not unite people as much as a common hatred for something.", + "author": "Anton Chekhov" + }, + { + "content": "Some people go to priests; others to poetry; I to my friends.", + "author": "Virginia Woolf" + }, + { + "content": "Good advice is always certain to be ignored, but that's no reason not to give it.", + "author": "Agatha Christie" + }, + { + "content": "There is not one big cosmic meaning for all, there is only the meaning we each give to our life.", + "author": "Anaïs Nin" + }, + { + "content": "Tell me and I forget. Teach me and I remember. Involve me and I learn.", + "author": "Benjamin Franklin" + }, + { + "content": "Man is equally incapable of seeing the nothingness from which he emerges and the infinity in which he is engulfed.", + "author": "Blaise Pascal" + }, + { + "content": "There is nothing in a caterpillar that tells you it's going to be a butterfly.", + "author": "Buckminster Fuller" + }, + { + "content": "Peace comes from within. Do not seek it without.", + "author": "Buddha" + }, + { + "content": "The most beautiful things in the world cannot be seen or even touched. They must be felt with the heart.", + "author": "Helen Keller" + }, + { + "content": "If you don't design your own life plan, chances are you'll fall into someone else's plan. And guess what they have planned for you? Not much.", + "author": "Jim Rohn" + }, + { + "content": "Those who dare to fail miserably can achieve greatly.", + "author": "John F. Kennedy" + }, + { + "content": "The key to growth is the introduction of higher dimensions of consciousness into our awareness.", + "author": "Laozi" + }, + { + "content": "Aerodynamically the bumblebee shouldn't be able to fly, but the bumblebee doesn't know that, so it goes on flying anyway.", + "author": "Mary Kay Ash" + }, + { + "content": "The greatest danger for most of us is not that our aim is too high, and we miss it, but that it is too low, and we reach it.", + "author": "Michelangelo" + }, + { + "content": "Lots of people want to ride with you in the limo, but what you want is someone who will take the bus with you when the limo breaks down.", + "author": "Oprah Winfrey" + }, + { + "content": "I begin with an idea and then it becomes something else.", + "author": "Pablo Picasso" + }, + { + "content": "Happiness is the reward we get for living to the highest right we know.", + "author": "Richard Bach" + }, + { + "content": "Wisdom is the supreme part of happiness.", + "author": "Sophocles" + }, + { + "content": "Think for yourselves and let others enjoy the privilege to do so too.", + "author": "Voltaire" + }, + { + "content": "I cannot always control what goes on outside. But I can always control what goes on inside.", + "author": "Wayne Dyer" + }, + { + "content": "I'd rather attempt to do something great and fail than to attempt to do nothing and succeed.", + "author": "Robert Schuller" + }, + { + "content": "The greatest obstacle to discovery is not ignorance - it is the illusion of knowledge.", + "author": "Daniel J. Boorstin" + }, + { + "content": "Wisdom cannot come by railroad or automobile or airplane or be hurried up by telegraph or telephone.", + "author": "John Burroughs" + }, + { + "content": "Know what's important and what isn't. Have the wisdom to know the right thing to do, the integrity to do it, the character to stand up to those who don't, and the courage to stop those who won't.", + "author": "Mark Goulston" + }, + { + "content": "Logic is the beginning of wisdom, not the end.", + "author": "Leonard Nimoy" + }, + { + "content": "One's life has value so long as one attributes value to the life of others, by means of love, friendship, indignation and compassion.", + "author": "Simone de Beauvoir" + }, + { + "content": "I walk slowly, but I never walk backward.", + "author": "Abraham Lincoln" + }, + { + "content": "The happiness of a man in this life does not consist in the absence but in the mastery of his passions.", + "author": "Alfred Tennyson" + }, + { + "content": "The secret of success is constancy to purpose.", + "author": "Benjamin Disraeli" + }, + { + "content": "When you realize how perfect everything is you will tilt your head back and laugh at the sky.", + "author": "Buddha" + }, + { + "content": "I do not believe in a fate that falls on men however they act; but I do believe in a fate that falls on them unless they act.", + "author": "G. K. Chesterton" + }, + { + "content": "Everything that irritates us about others can lead us to an understanding of ourselves.", + "author": "Carl Jung" + }, + { + "content": "Genuine love should first be directed at oneself; if we do not love ourselves, how can we love others?", + "author": "Dalai Lama" + }, + { + "content": "Happiness mainly comes from our own attitude, rather than from external factors.", + "author": "Dalai Lama" + }, + { + "content": "I believe that we are solely responsible for our choices, and we have to accept the consequences of every deed, word, and thought throughout our lifetime.", + "author": "Elisabeth Kübler-Ross" + }, + { + "content": "Make the best use of what is in your power and take the rest as it happens.", + "author": "Epictetus" + }, + { + "content": "I am a man of fixed and unbending principles, the first of which is to be flexible at all times.", + "author": "Everett Dirksen" + }, + { + "content": "The best and most beautiful things in the world cannot be seen, nor touched... but are felt in the heart.", + "author": "Helen Keller" + }, + { + "content": "If you must tell me your opinions, tell me what you believe in. I have plenty of doubts of my own.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Gratitude makes sense of our past, brings peace for today, and creates a vision for tomorrow.", + "author": "Melody Beattie" + }, + { + "content": "The cause is hidden. The effect is visible to all.", + "author": "Ovid" + }, + { + "content": "The greatest obstacle to connecting with our joy is resentment.", + "author": "Pema Chödrön" + }, + { + "content": "We read the world wrong and say that it deceives us.", + "author": "Rabindranath Tagore" + }, + { + "content": "Each man has his own vocation; his talent is his call. There is one direction in which all space is open to him.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The place to improve the world is first in one's own heart and head and hands.", + "author": "Robert M. Pirsig" + }, + { + "content": "It is in your moments of decision that your destiny is shaped.", + "author": "Tony Robbins" + }, + { + "content": "I never worry about action, but only inaction.", + "author": "Winston Churchill" + }, + { + "content": "You are the only person on earth who can use your ability.", + "author": "Zig Ziglar" + }, + { + "content": "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest.", + "author": "Confucius" + }, + { + "content": "Music is a higher revelation than all wisdom and philosophy.", + "author": "Ludwig van Beethoven" + }, + { + "content": "Along with success comes a reputation for wisdom.", + "author": "Euripides" + }, + { + "content": "If you have one true friend, you have more than your share.", + "author": "Thomas Fuller" + }, + { + "content": "There are no strangers here; Only friends you haven't yet met.", + "author": "William Butler Yeats" + }, + { + "content": "Marriage is the highest state of friendship. If happy, it lessens our cares by dividing them, at the same time that it doubles our pleasures by mutual participation.", + "author": "Samuel Richardson" + }, + { + "content": "A friend may well be reckoned the masterpiece of nature.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "It is important to our friends to believe that we are unreservedly frank with them, and important to friendship that we are not.", + "author": "Mignon McLaughlin" + }, + { + "author": "Woody Allen", + "content": "I don't want to achieve immortality through my work... I want to achieve it through not dying." + }, + { + "author": "Woody Allen", + "content": "I was thrown out of college for cheating on the metaphysics exam; I looked into the soul of the boy sitting next to me." + }, + { + "content": "No valid plans for the future can be made by those who have no capacity for living now.", + "author": "Alan Watts" + }, + { + "content": "He who angers you conquers you.", + "author": "Elizabeth Kenny" + }, + { + "content": "One needs something to believe in, something for which one can have whole-hearted enthusiasm. One needs to feel that one's life has meaning, that one is needed in this world.", + "author": "Hannah Szenes" + }, + { + "content": "We could never learn to be brave and patient if there were only joy in the world.", + "author": "Helen Keller" + }, + { + "content": "Almost everything comes from nothing.", + "author": "Henri-Frédéric Amiel" + }, + { + "content": "In the end we retain from our studies only that which we practically apply.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Happiness often sneaks in through a door you didn't know you left open.", + "author": "John Barrymore" + }, + { + "content": "The journey of a thousand miles begins with one step.", + "author": "Laozi" + }, + { + "content": "Always tell the truth. That way, you don't have to remember what you said.", + "author": "Mark Twain" + }, + { + "content": "Whoever is happy will make others happy, too.", + "author": "Mark Twain" + }, + { + "content": "Life's most persistent and urgent question is, 'What are you doing for others?'", + "author": "Martin Luther King Jr." + }, + { + "content": "Do not wait for leaders; do it alone, person to person.", + "author": "Mother Teresa" + }, + { + "content": "The best cure for the body is a quiet mind.", + "author": "Napoleon" + }, + { + "content": "When your desires are strong enough you will appear to possess superhuman powers to achieve.", + "author": "Napoleon Hill" + }, + { + "content": "Men of perverse opinion do not know the excellence of what is in their hands, till someone dash it from them.", + "author": "Sophocles" + }, + { + "content": "Grief can be the garden of compassion. If you keep your heart open through everything, your pain can become your greatest ally in your life's search for love and wisdom.", + "author": "Rumi" + }, + { + "content": "Knowledge speaks, but wisdom listens.", + "author": "Jimi Hendrix" + }, + { + "content": "Knowing others is wisdom, knowing yourself is Enlightenment.", + "author": "Laozi" + }, + { + "content": "Wisdom comes alone through suffering.", + "author": "Aeschylus" + }, + { + "content": "Wisdom is oftentimes nearer when we stoop than when we soar.", + "author": "William Wordsworth" + }, + { + "content": "All this worldly wisdom was once the unamiable heresy of some wise man.", + "author": "Henry David Thoreau" + }, + { + "content": "One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.", + "author": "Elbert Hubbard" + }, + { + "content": "Loyalty and friendship, which is to me the same, created all the wealth that I've ever thought I'd have.", + "author": "Ernie Banks" + }, + { + "content": "Nothing but heaven itself is better than a friend who is really a friend.", + "author": "Plautus" + }, + { + "content": "Friendship is held to be the severest test of character. It is easy, we think, to be loyal to a family and clan, whose blood is in your own veins.", + "author": "Charles Eastman" + }, + { + "content": "Try not to become a man of success, but rather try to become a man of value.", + "author": "Albert Einstein" + }, + { + "content": "Dreams pass into the reality of action. From the actions stems the dream again; and this interdependence produces the highest form of living.", + "author": "Anaïs Nin" + }, + { + "content": "Yesterday is history. Tomorrow is a mystery. And today? Today is a gift. That is why we call it the present.", + "author": "Babatunde Olatunji" + }, + { + "content": "A wise man can learn more from a foolish question than a fool can learn from a wise answer.", + "author": "Bruce Lee" + }, + { + "content": "It is not fair to ask of others what you are unwilling to do yourself.", + "author": "Eleanor Roosevelt" + }, + { + "content": "The truest greatness lies in being kind, the truest wisdom in a happy mind.", + "author": "Ella Wheeler Wilcox" + }, + { + "content": "Mountains cannot be surmounted except by winding paths.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "If your actions inspire others to dream more, learn more, do more and become more, you are a leader.", + "author": "John Quincy Adams" + }, + { + "content": "To lead people walk behind them.", + "author": "Laozi" + }, + { + "content": "When you are content to be simply yourself and don't compare or compete, everybody will respect you.", + "author": "Laozi" + }, + { + "content": "It is the quality of our work which will please God, not the quantity.", + "author": "Mahatma Gandhi" + }, + { + "content": "All great achievements require time.", + "author": "Maya Angelou" + }, + { + "content": "No alibi will save you from accepting the responsibility.", + "author": "Napoleon Hill" + }, + { + "content": "There are no limitations to the mind except those we acknowledge.", + "author": "Napoleon Hill" + }, + { + "content": "All things change; nothing perishes.", + "author": "Ovid" + }, + { + "content": "Build a better mousetrap and the world will beat a path to your door.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Be not angry that you cannot make others as you wish them to be, since you cannot make yourself as you wish to be.", + "author": "Thomas à Kempis" + }, + { + "content": "For everything that lives is holy, life delights in life.", + "author": "William Blake" + }, + { + "_id": "J-Q-UnpXS3G2", + "content": "The pessimist sees difficulty in every opportunity. The optimist sees the opportunity in every difficulty.", + "author": "Winston Churchill" + }, + { + "content": "The will to win, the desire to succeed, the urge to reach your full potential... these are the keys that will unlock the door to personal excellence.", + "author": "Confucius" + }, + { + "content": "The superior man blames himself. The inferior man blames others.", + "author": "Don Shula" + }, + { + "content": "The smallest deed is better than the greatest intention.", + "author": "John Burroughs" + }, + { + "content": "The world is a book, and those who do not travel read only a page.", + "author": "Augustine of Hippo" + }, + { + "content": "The thought manifests as the word. The word manifests as the deed. The deed develops into habit. And the habit hardens into character.", + "author": "Buddha" + }, + { + "content": "We must not say every mistake is a foolish one.", + "author": "Cicero" + }, + { + "content": "The superior man is satisfied and composed; the mean man is always full of distress.", + "author": "Confucius" + }, + { + "content": "When it is obvious that the goals cannot be reached, don't adjust the goals, adjust the action steps.", + "author": "Confucius" + }, + { + "content": "The most important thing is transforming our minds, for a new way of thinking, a new outlook: we should strive to develop a new inner world.", + "author": "Dalai Lama" + }, + { + "content": "Today you are you! That is truer than true! There is no one alive who is you-er than you!", + "author": "Dr. Seuss" + }, + { + "content": "Obstacles are those frightful things you see when you take your eyes off your goal.", + "author": "Henry Ford" + }, + { + "content": "An ant on the move does more than a dozing ox", + "author": "Laozi" + }, + { + "content": "From wonder into wonder existence opens.", + "author": "Laozi" + }, + { + "content": "Cherish your visions and your dreams as they are the children of your soul; the blueprints of your ultimate achievements.", + "author": "Napoleon Hill" + }, + { + "content": "Edison failed 10,000 times before he made the electric light. Do not be discouraged if you fail a few times.", + "author": "Napoleon Hill" + }, + { + "content": "What is a weed? A plant whose virtues have not yet been discovered.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "They can conquer who believe they can.", + "author": "Virgil" + }, + { + "content": "Go for it now. The future is promised to no one.", + "author": "Wayne Dyer" + }, + { + "content": "Difficulties are meant to rouse, not discourage. The human spirit is to grow strong by conflict.", + "author": "William Ellery Channing" + }, + { + "content": "Beginning today, treat everyone you meet as if they were going to be dead by midnight. Extend to them all the care, kindness and understanding you can muster, and do it with no thought of any reward. Your life will never be the same again.", + "author": "Og Mandino" + }, + { + "content": "None knows the weight of another's burden.", + "author": "George Herbert" + }, + { + "content": "To keep your secret is wisdom; but to expect others to keep it is folly.", + "author": "Samuel Johnson" + }, + { + "content": "Walking with a friend in the dark is better than walking alone in the light.", + "author": "Helen Keller" + }, + { + "content": "There are two ways to slide easily through life: to believe everything or to doubt everything; both ways save us from thinking.", + "author": "Alfred Korzybski" + }, + { + "content": "Without passion man is a mere latent force and possibility, like the flint which awaits the shock of the iron before it can give forth its spark.", + "author": "Henri-Frédéric Amiel" + }, + { + "content": "The personal life deeply lived always expands into truths beyond itself.", + "author": "Anaïs Nin" + }, + { + "content": "Life's challenges are not supposed to paralyze you, they're supposed to help you discover who you are.", + "author": "Bernice Reagon" + }, + { + "content": "Everything that irritates us about others can lead us to a better understanding of ourselves.", + "author": "Carl Jung" + }, + { + "content": "A lot of times people look at the negative side of what they feel they can't do. I always look on the positive side of what I can do.", + "author": "Chuck Norris" + }, + { + "content": "Do one thing every day that scares you.", + "author": "Eleanor Roosevelt" + }, + { + "content": "One that desires to excel should endeavor in those things that are in themselves most excellent.", + "author": "Epictetus" + }, + { + "_id": "bEBdLymQ--0t", + "content": "A subtle thought that is in error may yet give rise to fruitful inquiry that can establish truths of great value.", + "author": "Isaac Asimov" + }, + { + "content": "A really great talent finds its happiness in execution.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "He who lives in harmony with himself lives in harmony with the world.", + "author": "Marcus Aurelius" + }, + { + "content": "Joy is what happens to us when we allow ourselves to recognize how good things really are.", + "author": "Marianne Williamson" + }, + { + "content": "Time is the most valuable thing a man can spend.", + "author": "Theophrastus" + }, + { + "content": "An invincible determination can accomplish almost anything and in this lies the great distinction between great men and little men.", + "author": "Thomas Fuller" + }, + { + "content": "Where all think alike, no one thinks very much.", + "author": "Walter Lippmann" + }, + { + "content": "I think and that is all that I am.", + "author": "Wayne Dyer" + }, + { + "content": "If you change the way you look at things, the things you look at change.", + "author": "Wayne Dyer" + }, + { + "content": "To change one's life, start immediately, do it flamboyantly, no exceptions.", + "author": "William James" + }, + { + "content": "Having nothing, nothing can he lose.", + "author": "William Shakespeare" + }, + { + "content": "Quality is not an act; it is a habit.", + "author": "Aristotle" + }, + { + "content": "The young man knows the rules, but the old man knows the exceptions.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Give me a lever long enough and a fulcrum on which to place it, and I shall move the world.", + "author": "Archimedes" + }, + { + "content": "All this modern technology just makes people try to do everything at once.", + "author": "Bill Watterson" + }, + { + "content": "Sometimes being a friend means mastering the art of timing. There is a time for silence. A time to let go and allow people to hurl themselves into their own destiny. And a time to prepare to pick up the pieces when it's all over.", + "author": "Octavia E. Butler" + }, + { + "content": "Your friend is your needs answered.", + "author": "Kahlil Gibran" + }, + { + "author": "Woody Allen", + "content": "Eighty percent of success is showing up." + }, + { + "content": "When you have got an elephant by the hind legs and he is trying to run away, it's best to let him run.", + "author": "Abraham Lincoln" + }, + { + "content": "How we spend our days is, of course, how we spend our lives.", + "author": "Annie Dillard" + }, + { + "content": "You only lose what you cling to.", + "author": "Buddha" + }, + { + "content": "Life is 10% what happens to you and 90% how you react to it.", + "author": "Chuck Swindoll" + }, + { + "content": "Obstacles are those things you see when you take your eyes off the goal.", + "author": "Hannah More" + }, + { + "content": "The future is completely open, and we are writing it moment to moment.", + "author": "Pema Chödrön" + }, + { + "content": "Never promise more than you can perform.", + "author": "Publilius Syrus" + }, + { + "content": "Good luck is another name for tenacity of purpose.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "If we are not given the chance to forget, we are also not given the chance to recover our memories, to alter them with time, perspective, and wisdom. Forgetting, we can be ourselves beyond what the past has told us we are; we can evolve. That is the possibility we want from the future.", + "author": "Caterina Fake" + }, + { + "content": "Appearances are often deceiving.", + "author": "Aesop" + }, + { + "content": "I think that novels that leave out technology misrepresent life as badly as Victorians misrepresented life by leaving out sex.", + "author": "Kurt Vonnegut" + }, + { + "content": "Technology presumes there's just one right way to do things and there never is.", + "author": "Robert M. Pirsig" + }, + { + "content": "Wishing to be friends is quick work, but friendship is a slow ripening fruit.", + "author": "Aristotle" + }, + { + "content": "Friendship, like the immortality of the soul, is too good to be believed.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "All I required to be happy was friendship and people I could admire.", + "author": "Christian Dior" + }, + { + "_id": "5G-M_-ye7r", + "content": "He who hath many friends hath none.", + "author": "Aristotle" + }, + { + "content": "Imagination is more important than knowledge. For while knowledge defines all we currently know and understand, imagination points to all we might yet discover and create.", + "author": "Albert Einstein" + }, + { + "content": "The greatest pleasure I know is to do a good action by stealth, and to have it found out by accident.", + "author": "Charles Lamb" + }, + { + "content": "To avoid criticism, do nothing, say nothing, be nothing.", + "author": "Elbert Hubbard" + }, + { + "content": "It isn't where you come from, it's where you're going that counts.", + "author": "Ella Fitzgerald" + }, + { + "_id": "Um2MLxmE-Dv-", + "content": "A fine quotation is a diamond on the finger of a man of wit, and a pebble in the hand of a fool.", + "author": "Joseph Roux" + }, + { + "content": "The greatest minds are capable of the greatest vices as well as of the greatest virtues.", + "author": "René Descartes" + }, + { + "content": "Formula for success: under promise and over deliver.", + "author": "Tom Peters" + }, + { + "content": "Love is never lost. If not reciprocated, it will flow back and soften and purify the heart.", + "author": "Washington Irving" + }, + { + "content": "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", + "author": "Thomas Edison" + }, + { + "content": "Without hard work, nothing grows but weeds.", + "author": "Gordon Hinckley" + }, + { + "content": "It's better to be a lion for a day than a sheep all your life.", + "author": "Elizabeth Kenny" + }, + { + "content": "It is unwise to be too sure of one's own wisdom. It is healthy to be reminded that the strongest might weaken and the wisest might err.", + "author": "Mahatma Gandhi" + }, + { + "content": "Never reach out your hand unless you're willing to extend an arm.", + "author": "Pope Paul VI" + }, + { + "content": "Technology frightens me to death. It's designed by engineers to impress other engineers. And they always come with instruction booklets that are written by engineers for other engineers — which is why almost no technology ever works.", + "author": "John Cleese" + }, + { + "content": "Technology… is a queer thing. It brings you great gifts with one hand, and it stabs you in the back with the other.", + "author": "Carrie Snow" + }, + { + "content": "Even an animal, if you show genuine affection, gradually trust develops... If you always showing bad face and beating, how can you develop friendship?", + "author": "Dalai Lama" + }, + { + "content": "What sweetness is left in life, if you take away friendship? Robbing life of friendship is like robbing the world of the sun. A true friend is more to be esteemed than kinsfolk.", + "author": "Cicero" + }, + { + "content": "Through pride we are ever deceiving ourselves. But deep down below the surface of the average conscience a still, small voice says to us, something is out of tune.", + "author": "Carl Jung" + }, + { + "content": "Lord, make me an instrument of thy peace. Where there is hatred, let me sow love.", + "author": "Francis of Assisi" + }, + { + "content": "To be tested is good. The challenged life may be the best therapist.", + "author": "Gail Sheehy" + }, + { + "content": "Sometimes our fate resembles a fruit tree in winter. Who would think that those branches would turn green again and blossom, but we hope it, we know it.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "The wise man does not lay up his own treasures. The more he gives to others, the more he has for his own.", + "author": "Laozi" + }, + { + "content": "The awareness of our own strength makes us modest.", + "author": "Paul Cézanne" + }, + { + "content": "The truth you believe and cling to makes you unavailable to hear anything new.", + "author": "Pema Chödrön" + }, + { + "content": "A good decision is based on knowledge and not on numbers.", + "author": "Plato" + }, + { + "content": "Your friends will know you better in the first minute you meet than your acquaintances will know you in a thousand years.", + "author": "Richard Bach" + }, + { + "content": "Do the difficult things while they are easy and do the great things while they are small. A journey of a thousand miles must begin with a single step.", + "author": "Laozi" + }, + { + "content": "Knowledge without justice ought to be called cunning rather than wisdom.", + "author": "Plato" + }, + { + "content": "Wisdom is found only in truth.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "I prefer the folly of enthusiasm to the indifference of wisdom.", + "author": "Anatole France" + }, + { + "content": "If you do not express your own original ideas, if you do not listen to your own being, you will have betrayed yourself.", + "author": "Rollo May" + }, + { + "content": "Humanity is acquiring all the right technology for all the wrong reasons.", + "author": "Buckminster Fuller" + }, + { + "content": "All of our technology is completely unnecessary to a happy life.", + "author": "Tom Hodgkinson" + }, + { + "content": "Most people are about as happy as they make up their minds to be", + "author": "Abraham Lincoln" + }, + { + "content": "No act of kindness, no matter how small, is ever wasted.", + "author": "Aesop" + }, + { + "content": "The possession of knowledge does not kill the sense of wonder and mystery. There is always more mystery.", + "author": "Anaïs Nin" + }, + { + "content": "If you're walking down the right path and you're willing to keep walking, eventually you'll make progress.", + "author": "Barack Obama" + }, + { + "content": "We don't stop playing because we grow old; we grow old because we stop playing.", + "author": "Bernard Shaw" + }, + { + "content": "Remembering a wrong is like carrying a burden on the mind.", + "author": "Buddha" + }, + { + "content": "A man is great by deeds, not by birth.", + "author": "Chanakya" + }, + { + "content": "Whenever something negative happens to you, there is a deep lesson concealed within it.", + "author": "Eckhart Tolle" + }, + { + "content": "It is impossible for a man to learn what he thinks he already knows.", + "author": "Epictetus" + }, + { + "content": "The only way to tell the truth is to speak with kindness. Only the words of a loving man can be heard.", + "author": "Henry David Thoreau" + }, + { + "content": "When you doubt your power, you give power to your doubt.", + "author": "Honoré de Balzac" + }, + { + "_id": "ff8I--Yqxowc", + "content": "The noblest worship is to make yourself as good and as just as you can.", + "author": "Isocrates" + }, + { + "content": "Sunshine is delicious, rain is refreshing, wind braces us up, snow is exhilarating; there is really no such thing as bad weather, only different kinds of good weather.", + "author": "John Ruskin" + }, + { + "content": "It is through science that we prove, but through intuition that we discover.", + "author": "Henri Poincaré" + }, + { + "content": "To understand the heart and mind of a person, look not at what he has already achieved, but at what he aspires to do.", + "author": "Kahlil Gibran" + }, + { + "content": "Be like the flower, turn your face to the sun.", + "author": "Kahlil Gibran" + }, + { + "content": "Anticipate the difficult by managing the easy.", + "author": "Laozi" + }, + { + "content": "Kind words can be short and easy to speak, but their echoes are truly endless.", + "author": "Mother Teresa" + }, + { + "content": "He who fears being conquered is sure of defeat.", + "author": "Napoleon" + }, + { + "content": "A rolling stone gathers no moss.", + "author": "Publilius Syrus" + }, + { + "content": "Living at risk is jumping off the cliff and building your wings on the way down.", + "author": "Ray Bradbury" + }, + { + "content": "I gave my life to become the person I am right now. Was it worth it?", + "author": "Richard Bach" + }, + { + "content": "Imagination is the living power and prime agent of all human perception.", + "author": "Samuel Taylor Coleridge" + }, + { + "content": "Think in the morning. Act in the noon. Eat in the evening. Sleep in the night.", + "author": "William Blake" + }, + { + "content": "Your attitude, not your aptitude, will determine your altitude.", + "author": "Zig Ziglar" + }, + { + "content": "Learning is the beginning of wealth. Learning is the beginning of health. Learning is the beginning of spirituality. Searching and learning is where the miracle process all begins.", + "author": "Jim Rohn" + }, + { + "content": "Beware of false knowledge; it is more dangerous than ignorance.", + "author": "Bernard Shaw" + }, + { + "content": "A friend to all is a friend to none.", + "author": "Aristotle" + }, + { + "content": "Happiness depends upon ourselves.", + "author": "Aristotle" + }, + { + "content": "There never was a good knife made of bad steel.", + "author": "Benjamin Franklin" + }, + { + "content": "Notice that the stiffest tree is most easily cracked, while the bamboo or willow survives by bending with the wind.", + "author": "Bruce Lee" + }, + { + "content": "Your work is to discover your work and then with all your heart to give yourself to it.", + "author": "Buddha" + }, + { + "content": "Being in humaneness is good. If we select other goodness and thus are far apart from humaneness, how can we be the wise?", + "author": "Confucius" + }, + { + "content": "Small opportunities are often the beginning of great enterprises.", + "author": "Demosthenes" + }, + { + "content": "The poor man is not he who is without a cent, but he who is without a dream.", + "author": "Harry Kemp" + }, + { + "content": "Science is organized knowledge. Wisdom is organized life.", + "author": "Immanuel Kant" + }, + { + "content": "Character develops itself in the stream of life.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "The person born with a talent they are meant to use will find their greatest happiness in using it.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Kindness is the golden chain by which society is bound together.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Discovery consists of seeing what everybody has seen and thinking what nobody else has thought.", + "author": "Jonathan Swift" + }, + { + "content": "A goal without a plan is just a wish.", + "author": "Larry Elder" + }, + { + "content": "Learning never exhausts the mind.", + "author": "Leonardo da Vinci" + }, + { + "content": "You need chaos in your soul to give birth to a dancing star.", + "author": "Friedrich Nietzsche" + }, + { + "content": "To be great is to be misunderstood.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Don't be dismayed by good-byes. A farewell is necessary before you can meet again. And meeting again, after moments or lifetimes, is certain for those who are friends.", + "author": "Richard Bach" + }, + { + "_id": "yDgu-x-mFPpU", + "content": "If one does not know to which port is sailing, no wind is favorable.", + "author": "Seneca the Younger" + }, + { + "content": "What lies behind us and what lies before us are tiny matters compared to what lies within us.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "For beautiful eyes, look for the good in others; for beautiful lips, speak only words of kindness; and for poise, walk with the knowledge that you are never alone.", + "author": "Audrey Hepburn" + }, + { + "content": "There is a wisdom of the head, and a wisdom of the heart.", + "author": "Charles Dickens" + }, + { + "content": "Only put off until tomorrow what you are willing to die having left undone.", + "author": "Pablo Picasso" + }, + { + "content": "Imagination allows us to escape the predictable. It enables us to reply to the common wisdom that we cannot soar by saying, 'Just watch!'", + "author": "Bill Bradley" + }, + { + "content": "Once you label me you negate me.", + "author": "Søren Kierkegaard" + }, + { + "content": "We gain the strength of the temptation we resist.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Just because something doesn't do what you planned it to do doesn't mean it's useless.", + "author": "Thomas Edison" + }, + { + "content": "God always takes the simplest way.", + "author": "Albert Einstein" + }, + { + "content": "There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.", + "author": "Albert Einstein" + }, + { + "content": "Imagination disposes of everything; it creates beauty, justice, and happiness, which are everything in this world.", + "author": "Blaise Pascal" + }, + { + "content": "I want you to be everything that's you, deep at the center of your being.", + "author": "Confucius" + }, + { + "content": "Don't cry because it's over. Smile because it happened.", + "author": "Dr. Seuss" + }, + { + "content": "If you seek truth, you will not seek victory by dishonorable means, and if you find truth you will become invincible.", + "author": "Epictetus" + }, + { + "content": "If you do not change direction, you may end up where you are heading.", + "author": "Laozi" + }, + { + "content": "He who is fixed to a star does not change his mind.", + "author": "Leonardo da Vinci" + }, + { + "content": "We aim above the mark to hit the mark.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Patience is the companion of wisdom.", + "author": "Augustine of Hippo" + }, + { + "content": "Don't look back. Something might be gaining on you.", + "author": "Satchel Paige" + }, + { + "content": "A short saying often contains much wisdom.", + "author": "Sophocles" + }, + { + "content": "Keep your eyes on the stars and your feet on the ground.", + "author": "Theodore Roosevelt" + }, + { + "content": "The more man meditates upon good thoughts, the better will be his world and the world at large.", + "author": "Confucius" + }, + { + "content": "By failing to prepare, you are preparing to fail.", + "author": "Benjamin Franklin" + }, + { + "content": "Wisdom is the right use of knowledge. To know is not to be wise. Many men know a great deal and are all the greater fools for it. There is no fool so great a fool as a knowing fool. But to know how to use knowledge is to have wisdom.", + "author": "Charles Spurgeon" + }, + { + "content": "If you talk to a man in a language he understands, that goes to his head. If you talk to him in his language, that goes to his heart.", + "author": "Nelson Mandela" + }, + { + "content": "There are many ways of going forward, but only one way of standing still.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "Think big thoughts but relish small pleasures.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "All human wisdom is summed up in two words; wait and hope.", + "author": "Alexandre Dumas" + }, + { + "content": "Cunning... is but the low mimic of wisdom.", + "author": "Plato" + }, + { + "content": "To wear your heart on your sleeve isn't a very good plan; you should wear it inside, where it functions best.", + "author": "Margaret Thatcher" + }, + { + "content": "The art challenges the technology, and the technology inspires the art.", + "author": "John Lasseter" + }, + { + "content": "I have learned that friendship isn't about who you've known the longest, it's about who came and never left your side.", + "author": "Yolanda Hadid" + }, + { + "content": "A friend is what the heart needs all the time.", + "author": "Henry van Dyke Jr." + }, + { + "content": "Let us sacrifice our today so that our children can have a better tomorrow.", + "author": "A. P. J. Abdul Kalam" + }, + { + "content": "Never say there is nothing beautiful in the world anymore. There is always something to make you wonder in the shape of a tree, the trembling of a leaf.", + "author": "Albert Schweitzer" + }, + { + "content": "Take things as they are. Punch when you have to punch. Kick when you have to kick.", + "author": "Bruce Lee" + }, + { + "content": "We are what we think. All that we are arises with our thoughts. With our thoughts, we make the world.", + "author": "Buddha" + }, + { + "content": "He who experiences the unity of life sees his own Self in all beings, and all beings in his own Self, and looks on everything with an impartial eye.", + "author": "Buddha" + }, + { + "content": "Knowing your own darkness is the best method for dealing with the darkness of other people.", + "author": "Carl Jung" + }, + { + "content": "What matters is the value we've created in our lives, the people we've made happy and how much we've grown as people.", + "author": "Daisaku Ikeda" + }, + { + "content": "No one can make you feel inferior without your consent.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Know, first, who you are, and then adorn yourself accordingly.", + "author": "Epictetus" + }, + { + "content": "We have two ears and one mouth so that we can listen twice as much as we speak.", + "author": "Epictetus" + }, + { + "content": "The world turns aside to let any man pass who knows where he is going.", + "author": "Epictetus" + }, + { + "content": "I cannot make my days longer, so I strive to make them better.", + "author": "Henry David Thoreau" + }, + { + "content": "Our doubts are traitors and make us lose the good we often might win, by fearing to attempt.", + "author": "Jane Addams" + }, + { + "content": "People are so constituted that everybody would rather undertake what they see others do, whether they have an aptitude for it or not.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "We choose our joys and sorrows long before we experience them.", + "author": "Kahlil Gibran" + }, + { + "content": "When you realize there is nothing lacking, the whole world belongs to you.", + "author": "Laozi" + }, + { + "content": "It is not only for what we do that we are held responsible, but also for what we do not do.", + "author": "Molière" + }, + { + "content": "If you break your neck, if you have nothing to eat, if your house is on fire, then you got a problem. Everything else is inconvenience.", + "author": "Robert Fulghum" + }, + { + "content": "Honesty is the first chapter in the book of wisdom.", + "author": "Thomas Jefferson" + }, + { + "content": "If you'll not settle for anything less than your best, you will be amazed at what you can accomplish in your lives.", + "author": "Vince Lombardi" + }, + { + "content": "To enjoy life, we must touch much of it lightly.", + "author": "Voltaire" + }, + { + "content": "Before you can inspire with emotion, you must be swamped with it yourself. Before you can move their tears, your own must flow. To convince them, you must yourself believe.", + "author": "Winston Churchill" + }, + { + "content": "The way you see people is the way you treat them, and the way you treat them is what they become.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Ignorant men raise questions that wise men answered a thousand years ago.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "I don't turn to greeting cards for wisdom and advice, but they are a fine reflection of the general drift of the culture.", + "author": "Susan Orlean" + }, + { + "content": "Irony is the gaiety of reflection and the joy of wisdom.", + "author": "Anatole France" + }, + { + "content": "Love demands infinitely less than friendship.", + "author": "George Jean Nathan" + }, + { + "content": "Laughter is not at all a bad beginning for a friendship, and it is far the best ending for one.", + "author": "Oscar Wilde" + }, + { + "content": "Friendship multiplies the good of life and divides the evil.", + "author": "Baltasar Gracián" + }, + { + "content": "Do good by stealth, and blush to find it fame.", + "author": "Alexander Pope" + }, + { + "content": "Be kind whenever possible. It is always possible.", + "author": "Dalai Lama" + }, + { + "content": "Keep silence for the most part, and speak only when you must, and then briefly.", + "author": "Epictetus" + }, + { + "content": "I do not believe in a fate that falls on men however they act; but I do believe in a fate that falls on man unless they act.", + "author": "G. K. Chesterton" + }, + { + "content": "If you aren't going all the way, why go at all?", + "author": "Joe Namath" + }, + { + "content": "Treat people as if they were what they ought to be, and you help them to become what they are capable of being.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "A leader is one who knows the way, goes the way, and shows the way.", + "author": "John C. Maxwell" + }, + { + "content": "Faith in oneself is the best and safest course.", + "author": "Michelangelo" + }, + { + "content": "If the stars should appear but one night every thousand years how man would marvel and adore.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "A hero is no braver than an ordinary man, but he is braver five minutes longer.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Be not afraid of greatness: some are born great, some achieve greatness, and some have greatness thrust upon them.", + "author": "William Shakespeare" + }, + { + "content": "Knowledge is knowing that a tomato is a fruit. Wisdom is knowing not to put it in a fruit salad.", + "author": "Brian O'Driscoll" + }, + { + "content": "What happens is not as important as how you react to what happens.", + "author": "Ellen Glasgow" + }, + { + "content": "The final wisdom of life requires not the annulment of incongruity but the achievement of serenity within and above it.", + "author": "Reinhold Niebuhr" + }, + { + "content": "Swim upstream. Go the other way. Ignore the conventional wisdom.", + "author": "Sam Walton" + }, + { + "content": "Dost thou love life? Then do not squander time, for that is the stuff life is made of.", + "author": "Benjamin Franklin" + }, + { + "content": "We don't receive wisdom; we must discover it for ourselves after a journey that no one can take for us or spare us.", + "author": "Marcel Proust" + }, + { + "content": "Every man is a damn fool for at least five minutes every day; wisdom consists in not exceeding the limit.", + "author": "Elbert Hubbard" + }, + { + "content": "Technology is nothing. What's important is that you have a faith in people, that they're basically good and smart, and if you give them tools, they'll do wonderful things with them.", + "author": "Steve Jobs" + }, + { + "content": "We are shaped by our thoughts; we become what we think. When the mind is pure, joy follows like a shadow that never leaves.", + "author": "Buddha" + }, + { + "content": "Silence is deep as Eternity; Speech is shallow as Time.", + "author": "Thomas Carlyle" + }, + { + "content": "You cannot change anything in your life with intention alone, which can become a watered-down, occasional hope that you'll get to tomorrow. Intention without action is useless.", + "author": "Caroline Myss" + }, + { + "content": "You do not become good by trying to be good, but by finding the goodness that is already within you.", + "author": "Eckhart Tolle" + }, + { + "content": "There is no charm equal to tenderness of heart.", + "author": "Jane Austen" + }, + { + "content": "I love you the more in that I believe you had liked me for my own sake and for nothing else.", + "author": "John Keats" + }, + { + "content": "Reality leaves a lot to the imagination.", + "author": "John Lennon" + }, + { + "_id": "aUI--Kax4njP", + "content": "Trust your hunches. They're usually based on facts filed away just below the conscious level.", + "author": "Joyce Brothers" + }, + { + "content": "I always wanted to be somebody, but I should have been more specific.", + "author": "Lily Tomlin" + }, + { + "content": "A garden is always a series of losses set against a few triumphs, like life itself.", + "author": "May Sarton" + }, + { + "content": "We may encounter many defeats, but we must not be defeated.", + "author": "Maya Angelou" + }, + { + "content": "Be yourself; everyone else is already taken.", + "author": "Oscar Wilde" + }, + { + "content": "They can do all because they think they can.", + "author": "Virgil" + }, + { + "content": "The pine stays green in winter... wisdom in hardship.", + "author": "Norman Douglas" + }, + { + "content": "There is a difference between happiness and wisdom: he that thinks himself the happiest man is really so; but he that thinks himself the wisest is generally the greatest fool.", + "author": "Francis Bacon" + }, + { + "content": "This is why I loved technology: if you used it right, it could give you power and privacy.", + "author": "Cory Doctorow" + }, + { + "content": "In romance, we feel the need to zoom in and expound on our partner's foibles in intimate detail; in friendship, we tend to do the opposite, avoiding confrontation through fear, lethargy or both.", + "author": "Mariella Frostrup" + }, + { + "content": "Friendship brings in a lot of honesty and trust into any relationship, especially a marriage.", + "author": "Farhan Akhtar" + }, + { + "content": "Friendships are the family we make - not the one we inherit. I've always been someone to whom friendship, elective affinities, is as important as family.", + "author": "Salman Rushdie" + }, + { + "content": "In friendship as well as love, ignorance very often contributes more to our happiness than knowledge.", + "author": "François de La Rochefoucauld" + }, + { + "content": "A house divided against itself cannot stand.", + "author": "Abraham Lincoln" + }, + { + "content": "No person is your friend who demands your silence or denies your right to grow.", + "author": "Alice Walker" + }, + { + "content": "Your work is to discover your world and then with all your heart give yourself to it.", + "author": "Buddha" + }, + { + "content": "Always be mindful of the kindness and not the faults of others.", + "author": "Buddha" + }, + { + "content": "Who looks outside, dreams, who looks inside, awakes.", + "author": "Carl Jung" + }, + { + "content": "Learning without reflection is a waste, reflection without learning is dangerous.", + "author": "Confucius" + }, + { + "content": "Consider that not only do negative thoughts and emotions destroy our experience of peace, but they also undermine our health.", + "author": "Dalai Lama" + }, + { + "content": "Through meditation and by giving full attention to one thing at a time, we can learn to direct attention where we choose.", + "author": "Eknath Easwaran" + }, + { + "_id": "aJ-kdYIolJ8-", + "content": "Accept challenges, so that you may feel the exhilaration of victory.", + "author": "George S. Patton" + }, + { + "content": "Never idealize others. They will never live up to your expectations.", + "author": "Leo Buscaglia" + }, + { + "content": "You're never a loser until you quit trying.", + "author": "Mike Ditka" + }, + { + "content": "Every time you smile at someone, it is an action of love, a gift to that person, a beautiful thing.", + "author": "Mother Teresa" + }, + { + "content": "You give before you get.", + "author": "Napoleon Hill" + }, + { + "content": "And as we let our own light shine, we unconsciously give other people permission to do the same.", + "author": "Nelson Mandela" + }, + { + "content": "Men in general judge more from appearances than from reality. All men have eyes, but few have the gift of penetration.", + "author": "Niccolò Machiavelli" + }, + { + "content": "In order to live free and happily you must sacrifice boredom. It is not always an easy sacrifice.", + "author": "Richard Bach" + }, + { + "content": "No man was ever wise by chance.", + "author": "Seneca the Younger" + }, + { + "content": "To be beautiful means to be yourself. You don't need to be accepted by others. You need to accept yourself.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "Permanence, perseverance and persistence in spite of all obstacles, discouragements, and impossibilities: It is this, that in all things distinguishes the strong soul from the weak.", + "author": "Thomas Carlyle" + }, + { + "content": "Real magic in relationships means an absence of judgement of others.", + "author": "Wayne Dyer" + }, + { + "content": "A good head and a good heart are always a formidable combination.", + "author": "Nelson Mandela" + }, + { + "content": "If you are bitter, you are like a dry leaf that you can just squash, and you can get blown away by the wind. There is much more wisdom in forgiveness.", + "author": "Vusi Mahlasela" + }, + { + "content": "Honesty is the best policy.", + "author": "Benjamin Franklin" + }, + { + "content": "Friendship often ends in love, but love in friendship - never.", + "author": "Albert Camus" + }, + { + "content": "A person who never made a mistake never tried anything new.", + "author": "Albert Einstein" + }, + { + "content": "The dream was always running ahead of me. To catch up, to live for a moment in unison with it, that was the miracle.", + "author": "Anaïs Nin" + }, + { + "content": "Action may not always bring happiness; but there is no happiness without action.", + "author": "Benjamin Disraeli" + }, + { + "content": "In the sky, there is no distinction of east and west; people create distinctions out of their own minds and then believe them to be true.", + "author": "Buddha" + }, + { + "content": "If we could see the miracle of a single flower clearly, our whole life would change.", + "author": "Buddha" + }, + { + "content": "Life a culmination of the past, an awareness of the present, an indication of the future beyond knowledge, the quality that gives a touch of divinity to matter.", + "author": "Charles Lindbergh" + }, + { + "content": "Impossibilities are merely things which we have not yet learned.", + "author": "Charles W. Chesnutt" + }, + { + "content": "Friendship with oneself is all important because without it one cannot be friends with anybody else in the world.", + "author": "Eleanor Roosevelt" + }, + { + "content": "First say to yourself what you would be; and then do what you have to do.", + "author": "Epictetus" + }, + { + "content": "Fame usually comes to those who are thinking about something else.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Give whatever you are doing and whoever you are with the gift of your attention.", + "author": "Jim Rohn" + }, + { + "content": "You cannot have what you do not want.", + "author": "John Acosta" + }, + { + "content": "Be the change that you want to see in the world.", + "author": "Mahatma Gandhi" + }, + { + "content": "Bad times have a scientific value. These are occasions a good learner would not miss.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "You are never given a wish without also being given the power to make it come true. You may have to work for it, however.", + "author": "Richard Bach" + }, + { + "content": "Many of life's failures are people who did not realize how close they were to success when they gave up.", + "author": "Thomas Edison" + }, + { + "content": "The World is my country, all mankind are my brethren, and to do good is my religion.", + "author": "Thomas Paine" + }, + { + "content": "Nature takes away any faculty that is not used.", + "author": "William Inge" + }, + { + "content": "With the new day comes new strength and new thoughts.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Keep me away from the wisdom which does not cry, the philosophy which does not laugh and the greatness which does not bow before children.", + "author": "Kahlil Gibran" + }, + { + "content": "The word philosophy sounds high-minded, but it simply means the love of wisdom. If you love something, you don't just read about it; you hug it, you mess with it, you play with it, you argue with it.", + "author": "Hugh Jackman" + }, + { + "content": "TV and the Internet are good because they keep stupid people from spending too much time out in public.", + "author": "Douglas Coupland" + }, + { + "content": "The rule of friendship means there should be mutual sympathy between them, each supplying what the other lacks and trying to benefit the other, always using friendly and sincere words.", + "author": "Cicero" + }, + { + "content": "There is nothing impossible to him who will try.", + "author": "Alexander the Great" + }, + { + "content": "The most difficult thing is the decision to act, the rest is merely tenacity. The fears are paper tigers. You can do anything you decide to do. You can act to change and control your life; and the procedure, the process is its own reward.", + "author": "Amelia Earhart" + }, + { + "content": "Age does not protect you from love. But love, to some extent, protects you from age.", + "author": "Anaïs Nin" + }, + { + "content": "In all things of nature there is something of the marvelous.", + "author": "Aristotle" + }, + { + "content": "If you spend too much time thinking about a thing, you'll never get it done.", + "author": "Bruce Lee" + }, + { + "content": "Happiness does not come from having much, but from being attached to little.", + "author": "Cheng Yen" + }, + { + "content": "I find hope in the darkest of days, and focus in the brightest. I do not judge the universe.", + "author": "Dalai Lama" + }, + { + "content": "Absence makes the heart grow fonder.", + "author": "Thomas Haynes Bayly" + }, + { + "content": "Quality means doing it right when no one is looking.", + "author": "Henry Ford" + }, + { + "content": "Conflict is the gadfly of thought. It stirs us to observation and memory. It instigates to invention. It shocks us out of sheeplike passivity, and sets us at noting and contriving.", + "author": "John Dewey" + }, + { + "content": "Change is the law of life. And those who look only to the past or present are certain to miss the future.", + "author": "John F. Kennedy" + }, + { + "content": "Life is what happens to you while you're busy making other plans.", + "author": "John Lennon" + }, + { + "content": "I have always thought the actions of men the best interpreters of their thoughts.", + "author": "John Locke" + }, + { + "content": "He who has imagination without learning has wings but no feet.", + "author": "Joseph Joubert" + }, + { + "content": "Each misfortune you encounter will carry in it the seed of tomorrows good luck.", + "author": "Og Mandino" + }, + { + "content": "Follow your instincts. That is where true wisdom manifests itself.", + "author": "Oprah Winfrey" + }, + { + "content": "Skill to do comes of doing.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "You'll see it when you believe it.", + "author": "Wayne Dyer" + }, + { + "content": "Adversity causes some men to break, others to break records.", + "author": "William Arthur Ward" + }, + { + "content": "If you want to succeed you should strike out on new paths, rather than travel the worn paths of accepted success.", + "author": "John Locke" + }, + { + "content": "I'd rather regret the things I've done than regret the things I haven't done.", + "author": "Lucille Ball" + }, + { + "content": "We are stuck with technology when what we really want is just stuff that works.", + "author": "Douglas Adams" + }, + { + "content": "Technology is the campfire around which we tell our stories.", + "author": "Laurie Anderson" + }, + { + "content": "True friendship can afford true knowledge. It does not depend on darkness and ignorance.", + "author": "Henry David Thoreau" + }, + { + "author": "Abraham Lincoln", + "content": "I'll prepare and someday my chance will come." + }, + { + "content": "Trust your own instinct. Your mistakes might as well be your own, instead of someone else's.", + "author": "Billy Wilder" + }, + { + "content": "Once you choose hope, anything's possible.", + "author": "Christopher Reeve" + }, + { + "content": "It's important to know that words don't move mountains. Work, exacting work moves mountains.", + "author": "Danilo Dolci" + }, + { + "content": "Success in business requires training and discipline and hard work. But if you're not frightened by these things, the opportunities are just as great today as they ever were.", + "author": "David Rockefeller" + }, + { + "content": "The self is not something ready-made, but something in continuous formation through choice of action.", + "author": "John Dewey" + }, + { + "content": "Your big opportunity may be right where you are now.", + "author": "Napoleon Hill" + }, + { + "content": "Only do what your heart tells you.", + "author": "Princess Diana" + }, + { + "content": "It is with words as with sunbeams. The more they are condensed, the deeper they burn.", + "author": "Robert Southey" + }, + { + "content": "Most powerful is he who has himself in his own power.", + "author": "Seneca the Younger" + }, + { + "content": "We must never forget that it is through our actions, words, and thoughts that we have a choice.", + "author": "Sogyal Rinpoche" + }, + { + "content": "If we are not fully ourselves, truly in the present moment, we miss everything.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "How far that little candle throws its beams! So shines a good deed in a naughty world.", + "author": "William Shakespeare" + }, + { + "content": "All the world is a stage, And all the men and women merely players. They have their exits and entrances; Each man in his time plays many parts.", + "author": "William Shakespeare" + }, + { + "content": "O, what a tangled web we weave when first we practice to deceive!", + "author": "Walter Scott" + }, + { + "content": "In life, all good things come hard, but wisdom is the hardest to come by.", + "author": "Lucille Ball" + }, + { + "content": "It is the nature of the wise to resist pleasures, but the foolish to be a slave to them.", + "author": "Epictetus" + }, + { + "content": "The great myth of our times is that technology is communication.", + "author": "Libby Larsen" + }, + { + "content": "Friendship is certainly the finest balm for the pangs of disappointed love.", + "author": "Jane Austen" + }, + { + "content": "If a man does not make new acquaintances as he advances through life, he will soon find himself left alone. A man, sir, should keep his friendship in a constant repair.", + "author": "Samuel Johnson" + }, + { + "content": "Friendship without self-interest is one of the rare and beautiful things of life.", + "author": "James F. Byrnes" + }, + { + "content": "Be sure you put your feet in the right place, then stand firm.", + "author": "Abraham Lincoln" + }, + { + "content": "Mediocrity knows nothing higher than itself, but talent instantly recognizes genius.", + "author": "Arthur Conan Doyle" + }, + { + "content": "Watch the little things; a small leak will sink a great ship.", + "author": "Benjamin Franklin" + }, + { + "content": "All fixed set patterns are incapable of adaptability or pliability. The truth is outside of all fixed patterns.", + "author": "Bruce Lee" + }, + { + "content": "Success is getting what you want. Happiness is wanting what you get.", + "author": "Dale Carnegie" + }, + { + "content": "The winner ain't the one with the fastest car it's the one who refuses to lose.", + "author": "Dale Earnhardt" + }, + { + "content": "I prefer to be true to myself, even at the hazard of incurring the ridicule of others, rather than to be false, and to incur my own abhorrence.", + "author": "Frederick Douglass" + }, + { + "content": "Every artist dips his brush in his own soul, and paints his own nature into his pictures.", + "author": "Henry Ward Beecher" + }, + { + "content": "Arriving at one point is the starting point to another.", + "author": "John Dewey" + }, + { + "content": "If you would take, you must first give, this is the beginning of intelligence.", + "author": "Laozi" + }, + { + "content": "A leader is best when people barely know he exists, when his work is done, his aim fulfilled, they will say: we did it ourselves.", + "author": "Laozi" + }, + { + "content": "To be able to give away riches is mandatory if you wish to possess them. This is the only way that you will be truly rich.", + "author": "Muhammad Ali" + }, + { + "_id": "-ScvfiXp-jo-", + "content": "You can tell whether a man is clever by his answers. You can tell whether a man is wise by his questions.", + "author": "Naguib Mahfouz" + }, + { + "content": "What lies behind us and what lies before us are small matters compared to what lies within us.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Don't believe what your eyes are telling you. All they show is limitation. Look with your understanding, find out what you already know, and you'll see the way to fly.", + "author": "Richard Bach" + }, + { + "content": "The mind unlearns with difficulty what it has long learned.", + "author": "Seneca the Younger" + }, + { + "content": "Begin at once to live and count each separate day as a separate life.", + "author": "Seneca the Younger" + }, + { + "content": "Better to have loved and lost, than to have never loved at all.", + "author": "Augustine of Hippo" + }, + { + "content": "Get busy living or get busy dying.", + "author": "Stephen King" + }, + { + "content": "Believe you can and you're halfway there.", + "author": "Theodore Roosevelt" + }, + { + "content": "I'm a great believer in luck and I find the harder I work, the more I have of it.", + "author": "Thomas Jefferson" + }, + { + "content": "Only I can change my life. No one can do it for me.", + "author": "Carol Burnett" + }, + { + "content": "The greatest obstacle to being heroic is the doubt whether one may not be going to prove oneself a fool; the truest heroism is to resist the doubt; and the profoundest wisdom, to know when it ought to be resisted, and when it be obeyed.", + "author": "Nathaniel Hawthorne" + }, + { + "content": "Let my skin and sinews and bones dry up, together with all the flesh and blood of my body! I welcome it! But I will not move from this spot until I have attained the supreme and final wisdom.", + "author": "Buddha" + }, + { + "content": "I hope our wisdom will grow with our power, and teach us, that the less we use our power the greater it will be.", + "author": "Thomas Jefferson" + }, + { + "content": "A poem begins in delight and ends in wisdom.", + "author": "Robert Frost" + }, + { + "_id": "mRyh-i79x-", + "content": "Love is the only force capable of transforming an enemy into a friend.", + "author": "Martin Luther King Jr." + }, + { + "content": "The final proof of greatness lies in being able to endure criticism without resentment.", + "author": "Elbert Hubbard" + }, + { + "content": "Whoso loves, believes the impossible.", + "author": "Elizabeth Browning" + }, + { + "content": "Happiness can exist only in acceptance.", + "author": "George Orwell" + }, + { + "content": "Work while you have the light. You are responsible for the talent that has been entrusted to you.", + "author": "Henri-Frédéric Amiel" + }, + { + "content": "Perseverance is a great element of success. If you only knock long enough and loud enough at the gate, you are sure to wake up somebody.", + "author": "Henry Wadsworth Longfellow" + }, + { + "content": "Love has no age, no limit; and no death.", + "author": "John Galsworthy" + }, + { + "content": "Music in the soul can be heard by the universe.", + "author": "Laozi" + }, + { + "content": "We lost because we told ourselves we lost.", + "author": "Leo Tolstoy" + }, + { + "content": "Nothing strengthens authority so much as silence.", + "author": "Leonardo da Vinci" + }, + { + "content": "I allow my intuition to lead my path.", + "author": "Manuel Puig" + }, + { + "content": "The truth of the matter is that you always know the right thing to do. The hard part is doing it.", + "author": "Norman Schwarzkopf" + }, + { + "content": "If you want your life to be more rewarding, you have to change the way you think.", + "author": "Oprah Winfrey" + }, + { + "content": "Everything you can imagine is real.", + "author": "Pablo Picasso" + }, + { + "content": "While we stop to think, we often miss our opportunity.", + "author": "Publilius Syrus" + }, + { + "content": "The only way to have a friend is to be one.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Every person, all the events of your life are there because you have drawn them there. What you choose to do with them is up to you.", + "author": "Richard Bach" + }, + { + "content": "To dare is to lose ones footing momentarily. To not dare is to lose oneself.", + "author": "Søren Kierkegaard" + }, + { + "content": "Never put off till tomorrow what you can do today.", + "author": "Thomas Jefferson" + }, + { + "content": "You always succeed in producing a result.", + "author": "Tony Robbins" + }, + { + "content": "God gave us the gift of life; it is up to us to give ourselves the gift of living well.", + "author": "Voltaire" + }, + { + "content": "No matter how carefully you plan your goals they will never be more that pipe dreams unless you pursue them with gusto.", + "author": "W. Clement Stone" + }, + { + "content": "It is not wisdom but Authority that makes a law.", + "author": "Thomas Hobbes" + }, + { + "content": "Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?", + "author": "George Eliot" + }, + { + "content": "I think that we have a great opportunity to impart our wisdom and our knowledge and our experience to this younger generation. It may be different times, but experience transcends time, and wisdom transcends time.", + "author": "Victoria Osteen" + }, + { + "content": "No party has a monopoly on wisdom. No democracy works without compromise.", + "author": "Barack Obama" + }, + { + "content": "Wisdom has never made a bigot, but learning has.", + "author": "Josh Billings" + }, + { + "content": "First we thought the PC was a calculator. Then we found out how to turn numbers into letters with ASCII — and we thought it was a typewriter. Then we discovered graphics, and we thought it was a television. With the World Wide Web, we've realized it's a brochure.", + "author": "Douglas Adams" + }, + { + "content": "I cannot even imagine where I would be today were it not for that handful of friends who have given me a heart full of joy. Let's face it, friends make life a lot more fun.", + "author": "Chuck Swindoll" + }, + { + "content": "I never considered a difference of opinion in politics, in religion, in philosophy, as cause for withdrawing from a friend.", + "author": "Thomas Jefferson" + }, + { + "content": "The best thing about the future is that it only comes one day at a time.", + "author": "Abraham Lincoln" + }, + { + "content": "Well begun is half done.", + "author": "Aristotle" + }, + { + "content": "No yesterdays are ever wasted for those who give themselves to today.", + "author": "Brendan Behan" + }, + { + "content": "The less effort, the faster and more powerful you will be.", + "author": "Bruce Lee" + }, + { + "content": "No one saves us but ourselves. No one can and no one may. We ourselves must walk the path.", + "author": "Buddha" + }, + { + "content": "However many holy words you read, however many you speak, what good will they do you if you do not act on upon them?", + "author": "Buddha" + }, + { + "content": "Gratitude is riches. Complaint is poverty.", + "author": "Doris Day" + }, + { + "content": "A man sees in the world what he carries in his heart.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "Before you put on a frown, make absolutely sure there are no smiles available.", + "author": "James M. Beggs" + }, + { + "content": "Difficulties increase the nearer we get to the goal.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "When I let go of what I am, I become what I might be.", + "author": "Laozi" + }, + { + "content": "Let us always meet each other with smile, for the smile is the beginning of love.", + "author": "Mother Teresa" + }, + { + "content": "The aim of life is self-development. To realize one's nature perfectly - that is what each of us is here for.", + "author": "Oscar Wilde" + }, + { + "content": "Great are they who see that spiritual is stronger than any material force, that thoughts rule the world.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "So is cheerfulness, or a good temper, the more it is spent, the more remains.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "The conditions of conquest are always easy. We have but to toil awhile, endure awhile, believe always, and never turn back.", + "author": "Seneca the Younger" + }, + { + "content": "Love all, trust a few, do wrong to none.", + "author": "William Shakespeare" + }, + { + "content": "We should not give up and we should not allow the problem to defeat us.", + "author": "A. P. J. Abdul Kalam" + }, + { + "content": "That old law about 'an eye for an eye' leaves everybody blind. The time is always right to do the right thing.", + "author": "Martin Luther King Jr." + }, + { + "content": "The opportunity for brotherhood presents itself every time you meet a human being.", + "author": "Jane Wyman" + }, + { + "content": "A ruffled mind makes a restless pillow.", + "author": "Charlotte Brontë" + }, + { + "content": "Wisdom and penetration are the fruit of experience, not the lessons of retirement and leisure. Great necessities call out great virtues.", + "author": "Abigail Adams" + }, + { + "content": "Never accept ultimatums, conventional wisdom, or absolutes.", + "author": "Christopher Reeve" + }, + { + "content": "All love that has not friendship for its base, is like a mansion built upon the sand.", + "author": "Ella Wheeler Wilcox" + }, + { + "content": "A man cannot be said to succeed in this life who does not satisfy one friend.", + "author": "Henry David Thoreau" + }, + { + "content": "The fact is, with every friendship you make, and every bond of trust you establish, you are shaping the image of America projected to the rest of the world. That is so important. So when you study abroad, you're actually helping to make America stronger.", + "author": "Michelle Obama" + }, + { + "content": "Of course there is no formula for success except perhaps an unconditional acceptance of life and what it brings.", + "author": "Arthur Rubinstein" + }, + { + "content": "The heart has its reasons which reason knows not of.", + "author": "Blaise Pascal" + }, + { + "content": "Always be yourself, express yourself, have faith in yourself, do not go out and look for a successful personality and duplicate it.", + "author": "Bruce Lee" + }, + { + "content": "Do not overrate what you have received, nor envy others. He who envies others does not obtain peace of mind.", + "author": "Buddha" + }, + { + "content": "On every thorn, delightful wisdom grows, in every rill a sweet instruction flows.", + "author": "Edward Young" + }, + { + "content": "The beginning of knowledge is the discovery of something we do not understand.", + "author": "Frank Herbert" + }, + { + "content": "Intuition is the very force or activity of the soul in its experience through whatever has been the experience of the soul itself.", + "author": "Henry Reed" + }, + { + "content": "Be glad of life because it gives you the chance to love, to work, to play, and to look up at the stars.", + "author": "Henry van Dyke Jr." + }, + { + "content": "Either you run the day or the day runs you.", + "author": "Jim Rohn" + }, + { + "content": "Not what we have but what we enjoy constitutes our abundance.", + "author": "Jean Antoine Petit-Senn" + }, + { + "content": "Dreams come true. Without that possibility, nature would not incite us to have them.", + "author": "John Updike" + }, + { + "content": "As an organizer I start from where the world is, as it is, not as I would like it to be.", + "author": "Saul Alinsky" + }, + { + "content": "The greatest way to live with honor in this world is to be what we pretend to be.", + "author": "Socrates" + }, + { + "content": "To be aware of a single shortcoming in oneself is more useful than to be aware of a thousand in someone else.", + "author": "Dalai Lama" + }, + { + "content": "No garden is without its weeds.", + "author": "Thomas Fuller" + }, + { + "content": "Life is like a sewer. What you get out of it depends on what you put into it.", + "author": "Tom Lehrer" + }, + { + "content": "In seed time learn, in harvest teach, in winter enjoy.", + "author": "William Blake" + }, + { + "content": "Accept the challenges so that you can feel the exhilaration of victory.", + "author": "George S. Patton" + }, + { + "content": "The more you like yourself, the less you are like anyone else, which makes you unique.", + "author": "Walt Disney" + }, + { + "content": "If you set out to be liked, you would be prepared to compromise on anything at any time, and you would achieve nothing.", + "author": "Margaret Thatcher" + }, + { + "content": "The most I can do for my friend is simply be his friend.", + "author": "Henry David Thoreau" + }, + { + "content": "Rejoicing in our joy, not suffering over our suffering, makes someone a friend.", + "author": "Friedrich Nietzsche" + }, + { + "content": "Love and friendship exclude each other.", + "author": "Jean de La Bruyère" + }, + { + "content": "Trust only movement. Life happens at the level of events, not of words. Trust movement.", + "author": "Alfred Adler" + }, + { + "content": "I have never been hurt by anything I didn't say.", + "author": "Calvin Coolidge" + }, + { + "content": "Our lives are the only meaningful expression of what we believe and in Whom we believe. And the only real wealth, for any of us, lies in our faith.", + "author": "Gordon Hinckley" + }, + { + "content": "Promises are the uniquely human way of ordering the future, making it predictable and reliable to the extent that this is humanly possible.", + "author": "Hannah Arendt" + }, + { + "content": "He who knows himself is enlightened.", + "author": "Laozi" + }, + { + "content": "Iron rusts from disuse; water loses its purity from stagnation... even so does inaction sap the vigor of the mind.", + "author": "Leonardo da Vinci" + }, + { + "content": "The years teach much which the days never know.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Life is a progress, and not a station.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Everything in the universe goes by indirection. There are no straight lines.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Luck is what happens when preparation meets opportunity.", + "author": "Seneca the Younger" + }, + { + "content": "Genius is one percent inspiration and ninety-nine percent perspiration.", + "author": "Thomas Edison" + }, + { + "content": "All our dreams can come true, if we have the courage to pursue them.", + "author": "Walt Disney" + }, + { + "content": "Good, better, best. Never let it rest. ‘Til your good is better and your better is best.", + "author": "Jerome" + }, + { + "content": "A long habit of not thinking a thing wrong gives it a superficial appearance of being right.", + "author": "Thomas Paine" + }, + { + "content": "The doorstep to the temple of wisdom is a knowledge of our own ignorance.", + "author": "Benjamin Franklin" + }, + { + "content": "The more sand that has escaped from the hourglass of our life, the clearer we should see through it.", + "author": "Jean-Paul Sartre" + }, + { + "content": "My best friend is the one who brings out the best in me.", + "author": "Henry Ford" + }, + { + "content": "We must reach out our hand in friendship and dignity both to those who would befriend us and those who would be our enemy.", + "author": "Arthur Ashe" + }, + { + "content": "Life is like riding a bicycle. To keep your balance you must keep moving.", + "author": "Albert Einstein" + }, + { + "content": "Change in all things is sweet.", + "author": "Aristotle" + }, + { + "content": "Trust yourself. You know more than you think you do.", + "author": "Benjamin Spock" + }, + { + "content": "Life's challenges are not supposed to paralyze you, they're supposed to help you discover who you are.", + "author": "Bernice Reagon" + }, + { + "content": "We are all something, but none of us are everything.", + "author": "Blaise Pascal" + }, + { + "content": "You cannot find yourself by going into the past. You can find yourself by coming into the present.", + "author": "Eckhart Tolle" + }, + { + "content": "Love doesn't make the world go round; love is what makes the ride worthwhile.", + "author": "Elizabeth Browning" + }, + { + "content": "A wise man will make more opportunities than he finds.", + "author": "Francis Bacon" + }, + { + "content": "So long as a person is capable of self-renewal they are a living being.", + "author": "Henri-Frédéric Amiel" + }, + { + "content": "The world is round and the place which may seem like the end may also be the beginning.", + "author": "Ivy Baker Priest" + }, + { + "content": "The most successful people are those who are good at plan B.", + "author": "James A. Yorke" + }, + { + "content": "If opportunity doesn't knock, build a door.", + "author": "Milton Berle" + }, + { + "content": "We can do no great things, only small things with great love.", + "author": "Mother Teresa" + }, + { + "_id": "K4fn0Bz-4V1-", + "content": "When you begin to touch your heart or let your heart be touched, you begin to discover that it's bottomless.", + "author": "Pema Chödrön" + }, + { + "content": "Allow the world to live as it chooses, and allow yourself to live as you choose.", + "author": "Richard Bach" + }, + { + "content": "May our hearts garden of awakening bloom with hundreds of flowers.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "Whatever happens, take responsibility.", + "author": "Tony Robbins" + }, + { + "content": "True wisdom is less presuming than folly. The wise man doubteth often, and changeth his mind; the fool is obstinate, and doubteth not; he knoweth all things but his own ignorance.", + "author": "Akhenaten" + }, + { + "content": "Computers are useless. They can only give you answers.", + "author": "Pablo Picasso" + }, + { + "content": "Business, you know, may bring you money, but friendship hardly ever does.", + "author": "Jane Austen" + }, + { + "content": "The world is round so that friendship may encircle it.", + "author": "Pierre Teilhard de Chardin" + }, + { + "content": "To effectively communicate, we must realize that we are all different in the way we perceive the world and use this understanding as a guide to our communication with others.", + "author": "Tony Robbins" + }, + { + "content": "Work out your own salvation. Do not depend on others.", + "author": "Buddha" + }, + { + "content": "The way is not in the sky. The way is in the heart.", + "author": "Buddha" + }, + { + "content": "What is not started today is never finished tomorrow.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "It is not so important to know everything as to appreciate what we learn.", + "author": "Hannah More" + }, + { + "content": "Kindness in words creates confidence. Kindness in thinking creates profoundness. Kindness in giving creates love.", + "author": "Laozi" + }, + { + "content": "Loss is nothing else but change, and change is Nature's delight.", + "author": "Marcus Aurelius" + }, + { + "content": "The greatest part of our happiness depends on our dispositions, not our circumstances.", + "author": "Martha Washington" + }, + { + "content": "First comes thought; then organization of that thought, into ideas and plans; then transformation of those plans into reality. The beginning, as you will observe, is in your imagination.", + "author": "Napoleon Hill" + }, + { + "content": "There is nothing like returning to a place that remains unchanged to find the ways in which you yourself have altered.", + "author": "Nelson Mandela" + }, + { + "content": "Good actions give strength to ourselves and inspire good actions in others.", + "author": "Plato" + }, + { + "content": "Nature is a mutable cloud which is always and never the same.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "In three words I can sum up everything I've learned about life: it goes on.", + "author": "Robert Frost" + }, + { + "content": "Sometimes your joy is the source of your smile, but sometimes your smile can be the source of your joy.", + "author": "Thích Nhất Hạnh" + }, + { + "content": "The spirit, the will to win, and the will to excel, are the things that endure. These qualities are so much more important than the events that occur.", + "author": "Vince Lombardi" + }, + { + "content": "Good people are good because they've come to wisdom through failure. We get very little wisdom from success, you know.", + "author": "William Saroyan" + }, + { + "content": "When we seek to discover the best in others, we somehow bring out the best in ourselves.", + "author": "William Arthur Ward" + }, + { + "content": "A man must be big enough to admit his mistakes, smart enough to profit from them, and strong enough to correct them.", + "author": "John C. Maxwell" + }, + { + "content": "The problem with Google is you have 360 degrees of omnidirectional information on a linear basis, but the algorithms for irony and ambiguity are not there. And those are the algorithms of wisdom.", + "author": "William Hurt" + }, + { + "content": "The greatest achievement of humanity is not its works of art, science, or technology, but the recognition of its own dysfunction.", + "author": "Eckhart Tolle" + }, + { + "content": "A true friend freely, advises justly, assists readily, adventures boldly, takes all patiently, defends courageously, and continues a friend unchangeably.", + "author": "William C. Menninger" + }, + { + "content": "Of all possessions a friend is the most precious.", + "author": "Herodotus" + }, + { + "content": "Friendship is the source of the greatest pleasures, and without friends even the most agreeable pursuits become tedious.", + "author": "Thomas Aquinas" + }, + { + "content": "Logic will get you from A to B. Imagination will take you everywhere.", + "author": "Albert Einstein" + }, + { + "content": "Experience is not what happens to a man. It is what a man does with what happens to him.", + "author": "Aldous Huxley" + }, + { + "content": "Never do things others can do and will do, if there are things others cannot do or will not do.", + "author": "Amelia Earhart" + }, + { + "content": "One today is worth two tomorrows.", + "author": "Benjamin Franklin" + }, + { + "content": "I am of the opinion that my life belongs to the community, and as long as I live it is my privilege to do for it whatever I can.", + "author": "Bernard Shaw" + }, + { + "content": "Gratitude is not only the greatest of virtues, but the parent of all the others.", + "author": "Cicero" + }, + { + "content": "I believe that we are fundamentally the same and have the same basic potential.", + "author": "Dalai Lama" + }, + { + "content": "A man is not old as long as he is seeking something.", + "author": "Edmond Rostand" + }, + { + "content": "I'm not interested in age. People who tell me their age are silly. You're as old as you feel.", + "author": "Elizabeth Arden" + }, + { + "content": "A life spent making mistakes is not only more honorable, but more useful than a life spent doing nothing.", + "author": "George Bernard Shaw" + }, + { + "content": "It is on our failures that we base a new and different and better success.", + "author": "Havelock Ellis" + }, + { + "content": "The really unhappy person is the one who leaves undone what they can do, and starts doing what they don't understand; no wonder they come to grief.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "As we express our gratitude, we must never forget that the highest appreciation is not to utter words, but to live by them.", + "author": "John F. Kennedy" + }, + { + "content": "A single rose can be my garden... a single friend, my world.", + "author": "Leo Buscaglia" + }, + { + "content": "The right way is not always the popular and easy way. Standing for right when it is unpopular is a true test of moral character.", + "author": "Margaret Chase Smith" + }, + { + "content": "Don't settle for a relationship that won't let you be yourself.", + "author": "Oprah Winfrey" + }, + { + "content": "The only thing to do with good advice is to pass it on. It is never of any use to oneself.", + "author": "Oscar Wilde" + }, + { + "content": "The best way out is always through.", + "author": "Robert Frost" + }, + { + "content": "If we did the things we are capable of, we would astound ourselves.", + "author": "Thomas Edison" + }, + { + "content": "If you surrender to the wind, you can ride it.", + "author": "Toni Morrison" + }, + { + "content": "Using the power of decision gives you the capacity to get past any excuse to change any and every part of your life in an instant.", + "author": "Tony Robbins" + }, + { + "content": "Optimism is the faith that leads to achievement. Nothing can be done without hope and confidence.", + "author": "Helen Keller" + }, + { + "content": "It always seems impossible until it's done.", + "author": "Nelson Mandela" + }, + { + "content": "The Universal Zulu Nation stands to acknowledge wisdom, understanding, freedom, justice, and equality, peace, unity, love, and having fun, work, overcoming the negative through the positive, science, mathematics, faith, facts, and the wonders of God, whether we call him Allah, Jehovah, Yahweh, or Jah.", + "author": "Afrika Bambaataa" + }, + { + "content": "All things must come to the soul from its roots, from where it is planted.", + "author": "Teresa of Ávila" + }, + { + "content": "He is no fool who gives what he cannot keep to gain what he cannot lose.", + "author": "Jim Elliot" + }, + { + "content": "Experience is not what happens to you; it's what you do with what happens to you.", + "author": "Aldous Huxley" + }, + { + "content": "America's freedom of religion, and freedom from religion, offers every wisdom tradition an opportunity to address our soul-deep needs: Christianity, Judaism, Islam, Buddhism, Hinduism, secular humanism, agnosticism and atheism among others.", + "author": "Parker Palmer" + }, + { + "content": "I love wisdom. And you can never be great at anything unless you love it. Not be in love with it, but love the thing, admire the thing. And it seems that if you love the thing, and you don't just want to possess it, it will find you.", + "author": "Maya Angelou" + }, + { + "content": "As you walk down the fairway of life you must smell the roses, for you only get to play one round.", + "author": "Ben Hogan" + }, + { + "content": "It is the province of knowledge to speak, and it is the privilege of wisdom to listen.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Technology has to be invented or adopted.", + "author": "Jared Diamond" + }, + { + "content": "It is only the great hearted who can be true friends. The mean and cowardly, can never know what true friendship means.", + "author": "Charles Kingsley" + }, + { + "content": "Sustaining true friendship is a lot more challenging than we give it credit for.", + "author": "Mariella Frostrup" + }, + { + "content": "Friendship needs no words - it is solitude delivered from the anguish of loneliness.", + "author": "Dag Hammarskjöld" + }, + { + "author": "Woody Allen", + "content": "If it turns out that there is a God, I don't think that he's evil. But the worst that you can say about him is that basically he's an underachiever." + }, + { + "content": "One of the advantages of being disorderly is that one is constantly making exciting discoveries.", + "author": "A. A. Milne" + }, + { + "content": "In a controversy the instant we feel anger we have already ceased striving for the truth, and have begun striving for ourselves.", + "author": "Buddha" + }, + { + "content": "All that we are is the result of what we have thought. The mind is everything. What we think we become.", + "author": "Buddha" + }, + { + "content": "I hear and I forget. I see and I remember. I do and I understand.", + "author": "Confucius" + }, + { + "content": "He who wishes to secure the good of others, has already secured his own.", + "author": "Confucius" + }, + { + "content": "There is no need for temples, no need for complicated philosophies. My brain and my heart are my temples; my philosophy is kindness.", + "author": "Dalai Lama" + }, + { + "content": "It is better to have enough ideas for some of them to be wrong, than to be always right by having no ideas at all.", + "author": "Edward de Bono" + }, + { + "content": "Friends show their love in times of trouble, not in happiness.", + "author": "Euripides" + }, + { + "content": "I would maintain that thanks are the highest form of thought, and that gratitude is happiness doubled by wonder.", + "author": "G. K. Chesterton" + }, + { + "content": "I'd rather regret the things that I have done than the things that I have not done.", + "author": "Lucille Ball" + }, + { + "content": "Prejudice is a burden that confuses the past, threatens the future and renders the present inaccessible.", + "author": "Maya Angelou" + }, + { + "content": "If you spend your whole life waiting for the storm, you'll never enjoy the sunshine.", + "author": "Morris West" + }, + { + "content": "We do not quit playing because we grow old, we grow old because we quit playing.", + "author": "Oliver Wendell Holmes Jr." + }, + { + "content": "Do not follow where the path may lead. Go, instead, where there is no path and leave a trail.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "You cannot be lonely if you like the person you're alone with.", + "author": "Wayne Dyer" + }, + { + "content": "God has given you one face, and you make yourself another.", + "author": "William Shakespeare" + }, + { + "content": "You got to be careful if you don't know where you're going, because you might not get there.", + "author": "Yogi Berra" + }, + { + "content": "Whatever you do in life, surround yourself with smart people who'll argue with you.", + "author": "John Wooden" + }, + { + "content": "The truth is not for all men, but only for those who seek it.", + "author": "Ayn Rand" + }, + { + "content": "The human spirit must prevail over technology.", + "author": "Albert Einstein" + }, + { + "content": "Friends are the siblings God never gave us.", + "author": "Mencius" + }, + { + "content": "You win the victory when you yield to friends.", + "author": "Sophocles" + }, + { + "content": "Friendship is Love without his wings!", + "author": "Lord Byron" + }, + { + "content": "Blessed are the hearts that can bend; they shall never be broken.", + "author": "Albert Camus" + }, + { + "content": "Change will not come if we wait for some other person or some other time. We are the ones we've been waiting for. We are the change that we seek.", + "author": "Barack Obama" + }, + { + "content": "We make our own fortunes and we call them fate.", + "author": "Benjamin Disraeli" + }, + { + "content": "Life isn't about finding yourself. Life is about creating yourself.", + "author": "Bernard Shaw" + }, + { + "content": "The world cares very little about what a man or woman knows; it is what a man or woman is able to do that counts.", + "author": "Booker T. Washington" + }, + { + "content": "The trick is in what one emphasizes. We either make ourselves miserable, or we make ourselves happy. The amount of work is the same.", + "author": "Carlos Castaneda" + }, + { + "content": "The cautious seldom err.", + "author": "Confucius" + }, + { + "content": "It is difficult to achieve a spirit of genuine cooperation as long as people remain indifferent to the feelings and happiness of others.", + "author": "Dalai Lama" + }, + { + "content": "The fox has many tricks. The hedgehog has but one. But that is the best of all.", + "author": "Erasmus" + }, + { + "content": "A failure is a man who has blundered but is not capable of cashing in on the experience.", + "author": "Elbert Hubbard" + }, + { + "content": "Remember always that you not only have the right to be an individual, you have an obligation to be one.", + "author": "Eleanor Roosevelt" + }, + { + "content": "Never mistake motion for action.", + "author": "Ernest Hemingway" + }, + { + "content": "If there is no struggle, there is no progress.", + "author": "Frederick Douglass" + }, + { + "content": "Life is what happens while you are making other plans.", + "author": "John Lennon" + }, + { + "content": "Life without love is like a tree without blossoms or fruit.", + "author": "Kahlil Gibran" + }, + { + "content": "One who is too insistent on his own views, finds few to agree with him.", + "author": "Laozi" + }, + { + "content": "If you don't know where you are going, you will probably end up somewhere else.", + "author": "Laurence J. Peter" + }, + { + "content": "Strength does not come from physical capacity. It comes from an indomitable will.", + "author": "Mahatma Gandhi" + }, + { + "content": "You might well remember that nothing can bring you success but yourself.", + "author": "Napoleon Hill" + }, + { + "content": "It is not enough to have a good mind; the main thing is to use it well.", + "author": "René Descartes" + }, + { + "content": "Failure doesn't mean you are a failure it just means you haven't succeeded yet.", + "author": "Robert Schuller" + }, + { + "content": "Stay committed to your decisions, but stay flexible in your approach.", + "author": "Tony Robbins" + }, + { + "content": "If you do what you've always done, you'll get what you've always gotten.", + "author": "Tony Robbins" + }, + { + "content": "Knowledge comes, but wisdom lingers. It may not be difficult to store up in the mind a vast quantity of facts within a comparatively short time, but the ability to form judgments requires the severe discipline of hard work and the tempering heat of experience and maturity.", + "author": "Calvin Coolidge" + }, + { + "content": "If you're trying to achieve, there will be roadblocks. I've had them; everybody has had them. But obstacles don't have to stop you. If you run into a wall, don't turn around and give up. Figure out how to climb it, go through it, or work around it.", + "author": "Michael Jordan" + }, + { + "content": "What makes Superman a hero is not that he has power, but that he has the wisdom and the maturity to use the power wisely. From an acting point of view, that's how I approached the part.", + "author": "Christopher Reeve" + }, + { + "content": "The man who makes everything that leads to happiness depends upon himself, and not upon other men, has adopted the very best plan for living happily. This is the man of moderation, the man of manly character and of wisdom.", + "author": "Plato" + }, + { + "content": "You are a product of your environment. So choose the environment that will best develop you toward your objective. Analyze your life in terms of its environment. Are the things around you helping you toward success - or are they holding you back?", + "author": "W. Clement Stone" + }, + { + "content": "Technology is a word that describes something that doesn't work yet.", + "author": "Douglas Adams" + }, + { + "content": "Science and technology revolutionize our lives, but memory, tradition and myth frame our response.", + "author": "Arthur M. Schlesinger Jr." + }, + { + "content": "True friendship is a plant of slow growth, and must undergo and withstand the shocks of adversity, before it is entitled to the appellation.", + "author": "George Washington" + }, + { + "content": "It is the mark of an educated mind to be able to entertain a thought without accepting it.", + "author": "Aristotle" + }, + { + "content": "Better than a thousand hollow words, is one word that brings peace.", + "author": "Buddha" + }, + { + "content": "The heart has eyes which the brain knows nothing of.", + "author": "Charles Henry Parkhurst" + }, + { + "content": "When you see a good person, think of becoming like him. When you see someone not so good, reflect on your own weak points.", + "author": "Confucius" + }, + { + "content": "We have committed the Golden Rule to memory; let us now commit it to life.", + "author": "Edwin Markham" + }, + { + "content": "The thing always happens that you really believe in; and the belief in a thing makes it happen.", + "author": "Frank Lloyd Wright" + }, + { + "content": "Don't be afraid to go out on a limb. That's where the fruit is.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "If one advances confidently in the direction of his dream, and endeavors to live the life which he had imagines, he will meet with a success unexpected in common hours.", + "author": "Henry David Thoreau" + }, + { + "content": "I care not so much what I am to others as what I am to myself. I will be rich by myself, and not by borrowing.", + "author": "Michel de Montaigne" + }, + { + "content": "Happiness is when what you think, what you say, and what you do are in harmony.", + "author": "Mahatma Gandhi" + }, + { + "content": "As we are liberated from our own fear, our presence automatically liberates others.", + "author": "Nelson Mandela" + }, + { + "content": "Efficiency is doing things right; effectiveness is doing the right things.", + "author": "Peter Drucker" + }, + { + "content": "I have often regretted my speech, never my silence.", + "author": "Publilius Syrus" + }, + { + "content": "You teach best what you most need to learn.", + "author": "Richard Bach" + }, + { + "content": "One's philosophy is not best expressed in words; it is expressed in the choices one makes... and the choices we make are ultimately our responsibility.", + "author": "Eleanor Roosevelt" + }, + { + "content": "It is the neglect of timely repair that makes rebuilding necessary.", + "author": "Richard Whately" + }, + { + "content": "Use what talents you possess; the woods would be very silent if no birds sang there except those that sang best.", + "author": "Henry van Dyke Jr." + }, + { + "content": "In complete darkness we are all the same, it is only our knowledge and wisdom that separates us, don't let your eyes deceive you.", + "author": "Janet Jackson" + }, + { + "content": "If you want to go east, don't go west.", + "author": "Ramakrishna" + }, + { + "content": "Ignorance and bungling with love are better than wisdom and skill without.", + "author": "Henry David Thoreau" + }, + { + "content": "Computers are like bikinis. They save people a lot of guesswork.", + "author": "Sam Ewing" + }, + { + "content": "Every friendship is different because everyone's personality is different.", + "author": "Nargis Fakhri" + }, + { + "content": "The friend who can be silent with us in a moment of despair or confusion, who can stay with us in an hour of grief and bereavement, who can tolerate not knowing... not healing, not curing... that is a friend who cares.", + "author": "Henri Nouwen" + }, + { + "author": "Woody Allen", + "content": "It is impossible to experience one's death objectively and still carry a tune." + }, + { + "content": "One may say the eternal mystery of the world is its comprehensibility.", + "author": "Albert Einstein" + }, + { + "content": "We should all be thankful for those people who rekindle the inner spirit.", + "author": "Albert Schweitzer" + }, + { + "content": "I'm not in this world to live up to your expectations and you're not in this world to live up to mine.", + "author": "Bruce Lee" + }, + { + "content": "There is no failure except in no longer trying.", + "author": "Elbert Hubbard" + }, + { + "content": "We are either progressing or retrograding all the while. There is no such thing as remaining stationary in this life.", + "author": "James Freeman Clarke" + }, + { + "content": "There is no greater harm than that of time wasted.", + "author": "Michelangelo" + }, + { + "content": "Ideas are the beginning points of all fortunes.", + "author": "Napoleon Hill" + }, + { + "content": "Nothing ever goes away until it has taught us what we need to know.", + "author": "Pema Chödrön" + }, + { + "content": "If facts are the seeds that later produce knowledge and wisdom, then the emotions and the impressions of the senses are the fertile soil in which the seeds must grow.", + "author": "Rachel Carson" + }, + { + "content": "Excellence is not a skill. It is an attitude.", + "author": "Ralph Marston" + }, + { + "content": "Sometimes it is better to lose and do the right thing than to win and do the wrong thing.", + "author": "Tony Blair" + }, + { + "content": "Where there is great love, there are always miracles.", + "author": "Willa Cather" + }, + { + "content": "A tree is known by its fruit; a man by his deeds. A good deed is never lost; he who sows courtesy reaps friendship, and he who plants kindness gathers love.", + "author": "Basil of Caesarea" + }, + { + "content": "Never interrupt your enemy when he is making a mistake.", + "author": "Napoleon" + }, + { + "content": "We respect our elders. There is wisdom that comes from experience, and I am not going to stop learning from wise counsel.", + "author": "Marcia Fudge" + }, + { + "content": "Not engaging in ignorance is wisdom.", + "author": "Bodhidharma" + }, + { + "content": "Wisdom has its root in goodness, not goodness its root in wisdom.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "There is a magnet in your heart that will attract true friends. That magnet is unselfishness, thinking of others first; when you learn to live for others, they will live for you.", + "author": "Paramahansa Yogananda" + }, + { + "content": "A true friend is the greatest of all blessings, and that which we take the least care of all to acquire.", + "author": "François de La Rochefoucauld" + }, + { + "content": "You can always tell a real friend: when you've made a fool of yourself he doesn't feel you've done a permanent job.", + "author": "Laurence J. Peter" + }, + { + "content": "Friendship is one of our most treasured relationships, but it isn't codified and celebrated; it's never going to give you a party.", + "author": "Hanya Yanagihara" + }, + { + "content": "A quarrel between friends, when made up, adds a new tie to friendship.", + "author": "Francis de Sales" + }, + { + "content": "Yesterday's home runs don't win today's games.", + "author": "Babe Ruth" + }, + { + "content": "Study the past, if you would divine the future.", + "author": "Confucius" + }, + { + "content": "Wherever you go, go with all your heart.", + "author": "Confucius" + }, + { + "content": "With the realization of one's own potential and self-confidence in one's ability, one can build a better world.", + "author": "Dalai Lama" + }, + { + "content": "Coming together is a beginning; keeping together is progress; working together is success.", + "author": "Edward Everett Hale" + }, + { + "content": "Happiness is not in the mere possession of money; it lies in the joy of achievement, in the thrill of creative effort.", + "author": "Franklin D. Roosevelt" + }, + { + "content": "It is fatal to enter any war without the will to win it.", + "author": "Douglas MacArthur" + }, + { + "content": "The eye sees only what the mind is prepared to comprehend.", + "author": "Henri Bergson" + }, + { + "content": "Don't smother each other. No one can grow in the shade.", + "author": "Leo Buscaglia" + }, + { + "content": "Everyone thinks of changing the world, but no one thinks of changing himself.", + "author": "Leo Tolstoy" + }, + { + "content": "That's the risk you take if you change: that people you've been involved with won't like the new you. But other people who do will come along.", + "author": "Lisa Alther" + }, + { + "content": "I'm selfish, impatient and a little insecure. I make mistakes, I am out of control and at times hard to handle. But if you can't handle me at my worst, then you sure as hell don't deserve me at my best.", + "author": "Marilyn Monroe" + }, + { + "content": "Courage is not the absence of fear, but simply moving on with dignity despite that fear.", + "author": "Pat Riley" + }, + { + "content": "Love is a serious mental disease.", + "author": "Plato" + }, + { + "content": "Our distrust is very expensive.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "To bring anything into your life, imagine that it's already there.", + "author": "Richard Bach" + }, + { + "_id": "9-V6Bzl0nfN-", + "content": "The trouble with most people is that they think with their hopes or fears or wishes rather than with their minds.", + "author": "Will Durant" + }, + { + "content": "The teacher who is indeed wise does not bid you to enter the house of his wisdom but rather leads you to the threshold of your mind.", + "author": "Kahlil Gibran" + }, + { + "content": "We live in a society bloated with data yet starved for wisdom. We're connected 24/7, yet anxiety, fear, depression and loneliness are at an all-time high. We must course-correct.", + "author": "Elizabeth Kapu'uwailani Lindsey" + }, + { + "content": "It has long been an axiom of mine that the little things are infinitely the most important.", + "author": "Arthur Conan Doyle" + }, + { + "content": "The day of fortune is like a harvest day, we must be busy when the corn is ripe.", + "author": "Torquato Tasso" + }, + { + "content": "The invariable mark of wisdom is to see the miraculous in the common.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "He who is taught to live upon little owes more to his father's wisdom than he who has a great deal left him does to his father's care.", + "author": "William C. Menninger" + }, + { + "content": "The greatest gift of life is friendship, and I have received it.", + "author": "Hubert Humphrey" + }, + { + "content": "The friendship that can cease has never been real.", + "author": "Jerome" + }, + { + "content": "Character is like a tree and reputation like a shadow. The shadow is what we think of it; the tree is the real thing.", + "author": "Abraham Lincoln" + }, + { + "content": "If you smile when no one else is around, you really mean it.", + "author": "Andy Rooney" + }, + { + "_id": "8IyWC1hl--Je", + "content": "You, yourself, as much as anybody in the entire universe, deserve your love and affection.", + "author": "Buddha" + }, + { + "content": "A jug fills drop by drop.", + "author": "Buddha" + }, + { + "content": "Your body is precious. It is our vehicle for awakening. Treat it with care.", + "author": "Buddha" + }, + { + "content": "If you look into your own heart, and you find nothing wrong there, what is there to worry about? What is there to fear?", + "author": "Confucius" + }, + { + "content": "Happiness resides not in possessions, and not in gold, happiness dwells in the soul.", + "author": "Democritus" + }, + { + "content": "A little more persistence, a little more effort, and what seemed hopeless failure may turn to glorious success.", + "author": "Elbert Hubbard" + }, + { + "content": "What worries you masters you.", + "author": "Haddon Robinson" + }, + { + "content": "Every great dream begins with a dreamer. Always remember, you have within you the strength, the patience, and the passion to reach for the stars to change the world.", + "author": "Harriet Tubman" + }, + { + "content": "To exist is to change, to change is to mature, to mature is to go on creating oneself endlessly.", + "author": "Henri Bergson" + }, + { + "content": "Love cures people - both the ones who give it and the ones who receive it.", + "author": "Karl Menninger" + }, + { + "content": "We must embrace pain and burn it as fuel for our journey.", + "author": "Kenji Miyazawa" + }, + { + "content": "It had long since come to my attention that people of accomplishment rarely sat back and let things happen to them. They went out and happened to things.", + "author": "Leonardo da Vinci" + }, + { + "content": "Wrinkles should merely indicate where smiles have been.", + "author": "Mark Twain" + }, + { + "content": "The beginning is always today.", + "author": "Mary Wollstonecraft" + }, + { + "content": "If one is lucky, a solitary fantasy can totally transform one million realities.", + "author": "Maya Angelou" + }, + { + "content": "Kindness is more important than wisdom, and the recognition of this is the beginning of wisdom.", + "author": "Theodore Isaac Rubin" + }, + { + "content": "I think people who are creative are the luckiest people on earth. I know that there are no shortcuts, but you must keep your faith in something Greater than you and keep doing what you love. Do what you love, and you will find the way to get it out to the world.", + "author": "Judy Collins" + }, + { + "content": "The hours of folly are measured by the clock; but of wisdom, no clock can measure.", + "author": "William Blake" + }, + { + "content": "Of all the things which wisdom provides to make us entirely happy, much the greatest is the possession of friendship.", + "author": "Epicurus" + }, + { + "content": "If you have the guts to keep making mistakes, your wisdom and intelligence leap forward with huge momentum.", + "author": "Holly Near" + }, + { + "content": "We all grow up. Hopefully, we get wiser. Age brings wisdom, and fatherhood changes one's life completely.", + "author": "Frank Abagnale" + }, + { + "content": "When an opponent comes forward, move in and greet him; if he wants to pull back, send him on his way.", + "author": "Morihei Ueshiba" + }, + { + "content": "Never explain - your friends do not need it and your enemies will not believe you anyway.", + "author": "Elbert Hubbard" + }, + { + "content": "A friend is, as it were, a second self.", + "author": "Cicero" + }, + { + "content": "In the middle of every difficulty lies opportunity.", + "author": "Albert Einstein" + }, + { + "content": "The only real failure in life is not to be true to the best one knows.", + "author": "Buddha" + }, + { + "content": "A man who doesn't trust himself can never really trust anyone else.", + "author": "Jean François Paul de Gondi" + }, + { + "content": "Be here now. Be someplace else later. Is that so complicated?", + "author": "David Bader" + }, + { + "content": "You must welcome change as the rule but not as your ruler.", + "author": "Denis Waitley" + }, + { + "content": "Men are disturbed not by things, but by the view which they take of them.", + "author": "Epictetus" + }, + { + "content": "Just trust yourself, then you will know how to live.", + "author": "Johann Wolfgang von Goethe" + }, + { + "content": "He who knows others is wise. He who knows himself is enlightened.", + "author": "Laozi" + }, + { + "content": "All our knowledge has its origins in our perceptions.", + "author": "Leonardo da Vinci" + }, + { + "content": "Until you value yourself, you won't value your time. Until you value your time, you won't do anything with it.", + "author": "M. Scott Peck" + }, + { + "content": "Never doubt that a small group of thoughtful, committed people can change the world. Indeed. It is the only thing that ever has.", + "author": "Margaret Mead" + }, + { + "content": "Nothing will work unless you do.", + "author": "Maya Angelou" + }, + { + "content": "Fears are nothing more than a state of mind.", + "author": "Napoleon Hill" + }, + { + "content": "Thought is the blossom; language the bud; action the fruit behind it.", + "author": "Ralph Waldo Emerson" + }, + { + "content": "Argue for your limitations, and sure enough they're yours.", + "author": "Richard Bach" + }, + { + "content": "Good judgment comes from experience, and a lot of that comes from bad judgment.", + "author": "Will Rogers" + }, + { + "content": "He that is giddy thinks the world turns round.", + "author": "William Shakespeare" + }, + { + "content": "Wisdom ceases to be wisdom when it becomes too proud to weep, too grave to laugh, and too selfish to seek other than itself.", + "author": "Kahlil Gibran" + }, + { + "content": "In wisdom gathered over time I have found that every experience is a form of exploration.", + "author": "Ansel Adams" + }, + { + "content": "The greater our knowledge increases the more our ignorance unfolds.", + "author": "John F. Kennedy" + }, + { + "content": "Mistakes are the usual bridge between inexperience and wisdom.", + "author": "Phyllis Grissim-Theroux" + }, + { + "content": "Our character is what we do when we think no one is looking.", + "author": "H. Jackson Brown Jr." + }, + { + "content": "Life is the only real counselor; wisdom unfiltered through personal experience does not become a part of the moral tissue.", + "author": "Edith Wharton" + }, + { + "content": "One of the most beautiful qualities of true friendship is to understand and to be understood.", + "author": "Seneca the Younger" + }, + { + "content": "Friendship is a very taxing and arduous form of leisure activity.", + "author": "Mortimer J. Adler" + }, + { + "content": "You can't blame gravity for falling in love.", + "author": "Albert Einstein" + }, + { + "content": "Success is not the key to happiness. Happiness is the key to success. If you love what you are doing, you will be successful.", + "author": "Albert Schweitzer" + }, + { + "content": "The least of things with a meaning is worth more in life than the greatest of things without it.", + "author": "Carl Jung" + }, + { + "_id": "Oh-e1-oygRPX", + "content": "To be wronged is nothing unless you continue to remember it.", + "author": "Confucius" + }, + { + "content": "Friends are those rare people who ask how we are and then wait to hear the answer.", + "author": "Ed Cunningham" + }, + { + "content": "You can stand tall without standing on someone. You can be a victor without having victims.", + "author": "Harriet Woods" + }, + { + "content": "Some people thrive on huge, dramatic change. Some people prefer the slow and steady route. Do what's right for you.", + "author": "Julie Morgenstern" + }, + { + "content": "He who controls others may be powerful, but he who has mastered himself is mightier still.", + "author": "Laozi" + }, + { + "_id": "Log-YUXR2i-", + "content": "Truth is powerful and it prevails.", + "author": "Sojourner Truth" + }, + { + "content": "Take up one idea. Make that one idea your life - think of it, dream of it, live on that idea. Let the brain, muscles, nerves, every part of your body, be full of that idea, and just leave every other idea alone. This is the way to success.", + "author": "Swami Vivekananda" + }, + { + "content": "Don't talk about what you have done or what you are going to do.", + "author": "Thomas Jefferson" + }, + { + "content": "The things that one most wants to do are the things that are probably most worth doing.", + "author": "Winifred Holtby" + }, + { + "content": "Wisdom, compassion, and courage are the three universally recognized moral qualities of men.", + "author": "Confucius" + }, + { + "content": "With age comes wisdom and a high sex drive. And the wisdom to enjoy it.", + "author": "Amber Valletta" + }, + { + "content": "Make it your habit not to be critical about small things.", + "author": "Edward Everett Hale" + }, + { + "content": "Silence is the sleep that nourishes wisdom.", + "author": "Francis Bacon" + }, + { + "content": "When a thing is done, it's done. Don't look back. Look forward to your next objective.", + "author": "George Marshall" + }, + { + "content": "There is some self-interest behind every friendship. There is no friendship without self-interests. This is a bitter truth.", + "author": "Chanakya" + }, + { + "content": "Two persons cannot long be friends if they cannot forgive each other's little failings.", + "author": "Jean de La Bruyère" + }, + { + "content": "Friendship, like credit, is highest when it is not used.", + "author": "Elbert Hubbard" + }, + { + "content": "Friendship increases in visiting friends, but in visiting them seldom.", + "author": "Francis Bacon" + }, + { + "author": "Helmut Schmidt", + "content": "The biggest room in the world is room for improvement." + }, + { + "author": "Amy Poehler", + "content": "There's power in looking silly and not caring that you do." + }, + { + "author": "Eric Hoffer", + "content": "In times of change, learners inherit the earth, while the learned find themselves beautifully equipped to deal with a world that no longer exists." + }, + { + "author": "Henry Ford", + "content": "Whether you think you can or you think you can't, you are right." + }, + { + "author": "Larry Page", + "content": "If you're changing the world, you're working on important things. You're excited to get up in the morning." + }, + { + "author": "Neil Gaiman", + "content": "The one thing that you have that nobody else has is you. Your voice, your mind, your story, your vision. So write and draw and build and play and dance and live as only you can." + }, + { + "author": "Winston Churchill", + "content": "Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning.", + "tags": [] + }, + { + "author": "Winston Churchill", + "content": "If you're going through hell, keep going." + }, + { + "author": "Winston Churchill", + "content": "To improve is to change; to be perfect is to change often." + }, + { + "author": "Winston Churchill", + "content": "The best argument against democracy is a five-minute conversation with the average voter." + }, + { + "author": "Winston Churchill", + "content": "Attitude is a little thing that makes a big difference.", + "tags": [] + }, + { + "author": "Winston Churchill", + "content": "A lie gets halfway around the world before the truth has a chance to get its pants on." + }, + { + "author": "Winston Churchill", + "content": "I am fond of pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." + }, + { + "author": "Winston Churchill", + "content": "Success consists of going from failure to failure without loss of enthusiasm." + }, + { + "author": "Winston Churchill", + "content": "You can always count on Americans to do the right thing - after they've tried everything else." + }, + { + "author": "Winston Churchill", + "content": "The truth is incontrovertible. Malice may attack it, ignorance may deride it, but in the end, there it is." + }, + { + "author": "Winston Churchill", + "content": "All the great things are simple, and many can be expressed in a single word: freedom, justice, honor, duty, mercy, hope." + }, + { + "author": "Winston Churchill", + "content": "History is written by the victors." + }, + { + "author": "Winston Churchill", + "content": "The farther backward you can look, the farther forward you can see." + }, + { + "author": "Winston Churchill", + "content": "I am an optimist. It does not seem too much use being anything else.", + "tags": [] + }, + { + "author": "Winston Churchill", + "content": "It is no use saying, 'We are doing our best.' You have got to succeed in doing what is necessary." + }, + { + "author": "Winston Churchill", + "content": "Russia is a riddle wrapped in a mystery inside an enigma." + }, + { + "author": "Winston Churchill", + "content": "An appeaser is one who feeds a crocodile, hoping it will eat him last." + }, + { + "author": "Winston Churchill", + "content": "If we open a quarrel between past and present, we shall find that we have lost the future." + }, + { + "author": "Winston Churchill", + "content": "The inherent vice of capitalism is the unequal sharing of blessings; the inherent virtue of socialism is the equal sharing of miseries." + }, + { + "author": "Winston Churchill", + "content": "In wartime, truth is so precious that she should always be attended by a bodyguard of lies." + }, + { + "author": "Winston Churchill", + "content": "We are masters of the unsaid words, but slaves of those we let slip out." + }, + { + "author": "Winston Churchill", + "content": "Courage is rightly esteemed the first of human qualities... because it is the quality which guarantees all others." + }, + { + "author": "Winston Churchill", + "content": "Nothing in life is so exhilarating as to be shot at without result." + }, + { + "author": "Winston Churchill", + "content": "I am always ready to learn although I do not always like being taught." + }, + { + "author": "Abraham Lincoln", + "content": "You can fool all the people some of the time, and some of the people all the time, but you cannot fool all the people all the time." + }, + { + "author": "Abraham Lincoln", + "content": "Sir, my concern is not whether God is on our side; my greatest concern is to be on God's side, for God is always right." + }, + { + "author": "Abraham Lincoln", + "content": "You cannot escape the responsibility of tomorrow by evading it today." + }, + { + "author": "Abraham Lincoln", + "content": "Government of the people, by the people, for the people, shall not perish from the Earth." + }, + { + "author": "Abraham Lincoln", + "content": "All that I am, or hope to be, I owe to my angel mother." + }, + { + "author": "Abraham Lincoln", + "content": "Most folks are as happy as they make up their minds to be." + }, + { + "author": "Abraham Lincoln", + "content": "The ballot is stronger than the bullet." + }, + { + "author": "Abraham Lincoln", + "content": "The philosophy of the school room in one generation will be the philosophy of government in the next." + }, + { + "author": "Abraham Lincoln", + "content": "How many legs does a dog have if you call his tail a leg? Four. Saying that a tail is a leg doesn't make it a leg." + }, + { + "author": "Abraham Lincoln", + "content": "Always bear in mind that your own resolution to succeed is more important than any other." + }, + { + "author": "Abraham Lincoln", + "content": "If I were two-faced, would I be wearing this one?" + }, + { + "author": "Abraham Lincoln", + "content": "I will prepare and some day my chance will come." + }, + { + "author": "Abraham Lincoln", + "content": "No man has a good enough memory to be a successful liar." + }, + { + "author": "Abraham Lincoln", + "content": "I am not bound to win, but I am bound to be true. I am not bound to succeed, but I am bound to live by the light that I have. I must stand with anybody that stands right, and stand with him while he is right, and part with him when he goes wrong." + }, + { + "author": "Abraham Lincoln", + "content": "I am a firm believer in the people. If given the truth, they can be depended upon to meet any national crisis. The great point is to bring them the real facts." + }, + { + "author": "Abraham Lincoln", + "content": "We the people are the rightful masters of both Congress and the courts, not to overthrow the Constitution but to overthrow the men who pervert the Constitution." + }, + { + "author": "Abraham Lincoln", + "content": "I have always found that mercy bears richer fruits than strict justice." + }, + { + "author": "Abraham Lincoln", + "content": "When I do good I feel good, when I do bad I feel bad, and that's my religion." + }, + { + "author": "Abraham Lincoln", + "content": "It has been my experience that folks who have no vices have very few virtues." + }, + { + "author": "Alan Watts", + "content": "The only way to make sense out of change is to plunge into it, move with it, and join the dance." + }, + { + "author": "Alan Watts", + "content": "To have faith is to trust yourself to the water. When you swim you don't grab hold of the water, because if you do you will sink and drown. Instead you relax, and float." + }, + { + "author": "Alan Watts", + "content": "I have realized that the past and future are real illusions, that they exist in the present, which is what there is and all there is." + }, + { + "author": "Alan Watts", + "content": "But the attitude of faith is to let go, and become open to truth, whatever it might turn out to be." + }, + { + "author": "Alan Watts", + "content": "We cannot be more sensitive to pleasure without being more sensitive to pain." + }, + { + "author": "Alan Watts", + "content": "Never pretend to a love which you do not actually feel, for love is not ours to command." + }, + { + "author": "Alan Watts", + "content": "But I'll tell you what hermits realize. If you go off into a far, far forest and get very quiet, you'll come to understand that you're connected with everything." + }, + { + "author": "Alan Watts", + "content": "You and I are all as much continuous with the physical universe as a wave is continuous with the ocean." + }, + { + "author": "Alan Watts", + "content": "You don't look out there for God, something in the sky, you look in you." + }, + { + "author": "Alan Watts", + "content": "How is it possible that a being with such sensitive jewels as the eyes, such enchanted musical instruments as the ears, and such fabulous arabesque of nerves as the brain can experience itself anything less than a god." + }, + { + "author": "Alan Watts", + "content": "No work or love will flourish out of guilt, fear, or hollowness of heart, just as no valid plans for the future can be made by those who have no capacity for living now." + }, + { + "author": "Alan Watts", + "content": "The ego is nothing other than the focus of conscious attention.", + "tags": [] + }, + { + "author": "Alan Watts", + "content": "Things are as they are. Looking out into it the universe at night, we make no comparisons between right and wrong stars, nor between well and badly arranged constellations." + }, + { + "author": "Alan Watts", + "content": "You are that vast thing that you see far, far off with great telescopes." + }, + { + "author": "Alan Watts", + "content": "I owe my solitude to other people." + }, + { + "author": "Alan Watts", + "content": "Trying to define yourself is like trying to bite your own teeth." + }, + { + "author": "Alan Watts", + "content": "Unless one is able to live fully in the present, the future is a hoax." + }, + { + "author": "Alan Watts", + "content": "And the attitude of faith is the very opposite of clinging to belief, of holding on." + }, + { + "author": "Alan Watts", + "content": "So then, the relationship of self to other is the complete realization that loving yourself is impossible without loving everything defined as other than yourself." + }, + { + "author": "Alan Watts", + "content": "But at any rate, the point is that God is what nobody admits to being, and everybody really is." + }, + { + "author": "Alan Watts", + "content": "Technology is destructive only in the hands of people who do not realize that they are one and the same process as the universe." + }, + { + "author": "Michael Jordan", + "content": "I've missed more than 9000 shots in my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed." + }, + { + "author": "Henry David Thoreau", + "content": "Many men go fishing all of their lives without knowing that it is not fish they are after." + }, + { + "author": "Vince Lombardi", + "content": "Winners never quit and quitters never win." + }, + { + "author": "Babe Ruth", + "content": "The way a team plays as a whole determines its success. You may have the greatest bunch of individual stars in the world, but if they don't play together, the club won't be worth a dime." + }, + { + "author": "Bob Feller", + "content": "Every day is a new opportunity. You can build on yesterday's success or put its failures behind and start over again. That's the way life is, with a new game every day, and that's the way baseball is." + }, + { + "author": "Dan Gable", + "content": "Gold medals aren't really made of gold. They're made of sweat, determination, and a hard-to-find alloy called guts." + }, + { + "author": "Bobby Unser", + "content": "Success is where preparation and opportunity meet." + }, + { + "author": "Kareem Abdul-Jabbar", + "content": "You can't win unless you learn how to lose." + }, + { + "author": "Barry Switzer", + "content": "Some people are born on third base and go through life thinking they hit a triple." + }, + { + "author": "Wayne Gretzky", + "content": "A good hockey player plays where the puck is. A great hockey player plays where the puck is going to be." + }, + { + "author": "Michael Phelps", + "content": "You can't put a limit on anything. The more you dream, the farther you get." + }, + { + "author": "Mia Hamm", + "content": "I am building a fire, and everyday I train, I add more fuel. At just the right moment, I light the match." + }, + { + "author": "Muhammad Ali", + "content": "It's just a job. Grass grows, birds fly, waves pound the sand. I beat people up." + }, + { + "author": "George Orwell", + "content": "Serious sport has nothing to do with fair play. It is bound up with hatred, jealousy, boastfulness, disregard of all rules and sadistic pleasure in witnessing violence. In other words, it is war minus the shooting." + }, + { + "author": "Eric Liddell", + "content": "God made me fast. And when I run, I feel His pleasure." + }, + { + "author": "Yogi Berra", + "content": "Half the lies they tell about me aren't true." + }, + { + "author": "P. G. Wodehouse", + "content": "To find a man's true character, play golf with him." + }, + { + "author": "Earl Monroe", + "content": "Just be patient. Let the game come to you. Don't rush. Be quick, but don't hurry." + }, + { + "author": "Billie Jean King", + "content": "Champions keep playing until they get it right." + }, + { + "author": "Heywood Broun", + "content": "Sports do not build character. They reveal it." + }, + { + "author": "Casey Stengel", + "content": "Finding good players is easy. Getting them to play as a team is another story." + }, + { + "author": "Reggie Jackson (basketball, born 1990)", + "content": "Fans don't boo nobodies." + }, + { + "author": "Shaquille O'Neal", + "content": "I'm tired of hearing about money, money, money, money, money. I just want to play the game, drink Pepsi, and wear Reebok." + }, + { + "author": "Ian Botham", + "content": "To me, it doesn't matter how good you are. Sport is all about playing and competing. Whatever you do in cricket and in sport, enjoy it, be positive and try to win." + }, + { + "author": "Knute Rockne", + "content": "One man practicing sportsmanship is far better than a hundred teaching it." + }, + { + "author": "William James", + "content": "Most people never run far enough on their first wind to find out they've got a second." + }, + { + "author": "Hank Aaron", + "content": "My motto was always to keep swinging. Whether I was in a slump or feeling badly or having trouble off the field, the only thing to do was keep swinging." + }, + { + "author": "Jim Bouton", + "content": "You spend a good piece of your life gripping a baseball and in the end it turns out that it was the other way around all the time." + }, + { + "author": "Rogers Hornsby", + "content": "People ask me what I do in winter when there's no baseball. I'll tell you what I do. I stare out the window and wait for spring." + }, + { + "author": "Ernie Banks", + "content": "The only way to prove that you're a good sport is to lose." + }, + { + "author": "Sandy Koufax", + "content": "Pitching is the art of instilling fear." + }, + { + "author": "Carl Lewis", + "content": "Life is about timing." + }, + { + "author": "Ted Williams", + "content": "Baseball is the only field of endeavor where a man can succeed three times out of ten and be considered a good performer." + }, + { + "author": "Robert Griffin III", + "content": "Football is football and talent is talent. But the mindset of your team makes all the difference." + }, + { + "author": "Erma Bombeck", + "content": "If a man watches three football games in a row, he should be declared legally dead." + }, + { + "author": "Joe Adcock", + "content": "Trying to sneak a fastball past Hank Aaron is like trying to sneak the sunrise past a rooster." + }, + { + "author": "Mike Singletary (basketball)", + "content": "Do you know what my favorite part of the game is? The opportunity to play." + }, + { + "author": "Bob Knight", + "content": "You don't play against opponents, you play against the game of basketball." + }, + { + "author": "Woodrow Wilson", + "content": "Golf is a game in which one endeavors to control a ball with implements ill adapted for the purpose." + }, + { + "author": "Billie Jean King", + "content": "Tennis is a perfect combination of violent action taking place in an atmosphere of total tranquillity." + }, + { + "author": "Arnold Palmer", + "content": "What other people may find in poetry or art museums, I find in the flight of a good drive." + }, + { + "author": "Hugo Black", + "content": "When I was 40, my doctor advised me that a man in his 40s shouldn't play tennis. I heeded his advice carefully and could hardly wait until I reached 50 to start again." + }, + { + "author": "John Madden", + "content": "The fewer rules a coach has, the fewer rules there are for players to break." + }, + { + "author": "Mark Twain", + "content": "Whenever you find yourself on the side of the majority, it is time to pause and reflect." + }, + { + "author": "Colin Powell", + "content": "There are no secrets to success. It is the result of preparation, hard work, and learning from failure." + }, + { + "author": "Seneca the Younger", + "content": "If one does not know to which port one is sailing, no wind is favorable." + }, + { + "author": "J. Paul Getty", + "content": "If you owe the bank $100 that's your problem. If you owe the bank $100 million, that's the bank's problem." + }, + { + "author": "Elon Musk", + "content": "If you're trying to create a company, it's like baking a cake. You have to have all the ingredients in the right proportion." + }, + { + "author": "Sam Walton", + "content": "There is only one boss. The customer. And he can fire everybody in the company from the chairman on down, simply by spending his money somewhere else." + }, + { + "author": "Ambrose Bierce", + "content": "The gambling known as business looks with austere disfavor upon the business known as gambling." + }, + { + "author": "Tom Brokaw", + "content": "It's easy to make a buck. It's a lot tougher to make a difference." + }, + { + "author": "Theodore Isaac Rubin", + "content": "Happiness does not come from doing easy work but from the afterglow of satisfaction that comes after the achievement of a difficult task that demanded our best." + }, + { + "author": "Jeff Bezos", + "content": "A brand for a company is like a reputation for a person. You earn reputation by trying to do hard things well." + }, + { + "author": "Peter Drucker", + "content": "The entrepreneur always searches for change, responds to it, and exploits it as an opportunity." + }, + { + "author": "Don Marquis", + "content": "Ideas pull the trigger, but instinct loads the gun." + }, + { + "author": "Jack Welch", + "content": "An organization's ability to learn, and translate that learning into action rapidly, is the ultimate competitive advantage." + }, + { + "author": "Thomas Jefferson", + "content": "I hope we shall crush in its birth the aristocracy of our monied corporations which dare already to challenge our government to a trial by strength, and bid defiance to the laws of our country." + }, + { + "author": "Napoleon Hill", + "content": "Effort only fully releases its reward after a person refuses to quit." + }, + { + "author": "Henry Ford", + "content": "A business that makes nothing but money is a poor business." + }, + { + "author": "Aristotle Onassis", + "content": "The secret of business is to know something that nobody else knows." + }, + { + "author": "Charles F. Kettering", + "content": "If you want to kill any idea in the world, get a committee working on it." + }, + { + "author": "Laurence J. Peter", + "content": "An economist is an expert who will know tomorrow why the things he predicted yesterday didn't happen today." + }, + { + "author": "Dee Hock", + "content": "An organization, no matter how well designed, is only as good as the people who live and work in it." + }, + { + "author": "Leo Rosten", + "content": "First-rate people hire first-rate people; second-rate people hire third-rate people." + }, + { + "_id": "T-E-4pGn5i1", + "author": "Olivier Messiaen", + "content": "One of the tests of leadership is the ability to recognize a problem before it becomes an emergency." + }, + { + "author": "Confucius", + "content": "The superior man understands what is right; the inferior man understands what will sell." + }, + { + "author": "Mary Kay Ash", + "content": "Everyone has an invisible sign hanging from their neck saying, 'Make me feel important.' Never forget this message when working with people." + }, + { + "author": "Niccolò Machiavelli", + "content": "No enterprise is more likely to succeed than one concealed from the enemy until it is ripe for execution." + }, + { + "author": "Harold Geneen", + "content": "In the business world, everyone is paid in two coins: cash and experience. Take the experience first; the cash will come later." + }, + { + "author": "Robert Kiyosaki", + "content": "When times are bad is when the real entrepreneurs emerge." + }, + { + "author": "André Malraux", + "content": "To command is to serve, nothing more and nothing less." + }, + { + "author": "John Kenneth Galbraith", + "content": "Meetings are indispensable when you don't want to do anything." + }, + { + "author": "Howard H. Aiken", + "content": "Don't worry about people stealing your ideas. If your ideas are any good, you'll have to ram them down people's throats." + }, + { + "author": "Edward Gibbon", + "content": "Our work is the presentation of our capabilities." + }, + { + "author": "Warren Bennis", + "content": "Trust is the lubrication that makes it possible for organizations to work." + }, + { + "author": "Elon Musk", + "content": "When something is important enough, you do it even if the odds are not in your favor." + }, + { + "author": "Ralph Marston", + "content": "What you do today can improve all your tomorrows." + }, + { + "author": "H. G. Wells", + "content": "If you fell down yesterday, stand up today." + }, + { + "author": "George S. Patton", + "content": "A good plan violently executed now is better than a perfect plan executed next week." + }, + { + "author": "Ken Venturi", + "content": "I don't believe you have to be better than everybody else. I believe you have to be better than you ever thought you could be." + }, + { + "author": "Johann Wolfgang von Goethe", + "content": "Knowing is not enough; we must apply. Willing is not enough; we must do." + }, + { + "author": "W. Clement Stone", + "content": "Aim for the moon. If you miss, you may hit a star." + }, + { + "author": "Sam Levenson", + "content": "Don't watch the clock; do what it does. Keep going." + }, + { + "author": "Benjamin Disraeli", + "content": "Never complain and never explain." + }, + { + "author": "Robert Schuller", + "content": "Problems are not stop signs, they are guidelines." + }, + { + "author": "John F. Kennedy", + "content": "Things do not happen. Things are made to happen." + }, + { + "author": "Amelia Earhart", + "content": "The most effective way to do it, is to do it." + }, + { + "author": "Pauline Kael", + "content": "Where there is a will, there is a way. If there is a chance in a million that you can do something, anything, to keep what you want from ending, do it. Pry the door open or, if need be, wedge your foot in that door and keep it open." + }, + { + "author": "Babe Ruth", + "content": "You just can't beat the person who never gives up." + }, + { + "author": "Harriet Beecher Stowe", + "content": "Never give up, for that is just the place and time that the tide will turn." + }, + { + "author": "Kyle Chandler", + "content": "Opportunity does not knock, it presents itself when you beat down the door." + }, + { + "author": "Ayn Rand", + "content": "A creative man is motivated by the desire to achieve, not by the desire to beat others." + }, + { + "author": "Nikos Kazantzakis", + "content": "In order to succeed, we must first believe that we can." + }, + { + "author": "William Blake", + "content": "No bird soars too high if he soars with his own wings." + } +] \ No newline at end of file diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_ACN.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_ACN.csv deleted file mode 100644 index c743dfdf..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_ACN.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,1 -author,acn128 -name,ACN -theme_boost_header_color,-727060 -theme_text_header_1_line,-10865760 -theme_text_header_2_line,-11719543 -theme_statuses_color,-197380 -theme_link_color,-13681272 -theme_icons_color,-15395562 -pref_color_background,-1 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-14059009 -theme_text_color,-13027015 -theme_primary,-1 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Breeze_Dark_Yellow.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Breeze_Dark_Yellow.csv deleted file mode 100644 index 3eec93e4..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Breeze_Dark_Yellow.csv +++ /dev/null @@ -1,13 +0,0 @@ -base_theme,2 -author,Fedilab -name,Breeze Dark - Yellow -theme_boost_header_color,-14012878 -theme_statuses_color,-14473687 -theme_link_color,-12734743 -theme_icons_color,-4340793 -pref_color_background,-15658735 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-148405 -theme_text_color,-1052431 -theme_primary,-13552069 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Cyberpunk_Neon.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Cyberpunk_Neon.csv deleted file mode 100644 index 7fb99a5d..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Cyberpunk_Neon.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,Roboron -name,Cyberpunk Neon -theme_boost_header_color,-16776697, -theme_text_header_1_line,-1441575, -theme_text_header_2_line,-5242717, -theme_statuses_color,-16181197, -theme_link_color,-1441575, -theme_icons_color,-16138810, -pref_color_background,-16774370, -pref_color_navigation_bar,true, -pref_color_status_bar,true, -theme_accent,-1441575, -theme_text_color,-16138810, -theme_primary,-16774370, diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Dark_Elephant.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Dark_Elephant.csv deleted file mode 100644 index 5bd65f60..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Dark_Elephant.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,0 -author,S1m -name,Dark Elephant -theme_boost_header_color,-13552317 -theme_text_header_1_line,-3479297 -theme_text_header_2_line,-7287815 -theme_statuses_color,-13552317 -theme_link_color,-11098143 -theme_icons_color,-789517 -pref_color_background,-14144456 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-13922086 -theme_text_color,-789517 -theme_primary,-14144456 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Grey_Orange.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Grey_Orange.csv deleted file mode 100644 index 2c5c107c..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Grey_Orange.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,Jøta Seth -name,Grey Orange -theme_boost_header_color,-14869219 -theme_text_header_1_line,-1 -theme_text_header_2_line,-1 -theme_statuses_color,-14145496 -theme_link_color,-26624 -theme_icons_color,-26624 -pref_color_background,-13092808 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-26624 -theme_text_color,-1 -theme_primary,-14408668 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Gruvbox_OLED.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Gruvbox_OLED.csv deleted file mode 100644 index d03b3b81..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Gruvbox_OLED.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,@AntoineD@h.kher.nl -name,Gruvbox OLED -theme_boost_header_color,-16777216 -theme_text_header_1_line,-265785 -theme_text_header_2_line,-6777062 -theme_statuses_color,-16777216 -theme_link_color,-2647775 -theme_icons_color,-7175308 -pref_color_background,-16777216 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-9921174 -theme_text_color,-265785 -theme_primary,-16777216 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Less_Angry_Orange.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Less_Angry_Orange.csv deleted file mode 100644 index 26c89789..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Less_Angry_Orange.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,AngryTux -name,Less Angry Orange -theme_boost_header_color,-15855063 -theme_text_header_1_line,-2128640 -theme_text_header_2_line,-5329234 -theme_statuses_color,-1 -theme_link_color,-12146699 -theme_icons_color,-2128640 -pref_color_background,-15987700 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-3968000 -theme_text_color,-197380 -theme_primary,-14408668 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Mondstern_Fedilab.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Mondstern_Fedilab.csv deleted file mode 100644 index b9b23d8f..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Mondstern_Fedilab.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,Mondstern -name,Mondstern Fedilab -theme_boost_header_color,-1, -theme_text_header_1_line,-13855804, -theme_text_header_2_line,-16227945, -theme_statuses_color,-14935012, -theme_link_color,-15542685, -theme_icons_color,-10723999, -pref_color_background,-15921907, -pref_color_navigation_bar,false, -pref_color_status_bar,false, -theme_accent,-15542685, -theme_text_color,-1, -theme_primary,-14474461, diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Nocturnal.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Nocturnal.csv deleted file mode 100644 index ed442449..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Nocturnal.csv +++ /dev/null @@ -1,13 +0,0 @@ -base_theme,2 -author,Fedilab -name,Nocturnal -theme_boost_header_color,-12895429 -theme_statuses_color,-13553359 -theme_link_color,-16747570 -theme_icons_color,-10158118 -pref_color_background,-14606047 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-13136013 -theme_text_color,-2236963 -theme_primary,-14013910 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Photon_Dark.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Photon_Dark.csv deleted file mode 100644 index 3284a4e4..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Photon_Dark.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,Jøta Seth -name,Photon Dark -theme_boost_header_color,-14145496 -theme_text_header_1_line,-1 -theme_text_header_2_line,-1 -theme_statuses_color,-14935012 -theme_link_color,-14059009 -theme_icons_color,-9474193 -pref_color_background,-15921907 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-14059009 -theme_text_color,-1 -theme_primary,-14474461 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Cyan_Accent.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Cyan_Accent.csv deleted file mode 100644 index 5a259123..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Cyan_Accent.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,1 -author,Animaly -name,Solarized - Cyan Accent -theme_boost_header_color,-69167 -theme_text_header_1_line,-4880128 -theme_text_header_2_line,-7102047 -theme_statuses_color,-133405 -theme_link_color,-14251054 -theme_icons_color,-10106727 -pref_color_background,-1120043 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-8021760 -theme_text_color,-16766154 -theme_primary,-1120043 diff --git a/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Dark_Purple.csv b/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Dark_Purple.csv deleted file mode 100644 index 6c434327..00000000 --- a/app/src/main/assets/themes/contributors/Fedilab_theme_Solarized_Dark_Purple.csv +++ /dev/null @@ -1,15 +0,0 @@ -base_theme,2 -author,Fedilab -name,Solarized Dark - Purple -theme_boost_header_color,-16506327 -theme_text_header_1_line,-1120043 -theme_text_header_2_line,-1120043 -theme_statuses_color,-16304574 -theme_link_color,-14251054 -theme_icons_color,-7102047 -pref_color_background,-16766154 -pref_color_navigation_bar,true -pref_color_status_bar,true -theme_accent,-9670204 -theme_text_color,-133405 -theme_primary,-16304574 diff --git a/app/src/main/assets/themes/cyanea_themes.json b/app/src/main/assets/themes/cyanea_themes.json deleted file mode 100644 index ae30ea31..00000000 --- a/app/src/main/assets/themes/cyanea_themes.json +++ /dev/null @@ -1,47 +0,0 @@ -[ - { - "theme_name": "Dark", - "base_theme": "DARK", - "primary": "#FF272727", - "primary_dark": "#FF272727", - "primary_light": "#FFd9e1e8", - "accent": "#FF2b90d9", - "accent_dark": "#FF1b80c9", - "accent_light": "#FF772b90d9", - "background": "#FF272727", - "background_dark": "#FF282c37", - "background_light": "#FF282c37", - "should_tint_statusbar": true, - "should_tint_navbar": true - }, - { - "theme_name": "Light", - "base_theme": "LIGHT", - "primary": "#FFFFFF", - "primary_dark": "#FFFFFFFF", - "primary_light": "#FFd9e1e8", - "accent": "#FF2b90d9", - "accent_dark": "#FF1b80c9", - "accent_light": "#FF772b90d9", - "background": "#FFFFFFFF", - "background_dark": "#FFFFFFFF", - "background_light": "#FFFFFFFF", - "should_tint_statusbar": true, - "should_tint_navbar": true - }, - { - "theme_name": "Black", - "base_theme": "DARK", - "primary": "#FF000000", - "primary_dark": "#FF000000", - "primary_light": "#FF000000", - "accent": "#FF606984", - "accent_dark": "#FF606984", - "accent_light": "#FF606984", - "background": "#FF000000", - "background_dark": "#FF000000", - "background_light": "#FF000000", - "should_tint_statusbar": true, - "should_tint_navbar": true - } -] \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/Quotes.java b/app/src/main/java/app/fedilab/android/client/entities/app/Quotes.java new file mode 100644 index 00000000..95c82ff1 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/client/entities/app/Quotes.java @@ -0,0 +1,34 @@ +package app.fedilab.android.client.entities.app; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + + +public class Quotes implements Serializable { + + @SerializedName("quotes") + public List quotes; + + public static class Quote implements Serializable { + @SerializedName("author") + public String author; + @SerializedName("content") + public String content; + } +} diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java index 9fdeb620..88ae8424 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java @@ -71,12 +71,17 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.vanniktech.emoji.EmojiManager; import com.vanniktech.emoji.EmojiPopup; import com.vanniktech.emoji.one.EmojiOneProvider; import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.lang.ref.WeakReference; +import java.nio.charset.StandardCharsets; import java.text.Normalizer; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -86,6 +91,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Random; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -102,6 +108,7 @@ import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.api.Tag; import app.fedilab.android.client.entities.app.BaseAccount; import app.fedilab.android.client.entities.app.Languages; +import app.fedilab.android.client.entities.app.Quotes; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.databinding.ComposeAttachmentItemBinding; import app.fedilab.android.databinding.ComposePollBinding; @@ -545,6 +552,7 @@ public class ComposeAdapter extends RecyclerView.Adapter { + holder.binding.content.setText(newContent[0]); + statusList.get(holder.getBindingAdapterPosition()).text = newContent[0]; + holder.binding.content.setSelection(holder.binding.content.getText().length()); + autocomplete = false; + updateCharacterCount(holder); + }; + mainHandler.post(myRunnable); + } else if (s.toString().contains(fedilabQuoteTrigger)) { + newContent[0] = s.toString().replaceAll(fedilabQuoteTrigger, "").trim(); + List mentions = new ArrayList<>(); + String mentionPattern = "@[a-z0-9_]+(@[a-z0-9.\\-]+[a-z0-9]+)?"; + final Pattern mPattern = Pattern.compile(mentionPattern, Pattern.CASE_INSENSITIVE); + Matcher matcherMentions = mPattern.matcher(newContent[0]); + while (matcherMentions.find()) { + mentions.add(matcherMentions.group()); + } + for (String mention : mentions) { + newContent[0] = newContent[0].replace(mention, ""); + } + + InputStream is; + newContent[0] = ""; + if (mentions.size() > 0) { + for (String mention : mentions) { + newContent[0] += mention + " "; + } + } + try { + is = context.getAssets().open("quotes/famous.json"); + int size; + size = is.available(); + byte[] buffer = new byte[size]; + //noinspection ResultOfMethodCallIgnored + is.read(buffer); + is.close(); + String json = new String(buffer, StandardCharsets.UTF_8); + Gson gson = new Gson(); + List quotes = gson.fromJson(json, new TypeToken>() { + }.getType()); + if (quotes != null && quotes.size() > 0) { + final int random = new Random().nextInt(quotes.size()); + Quotes.Quote quote = quotes.get(random); + newContent[0] += quote.content + "\n- " + quote.author; + } + } catch (IOException e) { + e.printStackTrace(); + } + + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { holder.binding.content.setText(newContent[0]); statusList.get(holder.getBindingAdapterPosition()).text = newContent[0]; @@ -649,6 +708,15 @@ public class ComposeAdapter extends RecyclerView.Adapter Date: Mon, 19 Dec 2022 14:19:22 +0100 Subject: [PATCH 06/68] Fix issue #658 --- .../main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java index 88ae8424..823d6ae3 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java @@ -1447,7 +1447,7 @@ public class ComposeAdapter extends RecyclerView.Adapter Date: Mon, 19 Dec 2022 14:26:56 +0100 Subject: [PATCH 07/68] Fix issue #658 - Toggle cw does not honor choice --- .../main/java/app/fedilab/android/jobs/ComposeWorker.java | 6 +++--- .../java/app/fedilab/android/ui/drawer/ComposeAdapter.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java index 46c90ca7..f241d7e8 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java +++ b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java @@ -221,10 +221,10 @@ public class ComposeWorker extends Worker { if (dataPost.scheduledDate == null) { if (dataPost.statusEditId == null) { statusCall = mastodonStatusesService.createStatus(null, dataPost.token, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, - poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoiler_text, statuses.get(i).visibility.toLowerCase(), language); + poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), language); } else { //Status is edited statusCall = mastodonStatusesService.updateStatus(null, dataPost.token, dataPost.statusEditId, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, - poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoiler_text, statuses.get(i).visibility.toLowerCase(), language); + poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), language); } try { Response statusResponse = statusCall.execute(); @@ -285,7 +285,7 @@ public class ComposeWorker extends Worker { } } else { Call scheduledStatusCall = mastodonStatusesService.createScheduledStatus(null, dataPost.token, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, - poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoiler_text, statuses.get(i).visibility.toLowerCase(), dataPost.scheduledDate, statuses.get(i).language); + poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), dataPost.scheduledDate, statuses.get(i).language); try { Response statusResponse = scheduledStatusCall.execute(); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java index 823d6ae3..88ae8424 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java @@ -1447,7 +1447,7 @@ public class ComposeAdapter extends RecyclerView.Adapter Date: Mon, 19 Dec 2022 15:09:14 +0100 Subject: [PATCH 08/68] Fix issue #654 - Truncated gimini links --- .../java/app/fedilab/android/helper/SpannableHelper.java | 2 +- src/fdroid/fastlane/metadata/android/en/changelogs/451.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 src/fdroid/fastlane/metadata/android/en/changelogs/451.txt diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index 6179f6b9..24dd5640 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -263,7 +263,7 @@ public class SpannableHelper { //Truncate URL if needed //TODO: add an option to disable truncated URLs String urlText = newURL; - if (newURL.length() > 30 && !urlDetails.containsKey(urlText)) { + if (newURL.length() > 30 && !urlDetails.containsKey(urlText) && !urlText.startsWith("gemini")) { urlText = urlText.substring(0, 30); urlText += "…"; content.replace(matchStart, matchEnd, urlText); diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt new file mode 100644 index 00000000..92629740 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt @@ -0,0 +1,6 @@ +Added: +- Post random quotes + +Fixed: +- Behavior with cw toggle +- Truncated gimini links \ No newline at end of file From d7a2a6b8558d5ffb3157c4e3e4e61870f84e834c Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Dec 2022 16:20:42 +0100 Subject: [PATCH 09/68] Fix jumps with media preview for some devices --- .../fedilab/android/ui/drawer/StatusAdapter.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index 82df20bf..13f82ed7 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -1163,15 +1163,15 @@ public class StatusAdapter extends RecyclerView.Adapter float mediaH = -1.0f; if (attachment.measuredWidth > 0) { + float viewWidth = attachment.measuredWidth; if (attachment.meta != null && attachment.meta.small != null) { - float viewWidth = attachment.measuredWidth; mediaH = attachment.meta.small.height; float mediaW = attachment.meta.small.width; if (mediaW != 0) { ratio = viewWidth / mediaW; } } - loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, mediaH, ratio, statusToDeal, attachment, singleMedia); + loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, viewWidth, mediaH, ratio, statusToDeal, attachment, singleMedia); } else { int finalMediaPosition = mediaPosition; layoutMediaBinding.media.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @@ -1181,20 +1181,20 @@ public class StatusAdapter extends RecyclerView.Adapter attachment.measuredWidth = layoutMediaBinding.media.getWidth(); float ratio = 1.0f; float mediaH = -1.0f; + float viewWidth = attachment.measuredWidth; if (attachment.meta != null && attachment.meta.small != null) { - float viewWidth = attachment.measuredWidth; mediaH = attachment.meta.small.height; float mediaW = attachment.meta.small.width; if (mediaW != 0) { ratio = viewWidth / mediaW; } } - loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, finalMediaPosition, mediaH, ratio, statusToDeal, attachment, singleMedia); + loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, finalMediaPosition, viewWidth, mediaH, ratio, statusToDeal, attachment, singleMedia); } }); } } else { - loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, statusToDeal, attachment, singleMedia); + loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, -1.f, statusToDeal, attachment, singleMedia); } mediaPosition++; if (fullAttachement || singleMedia) { @@ -1966,7 +1966,7 @@ public class StatusAdapter extends RecyclerView.Adapter private static void loadAndAddAttachment(Context context, LayoutMediaBinding layoutMediaBinding, StatusViewHolder holder, RecyclerView.Adapter adapter, - int mediaPosition, float mediaH, float ratio, + int mediaPosition, float viewWidth, float mediaH, float ratio, Status statusToDeal, Attachment attachment, boolean singleImage) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5); @@ -2037,6 +2037,7 @@ public class StatusAdapter extends RecyclerView.Adapter requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY))); } else { requestBuilder = requestBuilder.placeholder(R.color.transparent_grey); + requestBuilder = requestBuilder.apply(new RequestOptions().override((int) viewWidth, (int) mediaH)); requestBuilder = requestBuilder.fitCenter(); } requestBuilder.into(layoutMediaBinding.media); From 611c22a5c878077dc7d4df700af315e4f4ed7477 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 20 Dec 2022 09:53:34 +0100 Subject: [PATCH 10/68] Display translate icon only when language is different --- .../java/app/fedilab/android/ui/drawer/StatusAdapter.java | 6 +++++- src/fdroid/fastlane/metadata/android/en/changelogs/451.txt | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index 13f82ed7..a6c1990c 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -630,7 +630,11 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.actionButtonBookmark.setVisibility(View.GONE); } if (displayTranslate) { - holder.binding.actionButtonTranslate.setVisibility(View.VISIBLE); + if (statusToDeal.language != null && statusToDeal.language.trim().length() > 0 && statusToDeal.language.equalsIgnoreCase(MyTransL.getLocale())) { + holder.binding.actionButtonTranslate.setVisibility(View.GONE); + } else { + holder.binding.actionButtonTranslate.setVisibility(View.VISIBLE); + } } else { holder.binding.actionButtonTranslate.setVisibility(View.GONE); } diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt index 92629740..d748e4ab 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt @@ -1,6 +1,9 @@ Added: - Post random quotes +Changed: +- Display translate button only when language is different + Fixed: - Behavior with cw toggle - Truncated gimini links \ No newline at end of file From b428cf4de912e5344689d323c4f34ca624622eb5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 20 Dec 2022 10:24:03 +0100 Subject: [PATCH 11/68] Group reblogs --- .../android/helper/TimelineHelper.java | 30 ++++++++++++++++--- app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/pref_timelines.xml | 7 ++++- .../metadata/android/en/changelogs/451.txt | 1 + 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java index 4ad014c1..6c94cf29 100644 --- a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java @@ -17,6 +17,7 @@ package app.fedilab.android.helper; import static app.fedilab.android.BaseMainActivity.filteredAccounts; import android.content.Context; +import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; @@ -25,6 +26,7 @@ import android.text.Html; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; +import androidx.preference.PreferenceManager; import java.io.IOException; import java.util.ArrayList; @@ -35,6 +37,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; +import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.endpoints.MastodonFiltersService; import app.fedilab.android.client.entities.api.Account; @@ -153,21 +156,40 @@ public class TimelineHelper { } } } + + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + boolean groupReblogs = sharedpreferences.getBoolean(context.getString(R.string.SET_GROUP_REBLOGS), true); if (filterTimeLineType == Timeline.TimeLineEnum.HOME) { - if (filteredAccounts != null && filteredAccounts.size() > 0) { - for (Status status : statuses) { + + for (int i = 0; i < statuses.size(); i++) { + if (filteredAccounts != null && filteredAccounts.size() > 0) { for (Account account : filteredAccounts) { - if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) { + if (account.acct.equals(statuses.get(i).account.acct) || (statuses.get(i).reblog != null && account.acct.equals(statuses.get(i).reblog.account.acct))) { Filter filterCustom = new Filter(); filterCustom.filter_action = "hide"; ArrayList contextCustom = new ArrayList<>(); contextCustom.add("home"); filterCustom.title = "Fedilab"; filterCustom.context = contextCustom; - status.filteredByApp = filterCustom; + statuses.get(i).filteredByApp = filterCustom; } } } + //Group boosts + if (groupReblogs && statuses.get(i).filteredByApp == null && statuses.get(i).reblog != null) { + for (int j = 0; j < i; j++) { + if (statuses.get(j).reblog != null && statuses.get(j).reblog.id.equals(statuses.get(i).reblog.id)) { + Filter filterCustom = new Filter(); + filterCustom.filter_action = "hide"; + ArrayList contextCustom = new ArrayList<>(); + contextCustom.add("home"); + filterCustom.title = "Fedilab reblog"; + filterCustom.context = contextCustom; + statuses.get(i).filteredByApp = filterCustom; + } + } + } + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6f5edb4..acded866 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1409,6 +1409,8 @@ SET_DISPLAY_ALL_NOTIFICATIONS_TYPE SET_EXCLUDED_NOTIFICATIONS_TYPE SET_EXPAND_MEDIA + SET_GROUP_REBLOGS + SET_LIVE_TRANSLATE SET_TRUNCATE_TOOTS_SIZE SET_ART_WITH_NSFW @@ -2108,4 +2110,5 @@ All accounts will be muted for the Home timeline. Mute them all Import data + Group reblogs in home timeline \ No newline at end of file diff --git a/app/src/main/res/xml/pref_timelines.xml b/app/src/main/res/xml/pref_timelines.xml index 4afdb7d7..4ba37efa 100644 --- a/app/src/main/res/xml/pref_timelines.xml +++ b/app/src/main/res/xml/pref_timelines.xml @@ -19,7 +19,12 @@ app:key="@string/SET_EXPAND_MEDIA" app:singleLineTitle="false" app:title="@string/expand_image" /> - + Date: Tue, 20 Dec 2022 14:03:48 +0100 Subject: [PATCH 12/68] Respect blank spaces between words --- .../main/java/app/fedilab/android/helper/SpannableHelper.java | 2 ++ src/fdroid/fastlane/metadata/android/en/changelogs/451.txt | 1 + 2 files changed, 3 insertions(+) diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index 24dd5640..77cc88e0 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -185,6 +185,8 @@ public class SpannableHelper { urlDetails.put(url, urlText); } } + text = text.trim().replaceAll("\\s{3}", "   "); + text = text.trim().replaceAll("\\s{2}", "  "); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) initialContent = new SpannableString(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY)); else diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt index 146394a3..85356eed 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt @@ -4,6 +4,7 @@ Added: Changed: - Display translate button only when language is different +- Respect blank spaces between words in messages Fixed: - Behavior with cw toggle From fa2355b25f2f233b872e2f4bd76710fb361fe38d Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 20 Dec 2022 17:39:27 +0100 Subject: [PATCH 13/68] Release 3.12.1 --- app/build.gradle | 4 ++-- app/src/main/assets/release_notes/notes.json | 5 +++++ .../android/imageeditor/tools/EditingToolsAdapter.java | 2 +- app/src/main/res/drawable/ic_eraser.xml | 1 + app/src/main/res/drawable/ic_insert_emoticon.xml | 1 + app/src/main/res/drawable/ic_oval.xml | 1 + app/src/main/res/drawable/ic_text.xml | 1 + app/src/main/res/layout/activity_edit_image.xml | 1 + src/fdroid/fastlane/metadata/android/en/changelogs/451.txt | 1 + 9 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 77341663..445efddd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 21 targetSdk 32 - versionCode 450 - versionName "3.12.0" + versionCode 451 + versionName "3.12.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" diff --git a/app/src/main/assets/release_notes/notes.json b/app/src/main/assets/release_notes/notes.json index a98bff24..5c35915a 100644 --- a/app/src/main/assets/release_notes/notes.json +++ b/app/src/main/assets/release_notes/notes.json @@ -1,4 +1,9 @@ [ + { + "version": "3.12.1", + "code": "451", + "note": "Added:\n- Post random quotes\n- Group reblogs in home timeline\n\nChanged:\n- Display translate button only when language is different\n- Respect blank spaces between words in messages\n- Focus button more accessible when editing media\n\nFixed:\n- Behavior with cw toggle\n- Truncated gimini links" + }, { "version": "3.12.0", "code": "450", diff --git a/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java b/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java index 5415c24c..845b47df 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java @@ -27,12 +27,12 @@ public class EditingToolsAdapter extends RecyclerView.Adapter diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt index 85356eed..649057a9 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/451.txt @@ -5,6 +5,7 @@ Added: Changed: - Display translate button only when language is different - Respect blank spaces between words in messages +- Focus button more accessible when editing media Fixed: - Behavior with cw toggle From f4a38504cd544977cd84245f2dc290c5dc5fe22d Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 21 Dec 2022 14:49:01 +0100 Subject: [PATCH 14/68] Fix issue #662 - Fix nav bar color in light mode --- .../java/app/fedilab/android/activities/MediaActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/activities/MediaActivity.java b/app/src/main/java/app/fedilab/android/activities/MediaActivity.java index c8d83615..608f6f35 100644 --- a/app/src/main/java/app/fedilab/android/activities/MediaActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/MediaActivity.java @@ -495,10 +495,10 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload // except for the ones that make the content appear under the system bars. private void showSystemUI() { View decorView = getWindow().getDecorView(); - decorView.setSystemUiVisibility( + decorView.setSystemUiVisibility(flags | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } public FragmentMedia getCurrentFragment() { From 4fa8959f1146cff5c64d33cd859378d3072c58c7 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 21 Dec 2022 15:12:44 +0100 Subject: [PATCH 15/68] Fix issue #663 - Support nav & status bar colors for Android 5 --- .../app/fedilab/android/activities/BaseActivity.java | 11 ++++++++--- .../fedilab/android/activities/BaseBarActivity.java | 9 +++++++++ .../android/activities/BaseTransparentActivity.java | 9 +++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java index 2f2b870f..5070af57 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java @@ -19,8 +19,11 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.graphics.Color; import android.os.Build; import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -32,7 +35,6 @@ import com.vanniktech.emoji.one.EmojiOneProvider; import app.fedilab.android.R; import app.fedilab.android.helper.Helper; -import app.fedilab.android.helper.ThemeHelper; @SuppressLint("Registered") @@ -125,8 +127,11 @@ public class BaseActivity extends AppCompatActivity { } } super.onCreate(savedInstanceState); - if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { - ThemeHelper.adjustFontScale(this, getResources().getConfiguration()); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.BLACK); + window.setNavigationBarColor(Color.BLACK); } Helper.setLocale(this); } diff --git a/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java index e8f0111e..156d81b8 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java @@ -19,8 +19,11 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.graphics.Color; import android.os.Build; import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -111,6 +114,12 @@ public class BaseBarActivity extends AppCompatActivity { } } super.onCreate(savedInstanceState); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.BLACK); + window.setNavigationBarColor(Color.BLACK); + } if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { ThemeHelper.adjustFontScale(this, getResources().getConfiguration()); } diff --git a/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java index 77f2df73..6b1c46f5 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java @@ -19,8 +19,11 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.graphics.Color; import android.os.Build; import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -111,6 +114,12 @@ public class BaseTransparentActivity extends AppCompatActivity { } } super.onCreate(savedInstanceState); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.BLACK); + window.setNavigationBarColor(Color.BLACK); + } if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { ThemeHelper.adjustFontScale(this, getResources().getConfiguration()); } From b2e9a08e95306ee0ac0bee8dd6aea211e3e51797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Jel=C3=ADnek?= Date: Wed, 21 Dec 2022 14:49:38 +0100 Subject: [PATCH 16/68] Translated using Weblate (Czech) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.4% (989 of 994 strings) Translated using Weblate (Czech) Currently translated at 99.4% (987 of 992 strings) Co-authored-by: Lukáš Jelínek Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/cs/ Translation: Fedilab/Strings --- app/src/main/res/values-cs/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f8461e2e..f15e3f93 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -940,4 +940,6 @@ Všechny účtu budou na domovské časové ose ztlumeny. Importovat data Přidat všechny uživatele pro ztlumený domov + Zobrazit + Seskupovat reblogy v domovské časové ose \ No newline at end of file From c9c3d3453529f64f4dbfdeb3f61eccec1c9eb9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kalle=20Kniivil=C3=A4?= Date: Wed, 21 Dec 2022 14:49:38 +0100 Subject: [PATCH 17/68] Translated using Weblate (Esperanto) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.1% (636 of 992 strings) Co-authored-by: Kalle Kniivilä Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/eo/ Translation: Fedilab/Strings --- app/src/main/res/values-eo/strings.xml | 70 +++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index fc932c5e..034a9527 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -162,62 +162,62 @@ %1$s silentigita ĝis %2$s. \nKlaku ĉi tie por malsilentigi la konton. - Neniun sciigon por montri + Neniu sciigo por montri menciis vin - wrote a new message - {name} diskonigis vian mesaĝon - {name} stelumis vian mesaĝon + verkis novan mesaĝon + diskonigis vian mesaĝon + stelumis vian mesaĝon eksekvis vin - asked to follow you - Forigi sciigoj? - All notifications have been deleted! + petis sekvi vin + Forigi ĉiujn sciigojn\? + Ĉiuj sciigoj forigitaj! - Sekvitaj + Sekvantoj - Unable to get client id! + Ne eblas ricevi la klientan identigilon! La konto estis blokita! La konto ne plu estas blokita! La konto estis silentigita! La konto ne plu silentigita! - La konto estis sekvita! - La konto estas ne plu sekvas! + La konto estas eksekvita! + La konto estas ne plu estas sekvata! The toot was boosted! The toot is no longer boosted! La hup estis aldonita al stelumoj! The toot was removed from your favourites! Ups ! Eraro okazis! - An error occurred! The instance did not return an authorisation code! - The instance domain does not seem to be valid! - An error occurred while switching between accounts! - An error occurred while searching! - No action can be taken - Eraro okazis dum traduktas! + Eraro okazis! La instanco ne donis rajtigan kodon! + La adreso de la instanco ne ŝajnas valida! + Okazis eraro dum ŝanĝado de kontoj! + Okazis eraro dum serĉado! + Neniu ago eblas + Eraro okazis dum tradukado! Number of toots per load - Disable GIF avatars - Notify when someone follows you - Notify when someone boosts your status - Notify when someone favourites your status - Notify when someone mentions you - Notify when a poll ended - Notify for new posts - Show confirmation dialog before boosting - Show confirmation dialog before adding to favourites + Malŝalti GIF-profilbildojn + Sciigu kiam iu eksekvas vin + Sciigu kiam iu diskonigas vian afiŝon + Sciigu kiam iu stelumas vian statuson + Sciigu kiam iu mencias vin + Sciigu kiam enketo finiĝas + Sciigu pri novaj afiŝoj + Montru konfirman dialogon antaŭ diskonigo + Montru konfirman dialogon antaŭ aldono al legosignoj Sciigi? - Silent Notifications - NSFW view timeout (seconds, 0 means off) - Media Description timeout (seconds, 0 means off) - Custom sharing - Your custom sharing URL… + Silentaj sciigoj + Tempolimo de NSFW-vido (sekundoj, 0 estas malŝalto) + Tempolimo de aŭdvida priskribo (sekundoj, 0 estas malŝalto) + Adaptita kundivido + URL por via adaptita kundivido… Ŝlosi konton Konservi ŝanĝojn - Fit preview images + Adapti antaŭvidajn bildojn Inter kaj - Use the built-in browser + Uzu la enkonstruitan retumilon Propra langetoj - Automatically expand cw - Set LED colour: + Aŭtomate montri enhavon sub averto + Agordi koloron de LED: Blua Cejana From 506286c3b621627698136871370007ff2fb40c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Wed, 21 Dec 2022 14:49:38 +0100 Subject: [PATCH 18/68] Translated using Weblate (Galician) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.8% (991 of 992 strings) Co-authored-by: josé m Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/gl/ Translation: Fedilab/Strings --- app/src/main/res/values-gl/strings.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d23d3869..16a79175 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -916,4 +916,16 @@ A conversa comezou na túa instancia! Escuro - Cores personais Tarxetas elevadas + Importar datos + Mostrar sempre botón de tradución + Acalar cancelo + Restablecer cancelo + Non seguir cancelo + Fixar cancelo + Desafixar cancelo + Acalar para Inicio + Non acalar para Inicio + Engadir tódolas usuarias ao inicio acalado + Tódalas contas serán acaladas para a cronoloxía de Inicio. + Acalalas todas \ No newline at end of file From f51c2532ea9bc43b64e877fa5fe462ccd6236c14 Mon Sep 17 00:00:00 2001 From: Screenshared Date: Wed, 21 Dec 2022 14:49:39 +0100 Subject: [PATCH 19/68] Translated using Weblate (Italian) Currently translated at 98.9% (982 of 992 strings) Co-authored-by: Screenshared Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/it/ Translation: Fedilab/Strings --- app/src/main/res/values-it/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c514e968..c35d9b4a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -915,4 +915,15 @@ Non seguire etichetta Selettore lingua Mostra conversazione remota + Link malevoli, siti ingannevoli, o risposte ripetitive + Importa dati + Tempo online: %,.2f %% + Seleziona tutto + Ci sono dei post a supporto di questa segnalazione\? + Dominio frontend YouTube + Dominio frontend Twitter + Dominio frontend Instagram + Dominio frontend Reddit + Ricondiviso da + Offusca parzialmente il nome di dominio nella lista se mostra le limitazioni di dominio é abilitato \ No newline at end of file From 0001aa0c2c441a7e64467b57dca89c1b2e6d7ea2 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Wed, 21 Dec 2022 14:49:39 +0100 Subject: [PATCH 20/68] Translated using Weblate (Sardinian) Currently translated at 99.3% (988 of 994 strings) Co-authored-by: Ajeje Brazorf Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/sc/ Translation: Fedilab/Strings --- app/src/main/res/values-sc/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 09fbd0db..eb21760b 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -926,4 +926,6 @@ Torra a ativare pro sa pàgina printzipale Totu is contos ant a abarrare a sa muda in sa lìnia de tempus printzipale. Pone·los totus a sa muda + Importa datos + Agrupa is cumpartziduras in sa lìnia de tempus printzipale \ No newline at end of file From 29cf55338f9974322b401e7f4771355fb93bcda5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 21 Dec 2022 14:49:39 +0100 Subject: [PATCH 21/68] Translated using Weblate (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (994 of 994 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/tr/ Translation: Fedilab/Strings --- app/src/main/res/values-tr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2e16484e..0f6f15ce 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -933,4 +933,5 @@ Tüm kullanıcıları ana sayfada susturmaya ekle Ana sayfa için sustur Verileri içe aktar + Ana sayfa zaman çizelgesinde yeniden blogları gruplandır \ No newline at end of file From 8e93b2d2bc535a9c37bcfc71b7ee7c07a616d755 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 21 Dec 2022 15:15:22 +0100 Subject: [PATCH 22/68] Release notes --- .../fastlane/metadata/android/en/changelogs/452.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/fdroid/fastlane/metadata/android/en/changelogs/452.txt diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt new file mode 100644 index 00000000..edfcd879 --- /dev/null +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt @@ -0,0 +1,8 @@ +Added: + + +Changed: + +Fixed: +- Nav buttons not visible with media (Light theme) +- Status bar with Android 5 \ No newline at end of file From 8c44f338dacf5acdf2a2148198d7acb61060c33a Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 21 Dec 2022 18:31:21 +0100 Subject: [PATCH 23/68] Rename Nitter instances --- .../client/entities/app/RemoteInstance.java | 2 + .../android/helper/PinnedTimelineHelper.java | 144 ++++++++++++------ .../main/res/menu/option_nitter_timeline.xml | 12 ++ app/src/main/res/values/strings.xml | 1 + .../metadata/android/en/changelogs/452.txt | 2 +- 5 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 app/src/main/res/menu/option_nitter_timeline.xml diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/RemoteInstance.java b/app/src/main/java/app/fedilab/android/client/entities/app/RemoteInstance.java index 39b73df4..6230dd1b 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/app/RemoteInstance.java +++ b/app/src/main/java/app/fedilab/android/client/entities/app/RemoteInstance.java @@ -27,6 +27,8 @@ public class RemoteInstance implements Serializable { public String id; @SerializedName("host") public String host; + @SerializedName("displayName") + public String displayName; @SerializedName("type") public InstanceType type; @SerializedName("tags") diff --git a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java index 52bb8e81..fba039d9 100644 --- a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java @@ -39,6 +39,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatTextView; import androidx.appcompat.widget.PopupMenu; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; @@ -356,6 +357,10 @@ public class PinnedTimelineHelper { name = pinnedTimeline.remoteInstance.host; if (pinnedTimeline.remoteInstance.type == RemoteInstance.InstanceType.NITTER) { String remoteInstance = sharedpreferences.getString(activity.getString(R.string.SET_NITTER_HOST), activity.getString(R.string.DEFAULT_NITTER_HOST)).toLowerCase(); + //Custom name for Nitter instances + if (pinnedTimeline.remoteInstance.displayName != null && pinnedTimeline.remoteInstance.displayName.trim().length() > 0) { + name = pinnedTimeline.remoteInstance.displayName; + } ident = "@R@" + remoteInstance; } else { ident = "@R@" + pinnedTimeline.remoteInstance.host; @@ -521,7 +526,7 @@ public class PinnedTimelineHelper { if (pinnedTimelineVisibleList.get(position).remoteInstance.type != RemoteInstance.InstanceType.NITTER) { instanceClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); } else { - nitterClick(activity, finalPinned, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); + nitterClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); } break; case HOME: @@ -979,6 +984,10 @@ public class PinnedTimelineHelper { if (values.trim().length() == 0) values = tag; tagTimeline.displayName = values; + View titleView = view.findViewById(R.id.title); + if (titleView instanceof AppCompatTextView) { + ((AppCompatTextView) titleView).setText(tagTimeline.displayName); + } pinned.pinnedTimelines.get(finalOffSetPosition).tagTimeline = tagTimeline; try { new Pinned(activity).updatePinned(pinned); @@ -1224,7 +1233,7 @@ public class PinnedTimelineHelper { * @param pinned - {@link Pinned} * @param position - int position of the tab */ - public static void nitterClick(BaseMainActivity activity, Pinned pinned, ActivityMainBinding activityMainBinding, int position, String slug) { + public static void nitterClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position, String slug) { int toRemove = itemToRemoveInBottomMenu(activity); int offSetPosition = position - (BOTTOM_TIMELINE_COUNT - toRemove); @@ -1236,54 +1245,97 @@ public class PinnedTimelineHelper { RemoteInstance remoteInstance = pinned.pinnedTimelines.get(offSetPosition).remoteInstance; if (remoteInstance == null) return; - String accounts = remoteInstance.host; - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, Helper.dialogStyle()); - LayoutInflater inflater = activity.getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.tags_any, new LinearLayout(activity), false); - dialogBuilder.setView(dialogView); - final EditText editText = dialogView.findViewById(R.id.filter_any); - editText.setHint(R.string.list_of_twitter_accounts); - if (accounts != null) { - editText.setText(accounts); - editText.setSelection(editText.getText().toString().length()); - } + PopupMenu popup = new PopupMenu(activity, view); + popup.getMenuInflater() + .inflate(R.menu.option_nitter_timeline, popup.getMenu()); int finalOffSetPosition = offSetPosition; - dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { - pinned.pinnedTimelines.get(finalOffSetPosition).remoteInstance.host = editText.getText().toString().trim(); - try { - new Pinned(activity).updatePinned(pinned); - } catch (DBException e) { - e.printStackTrace(); - } - FragmentMastodonTimeline fragmentMastodonTimeline = null; - try { - new StatusCache(activity).deleteForSlug(slug); - } catch (DBException e) { - e.printStackTrace(); - } - if (activityMainBinding.viewPager.getAdapter() != null) { - Fragment fragment = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition()); - if (fragment instanceof FragmentMastodonTimeline && fragment.isVisible()) { - fragmentMastodonTimeline = ((FragmentMastodonTimeline) fragment); - fragmentMastodonTimeline.refreshAllAdapters(); + popup.setOnMenuItemClickListener(item -> { + int itemId = item.getItemId(); + if (itemId == R.id.action_displayname) { + AlertDialog.Builder dialogBuilder; + LayoutInflater inflater; + View dialogView; + AlertDialog alertDialog; + dialogBuilder = new AlertDialog.Builder(activity, Helper.dialogStyle()); + inflater = activity.getLayoutInflater(); + dialogView = inflater.inflate(R.layout.tags_name, new LinearLayout(activity), false); + dialogBuilder.setView(dialogView); + final EditText editTextName = dialogView.findViewById(R.id.column_name); + if (remoteInstance.displayName != null) { + editTextName.setText(remoteInstance.displayName); + editTextName.setSelection(editTextName.getText().toString().length()); + } + dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { + String values = editTextName.getText().toString(); + if (values.trim().length() == 0) { + values = remoteInstance.displayName; + } + remoteInstance.displayName = values; + View titleView = view.findViewById(R.id.title); + if (titleView instanceof AppCompatTextView) { + ((AppCompatTextView) titleView).setText(remoteInstance.displayName); + } + pinned.pinnedTimelines.get(finalOffSetPosition).remoteInstance = remoteInstance; + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + }); + alertDialog = dialogBuilder.create(); + alertDialog.show(); + } else if (itemId == R.id.action_nitter_manage_accounts) { + String accounts = remoteInstance.host; + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, Helper.dialogStyle()); + LayoutInflater inflater = activity.getLayoutInflater(); + View dialogView = inflater.inflate(R.layout.tags_any, new LinearLayout(activity), false); + dialogBuilder.setView(dialogView); + final EditText editText = dialogView.findViewById(R.id.filter_any); + editText.setHint(R.string.list_of_twitter_accounts); + if (accounts != null) { + editText.setText(accounts); + editText.setSelection(editText.getText().toString().length()); } + dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { + pinned.pinnedTimelines.get(finalOffSetPosition).remoteInstance.host = editText.getText().toString().trim(); + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + FragmentMastodonTimeline fragmentMastodonTimeline = null; + try { + new StatusCache(activity).deleteForSlug(slug); + } catch (DBException e) { + e.printStackTrace(); + } + if (activityMainBinding.viewPager.getAdapter() != null) { + Fragment fragment = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition()); + if (fragment instanceof FragmentMastodonTimeline && fragment.isVisible()) { + fragmentMastodonTimeline = ((FragmentMastodonTimeline) fragment); + fragmentMastodonTimeline.refreshAllAdapters(); + } + } + FragmentTransaction fragTransaction1 = activity.getSupportFragmentManager().beginTransaction(); + if (fragmentMastodonTimeline == null) + return; + fragTransaction1.detach(fragmentMastodonTimeline).commit(); + Bundle bundle = new Bundle(); + bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition)); + bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE); + bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false); + fragmentMastodonTimeline.setArguments(bundle); + FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction(); + fragTransaction2.attach(fragmentMastodonTimeline); + fragTransaction2.commit(); + fragmentMastodonTimeline.recreate(); + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); } - FragmentTransaction fragTransaction1 = activity.getSupportFragmentManager().beginTransaction(); - if (fragmentMastodonTimeline == null) - return; - fragTransaction1.detach(fragmentMastodonTimeline).commit(); - Bundle bundle = new Bundle(); - bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition)); - bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE); - bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false); - fragmentMastodonTimeline.setArguments(bundle); - FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction(); - fragTransaction2.attach(fragmentMastodonTimeline); - fragTransaction2.commit(); - fragmentMastodonTimeline.recreate(); + return true; }); - AlertDialog alertDialog = dialogBuilder.create(); - alertDialog.show(); + popup.show(); } diff --git a/app/src/main/res/menu/option_nitter_timeline.xml b/app/src/main/res/menu/option_nitter_timeline.xml new file mode 100644 index 00000000..cbfc4cc6 --- /dev/null +++ b/app/src/main/res/menu/option_nitter_timeline.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index acded866..1a8c3a21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2111,4 +2111,5 @@ Mute them all Import data Group reblogs in home timeline + Manage accounts \ No newline at end of file diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt index edfcd879..754cefcb 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt @@ -1,5 +1,5 @@ Added: - +- Rename Nitter timelines Changed: From 5e619d7e5cc1c3909a251ad9684a08f00654dcbd Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 21 Dec 2022 18:58:40 +0100 Subject: [PATCH 24/68] Rename Nitter instances --- .../fedilab/android/helper/SpannableHelper.java | 17 +++++++++++++++++ .../metadata/android/en/changelogs/452.txt | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index 77cc88e0..55bfb356 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -254,6 +254,14 @@ public class SpannableHelper { if (urlDetails.containsKey(url)) { continue; } + + ClickableSpan[] clickableSpans = content.getSpans(matchStart, matchEnd, ClickableSpan.class); + if (clickableSpans != null) { + for (ClickableSpan clickableSpan : clickableSpans) { + content.removeSpan(clickableSpan); + } + } + content.removeSpan(clickableSpans); String newURL = Helper.transformURL(context, url); //If URL has been transformed if (newURL.compareTo(url) != 0) { @@ -514,6 +522,15 @@ public class SpannableHelper { if (content.toString().length() < matchEnd || matchStart < 0 || matchStart > matchEnd) { continue; } + + ClickableSpan[] clickableSpans = content.getSpans(matchStart, matchEnd, ClickableSpan.class); + if (clickableSpans != null) { + for (ClickableSpan clickableSpan : clickableSpans) { + content.removeSpan(clickableSpan); + } + } + content.removeSpan(clickableSpans); + if (matchEnd <= content.length()) { content.setSpan(new LongClickableSpan() { @Override diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt index 754cefcb..1d1da373 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/452.txt @@ -5,4 +5,5 @@ Changed: Fixed: - Nav buttons not visible with media (Light theme) -- Status bar with Android 5 \ No newline at end of file +- Status bar with Android 5 +- Fix links not clickable \ No newline at end of file From 4bc128dbf9f88d8a05bf1621ee64b1dc1d5baf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 21 Dec 2022 22:21:04 +0100 Subject: [PATCH 25/68] Translated using Weblate (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (995 of 995 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/tr/ Translation: Fedilab/Strings --- app/src/main/res/values-tr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0f6f15ce..c3caf14e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -934,4 +934,5 @@ Ana sayfa için sustur Verileri içe aktar Ana sayfa zaman çizelgesinde yeniden blogları gruplandır + Hesapları yönet \ No newline at end of file From 51a09b05b13c48fc9f5133c6ba76193c600f594d Mon Sep 17 00:00:00 2001 From: Eduardo Lima Date: Thu, 22 Dec 2022 07:50:55 +0100 Subject: [PATCH 26/68] Translated using Weblate (Portuguese) Currently translated at 70.6% (703 of 995 strings) Co-authored-by: Eduardo Lima Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/pt/ Translation: Fedilab/Strings --- app/src/main/res/values-pt/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2bc08d3a..b72e2a26 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -638,4 +638,8 @@ Adicionar status Enviando mensagem %d/%d Nova atualização + Nova inscrição + Uma mensagem que você compartilhou foi editada + Um usuário fez uma denúncia + Um usuário se inscreveu \ No newline at end of file From ba4874a067f75f8f76cfc4c53deefc3f32e811a6 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 23 Dec 2022 05:48:48 +0100 Subject: [PATCH 27/68] Translated using Weblate (French) Currently translated at 99.6% (992 of 995 strings) Translated using Weblate (Arabic) Currently translated at 86.4% (860 of 995 strings) Co-authored-by: ButterflyOfFire Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/ar/ Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/fr/ Translation: Fedilab/Strings --- app/src/main/res/values-ar/strings.xml | 63 +++++++++++++++++++++++++- app/src/main/res/values-fr/strings.xml | 14 +++--- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 385929bb..e42adef7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -550,7 +550,7 @@ القيام بإجراء الترجمة لون النص - تغيير لون النص في البقع + تغيير لون النص في الرسائل استخدم قالبا مخصصا المظهر تم تصدير القالب @@ -750,4 +750,65 @@ تشويش اسم النطاق المظهر الداكن الافتراضي تعليق للعامة + إعلان · %1$s - %2$s + الشكل + اختر ما إذا كان يجب أن تكون قاعدة الحُلة داكنة أو فاتحة + اختر حُلة أنشأها المساهمون + لغة الرسائل + إرسال الرسالة %d / %d + إزالة المنشور + ألا تريد رؤية هذا؟ + أنت تتابع هذا الحساب. لكي لا ترى منشوراته في خيطك الرئيسي بعد الآن ، قم بإلغاء متابعته. + هل هناك أي شيء آخر تعتقد أننا يجب أن نعرفه؟ + نتائج الاستطلاع + محو كافة الإشعارات + عرض جميع الفئات + خط + جلب المزيد من الرسائل… + شاركه أيضا: + عرض زر الترجمة دائما + مؤكّد + عرض + بيضاوي + افتح المسودة + انضم + أحدث عنوان إيبي + غير مؤكد + روابط ضارة أو مشاركة مزيفة أو ردود متكررة + الإشارات + المفضلة + مسح ذاكرة التخزين المؤقت + استخدم لغة النظام الافتراضية + فشل التطبيق في الحصول على رمز مميز + إحضار الإشعارات كل: + تصدير الإعدادات + شريط إجراءات واحد + أي قواعد تم انتهاكها؟ + أهلاً! ندعوك للانضمام إلى الـ Fediverse. + عرض زر الفاصلة المرجعية دائما + وضع علامة مقروءة على جميع الإشعارات + "يفضله أيضًا: " + مستطيل + وضع الممحاة + هل تريد الخروج دون حفظ الصورة؟ + اضغط هنا لتحديث استطلاع الرأي + الخيوط الزمنية في قائمة + هل أنت متأكد من أنك تريد إلغاء متابعة هذا الوسم؟ + إلغاء متابعة الوسم + أنت مدرك أنه يخالف قواعد محددة + تعليقات إضافية + الحساب من خادم آخر. هل تريد إرسال نسخة مجهولة من التقرير هناك أيضًا؟ + إعادة التوجيه إلى %1$s + تم إرسال التقرير! + لا تملك حسابا؟ + انضم إلى الفديفرس + إعادة التدوين + عامل التصفية + حذف ذاكرة التخزين المؤقت + ملاحظات الإصدار + تحميل الصور المصغرة للوسائط + عرض الوسائط + استيراد الإعدادت + لا يمكن تحميل الوسائط! + أصل الحساب المبلغ عنه \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9b11eedb..3b815814 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -440,7 +440,7 @@ J\'accepte les %1$s et les %2$s règles du serveur conditions de service - S\'inscrire + S’inscrire Cette instance fonctionne avec des invitations. Votre compte devra être approuvé manuellement par un·e administrateur·rice pour qu\'il devienne utilisable. Les mots de passe ne sont pas identiques ! L\'adresse ne semble pas être valide ! @@ -864,7 +864,7 @@ Nouveau signalement Un message que vous avez partagé a été édité Un⋅e utilisateur⋅ice s\'est abonné⋅e - Politique de confidentialité + Politique de vie privée Vous n’avez pas bloqué de domaines Supprimer le fil épinglé \? Supprimer les fils épinglés \? @@ -877,7 +877,7 @@ Commentaire public Les modifications ont été enregistrées ! Créer un bloquage de domaine - Êtes-vous sûr de vouloir débloquer %1$s \? + Êtes-vous certain de débloquer %1$s \? a envoyé un rapport Domaines bloqués Rejeter les rapports @@ -887,17 +887,17 @@ Voulez-vous vraiment désépingler ce fil \? Nouvelle inscription (modérateurs) Ignorer tous les rapports provenant de ce domaine. Non pertinent pour les suspensions - Rejeter les médias + Rejeter le média Rejeter les rapports Voulez-vous vraiment masquer le tag %1$s \? Suggestions Pas intéressé - Avertir des mises à jour + Notifier les mises à jour Supprimer le fil chronologique Inscrit·e Thème sombre par défaut L\'app n\'a pas trouvé le message distant. - Ordonner les listes + Ré-arranger les listes Sévérité Le blocage de domaine n\'empêchera pas la création d\'entrées de compte dans la base de données, mais appliquera rétroactivement et automatiquement des méthodes de modération spécifiques à ces comptes. Rejeter les fichiers médias @@ -933,4 +933,6 @@ utilisateur·ices silencé·es sur l\'accueil Soumettre un rapport Masquer partiellement le nom de domaine dans la liste si l\'option de publication restreinte de la liste de domaine est activée + Importer des données + Gérer les comptes \ No newline at end of file From d9ed8bc3eab7911a83a6d35eac9f3b0023404f4a Mon Sep 17 00:00:00 2001 From: Eduardo Lima Date: Fri, 23 Dec 2022 05:48:49 +0100 Subject: [PATCH 28/68] Translated using Weblate (Portuguese) Currently translated at 69.5% (692 of 995 strings) Co-authored-by: Eduardo Lima Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/pt/ Translation: Fedilab/Strings --- app/src/main/res/values-pt/strings.xml | 152 ++++++++++++++----------- 1 file changed, 87 insertions(+), 65 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b72e2a26..cb127f48 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -13,19 +13,19 @@ Baixar Baixar %1$s Mídia salva - Ficheiro: %1$s + Arquivo: %1$s Senha E-mail Contas Mensagens - Tags + Etiquetas Salvar Instância Instância: mastodon.social Usando a conta %1$s agora - Adicionar conta + Adicionar uma conta O conteúdo da mensagem foi copiado para a área de transferência - O link da mensagem foi copiado para a área de transferência + A URL da mensagem foi copiada para a área de transferência Câmera Excluir tudo Agendar @@ -33,7 +33,7 @@ Próximo Anterior Abrir com - Ok + Validar Mídia Compartilhar com Compartilhado via Fedilab @@ -58,14 +58,14 @@ Configurações Mandar um e-mail Mensagens agendadas - As informações abaixo podem refletir incompletamente o perfil do usuário. + As informações abaixo podem refletir o perfil do usuário de forma incompleta. Inserir emoji O aplicativo não achou emojis personalizados no momento. - Tem a certeza que quer sair @%1$s@%2$s? + Você tem certeza que deseja sair de @%1$s@%2$s\? - Sem mensagens para mostrar - Favoritar essa mensagem\? - Desfavoritar essa mensagem\? + Nenhuma mensagem para exibir + Adicionar esta mensagem aos seus favoritos\? + Remover esta mensagem dos seus favoritos\? Dar boost\? Desfazer boost\? Silenciar @@ -75,7 +75,7 @@ Copiar Compartilhar Mencionar - Silenciar até... + Silenciar temporariamente Excluir & rascunhar Silenciar esta conta? @@ -93,9 +93,9 @@ Excluir este toot? Excluir & rascunhar este toot? - Salvos - Salvar - Remover dos Salvos + Favoritos + Adicionar aos favoritos + Remover dos favoritos Toot foi salvo! Toot foi removido dos Salvos! @@ -125,9 +125,9 @@ Ocorreu um erro ao selecionar a mídia! - Remover mídia? + Remover esta mídia\? Sua mensagem está vazia! - Mensagem enviada! + A mensagem foi enviada! Conteúdo sensível? Sem rascunhos! Escolha uma conta @@ -135,7 +135,7 @@ Excluir rascunho? Descreva para os deficientes visuais - Sem descrição! + Nenhuma descrição disponível! Versão %1$s Desenvolvedor: @@ -145,7 +145,7 @@ Procure instâncias: - Sem conta + Nenhuma conta para exibir Sem seguidores pendentes Mensagens \n %1$s @@ -153,13 +153,14 @@ Seguidores \n %1$s Recusar - Sem mensagens agendadas! + Nenhuma mensagem agendada para exibir! Excluir mensagem agendada\? - Mensagem agendada! + A mensagem foi agendada! A data de agendamento deve ser após o horário atual! - O tempo de silêncio deve ser maior do que um minuto. - %1$s foi silenciado até %2$s. \n Você pode desativar no perfil do usuário. + O tempo de silenciamento deve ser maior que um minuto. + %1$s foi silenciado até %2$s. +\n Você pode anular o silenciar desta conta na página de perfil dela. %1$s está silenciado até %2$s. \n Toque aqui para desativar o silêncio. Sem notificações @@ -418,12 +419,12 @@ Cancelar Salvando… Imagem salva! - Falha ao salvar imagem. + Falha ao salvar imagem Adicionar um item Silenciar conversa Desativar silêncio Silêncio desativado! - Silêncio ativado! + A conversa está silenciada Geral Regional Arte @@ -489,6 +490,7 @@ Denunciar conta %d votante + %d votantes %d votantes @@ -506,11 +508,11 @@ A sua votação não pode ter opções duplicadas! Limpar cache ao sair - The cache (media, cached messages, data from the built-in browser) will be automatically cleared when leaving the application. + O cache (mídia, mensagens em cache, dados do navegador integrado) será limpo automaticamente ao sair do aplicativo. Quer deixar de seguir esta conta? Mostrar diálogo de confirmação antes de deixar de seguir uma conta Replace Medium links - Replace medium.com links with an open source alternative front-end focused on privacy. + Use um frontend alternativo para o Medium Default: scribe.rip Use um sistema notificações instantâneas para ter notificações em tempo real. Adicionar notas @@ -530,53 +532,57 @@ Toque aqui para repor todas as suas cores personalizadas Reset Icons - Color of bottom icons in timelines - Logo of the instance - Edit profile - Make an action - Translation + Cor dos ícones inferiores nas linhas do tempo + Logo da instância + Editar Perfil + Faça uma ação + Tradução Text color - Change the text color in messages - Use a custom theme - Theming - The theme was exported - The theme has been successfully exported in CSV + Alterar a cor do texto nas mensagens + Use um tema personalizado + Personalização + O tema foi exportado + O tema foi exportado com sucesso em CSV Import a theme - Tap here to import a theme from a previous export + Toque aqui para importar um tema exportado previamente Export the theme - Tap here to export the current theme - An error occurred when selecting the theme file - User count - Status count - Instance count + Toque aqui para exportar o tema atual + Ocorreu um erro ao selecionar o arquivo do tema + Número de usuários + Número de status + Número de instâncias End in %s - This instance is not available on https://instances.social + Esta instância não está disponível em https://instances.social Exibir link completo Partilhar link Abrir noutra aplicação - Check redirect - This URL does not redirect - %1$s \n\nredirects to\n\n %2$s - Remove UTM parameters - The app will automatically remove UTM parameters from URLs before visiting a link. - %d people talking - Twitter accounts (via Nitter) - Twitter usernames space separated - Identity proofs - Verified identity - Verified by %1$s (%2$s) - Action disabled - Unfollow - Something went wrong, please check your download directory in settings. - Announcements - No announcements! - Add a reaction - Video cache in MB, zero means no cache. - Watermarks - Automatically add a watermark at the bottom of pictures. The text can be customized for each account. - No distributors found! + Verifique o redirecionamento + Este URL não redireciona + %1$s +\n +\nredireciona para +\n +\n %2$s + Remover parâmetros UTM + O aplicativo removerá automaticamente os parâmetros UTM das URLs antes de visitar um link. + %d pessoas conversando + Contas do Twitter (via Nitter) + Nomes de usuários do Twitter separados por espaço + Provas de identidade + Identidade verificada + Verificado por %1$s (%2$s) + Ação desativada + Deixar de seguir + Algo deu errado, verifique seu diretório de download nas configurações. + Anúncios + Sem anúncios! + Adicionar uma reação + Cache de vídeo em MB, zero significa sem cache. + Marcas d\'água + Adicione automaticamente uma marca d\'água na parte inferior das fotos. O texto pode ser personalizado para cada conta. + Nenhum distribuidor encontrado! Necessita de um distribuidor para receber notificações instantâneas. \nVai encontrar mais detalhes em %1$s.\n\nPode desactivar as mensagens instantâneas nas configurações para ignorar esta mensagem. - Select a distributor + Selecione um distribuidor Sons de notificação Usar um frontend alternativo para Twitter Twitter @@ -642,4 +648,20 @@ Uma mensagem que você compartilhou foi editada Um usuário fez uma denúncia Um usuário se inscreveu + Inscrições + Personalizar tema escuro + Personalizar tema claro + Escuro - Cores personalizadas + Por favor, tente novamente mais tarde. + A conversa começou na sua instância! + Eu não gosto disso + Claro - Cores personalizadas + Gerenciar contas + Importar dados + Quando ativado, os itens nas linhas do tempo terão uma sombra e uma elevação. + Tema claro padrão + Tema escuro padrão + Nova denúncia + Mostrar mesmo assim + Personalizar cores \ No newline at end of file From f658696c3432406279b36cda04a64ca153ce0e6a Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Fri, 23 Dec 2022 05:48:49 +0100 Subject: [PATCH 29/68] Translated using Weblate (Sardinian) Currently translated at 99.2% (988 of 995 strings) Co-authored-by: Ajeje Brazorf Translate-URL: https://hosted.weblate.org/projects/fedilab/strings/sc/ Translation: Fedilab/Strings --- app/src/main/res/values-sc/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index eb21760b..3a4733e8 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -928,4 +928,5 @@ Pone·los totus a sa muda Importa datos Agrupa is cumpartziduras in sa lìnia de tempus printzipale + Amministra is contos \ No newline at end of file From e5f36c3e43555445e0699c835b2f681e194e9053 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 23 Dec 2022 11:36:03 +0100 Subject: [PATCH 30/68] switch lib --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 2 +- .../android/activities/ComposeActivity.java | 1 + .../endpoints/MastodonStatusesService.java | 2 +- .../app/fedilab/android/helper/Helper.java | 52 +- .../fedilab/android/helper/MediaHelper.java | 154 ++ .../imageeditor/EditImageActivity.java | 91 +- .../android/interfaces/ProgressListener.java | 5 + .../fedilab/android/jobs/ComposeWorker.java | 6 +- .../viewmodel/mastodon/StatusesVM.java | 6 +- cropper/build.gradle | 22 - cropper/src/main/AndroidManifest.xml | 3 - .../cropper/BitmapCroppingWorkerTask.java | 354 --- .../cropper/BitmapLoadingWorkerTask.java | 176 -- .../edmodo/cropper/BitmapUtils.java | 923 ------- .../theartofdev/edmodo/cropper/CropImage.java | 1048 -------- .../edmodo/cropper/CropImageActivity.java | 367 --- .../edmodo/cropper/CropImageAnimation.java | 123 - .../edmodo/cropper/CropImageOptions.java | 541 ---- .../edmodo/cropper/CropImageView.java | 2296 ----------------- .../edmodo/cropper/CropOverlayView.java | 1118 -------- .../edmodo/cropper/CropWindowHandler.java | 405 --- .../edmodo/cropper/CropWindowMoveHandler.java | 786 ------ .../drawable-hdpi/crop_image_menu_flip.png | Bin 262 -> 0 bytes .../crop_image_menu_rotate_left.png | Bin 634 -> 0 bytes .../crop_image_menu_rotate_right.png | Bin 617 -> 0 bytes .../drawable-xhdpi/crop_image_menu_flip.png | Bin 259 -> 0 bytes .../crop_image_menu_rotate_left.png | Bin 798 -> 0 bytes .../crop_image_menu_rotate_right.png | Bin 787 -> 0 bytes .../drawable-xxhdpi/crop_image_menu_flip.png | Bin 417 -> 0 bytes .../crop_image_menu_rotate_left.png | Bin 1181 -> 0 bytes .../crop_image_menu_rotate_right.png | Bin 1165 -> 0 bytes .../drawable-xxxhdpi/crop_image_menu_flip.png | Bin 508 -> 0 bytes .../crop_image_menu_rotate_left.png | Bin 1577 -> 0 bytes .../crop_image_menu_rotate_right.png | Bin 1570 -> 0 bytes .../main/res/layout/crop_image_activity.xml | 5 - .../src/main/res/layout/crop_image_view.xml | 25 - cropper/src/main/res/menu/crop_image_menu.xml | 35 - cropper/src/main/res/values-ar/strings.xml | 16 - cropper/src/main/res/values-cs/strings.xml | 16 - cropper/src/main/res/values-de/strings.xml | 16 - .../src/main/res/values-es-rGT/strings.xml | 12 - cropper/src/main/res/values-es/strings.xml | 12 - cropper/src/main/res/values-fa/strings.xml | 11 - cropper/src/main/res/values-fr/strings.xml | 12 - cropper/src/main/res/values-he/strings.xml | 16 - cropper/src/main/res/values-hi/strings.xml | 11 - cropper/src/main/res/values-id/strings.xml | 12 - cropper/src/main/res/values-in/strings.xml | 12 - cropper/src/main/res/values-it/strings.xml | 16 - cropper/src/main/res/values-ja/strings.xml | 11 - cropper/src/main/res/values-ko/strings.xml | 16 - cropper/src/main/res/values-ms/strings.xml | 12 - cropper/src/main/res/values-nb/strings.xml | 16 - cropper/src/main/res/values-nl/strings.xml | 16 - cropper/src/main/res/values-pl/strings.xml | 16 - .../src/main/res/values-pt-rBR/strings.xml | 14 - .../src/main/res/values-ru-rRU/strings.xml | 10 - cropper/src/main/res/values-sv/strings.xml | 16 - cropper/src/main/res/values-tr/strings.xml | 12 - cropper/src/main/res/values-ur/strings.xml | 12 - cropper/src/main/res/values-vi/strings.xml | 16 - .../src/main/res/values-zh-rCN/strings.xml | 16 - .../src/main/res/values-zh-rTW/strings.xml | 16 - cropper/src/main/res/values-zh/strings.xml | 16 - cropper/src/main/res/values/attrs.xml | 50 - cropper/src/main/res/values/strings.xml | 16 - settings.gradle | 1 - 68 files changed, 281 insertions(+), 8715 deletions(-) create mode 100644 app/src/main/java/app/fedilab/android/interfaces/ProgressListener.java delete mode 100644 cropper/build.gradle delete mode 100644 cropper/src/main/AndroidManifest.xml delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapLoadingWorkerTask.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageAnimation.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowHandler.java delete mode 100644 cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowMoveHandler.java delete mode 100644 cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png delete mode 100644 cropper/src/main/res/drawable-hdpi/crop_image_menu_rotate_left.png delete mode 100644 cropper/src/main/res/drawable-hdpi/crop_image_menu_rotate_right.png delete mode 100644 cropper/src/main/res/drawable-xhdpi/crop_image_menu_flip.png delete mode 100644 cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_left.png delete mode 100644 cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_right.png delete mode 100644 cropper/src/main/res/drawable-xxhdpi/crop_image_menu_flip.png delete mode 100644 cropper/src/main/res/drawable-xxhdpi/crop_image_menu_rotate_left.png delete mode 100644 cropper/src/main/res/drawable-xxhdpi/crop_image_menu_rotate_right.png delete mode 100644 cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_flip.png delete mode 100644 cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_rotate_left.png delete mode 100644 cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_rotate_right.png delete mode 100644 cropper/src/main/res/layout/crop_image_activity.xml delete mode 100644 cropper/src/main/res/layout/crop_image_view.xml delete mode 100644 cropper/src/main/res/menu/crop_image_menu.xml delete mode 100644 cropper/src/main/res/values-ar/strings.xml delete mode 100644 cropper/src/main/res/values-cs/strings.xml delete mode 100644 cropper/src/main/res/values-de/strings.xml delete mode 100644 cropper/src/main/res/values-es-rGT/strings.xml delete mode 100644 cropper/src/main/res/values-es/strings.xml delete mode 100644 cropper/src/main/res/values-fa/strings.xml delete mode 100644 cropper/src/main/res/values-fr/strings.xml delete mode 100644 cropper/src/main/res/values-he/strings.xml delete mode 100644 cropper/src/main/res/values-hi/strings.xml delete mode 100644 cropper/src/main/res/values-id/strings.xml delete mode 100644 cropper/src/main/res/values-in/strings.xml delete mode 100644 cropper/src/main/res/values-it/strings.xml delete mode 100644 cropper/src/main/res/values-ja/strings.xml delete mode 100644 cropper/src/main/res/values-ko/strings.xml delete mode 100644 cropper/src/main/res/values-ms/strings.xml delete mode 100644 cropper/src/main/res/values-nb/strings.xml delete mode 100644 cropper/src/main/res/values-nl/strings.xml delete mode 100644 cropper/src/main/res/values-pl/strings.xml delete mode 100644 cropper/src/main/res/values-pt-rBR/strings.xml delete mode 100644 cropper/src/main/res/values-ru-rRU/strings.xml delete mode 100644 cropper/src/main/res/values-sv/strings.xml delete mode 100644 cropper/src/main/res/values-tr/strings.xml delete mode 100644 cropper/src/main/res/values-ur/strings.xml delete mode 100644 cropper/src/main/res/values-vi/strings.xml delete mode 100644 cropper/src/main/res/values-zh-rCN/strings.xml delete mode 100644 cropper/src/main/res/values-zh-rTW/strings.xml delete mode 100644 cropper/src/main/res/values-zh/strings.xml delete mode 100644 cropper/src/main/res/values/attrs.xml delete mode 100644 cropper/src/main/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index 445efddd..aefc0662 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,11 +8,11 @@ plugins { } def flavor android { - compileSdk 32 + compileSdk 33 defaultConfig { minSdk 21 - targetSdk 32 + targetSdk 33 versionCode 451 versionName "3.12.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -106,7 +106,7 @@ dependencies { implementation 'com.burhanrashid52:photoeditor:1.5.1' - implementation project(path: ':cropper') + implementation("com.vanniktech:android-image-cropper:4.3.3") annotationProcessor "com.github.bumptech.glide:compiler:4.12.0" implementation 'jp.wasabeef:glide-transformations:4.3.0' implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.24.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a10c058..7c0b89c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -213,7 +213,7 @@ android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/scheduled" /> diff --git a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java index 1688d292..3e344a94 100644 --- a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java @@ -126,6 +126,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana if (focusX != -2) { attachment.focus = focusX + "," + focusY; } + composeAdapter.notifyItemChanged(position); break; } diff --git a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonStatusesService.java b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonStatusesService.java index 08ae1d50..cf8613b4 100644 --- a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonStatusesService.java +++ b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonStatusesService.java @@ -251,7 +251,7 @@ public interface MastodonStatusesService { @Part MultipartBody.Part file, @Part MultipartBody.Part thumbnail, @Part("description") RequestBody description, - @Part("focus") String focus + @Part("focus") RequestBody focus ); //Edit a Media diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index fe70d4fe..da475df5 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -1243,32 +1243,48 @@ public class Helper { counter++; Date now = new Date(); attachment.filename = formatter.format(now) + "." + extension; - InputStream selectedFileInputStream; - try { - selectedFileInputStream = context.getContentResolver().openInputStream(uri); - if (selectedFileInputStream != null) { + if (attachment.mimeType.startsWith("image")) { + try { final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); boolean isCertCacheDirExists = certCacheDir.exists(); if (!isCertCacheDirExists) { - isCertCacheDirExists = certCacheDir.mkdirs(); + certCacheDir.mkdirs(); } - if (isCertCacheDirExists) { - String filePath = certCacheDir.getAbsolutePath() + "/" + attachment.filename; - attachment.local_path = filePath; - OutputStream selectedFileOutPutStream = new FileOutputStream(filePath); - byte[] buffer = new byte[1024]; - int length; - while ((length = selectedFileInputStream.read(buffer)) > 0) { - selectedFileOutPutStream.write(buffer, 0, length); + String filePath = certCacheDir.getAbsolutePath() + "/" + attachment.filename; + MediaHelper.ResizedImageRequestBody(context, uri, filePath); + attachment.local_path = filePath; + } catch (IOException e) { + e.printStackTrace(); + } + } else { + InputStream selectedFileInputStream; + try { + selectedFileInputStream = context.getContentResolver().openInputStream(uri); + if (selectedFileInputStream != null) { + final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); + boolean isCertCacheDirExists = certCacheDir.exists(); + if (!isCertCacheDirExists) { + isCertCacheDirExists = certCacheDir.mkdirs(); } - selectedFileOutPutStream.flush(); - selectedFileOutPutStream.close(); + if (isCertCacheDirExists) { + String filePath = certCacheDir.getAbsolutePath() + "/" + attachment.filename; + attachment.local_path = filePath; + OutputStream selectedFileOutPutStream = new FileOutputStream(filePath); + byte[] buffer = new byte[1024]; + int length; + while ((length = selectedFileInputStream.read(buffer)) > 0) { + selectedFileOutPutStream.write(buffer, 0, length); + } + selectedFileOutPutStream.flush(); + selectedFileOutPutStream.close(); + } + selectedFileInputStream.close(); } - selectedFileInputStream.close(); + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } + Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> callBack.onAttachmentCopied(attachment); mainHandler.post(myRunnable); diff --git a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java index 93c1b8d3..586df508 100644 --- a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java @@ -24,14 +24,23 @@ import android.app.DownloadManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.ImageDecoder; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.media.ExifInterface; import android.media.MediaRecorder; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; +import android.text.TextUtils; import android.text.format.DateFormat; import android.view.View; import android.webkit.MimeTypeMap; @@ -55,6 +64,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -69,10 +79,12 @@ import java.util.concurrent.atomic.AtomicInteger; import app.fedilab.android.BuildConfig; import app.fedilab.android.R; import app.fedilab.android.activities.ComposeActivity; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.entities.api.Attachment; import app.fedilab.android.databinding.DatetimePickerBinding; import app.fedilab.android.databinding.PopupRecordBinding; import es.dmoral.toasty.Toasty; +import okhttp3.MediaType; public class MediaHelper { @@ -420,4 +432,146 @@ public class MediaHelper { public interface OnSchedule { void scheduledAt(String scheduledDate); } + + + public static void ResizedImageRequestBody(Context context, Uri uri, String fullpatch) throws IOException { + + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + String contentType; + if ("file".equals(uri.getScheme())) { + BitmapFactory.decodeFile(uri.getPath(), opts); + contentType = MediaHelper.getFileMediaType(new File(uri.getPath())).type(); + } else { + try (InputStream in = context.getContentResolver().openInputStream(uri)) { + BitmapFactory.decodeStream(in, null, opts); + } + contentType = context.getContentResolver().getType(uri); + } + if (TextUtils.isEmpty(contentType)) + contentType = "image/jpeg"; + Bitmap bitmap; + if (Build.VERSION.SDK_INT >= 28) { + ImageDecoder.Source source; + if ("file".equals(uri.getScheme())) { + source = ImageDecoder.createSource(new File(uri.getPath())); + } else { + source = ImageDecoder.createSource(context.getContentResolver(), uri); + } + BitmapFactory.Options finalOpts = opts; + bitmap = ImageDecoder.decodeBitmap(source, (decoder, info, _source) -> { + int[] size = getTargetSize(info.getSize().getWidth(), info.getSize().getHeight()); + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + if (needResize(finalOpts.outWidth, finalOpts.outHeight)) { + decoder.setTargetSize(size[0], size[1]); + } + }); + } else { + int[] size = getTargetSize(opts.outWidth, opts.outHeight); + int targetWidth; + int targetHeight; + if (needResize(opts.outWidth, opts.outHeight)) { + targetWidth = size[0]; + targetHeight = size[1]; + } else { + targetWidth = opts.outWidth; + targetHeight = opts.outHeight; + } + float factor = opts.outWidth / (float) targetWidth; + opts = new BitmapFactory.Options(); + opts.inSampleSize = (int) factor; + int orientation = 0; + String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION}; + try { + Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); + if (cursor.moveToFirst()) { + int photoRotation = cursor.getInt(0); + } + cursor.close(); + } catch (Exception e) { + } + + if ("file".equals(uri.getScheme())) { + ExifInterface exif = new ExifInterface(uri.getPath()); + orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + try (InputStream in = context.getContentResolver().openInputStream(uri)) { + ExifInterface exif = new ExifInterface(in); + orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + } + } + if ("file".equals(uri.getScheme())) { + bitmap = BitmapFactory.decodeFile(uri.getPath(), opts); + } else { + try (InputStream in = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(in, null, opts); + } + } + if (factor % 1f != 0f) { + Rect srcBounds = null; + Rect dstBounds; + dstBounds = new Rect(0, 0, targetWidth, targetHeight); + Bitmap scaled = Bitmap.createBitmap(dstBounds.width(), dstBounds.height(), Bitmap.Config.ARGB_8888); + new Canvas(scaled).drawBitmap(bitmap, srcBounds, dstBounds, new Paint(Paint.FILTER_BITMAP_FLAG)); + bitmap = scaled; + } + + + int rotation = 0; + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + rotation = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + rotation = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + rotation = 270; + break; + } + if (rotation != 0) { + Matrix matrix = new Matrix(); + matrix.setRotate(rotation); + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); + } + } + + boolean isPNG = "image/png".equals(contentType); + File tempFile = new File(fullpatch); + try (FileOutputStream out = new FileOutputStream(tempFile)) { + if (isPNG) { + bitmap.compress(Bitmap.CompressFormat.PNG, 0, out); + } else { + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + } + } + + } + + + private static int[] getTargetSize(int srcWidth, int srcHeight) { + int maxSize = 1; + if (MainActivity.instanceInfo != null && MainActivity.instanceInfo.configuration != null && MainActivity.instanceInfo.configuration.media_attachments != null) { + maxSize = MainActivity.instanceInfo.configuration.media_attachments.image_size_limit; + } + int targetWidth = Math.round((float) Math.sqrt((float) maxSize * ((float) srcWidth / srcHeight))); + int targetHeight = Math.round((float) Math.sqrt((float) maxSize * ((float) srcHeight / srcWidth))); + return new int[]{targetWidth, targetHeight}; + } + + private static boolean needResize(int srcWidth, int srcHeight) { + int maxSize; + if (MainActivity.instanceInfo != null && MainActivity.instanceInfo.configuration != null && MainActivity.instanceInfo.configuration.media_attachments != null) { + maxSize = MainActivity.instanceInfo.configuration.media_attachments.image_size_limit; + } else { + return false; + } + return srcWidth * srcHeight > maxSize; + } + + + public static MediaType getFileMediaType(File file) { + String name = file.getName(); + return MediaType.parse(MimeTypeMap.getSingleton().getMimeTypeFromExtension(name.substring(name.lastIndexOf('.') + 1))); + } } diff --git a/app/src/main/java/app/fedilab/android/imageeditor/EditImageActivity.java b/app/src/main/java/app/fedilab/android/imageeditor/EditImageActivity.java index 81e65086..ecdee197 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/EditImageActivity.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/EditImageActivity.java @@ -10,10 +10,12 @@ import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.animation.AnticipateOvershootInterpolator; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.ConstraintSet; @@ -25,8 +27,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.transition.ChangeBounds; import androidx.transition.TransitionManager; +import com.canhub.cropper.CropImage; +import com.canhub.cropper.CropImageContract; +import com.canhub.cropper.CropImageContractOptions; +import com.canhub.cropper.CropImageOptions; +import com.canhub.cropper.CropImageView; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; -import com.theartofdev.edmodo.cropper.CropImage; import java.io.File; import java.io.IOException; @@ -73,6 +79,8 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList private Uri uri; private boolean exit; private ActivityEditImageBinding binding; + CropImageContractOptions cropImageContractOptions; + ActivityResultLauncher cropImageContractOptionsActivityResultLauncher; private static int exifToDegrees(int exifOrientation) { if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { @@ -146,6 +154,35 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList } } + cropImageContractOptions = new CropImageContractOptions(uri, new CropImageOptions()) + .setGuidelines(CropImageView.Guidelines.ON) + .setCropShape(CropImageView.CropShape.RECTANGLE) + .setAllowRotation(true) + .setAllowFlipping(true) + .setOutputCompressFormat(Bitmap.CompressFormat.PNG) + .setAllowCounterRotation(true) + .setImageSource(true, false) + .setScaleType(CropImageView.ScaleType.CENTER); + cropImageContractOptionsActivityResultLauncher = registerForActivityResult( + new CropImageContract(), + result -> { + if (result.isSuccessful()) { + Uri resultUri = result.getUriContent(); + if (resultUri != null) { + binding.photoEditorView.getSource().setImageURI(resultUri); + if (uri != null && uri.getPath() != null) { + File fdelete = new File(uri.getPath()); + if (fdelete.exists()) { + //noinspection ResultOfMethodCallIgnored + fdelete.delete(); + } + } + uri = resultUri; + } + } else { + Log.e(Helper.TAG, "onActivityResult...Error CropImage: " + result.getError()); + } + }); mPhotoEditor.setFilterEffect(PhotoFilter.NONE); binding.send.setOnClickListener(v -> { exit = true; @@ -286,6 +323,7 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList } intentImage.putExtra("focusX", focusX); intentImage.putExtra("focusY", focusY); + } LocalBroadcastManager.getInstance(EditImageActivity.this).sendBroadcast(intentImage); @@ -351,22 +389,37 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList } break; case CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE: - - CropImage.ActivityResult result = CropImage.getActivityResult(data); - if (result != null) { - Uri resultUri = result.getUri(); - if (resultUri != null) { - binding.photoEditorView.getSource().setImageURI(resultUri); - binding.photoEditorView.getSource().setRotation(rotationInDegrees); - if (uri != null && uri.getPath() != null) { - File fdelete = new File(uri.getPath()); - if (fdelete.exists()) { - //noinspection ResultOfMethodCallIgnored - fdelete.delete(); - } - } - uri = resultUri; - } + if (data != null && data.getData() != null) { + CropImageContractOptions cropImageContractOptions = new CropImageContractOptions(data.getData(), new CropImageOptions()) + .setGuidelines(CropImageView.Guidelines.ON) + .setCropShape(CropImageView.CropShape.RECTANGLE) + .setAllowRotation(true) + .setAllowFlipping(true) + .setOutputCompressFormat(Bitmap.CompressFormat.PNG) + .setAllowCounterRotation(true) + .setImageSource(true, false) + .setScaleType(CropImageView.ScaleType.CENTER); + ActivityResultLauncher cropImageContractOptionsActivityResultLauncher = registerForActivityResult( + new CropImageContract(), + result -> { + if (result.isSuccessful()) { + Uri resultUri = result.getUriContent(); + if (resultUri != null) { + binding.photoEditorView.getSource().setImageURI(resultUri); + if (uri != null && uri.getPath() != null) { + File fdelete = new File(uri.getPath()); + if (fdelete.exists()) { + //noinspection ResultOfMethodCallIgnored + fdelete.delete(); + } + } + uri = resultUri; + } + } else { + Log.e(Helper.TAG, "onActivityResult...Error CropImage: " + result.getError()); + } + }); + cropImageContractOptionsActivityResultLauncher.launch(cropImageContractOptions); } break; } @@ -454,8 +507,8 @@ public class EditImageActivity extends BaseActivity implements OnPhotoEditorList mPropertiesBSFragment.show(getSupportFragmentManager(), mPropertiesBSFragment.getTag()); break; case CROP: - CropImage.activity(uri) - .start(this); + + cropImageContractOptionsActivityResultLauncher.launch(cropImageContractOptions); break; case FOCUS: binding.focusCircle.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/app/fedilab/android/interfaces/ProgressListener.java b/app/src/main/java/app/fedilab/android/interfaces/ProgressListener.java new file mode 100644 index 00000000..4d9bcd96 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/interfaces/ProgressListener.java @@ -0,0 +1,5 @@ +package app.fedilab.android.interfaces; + +public interface ProgressListener { + void onProgress(long transferred, long total); +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java index f241d7e8..de565b87 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java +++ b/app/src/main/java/app/fedilab/android/jobs/ComposeWorker.java @@ -341,10 +341,14 @@ public class ComposeWorker extends Worker { private static String postAttachment(MastodonStatusesService mastodonStatusesService, DataPost dataPost, MultipartBody.Part fileMultipartBody, Attachment attachment) { RequestBody descriptionBody = null; + RequestBody focusBody = null; if (attachment.description != null && attachment.description.trim().length() > 0) { descriptionBody = RequestBody.create(MediaType.parse("text/plain"), attachment.description); } - Call attachmentCall = mastodonStatusesService.postMedia(dataPost.token, fileMultipartBody, null, descriptionBody, attachment.focus); + if (attachment.focus != null && attachment.focus.trim().length() > 0) { + focusBody = RequestBody.create(MediaType.parse("text/plain"), attachment.focus); + } + Call attachmentCall = mastodonStatusesService.postMedia(dataPost.token, fileMultipartBody, null, descriptionBody, focusBody); if (attachmentCall != null) { try { diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/StatusesVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/StatusesVM.java index be870a9f..82628377 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/StatusesVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/StatusesVM.java @@ -127,7 +127,11 @@ public class StatusesVM extends AndroidViewModel { if (description != null && description.trim().length() > 0) { descriptionBody = RequestBody.create(MediaType.parse("text/plain"), description); } - Call attachmentCall = mastodonStatusesService.postMedia(token, fileMultipartBody, thumbnailMultipartBody, descriptionBody, focus); + RequestBody focusBody = null; + if (focus != null && focus.trim().length() > 0) { + focusBody = RequestBody.create(MediaType.parse("text/plain"), focus); + } + Call attachmentCall = mastodonStatusesService.postMedia(token, fileMultipartBody, thumbnailMultipartBody, descriptionBody, focusBody); Attachment attachment = null; if (attachmentCall != null) { try { diff --git a/cropper/build.gradle b/cropper/build.gradle deleted file mode 100644 index 3486b192..00000000 --- a/cropper/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -apply plugin: 'com.android.library' - -android { - - compileSdk 31 - defaultConfig { - minSdkVersion 14 - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - lintOptions { - abortOnError false - } -} - -dependencies { - api 'androidx.appcompat:appcompat:1.4.2' - implementation "androidx.exifinterface:exifinterface:1.3.3" -} - diff --git a/cropper/src/main/AndroidManifest.xml b/cropper/src/main/AndroidManifest.xml deleted file mode 100644 index fe8baa84..00000000 --- a/cropper/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java deleted file mode 100644 index 54d33df4..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java +++ /dev/null @@ -1,354 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.content.Context; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.AsyncTask; - -import java.lang.ref.WeakReference; - -/** - * Task to crop bitmap asynchronously from the UI thread. - */ -final class BitmapCroppingWorkerTask - extends AsyncTask { - - // region: Fields and Consts - - /** - * Use a WeakReference to ensure the ImageView can be garbage collected - */ - private final WeakReference mCropImageViewReference; - - /** - * the bitmap to crop - */ - private final Bitmap mBitmap; - - /** - * The Android URI of the image to load - */ - private final Uri mUri; - - /** - * The context of the crop image view widget used for loading of bitmap by Android URI - */ - private final Context mContext; - - /** - * Required cropping 4 points (x0,y0,x1,y1,x2,y2,x3,y3) - */ - private final float[] mCropPoints; - - /** - * Degrees the image was rotated after loading - */ - private final int mDegreesRotated; - - /** - * the original width of the image to be cropped (for image loaded from URI) - */ - private final int mOrgWidth; - - /** - * the original height of the image to be cropped (for image loaded from URI) - */ - private final int mOrgHeight; - - /** - * is there is fixed aspect ratio for the crop rectangle - */ - private final boolean mFixAspectRatio; - - /** - * the X aspect ration of the crop rectangle - */ - private final int mAspectRatioX; - - /** - * the Y aspect ration of the crop rectangle - */ - private final int mAspectRatioY; - - /** - * required width of the cropping image - */ - private final int mReqWidth; - - /** - * required height of the cropping image - */ - private final int mReqHeight; - - /** - * is the image flipped horizontally - */ - private final boolean mFlipHorizontally; - - /** - * is the image flipped vertically - */ - private final boolean mFlipVertically; - - /** - * The option to handle requested width/height - */ - private final CropImageView.RequestSizeOptions mReqSizeOptions; - - /** - * the Android Uri to save the cropped image to - */ - private final Uri mSaveUri; - - /** - * the compression format to use when writing the image - */ - private final Bitmap.CompressFormat mSaveCompressFormat; - - /** - * the quality (if applicable) to use when writing the image (0 - 100) - */ - private final int mSaveCompressQuality; - // endregion - - BitmapCroppingWorkerTask( - CropImageView cropImageView, - Bitmap bitmap, - float[] cropPoints, - int degreesRotated, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - int reqWidth, - int reqHeight, - boolean flipHorizontally, - boolean flipVertically, - CropImageView.RequestSizeOptions options, - Uri saveUri, - Bitmap.CompressFormat saveCompressFormat, - int saveCompressQuality) { - - mCropImageViewReference = new WeakReference<>(cropImageView); - mContext = cropImageView.getContext(); - mBitmap = bitmap; - mCropPoints = cropPoints; - mUri = null; - mDegreesRotated = degreesRotated; - mFixAspectRatio = fixAspectRatio; - mAspectRatioX = aspectRatioX; - mAspectRatioY = aspectRatioY; - mReqWidth = reqWidth; - mReqHeight = reqHeight; - mFlipHorizontally = flipHorizontally; - mFlipVertically = flipVertically; - mReqSizeOptions = options; - mSaveUri = saveUri; - mSaveCompressFormat = saveCompressFormat; - mSaveCompressQuality = saveCompressQuality; - mOrgWidth = 0; - mOrgHeight = 0; - } - - BitmapCroppingWorkerTask( - CropImageView cropImageView, - Uri uri, - float[] cropPoints, - int degreesRotated, - int orgWidth, - int orgHeight, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - int reqWidth, - int reqHeight, - boolean flipHorizontally, - boolean flipVertically, - CropImageView.RequestSizeOptions options, - Uri saveUri, - Bitmap.CompressFormat saveCompressFormat, - int saveCompressQuality) { - - mCropImageViewReference = new WeakReference<>(cropImageView); - mContext = cropImageView.getContext(); - mUri = uri; - mCropPoints = cropPoints; - mDegreesRotated = degreesRotated; - mFixAspectRatio = fixAspectRatio; - mAspectRatioX = aspectRatioX; - mAspectRatioY = aspectRatioY; - mOrgWidth = orgWidth; - mOrgHeight = orgHeight; - mReqWidth = reqWidth; - mReqHeight = reqHeight; - mFlipHorizontally = flipHorizontally; - mFlipVertically = flipVertically; - mReqSizeOptions = options; - mSaveUri = saveUri; - mSaveCompressFormat = saveCompressFormat; - mSaveCompressQuality = saveCompressQuality; - mBitmap = null; - } - - /** - * The Android URI that this task is currently loading. - */ - public Uri getUri() { - return mUri; - } - - /** - * Crop image in background. - * - * @param params ignored - * @return the decoded bitmap data - */ - @Override - protected BitmapCroppingWorkerTask.Result doInBackground(Void... params) { - try { - if (!isCancelled()) { - - BitmapUtils.BitmapSampled bitmapSampled; - if (mUri != null) { - bitmapSampled = - BitmapUtils.cropBitmap( - mContext, - mUri, - mCropPoints, - mDegreesRotated, - mOrgWidth, - mOrgHeight, - mFixAspectRatio, - mAspectRatioX, - mAspectRatioY, - mReqWidth, - mReqHeight, - mFlipHorizontally, - mFlipVertically); - } else if (mBitmap != null) { - bitmapSampled = - BitmapUtils.cropBitmapObjectHandleOOM( - mBitmap, - mCropPoints, - mDegreesRotated, - mFixAspectRatio, - mAspectRatioX, - mAspectRatioY, - mFlipHorizontally, - mFlipVertically); - } else { - return new Result((Bitmap) null, 1); - } - - Bitmap bitmap = - BitmapUtils.resizeBitmap(bitmapSampled.bitmap, mReqWidth, mReqHeight, mReqSizeOptions); - - if (mSaveUri == null) { - return new Result(bitmap, bitmapSampled.sampleSize); - } else { - BitmapUtils.writeBitmapToUri( - mContext, bitmap, mSaveUri, mSaveCompressFormat, mSaveCompressQuality); - if (bitmap != null) { - bitmap.recycle(); - } - return new Result(mSaveUri, bitmapSampled.sampleSize); - } - } - return null; - } catch (Exception e) { - return new Result(e, mSaveUri != null); - } - } - - /** - * Once complete, see if ImageView is still around and set bitmap. - * - * @param result the result of bitmap cropping - */ - @Override - protected void onPostExecute(Result result) { - if (result != null) { - boolean completeCalled = false; - if (!isCancelled()) { - CropImageView cropImageView = mCropImageViewReference.get(); - if (cropImageView != null) { - completeCalled = true; - cropImageView.onImageCroppingAsyncComplete(result); - } - } - if (!completeCalled && result.bitmap != null) { - // fast release of unused bitmap - result.bitmap.recycle(); - } - } - } - - // region: Inner class: Result - - /** - * The result of BitmapCroppingWorkerTask async loading. - */ - static final class Result { - - /** - * The cropped bitmap - */ - public final Bitmap bitmap; - - /** - * The saved cropped bitmap uri - */ - public final Uri uri; - - /** - * The error that occurred during async bitmap cropping. - */ - final Exception error; - - /** - * is the cropping request was to get a bitmap or to save it to uri - */ - final boolean isSave; - - /** - * sample size used creating the crop bitmap to lower its size - */ - final int sampleSize; - - Result(Bitmap bitmap, int sampleSize) { - this.bitmap = bitmap; - this.uri = null; - this.error = null; - this.isSave = false; - this.sampleSize = sampleSize; - } - - Result(Uri uri, int sampleSize) { - this.bitmap = null; - this.uri = uri; - this.error = null; - this.isSave = true; - this.sampleSize = sampleSize; - } - - Result(Exception error, boolean isSave) { - this.bitmap = null; - this.uri = null; - this.error = error; - this.isSave = isSave; - this.sampleSize = 1; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapLoadingWorkerTask.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapLoadingWorkerTask.java deleted file mode 100644 index a6ecf939..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapLoadingWorkerTask.java +++ /dev/null @@ -1,176 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.content.Context; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.AsyncTask; -import android.util.DisplayMetrics; - -import java.lang.ref.WeakReference; - -/** - * Task to load bitmap asynchronously from the UI thread. - */ -final class BitmapLoadingWorkerTask extends AsyncTask { - - // region: Fields and Consts - - /** - * Use a WeakReference to ensure the ImageView can be garbage collected - */ - private final WeakReference mCropImageViewReference; - - /** - * The Android URI of the image to load - */ - private final Uri mUri; - - /** - * The context of the crop image view widget used for loading of bitmap by Android URI - */ - private final Context mContext; - - /** - * required width of the cropping image after density adjustment - */ - private final int mWidth; - - /** - * required height of the cropping image after density adjustment - */ - private final int mHeight; - // endregion - - public BitmapLoadingWorkerTask(CropImageView cropImageView, Uri uri) { - mUri = uri; - mCropImageViewReference = new WeakReference<>(cropImageView); - - mContext = cropImageView.getContext(); - - DisplayMetrics metrics = cropImageView.getResources().getDisplayMetrics(); - double densityAdj = metrics.density > 1 ? 1 / metrics.density : 1; - mWidth = (int) (metrics.widthPixels * densityAdj); - mHeight = (int) (metrics.heightPixels * densityAdj); - } - - /** - * The Android URI that this task is currently loading. - */ - public Uri getUri() { - return mUri; - } - - /** - * Decode image in background. - * - * @param params ignored - * @return the decoded bitmap data - */ - @Override - protected Result doInBackground(Void... params) { - try { - if (!isCancelled()) { - - BitmapUtils.BitmapSampled decodeResult = - BitmapUtils.decodeSampledBitmap(mContext, mUri, mWidth, mHeight); - - if (!isCancelled()) { - - BitmapUtils.RotateBitmapResult rotateResult = - BitmapUtils.rotateBitmapByExif(decodeResult.bitmap, mContext, mUri); - - return new Result( - mUri, rotateResult.bitmap, decodeResult.sampleSize, rotateResult.degrees); - } - } - return null; - } catch (Exception e) { - return new Result(mUri, e); - } - } - - /** - * Once complete, see if ImageView is still around and set bitmap. - * - * @param result the result of bitmap loading - */ - @Override - protected void onPostExecute(Result result) { - if (result != null) { - boolean completeCalled = false; - if (!isCancelled()) { - CropImageView cropImageView = mCropImageViewReference.get(); - if (cropImageView != null) { - completeCalled = true; - cropImageView.onSetImageUriAsyncComplete(result); - } - } - if (!completeCalled && result.bitmap != null) { - // fast release of unused bitmap - result.bitmap.recycle(); - } - } - } - - // region: Inner class: Result - - /** - * The result of BitmapLoadingWorkerTask async loading. - */ - public static final class Result { - - /** - * The Android URI of the image to load - */ - public final Uri uri; - - /** - * The loaded bitmap - */ - public final Bitmap bitmap; - - /** - * The sample size used to load the given bitmap - */ - public final int loadSampleSize; - - /** - * The degrees the image was rotated - */ - public final int degreesRotated; - - /** - * The error that occurred during async bitmap loading. - */ - public final Exception error; - - Result(Uri uri, Bitmap bitmap, int loadSampleSize, int degreesRotated) { - this.uri = uri; - this.bitmap = bitmap; - this.loadSampleSize = loadSampleSize; - this.degreesRotated = degreesRotated; - this.error = null; - } - - Result(Uri uri, Exception error) { - this.uri = uri; - this.bitmap = null; - this.loadSampleSize = 0; - this.degreesRotated = 0; - this.error = error; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java deleted file mode 100644 index 7190bd42..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java +++ /dev/null @@ -1,923 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.content.ContentResolver; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.BitmapRegionDecoder; -import android.graphics.Matrix; -import android.graphics.Rect; -import android.graphics.RectF; -import android.net.Uri; -import android.util.Log; -import android.util.Pair; - -import androidx.exifinterface.media.ExifInterface; - -import java.io.Closeable; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ref.WeakReference; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; - -/** - * Utility class that deals with operations with an ImageView. - */ -final class BitmapUtils { - - static final Rect EMPTY_RECT = new Rect(); - - static final RectF EMPTY_RECT_F = new RectF(); - - /** - * Reusable rectangle for general internal usage - */ - static final RectF RECT = new RectF(); - - /** - * Reusable point for general internal usage - */ - static final float[] POINTS = new float[6]; - - /** - * Reusable point for general internal usage - */ - static final float[] POINTS2 = new float[6]; - /** - * used to save bitmaps during state save and restore so not to reload them. - */ - static Pair> mStateBitmap; - /** - * Used to know the max texture size allowed to be rendered - */ - private static int mMaxTextureSize; - - /** - * Rotate the given image by reading the Exif value of the image (uri).
- * If no rotation is required the image will not be rotated.
- * New bitmap is created and the old one is recycled. - */ - static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, Context context, Uri uri) { - ExifInterface ei = null; - try { - InputStream is = context.getContentResolver().openInputStream(uri); - if (is != null) { - ei = new ExifInterface(is); - is.close(); - } - } catch (Exception ignored) { - } - return ei != null ? rotateBitmapByExif(bitmap, ei) : new RotateBitmapResult(bitmap, 0); - } - - /** - * Rotate the given image by given Exif value.
- * If no rotation is required the image will not be rotated.
- * New bitmap is created and the old one is recycled. - */ - static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, ExifInterface exif) { - int degrees; - int orientation = - exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - switch (orientation) { - case ExifInterface.ORIENTATION_ROTATE_90: - degrees = 90; - break; - case ExifInterface.ORIENTATION_ROTATE_180: - degrees = 180; - break; - case ExifInterface.ORIENTATION_ROTATE_270: - degrees = 270; - break; - default: - degrees = 0; - break; - } - return new RotateBitmapResult(bitmap, degrees); - } - - /** - * Decode bitmap from stream using sampling to get bitmap with the requested limit. - */ - static BitmapSampled decodeSampledBitmap(Context context, Uri uri, int reqWidth, int reqHeight) { - - try { - ContentResolver resolver = context.getContentResolver(); - - // First decode with inJustDecodeBounds=true to check dimensions - BitmapFactory.Options options = decodeImageForOption(resolver, uri); - - if (options.outWidth == -1 && options.outHeight == -1) - throw new RuntimeException("File is not a picture"); - - // Calculate inSampleSize - options.inSampleSize = - Math.max( - calculateInSampleSizeByReqestedSize( - options.outWidth, options.outHeight, reqWidth, reqHeight), - calculateInSampleSizeByMaxTextureSize(options.outWidth, options.outHeight)); - - // Decode bitmap with inSampleSize set - Bitmap bitmap = decodeImage(resolver, uri, options); - - return new BitmapSampled(bitmap, options.inSampleSize); - - } catch (Exception e) { - throw new RuntimeException( - "Failed to load sampled bitmap: " + uri + "\r\n" + e.getMessage(), e); - } - } - - /** - * Crop image bitmap from given bitmap using the given points in the original bitmap and the given - * rotation.
- * if the rotation is not 0,90,180 or 270 degrees then we must first crop a larger area of the - * image that contains the requires rectangle, rotate and then crop again a sub rectangle.
- * If crop fails due to OOM we scale the cropping image by 0.5 every time it fails until it is - * small enough. - */ - static BitmapSampled cropBitmapObjectHandleOOM( - Bitmap bitmap, - float[] points, - int degreesRotated, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - boolean flipHorizontally, - boolean flipVertically) { - int scale = 1; - while (true) { - try { - Bitmap cropBitmap = - cropBitmapObjectWithScale( - bitmap, - points, - degreesRotated, - fixAspectRatio, - aspectRatioX, - aspectRatioY, - 1 / (float) scale, - flipHorizontally, - flipVertically); - return new BitmapSampled(cropBitmap, scale); - } catch (OutOfMemoryError e) { - scale *= 2; - if (scale > 8) { - throw e; - } - } - } - } - - /** - * Crop image bitmap from given bitmap using the given points in the original bitmap and the given - * rotation.
- * if the rotation is not 0,90,180 or 270 degrees then we must first crop a larger area of the - * image that contains the requires rectangle, rotate and then crop again a sub rectangle. - * - * @param scale how much to scale the cropped image part, use 0.5 to lower the image by half (OOM - * handling) - */ - private static Bitmap cropBitmapObjectWithScale( - Bitmap bitmap, - float[] points, - int degreesRotated, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - float scale, - boolean flipHorizontally, - boolean flipVertically) { - - // get the rectangle in original image that contains the required cropped area (larger for non - // rectangular crop) - Rect rect = - getRectFromPoints( - points, - bitmap.getWidth(), - bitmap.getHeight(), - fixAspectRatio, - aspectRatioX, - aspectRatioY); - - // crop and rotate the cropped image in one operation - Matrix matrix = new Matrix(); - matrix.setRotate(degreesRotated, bitmap.getWidth() / 2, bitmap.getHeight() / 2); - matrix.postScale(flipHorizontally ? -scale : scale, flipVertically ? -scale : scale); - Bitmap result = - Bitmap.createBitmap(bitmap, rect.left, rect.top, rect.width(), rect.height(), matrix, true); - - if (result == bitmap) { - // corner case when all bitmap is selected, no worth optimizing for it - result = bitmap.copy(bitmap.getConfig(), false); - } - - // rotating by 0, 90, 180 or 270 degrees doesn't require extra cropping - if (degreesRotated % 90 != 0) { - - // extra crop because non rectangular crop cannot be done directly on the image without - // rotating first - result = - cropForRotatedImage( - result, points, rect, degreesRotated, fixAspectRatio, aspectRatioX, aspectRatioY); - } - - return result; - } - - /** - * Crop image bitmap from URI by decoding it with specific width and height to down-sample if - * required.
- * Additionally if OOM is thrown try to increase the sampling (2,4,8). - */ - static BitmapSampled cropBitmap( - Context context, - Uri loadedImageUri, - float[] points, - int degreesRotated, - int orgWidth, - int orgHeight, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - int reqWidth, - int reqHeight, - boolean flipHorizontally, - boolean flipVertically) { - int sampleMulti = 1; - while (true) { - try { - // if successful, just return the resulting bitmap - return cropBitmap( - context, - loadedImageUri, - points, - degreesRotated, - orgWidth, - orgHeight, - fixAspectRatio, - aspectRatioX, - aspectRatioY, - reqWidth, - reqHeight, - flipHorizontally, - flipVertically, - sampleMulti); - } catch (OutOfMemoryError e) { - // if OOM try to increase the sampling to lower the memory usage - sampleMulti *= 2; - if (sampleMulti > 16) { - throw new RuntimeException( - "Failed to handle OOM by sampling (" - + sampleMulti - + "): " - + loadedImageUri - + "\r\n" - + e.getMessage(), - e); - } - } - } - } - - /** - * Get left value of the bounding rectangle of the given points. - */ - static float getRectLeft(float[] points) { - return Math.min(Math.min(Math.min(points[0], points[2]), points[4]), points[6]); - } - - /** - * Get top value of the bounding rectangle of the given points. - */ - static float getRectTop(float[] points) { - return Math.min(Math.min(Math.min(points[1], points[3]), points[5]), points[7]); - } - - /** - * Get right value of the bounding rectangle of the given points. - */ - static float getRectRight(float[] points) { - return Math.max(Math.max(Math.max(points[0], points[2]), points[4]), points[6]); - } - - /** - * Get bottom value of the bounding rectangle of the given points. - */ - static float getRectBottom(float[] points) { - return Math.max(Math.max(Math.max(points[1], points[3]), points[5]), points[7]); - } - - /** - * Get width of the bounding rectangle of the given points. - */ - static float getRectWidth(float[] points) { - return getRectRight(points) - getRectLeft(points); - } - - /** - * Get height of the bounding rectangle of the given points. - */ - static float getRectHeight(float[] points) { - return getRectBottom(points) - getRectTop(points); - } - - /** - * Get horizontal center value of the bounding rectangle of the given points. - */ - static float getRectCenterX(float[] points) { - return (getRectRight(points) + getRectLeft(points)) / 2f; - } - - /** - * Get vertical center value of the bounding rectangle of the given points. - */ - static float getRectCenterY(float[] points) { - return (getRectBottom(points) + getRectTop(points)) / 2f; - } - - /** - * Get a rectangle for the given 4 points (x0,y0,x1,y1,x2,y2,x3,y3) by finding the min/max 2 - * points that contains the given 4 points and is a straight rectangle. - */ - static Rect getRectFromPoints( - float[] points, - int imageWidth, - int imageHeight, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY) { - int left = Math.round(Math.max(0, getRectLeft(points))); - int top = Math.round(Math.max(0, getRectTop(points))); - int right = Math.round(Math.min(imageWidth, getRectRight(points))); - int bottom = Math.round(Math.min(imageHeight, getRectBottom(points))); - - Rect rect = new Rect(left, top, right, bottom); - if (fixAspectRatio) { - fixRectForAspectRatio(rect, aspectRatioX, aspectRatioY); - } - - return rect; - } - - /** - * Fix the given rectangle if it doesn't confirm to aspect ration rule.
- * Make sure that width and height are equal if 1:1 fixed aspect ratio is requested. - */ - private static void fixRectForAspectRatio(Rect rect, int aspectRatioX, int aspectRatioY) { - if (aspectRatioX == aspectRatioY && rect.width() != rect.height()) { - if (rect.height() > rect.width()) { - rect.bottom -= rect.height() - rect.width(); - } else { - rect.right -= rect.width() - rect.height(); - } - } - } - - /** - * Write given bitmap to a temp file. If file already exists no-op as we already saved the file in - * this session. Uses JPEG 95% compression. - * - * @param uri the uri to write the bitmap to, if null - * @return the uri where the image was saved in, either the given uri or new pointing to temp - * file. - */ - static Uri writeTempStateStoreBitmap(Context context, Bitmap bitmap, Uri uri) { - try { - boolean needSave = true; - if (uri == null) { - uri = - Uri.fromFile( - File.createTempFile("aic_state_store_temp", ".jpg", context.getCacheDir())); - } else if (new File(uri.getPath()).exists()) { - needSave = false; - } - if (needSave) { - writeBitmapToUri(context, bitmap, uri, Bitmap.CompressFormat.JPEG, 95); - } - return uri; - } catch (Exception e) { - Log.w("AIC", "Failed to write bitmap to temp file for image-cropper save instance state", e); - return null; - } - } - - /** - * Write the given bitmap to the given uri using the given compression. - */ - static void writeBitmapToUri( - Context context, - Bitmap bitmap, - Uri uri, - Bitmap.CompressFormat compressFormat, - int compressQuality) - throws FileNotFoundException { - OutputStream outputStream = null; - try { - outputStream = context.getContentResolver().openOutputStream(uri); - bitmap.compress(compressFormat, compressQuality, outputStream); - } finally { - closeSafe(outputStream); - } - } - - /** - * Resize the given bitmap to the given width/height by the given option.
- */ - static Bitmap resizeBitmap( - Bitmap bitmap, int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options) { - try { - if (reqWidth > 0 - && reqHeight > 0 - && (options == CropImageView.RequestSizeOptions.RESIZE_FIT - || options == CropImageView.RequestSizeOptions.RESIZE_INSIDE - || options == CropImageView.RequestSizeOptions.RESIZE_EXACT)) { - - Bitmap resized = null; - if (options == CropImageView.RequestSizeOptions.RESIZE_EXACT) { - resized = Bitmap.createScaledBitmap(bitmap, reqWidth, reqHeight, false); - } else { - int width = bitmap.getWidth(); - int height = bitmap.getHeight(); - float scale = Math.max(width / (float) reqWidth, height / (float) reqHeight); - if (scale > 1 || options == CropImageView.RequestSizeOptions.RESIZE_FIT) { - resized = - Bitmap.createScaledBitmap( - bitmap, (int) (width / scale), (int) (height / scale), false); - } - } - if (resized != null) { - if (resized != bitmap) { - bitmap.recycle(); - } - return resized; - } - } - } catch (Exception e) { - Log.w("AIC", "Failed to resize cropped image, return bitmap before resize", e); - } - return bitmap; - } - - // region: Private methods - - /** - * Crop image bitmap from URI by decoding it with specific width and height to down-sample if - * required. - * - * @param orgWidth used to get rectangle from points (handle edge cases to limit rectangle) - * @param orgHeight used to get rectangle from points (handle edge cases to limit rectangle) - * @param sampleMulti used to increase the sampling of the image to handle memory issues. - */ - private static BitmapSampled cropBitmap( - Context context, - Uri loadedImageUri, - float[] points, - int degreesRotated, - int orgWidth, - int orgHeight, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - int reqWidth, - int reqHeight, - boolean flipHorizontally, - boolean flipVertically, - int sampleMulti) { - - // get the rectangle in original image that contains the required cropped area (larger for non - // rectangular crop) - Rect rect = - getRectFromPoints(points, orgWidth, orgHeight, fixAspectRatio, aspectRatioX, aspectRatioY); - - int width = reqWidth > 0 ? reqWidth : rect.width(); - int height = reqHeight > 0 ? reqHeight : rect.height(); - - Bitmap result = null; - int sampleSize = 1; - try { - // decode only the required image from URI, optionally sub-sampling if reqWidth/reqHeight is - // given. - BitmapSampled bitmapSampled = - decodeSampledBitmapRegion(context, loadedImageUri, rect, width, height, sampleMulti); - result = bitmapSampled.bitmap; - sampleSize = bitmapSampled.sampleSize; - } catch (Exception ignored) { - } - - if (result != null) { - try { - // rotate the decoded region by the required amount - result = rotateAndFlipBitmapInt(result, degreesRotated, flipHorizontally, flipVertically); - - // rotating by 0, 90, 180 or 270 degrees doesn't require extra cropping - if (degreesRotated % 90 != 0) { - - // extra crop because non rectangular crop cannot be done directly on the image without - // rotating first - result = - cropForRotatedImage( - result, points, rect, degreesRotated, fixAspectRatio, aspectRatioX, aspectRatioY); - } - } catch (OutOfMemoryError e) { - if (result != null) { - result.recycle(); - } - throw e; - } - return new BitmapSampled(result, sampleSize); - } else { - // failed to decode region, may be skia issue, try full decode and then crop - return cropBitmap( - context, - loadedImageUri, - points, - degreesRotated, - fixAspectRatio, - aspectRatioX, - aspectRatioY, - sampleMulti, - rect, - width, - height, - flipHorizontally, - flipVertically); - } - } - - /** - * Crop bitmap by fully loading the original and then cropping it, fallback in case cropping - * region failed. - */ - private static BitmapSampled cropBitmap( - Context context, - Uri loadedImageUri, - float[] points, - int degreesRotated, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY, - int sampleMulti, - Rect rect, - int width, - int height, - boolean flipHorizontally, - boolean flipVertically) { - Bitmap result = null; - int sampleSize; - try { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = - sampleSize = - sampleMulti - * calculateInSampleSizeByReqestedSize(rect.width(), rect.height(), width, height); - - Bitmap fullBitmap = decodeImage(context.getContentResolver(), loadedImageUri, options); - if (fullBitmap != null) { - try { - // adjust crop points by the sampling because the image is smaller - float[] points2 = new float[points.length]; - System.arraycopy(points, 0, points2, 0, points.length); - for (int i = 0; i < points2.length; i++) { - points2[i] = points2[i] / options.inSampleSize; - } - - result = - cropBitmapObjectWithScale( - fullBitmap, - points2, - degreesRotated, - fixAspectRatio, - aspectRatioX, - aspectRatioY, - 1, - flipHorizontally, - flipVertically); - } finally { - if (result != fullBitmap) { - fullBitmap.recycle(); - } - } - } - } catch (OutOfMemoryError e) { - if (result != null) { - result.recycle(); - } - throw e; - } catch (Exception e) { - throw new RuntimeException( - "Failed to load sampled bitmap: " + loadedImageUri + "\r\n" + e.getMessage(), e); - } - return new BitmapSampled(result, sampleSize); - } - - /** - * Decode image from uri using "inJustDecodeBounds" to get the image dimensions. - */ - private static BitmapFactory.Options decodeImageForOption(ContentResolver resolver, Uri uri) - throws FileNotFoundException { - InputStream stream = null; - try { - stream = resolver.openInputStream(uri); - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - BitmapFactory.decodeStream(stream, EMPTY_RECT, options); - options.inJustDecodeBounds = false; - return options; - } finally { - closeSafe(stream); - } - } - - /** - * Decode image from uri using given "inSampleSize", but if failed due to out-of-memory then raise - * the inSampleSize until success. - */ - private static Bitmap decodeImage( - ContentResolver resolver, Uri uri, BitmapFactory.Options options) - throws FileNotFoundException { - do { - InputStream stream = null; - try { - stream = resolver.openInputStream(uri); - return BitmapFactory.decodeStream(stream, EMPTY_RECT, options); - } catch (OutOfMemoryError e) { - options.inSampleSize *= 2; - } finally { - closeSafe(stream); - } - } while (options.inSampleSize <= 512); - throw new RuntimeException("Failed to decode image: " + uri); - } - - /** - * Decode specific rectangle bitmap from stream using sampling to get bitmap with the requested - * limit. - * - * @param sampleMulti used to increase the sampling of the image to handle memory issues. - */ - private static BitmapSampled decodeSampledBitmapRegion( - Context context, Uri uri, Rect rect, int reqWidth, int reqHeight, int sampleMulti) { - InputStream stream = null; - BitmapRegionDecoder decoder = null; - try { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = - sampleMulti - * calculateInSampleSizeByReqestedSize( - rect.width(), rect.height(), reqWidth, reqHeight); - - stream = context.getContentResolver().openInputStream(uri); - decoder = BitmapRegionDecoder.newInstance(stream, false); - do { - try { - return new BitmapSampled(decoder.decodeRegion(rect, options), options.inSampleSize); - } catch (OutOfMemoryError e) { - options.inSampleSize *= 2; - } - } while (options.inSampleSize <= 512); - } catch (Exception e) { - throw new RuntimeException( - "Failed to load sampled bitmap: " + uri + "\r\n" + e.getMessage(), e); - } finally { - closeSafe(stream); - if (decoder != null) { - decoder.recycle(); - } - } - return new BitmapSampled(null, 1); - } - - /** - * Special crop of bitmap rotated by not stright angle, in this case the original crop bitmap - * contains parts beyond the required crop area, this method crops the already cropped and rotated - * bitmap to the final rectangle.
- * Note: rotating by 0, 90, 180 or 270 degrees doesn't require extra cropping. - */ - private static Bitmap cropForRotatedImage( - Bitmap bitmap, - float[] points, - Rect rect, - int degreesRotated, - boolean fixAspectRatio, - int aspectRatioX, - int aspectRatioY) { - if (degreesRotated % 90 != 0) { - - int adjLeft = 0, adjTop = 0, width = 0, height = 0; - double rads = Math.toRadians(degreesRotated); - int compareTo = - degreesRotated < 90 || (degreesRotated > 180 && degreesRotated < 270) - ? rect.left - : rect.right; - for (int i = 0; i < points.length; i += 2) { - if (points[i] >= compareTo - 1 && points[i] <= compareTo + 1) { - adjLeft = (int) Math.abs(Math.sin(rads) * (rect.bottom - points[i + 1])); - adjTop = (int) Math.abs(Math.cos(rads) * (points[i + 1] - rect.top)); - width = (int) Math.abs((points[i + 1] - rect.top) / Math.sin(rads)); - height = (int) Math.abs((rect.bottom - points[i + 1]) / Math.cos(rads)); - break; - } - } - - rect.set(adjLeft, adjTop, adjLeft + width, adjTop + height); - if (fixAspectRatio) { - fixRectForAspectRatio(rect, aspectRatioX, aspectRatioY); - } - - Bitmap bitmapTmp = bitmap; - bitmap = Bitmap.createBitmap(bitmap, rect.left, rect.top, rect.width(), rect.height()); - if (bitmapTmp != bitmap) { - bitmapTmp.recycle(); - } - } - return bitmap; - } - - /** - * Calculate the largest inSampleSize value that is a power of 2 and keeps both height and width - * larger than the requested height and width. - */ - private static int calculateInSampleSizeByReqestedSize( - int width, int height, int reqWidth, int reqHeight) { - int inSampleSize = 1; - if (height > reqHeight || width > reqWidth) { - while ((height / 2 / inSampleSize) > reqHeight && (width / 2 / inSampleSize) > reqWidth) { - inSampleSize *= 2; - } - } - return inSampleSize; - } - - /** - * Calculate the largest inSampleSize value that is a power of 2 and keeps both height and width - * smaller than max texture size allowed for the device. - */ - private static int calculateInSampleSizeByMaxTextureSize(int width, int height) { - int inSampleSize = 1; - if (mMaxTextureSize == 0) { - mMaxTextureSize = getMaxTextureSize(); - } - if (mMaxTextureSize > 0) { - while ((height / inSampleSize) > mMaxTextureSize - || (width / inSampleSize) > mMaxTextureSize) { - inSampleSize *= 2; - } - } - return inSampleSize; - } - - /** - * Rotate the given bitmap by the given degrees.
- * New bitmap is created and the old one is recycled. - */ - private static Bitmap rotateAndFlipBitmapInt( - Bitmap bitmap, int degrees, boolean flipHorizontally, boolean flipVertically) { - if (degrees > 0 || flipHorizontally || flipVertically) { - Matrix matrix = new Matrix(); - matrix.setRotate(degrees); - matrix.postScale(flipHorizontally ? -1 : 1, flipVertically ? -1 : 1); - Bitmap newBitmap = - Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); - if (newBitmap != bitmap) { - bitmap.recycle(); - } - return newBitmap; - } else { - return bitmap; - } - } - - /** - * Get the max size of bitmap allowed to be rendered on the device.
- * http://stackoverflow.com/questions/7428996/hw-accelerated-activity-how-to-get-opengl-texture-size-limit. - */ - private static int getMaxTextureSize() { - // Safe minimum default size - final int IMAGE_MAX_BITMAP_DIMENSION = 2048; - - try { - // Get EGL Display - EGL10 egl = (EGL10) EGLContext.getEGL(); - EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - - // Initialise - int[] version = new int[2]; - egl.eglInitialize(display, version); - - // Query total number of configurations - int[] totalConfigurations = new int[1]; - egl.eglGetConfigs(display, null, 0, totalConfigurations); - - // Query actual list configurations - EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]]; - egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations); - - int[] textureSize = new int[1]; - int maximumTextureSize = 0; - - // Iterate through all the configurations to located the maximum texture size - for (int i = 0; i < totalConfigurations[0]; i++) { - // Only need to check for width since opengl textures are always squared - egl.eglGetConfigAttrib( - display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize); - - // Keep track of the maximum texture size - if (maximumTextureSize < textureSize[0]) { - maximumTextureSize = textureSize[0]; - } - } - - // Release - egl.eglTerminate(display); - - // Return largest texture size found, or default - return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION); - } catch (Exception e) { - return IMAGE_MAX_BITMAP_DIMENSION; - } - } - - /** - * Close the given closeable object (Stream) in a safe way: check if it is null and catch-log - * exception thrown. - * - * @param closeable the closable object to close - */ - private static void closeSafe(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException ignored) { - } - } - } - // endregion - - // region: Inner class: BitmapSampled - - /** - * Holds bitmap instance and the sample size that the bitmap was loaded/cropped with. - */ - static final class BitmapSampled { - - /** - * The bitmap instance - */ - public final Bitmap bitmap; - - /** - * The sample size used to lower the size of the bitmap (1,2,4,8,...) - */ - final int sampleSize; - - BitmapSampled(Bitmap bitmap, int sampleSize) { - this.bitmap = bitmap; - this.sampleSize = sampleSize; - } - } - // endregion - - // region: Inner class: RotateBitmapResult - - /** - * The result of {@link #rotateBitmapByExif(android.graphics.Bitmap, ExifInterface)}. - */ - static final class RotateBitmapResult { - - /** - * The loaded bitmap - */ - public final Bitmap bitmap; - - /** - * The degrees the image was rotated - */ - final int degrees; - - RotateBitmapResult(Bitmap bitmap, int degrees) { - this.bitmap = bitmap; - this.degrees = degrees; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java deleted file mode 100644 index 07d36ea0..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ /dev/null @@ -1,1048 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.Manifest; -import android.app.Activity; -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.RectF; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.provider.MediaStore; - -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import androidx.fragment.app.Fragment; - -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -/** - * Helper to simplify crop image work like starting pick-image acitvity and handling camera/gallery - * intents.
- * The goal of the helper is to simplify the starting and most-common usage of image cropping and - * not all porpose all possible scenario one-to-rule-them-all code base. So feel free to use it as - * is and as a wiki to make your own.
- * Added value you get out-of-the-box is some edge case handling that you may miss otherwise, like - * the stupid-ass Android camera result URI that may differ from version to version and from device - * to device. - */ -@SuppressWarnings("WeakerAccess, unused") -public final class CropImage { - - // region: Fields and Consts - - /** - * The key used to pass crop image source URI to {@link CropImageActivity}. - */ - public static final String CROP_IMAGE_EXTRA_SOURCE = "CROP_IMAGE_EXTRA_SOURCE"; - - /** - * The key used to pass crop image options to {@link CropImageActivity}. - */ - public static final String CROP_IMAGE_EXTRA_OPTIONS = "CROP_IMAGE_EXTRA_OPTIONS"; - - /** - * The key used to pass crop image bundle data to {@link CropImageActivity}. - */ - public static final String CROP_IMAGE_EXTRA_BUNDLE = "CROP_IMAGE_EXTRA_BUNDLE"; - - /** - * The key used to pass crop image result data back from {@link CropImageActivity}. - */ - public static final String CROP_IMAGE_EXTRA_RESULT = "CROP_IMAGE_EXTRA_RESULT"; - - /** - * The request code used to start pick image activity to be used on result to identify the this - * specific request. - */ - public static final int PICK_IMAGE_CHOOSER_REQUEST_CODE = 200; - - /** - * The request code used to request permission to pick image from external storage. - */ - public static final int PICK_IMAGE_PERMISSIONS_REQUEST_CODE = 201; - - /** - * The request code used to request permission to capture image from camera. - */ - public static final int CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE = 2011; - - /** - * The request code used to start {@link CropImageActivity} to be used on result to identify the - * this specific request. - */ - public static final int CROP_IMAGE_ACTIVITY_REQUEST_CODE = 203; - - /** - * The result code used to return error from {@link CropImageActivity}. - */ - public static final int CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE = 204; - // endregion - - private CropImage() { - } - - /** - * Create a new bitmap that has all pixels beyond the oval shape transparent. Old bitmap is - * recycled. - */ - public static Bitmap toOvalBitmap(@NonNull Bitmap bitmap) { - int width = bitmap.getWidth(); - int height = bitmap.getHeight(); - Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - - Canvas canvas = new Canvas(output); - - int color = 0xff424242; - Paint paint = new Paint(); - - paint.setAntiAlias(true); - canvas.drawARGB(0, 0, 0, 0); - paint.setColor(color); - - RectF rect = new RectF(0, 0, width, height); - canvas.drawOval(rect, paint); - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - canvas.drawBitmap(bitmap, 0, 0, paint); - - bitmap.recycle(); - - return output; - } - - /** - * Start an activity to get image for cropping using chooser intent that will have all the - * available applications for the device like camera (MyCamera), galery (Photos), store apps - * (Dropbox), etc.
- * Use "pick_image_intent_chooser_title" string resource to override pick chooser title. - * - * @param activity the activity to be used to start activity from - */ - public static void startPickImageActivity(@NonNull Activity activity) { - activity.startActivityForResult( - getPickImageChooserIntent(activity), PICK_IMAGE_CHOOSER_REQUEST_CODE); - } - - /** - * Same as {@link #startPickImageActivity(Activity) startPickImageActivity} method but instead of - * being called and returning to an Activity, this method can be called and return to a Fragment. - * - * @param context The Fragments context. Use getContext() - * @param fragment The calling Fragment to start and return the image to - */ - public static void startPickImageActivity(@NonNull Context context, @NonNull Fragment fragment) { - fragment.startActivityForResult( - getPickImageChooserIntent(context), PICK_IMAGE_CHOOSER_REQUEST_CODE); - } - - /** - * Create a chooser intent to select the source to get image from.
- * The source can be camera's (ACTION_IMAGE_CAPTURE) or gallery's (ACTION_GET_CONTENT).
- * All possible sources are added to the intent chooser.
- * Use "pick_image_intent_chooser_title" string resource to override chooser title. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - */ - public static Intent getPickImageChooserIntent(@NonNull Context context) { - return getPickImageChooserIntent( - context, context.getString(R.string.pick_image_intent_chooser_title), false, true); - } - - /** - * Create a chooser intent to select the source to get image from.
- * The source can be camera's (ACTION_IMAGE_CAPTURE) or gallery's (ACTION_GET_CONTENT).
- * All possible sources are added to the intent chooser. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - * @param title the title to use for the chooser UI - * @param includeDocuments if to include KitKat documents activity containing all sources - * @param includeCamera if to include camera intents - */ - public static Intent getPickImageChooserIntent( - @NonNull Context context, - CharSequence title, - boolean includeDocuments, - boolean includeCamera) { - - List allIntents = new ArrayList<>(); - PackageManager packageManager = context.getPackageManager(); - - // collect all camera intents if Camera permission is available - if (!isExplicitCameraPermissionRequired(context) && includeCamera) { - allIntents.addAll(getCameraIntents(context, packageManager)); - } - - List galleryIntents = - getGalleryIntents(packageManager, Intent.ACTION_GET_CONTENT, includeDocuments); - if (galleryIntents.size() == 0) { - // if no intents found for get-content try pick intent action (Huawei P9). - galleryIntents = getGalleryIntents(packageManager, Intent.ACTION_PICK, includeDocuments); - } - allIntents.addAll(galleryIntents); - - Intent target; - if (allIntents.isEmpty()) { - target = new Intent(); - } else { - target = allIntents.get(allIntents.size() - 1); - allIntents.remove(allIntents.size() - 1); - } - - // Create a chooser from the main intent - Intent chooserIntent = Intent.createChooser(target, title); - - // Add all other intents - chooserIntent.putExtra( - Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[allIntents.size()])); - - return chooserIntent; - } - - /** - * Get the main Camera intent for capturing image using device camera app. If the outputFileUri is - * null, a default Uri will be created with {@link #getCaptureImageOutputUri(Context)}, so then - * you will be able to get the pictureUri using {@link #getPickImageResultUri(Context, Intent)}. - * Otherwise, it is just you use the Uri passed to this method. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - * @param outputFileUri the Uri where the picture will be placed. - */ - public static Intent getCameraIntent(@NonNull Context context, Uri outputFileUri) { - Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - if (outputFileUri == null) { - outputFileUri = getCaptureImageOutputUri(context); - } - intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); - return intent; - } - - /** - * Get all Camera intents for capturing image using device camera apps. - */ - public static List getCameraIntents( - @NonNull Context context, @NonNull PackageManager packageManager) { - - List allIntents = new ArrayList<>(); - - // Determine Uri of camera image to save. - Uri outputFileUri = getCaptureImageOutputUri(context); - - Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - List listCam = packageManager.queryIntentActivities(captureIntent, 0); - for (ResolveInfo res : listCam) { - Intent intent = new Intent(captureIntent); - intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); - intent.setPackage(res.activityInfo.packageName); - if (outputFileUri != null) { - intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); - } - allIntents.add(intent); - } - - return allIntents; - } - - /** - * Get all Gallery intents for getting image from one of the apps of the device that handle - * images. - */ - public static List getGalleryIntents( - @NonNull PackageManager packageManager, String action, boolean includeDocuments) { - List intents = new ArrayList<>(); - Intent galleryIntent = - action == Intent.ACTION_GET_CONTENT - ? new Intent(action) - : new Intent(action, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - galleryIntent.setType("image/*"); - List listGallery = packageManager.queryIntentActivities(galleryIntent, 0); - for (ResolveInfo res : listGallery) { - Intent intent = new Intent(galleryIntent); - intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); - intent.setPackage(res.activityInfo.packageName); - intents.add(intent); - } - - // remove documents intent - if (!includeDocuments) { - for (Intent intent : intents) { - if (intent - .getComponent() - .getClassName() - .equals("com.android.documentsui.DocumentsActivity")) { - intents.remove(intent); - break; - } - } - } - return intents; - } - - /** - * Check if explicetly requesting camera permission is required.
- * It is required in Android Marshmellow and above if "CAMERA" permission is requested in the - * manifest.
- * See StackOverflow - * question. - */ - public static boolean isExplicitCameraPermissionRequired(@NonNull Context context) { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && hasPermissionInManifest(context, "android.permission.CAMERA") - && context.checkSelfPermission(Manifest.permission.CAMERA) - != PackageManager.PERMISSION_GRANTED; - } - - /** - * Check if the app requests a specific permission in the manifest. - * - * @param permissionName the permission to check - * @return true - the permission in requested in manifest, false - not. - */ - public static boolean hasPermissionInManifest( - @NonNull Context context, @NonNull String permissionName) { - String packageName = context.getPackageName(); - try { - PackageInfo packageInfo = - context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); - final String[] declaredPermisisons = packageInfo.requestedPermissions; - if (declaredPermisisons != null && declaredPermisisons.length > 0) { - for (String p : declaredPermisisons) { - if (p.equalsIgnoreCase(permissionName)) { - return true; - } - } - } - } catch (PackageManager.NameNotFoundException e) { - } - return false; - } - - /** - * Get URI to image received from capture by camera. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - */ - public static Uri getCaptureImageOutputUri(@NonNull Context context) { - Uri outputFileUri = null; - File getImage = context.getExternalCacheDir(); - if (getImage != null) { - outputFileUri = Uri.fromFile(new File(getImage.getPath(), "pickImageResult.jpeg")); - } - return outputFileUri; - } - - /** - * Get the URI of the selected image from {@link #getPickImageChooserIntent(Context)}.
- * Will return the correct URI for camera and gallery image. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - * @param data the returned data of the activity result - */ - public static Uri getPickImageResultUri(@NonNull Context context, @Nullable Intent data) { - boolean isCamera = true; - if (data != null && data.getData() != null) { - String action = data.getAction(); - isCamera = action != null && action.equals(MediaStore.ACTION_IMAGE_CAPTURE); - } - return isCamera || data.getData() == null ? getCaptureImageOutputUri(context) : data.getData(); - } - - /** - * Check if the given picked image URI requires READ_EXTERNAL_STORAGE permissions.
- * Only relevant for API version 23 and above and not required for all URI's depends on the - * implementation of the app that was used for picking the image. So we just test if we can open - * the stream or do we get an exception when we try, Android is awesome. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - * @param uri the result URI of image pick. - * @return true - required permission are not granted, false - either no need for permissions or - * they are granted - */ - public static boolean isReadExternalStoragePermissionsRequired( - @NonNull Context context, @NonNull Uri uri) { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED - && isUriRequiresPermissions(context, uri); - } - - /** - * Test if we can open the given Android URI to test if permission required error is thrown.
- * Only relevant for API version 23 and above. - * - * @param context used to access Android APIs, like content resolve, it is your - * activity/fragment/widget. - * @param uri the result URI of image pick. - */ - public static boolean isUriRequiresPermissions(@NonNull Context context, @NonNull Uri uri) { - try { - ContentResolver resolver = context.getContentResolver(); - InputStream stream = resolver.openInputStream(uri); - if (stream != null) { - stream.close(); - } - return false; - } catch (Exception e) { - return true; - } - } - - /** - * Create {@link ActivityBuilder} instance to open image picker for cropping and then start {@link - * CropImageActivity} to crop the selected image.
- * Result will be received in {@link Activity#onActivityResult(int, int, Intent)} and can be - * retrieved using {@link #getActivityResult(Intent)}. - * - * @return builder for Crop Image Activity - */ - public static ActivityBuilder activity() { - return new ActivityBuilder(null); - } - - /** - * Create {@link ActivityBuilder} instance to start {@link CropImageActivity} to crop the given - * image.
- * Result will be received in {@link Activity#onActivityResult(int, int, Intent)} and can be - * retrieved using {@link #getActivityResult(Intent)}. - * - * @param uri the image Android uri source to crop or null to start a picker - * @return builder for Crop Image Activity - */ - public static ActivityBuilder activity(@Nullable Uri uri) { - return new ActivityBuilder(uri); - } - - /** - * Get {@link CropImageActivity} result data object for crop image activity started using {@link - * #activity(Uri)}. - * - * @param data result data intent as received in {@link Activity#onActivityResult(int, int, - * Intent)}. - * @return Crop Image Activity Result object or null if none exists - */ - public static ActivityResult getActivityResult(@Nullable Intent data) { - return data != null ? (ActivityResult) data.getParcelableExtra(CROP_IMAGE_EXTRA_RESULT) : null; - } - - // region: Inner class: ActivityBuilder - - /** - * Builder used for creating Image Crop Activity by user request. - */ - public static final class ActivityBuilder { - - /** - * The image to crop source Android uri. - */ - @Nullable - private final Uri mSource; - - /** - * Options for image crop UX - */ - private final CropImageOptions mOptions; - - private ActivityBuilder(@Nullable Uri source) { - mSource = source; - mOptions = new CropImageOptions(); - } - - /** - * Get {@link CropImageActivity} intent to start the activity. - */ - public Intent getIntent(@NonNull Context context) { - return getIntent(context, CropImageActivity.class); - } - - /** - * Get {@link CropImageActivity} intent to start the activity. - */ - public Intent getIntent(@NonNull Context context, @Nullable Class cls) { - mOptions.validate(); - - Intent intent = new Intent(); - intent.setClass(context, cls); - Bundle bundle = new Bundle(); - bundle.putParcelable(CROP_IMAGE_EXTRA_SOURCE, mSource); - bundle.putParcelable(CROP_IMAGE_EXTRA_OPTIONS, mOptions); - intent.putExtra(CropImage.CROP_IMAGE_EXTRA_BUNDLE, bundle); - return intent; - } - - /** - * Start {@link CropImageActivity}. - * - * @param activity activity to receive result - */ - public void start(@NonNull Activity activity) { - mOptions.validate(); - activity.startActivityForResult(getIntent(activity), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * Start {@link CropImageActivity}. - * - * @param activity activity to receive result - */ - public void start(@NonNull Activity activity, @Nullable Class cls) { - mOptions.validate(); - activity.startActivityForResult(getIntent(activity, cls), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * Start {@link CropImageActivity}. - * - * @param fragment fragment to receive result - */ - public void start(@NonNull Context context, @NonNull Fragment fragment) { - fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * Start {@link CropImageActivity}. - * - * @param fragment fragment to receive result - */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) - public void start(@NonNull Context context, @NonNull android.app.Fragment fragment) { - fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * Start {@link CropImageActivity}. - * - * @param fragment fragment to receive result - */ - public void start( - @NonNull Context context, @NonNull Fragment fragment, @Nullable Class cls) { - fragment.startActivityForResult(getIntent(context, cls), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * Start {@link CropImageActivity}. - * - * @param fragment fragment to receive result - */ - @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) - public void start( - @NonNull Context context, @NonNull android.app.Fragment fragment, @Nullable Class cls) { - fragment.startActivityForResult(getIntent(context, cls), CROP_IMAGE_ACTIVITY_REQUEST_CODE); - } - - /** - * The shape of the cropping window.
- * To set square/circle crop shape set aspect ratio to 1:1.
- * Default: RECTANGLE - */ - public ActivityBuilder setCropShape(@NonNull CropImageView.CropShape cropShape) { - mOptions.cropShape = cropShape; - return this; - } - - /** - * An edge of the crop window will snap to the corresponding edge of a specified bounding box - * when the crop window edge is less than or equal to this distance (in pixels) away from the - * bounding box edge (in pixels).
- * Default: 3dp - */ - public ActivityBuilder setSnapRadius(float snapRadius) { - mOptions.snapRadius = snapRadius; - return this; - } - - /** - * The radius of the touchable area around the handle (in pixels).
- * We are basing this value off of the recommended 48dp Rhythm.
- * See: http://developer.android.com/design/style/metrics-grids.html#48dp-rhythm
- * Default: 48dp - */ - public ActivityBuilder setTouchRadius(float touchRadius) { - mOptions.touchRadius = touchRadius; - return this; - } - - /** - * whether the guidelines should be on, off, or only showing when resizing.
- * Default: ON_TOUCH - */ - public ActivityBuilder setGuidelines(@NonNull CropImageView.Guidelines guidelines) { - mOptions.guidelines = guidelines; - return this; - } - - /** - * The initial scale type of the image in the crop image view
- * Default: FIT_CENTER - */ - public ActivityBuilder setScaleType(@NonNull CropImageView.ScaleType scaleType) { - mOptions.scaleType = scaleType; - return this; - } - - /** - * if to show crop overlay UI what contains the crop window UI surrounded by background over the - * cropping image.
- * default: true, may disable for animation or frame transition. - */ - public ActivityBuilder setShowCropOverlay(boolean showCropOverlay) { - mOptions.showCropOverlay = showCropOverlay; - return this; - } - - /** - * if auto-zoom functionality is enabled.
- * default: true. - */ - public ActivityBuilder setAutoZoomEnabled(boolean autoZoomEnabled) { - mOptions.autoZoomEnabled = autoZoomEnabled; - return this; - } - - /** - * if multi touch functionality is enabled.
- * default: true. - */ - public ActivityBuilder setMultiTouchEnabled(boolean multiTouchEnabled) { - mOptions.multiTouchEnabled = multiTouchEnabled; - return this; - } - - /** - * The max zoom allowed during cropping.
- * Default: 4 - */ - public ActivityBuilder setMaxZoom(int maxZoom) { - mOptions.maxZoom = maxZoom; - return this; - } - - /** - * The initial crop window padding from image borders in percentage of the cropping image - * dimensions.
- * Default: 0.1 - */ - public ActivityBuilder setInitialCropWindowPaddingRatio(float initialCropWindowPaddingRatio) { - mOptions.initialCropWindowPaddingRatio = initialCropWindowPaddingRatio; - return this; - } - - /** - * whether the width to height aspect ratio should be maintained or free to change.
- * Default: false - */ - public ActivityBuilder setFixAspectRatio(boolean fixAspectRatio) { - mOptions.fixAspectRatio = fixAspectRatio; - return this; - } - - /** - * the X,Y value of the aspect ratio.
- * Also sets fixes aspect ratio to TRUE.
- * Default: 1/1 - * - * @param aspectRatioX the width - * @param aspectRatioY the height - */ - public ActivityBuilder setAspectRatio(int aspectRatioX, int aspectRatioY) { - mOptions.aspectRatioX = aspectRatioX; - mOptions.aspectRatioY = aspectRatioY; - mOptions.fixAspectRatio = true; - return this; - } - - /** - * the thickness of the guidelines lines (in pixels).
- * Default: 3dp - */ - public ActivityBuilder setBorderLineThickness(float borderLineThickness) { - mOptions.borderLineThickness = borderLineThickness; - return this; - } - - /** - * the color of the guidelines lines.
- * Default: Color.argb(170, 255, 255, 255) - */ - public ActivityBuilder setBorderLineColor(int borderLineColor) { - mOptions.borderLineColor = borderLineColor; - return this; - } - - /** - * thickness of the corner line (in pixels).
- * Default: 2dp - */ - public ActivityBuilder setBorderCornerThickness(float borderCornerThickness) { - mOptions.borderCornerThickness = borderCornerThickness; - return this; - } - - /** - * the offset of corner line from crop window border (in pixels).
- * Default: 5dp - */ - public ActivityBuilder setBorderCornerOffset(float borderCornerOffset) { - mOptions.borderCornerOffset = borderCornerOffset; - return this; - } - - /** - * the length of the corner line away from the corner (in pixels).
- * Default: 14dp - */ - public ActivityBuilder setBorderCornerLength(float borderCornerLength) { - mOptions.borderCornerLength = borderCornerLength; - return this; - } - - /** - * the color of the corner line.
- * Default: WHITE - */ - public ActivityBuilder setBorderCornerColor(int borderCornerColor) { - mOptions.borderCornerColor = borderCornerColor; - return this; - } - - /** - * the thickness of the guidelines lines (in pixels).
- * Default: 1dp - */ - public ActivityBuilder setGuidelinesThickness(float guidelinesThickness) { - mOptions.guidelinesThickness = guidelinesThickness; - return this; - } - - /** - * the color of the guidelines lines.
- * Default: Color.argb(170, 255, 255, 255) - */ - public ActivityBuilder setGuidelinesColor(int guidelinesColor) { - mOptions.guidelinesColor = guidelinesColor; - return this; - } - - /** - * the color of the overlay background around the crop window cover the image parts not in the - * crop window.
- * Default: Color.argb(119, 0, 0, 0) - */ - public ActivityBuilder setBackgroundColor(int backgroundColor) { - mOptions.backgroundColor = backgroundColor; - return this; - } - - /** - * the min size the crop window is allowed to be (in pixels).
- * Default: 42dp, 42dp - */ - public ActivityBuilder setMinCropWindowSize(int minCropWindowWidth, int minCropWindowHeight) { - mOptions.minCropWindowWidth = minCropWindowWidth; - mOptions.minCropWindowHeight = minCropWindowHeight; - return this; - } - - /** - * the min size the resulting cropping image is allowed to be, affects the cropping window - * limits (in pixels).
- * Default: 40px, 40px - */ - public ActivityBuilder setMinCropResultSize(int minCropResultWidth, int minCropResultHeight) { - mOptions.minCropResultWidth = minCropResultWidth; - mOptions.minCropResultHeight = minCropResultHeight; - return this; - } - - /** - * the max size the resulting cropping image is allowed to be, affects the cropping window - * limits (in pixels).
- * Default: 99999, 99999 - */ - public ActivityBuilder setMaxCropResultSize(int maxCropResultWidth, int maxCropResultHeight) { - mOptions.maxCropResultWidth = maxCropResultWidth; - mOptions.maxCropResultHeight = maxCropResultHeight; - return this; - } - - /** - * the title of the {@link CropImageActivity}.
- * Default: "" - */ - public ActivityBuilder setActivityTitle(CharSequence activityTitle) { - mOptions.activityTitle = activityTitle; - return this; - } - - /** - * the color to use for action bar items icons.
- * Default: NONE - */ - public ActivityBuilder setActivityMenuIconColor(int activityMenuIconColor) { - mOptions.activityMenuIconColor = activityMenuIconColor; - return this; - } - - /** - * the Android Uri to save the cropped image to.
- * Default: NONE, will create a temp file - */ - public ActivityBuilder setOutputUri(Uri outputUri) { - mOptions.outputUri = outputUri; - return this; - } - - /** - * the compression format to use when writting the image.
- * Default: JPEG - */ - public ActivityBuilder setOutputCompressFormat(Bitmap.CompressFormat outputCompressFormat) { - mOptions.outputCompressFormat = outputCompressFormat; - return this; - } - - /** - * the quility (if applicable) to use when writting the image (0 - 100).
- * Default: 90 - */ - public ActivityBuilder setOutputCompressQuality(int outputCompressQuality) { - mOptions.outputCompressQuality = outputCompressQuality; - return this; - } - - /** - * the size to resize the cropped image to.
- * Uses {@link CropImageView.RequestSizeOptions#RESIZE_INSIDE} option.
- * Default: 0, 0 - not set, will not resize - */ - public ActivityBuilder setRequestedSize(int reqWidth, int reqHeight) { - return setRequestedSize(reqWidth, reqHeight, CropImageView.RequestSizeOptions.RESIZE_INSIDE); - } - - /** - * the size to resize the cropped image to.
- * Default: 0, 0 - not set, will not resize - */ - public ActivityBuilder setRequestedSize( - int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options) { - mOptions.outputRequestWidth = reqWidth; - mOptions.outputRequestHeight = reqHeight; - mOptions.outputRequestSizeOptions = options; - return this; - } - - /** - * if the result of crop image activity should not save the cropped image bitmap.
- * Used if you want to crop the image manually and need only the crop rectangle and rotation - * data.
- * Default: false - */ - public ActivityBuilder setNoOutputImage(boolean noOutputImage) { - mOptions.noOutputImage = noOutputImage; - return this; - } - - /** - * the initial rectangle to set on the cropping image after loading.
- * Default: NONE - will initialize using initial crop window padding ratio - */ - public ActivityBuilder setInitialCropWindowRectangle(Rect initialCropWindowRectangle) { - mOptions.initialCropWindowRectangle = initialCropWindowRectangle; - return this; - } - - /** - * the initial rotation to set on the cropping image after loading (0-360 degrees clockwise). - *
- * Default: NONE - will read image exif data - */ - public ActivityBuilder setInitialRotation(int initialRotation) { - mOptions.initialRotation = (initialRotation + 360) % 360; - return this; - } - - /** - * if to allow rotation during cropping.
- * Default: true - */ - public ActivityBuilder setAllowRotation(boolean allowRotation) { - mOptions.allowRotation = allowRotation; - return this; - } - - /** - * if to allow flipping during cropping.
- * Default: true - */ - public ActivityBuilder setAllowFlipping(boolean allowFlipping) { - mOptions.allowFlipping = allowFlipping; - return this; - } - - /** - * if to allow counter-clockwise rotation during cropping.
- * Note: if rotation is disabled this option has no effect.
- * Default: false - */ - public ActivityBuilder setAllowCounterRotation(boolean allowCounterRotation) { - mOptions.allowCounterRotation = allowCounterRotation; - return this; - } - - /** - * The amount of degreees to rotate clockwise or counter-clockwise (0-360).
- * Default: 90 - */ - public ActivityBuilder setRotationDegrees(int rotationDegrees) { - mOptions.rotationDegrees = (rotationDegrees + 360) % 360; - return this; - } - - /** - * whether the image should be flipped horizontally.
- * Default: false - */ - public ActivityBuilder setFlipHorizontally(boolean flipHorizontally) { - mOptions.flipHorizontally = flipHorizontally; - return this; - } - - /** - * whether the image should be flipped vertically.
- * Default: false - */ - public ActivityBuilder setFlipVertically(boolean flipVertically) { - mOptions.flipVertically = flipVertically; - return this; - } - - /** - * optional, set crop menu crop button title.
- * Default: null, will use resource string: crop_image_menu_crop - */ - public ActivityBuilder setCropMenuCropButtonTitle(CharSequence title) { - mOptions.cropMenuCropButtonTitle = title; - return this; - } - - /** - * Image resource id to use for crop icon instead of text.
- * Default: 0 - */ - public ActivityBuilder setCropMenuCropButtonIcon(@DrawableRes int drawableResource) { - mOptions.cropMenuCropButtonIcon = drawableResource; - return this; - } - } - // endregion - - // region: Inner class: ActivityResult - - /** - * Result data of Crop Image Activity. - */ - public static final class ActivityResult extends CropImageView.CropResult implements Parcelable { - - public static final Creator CREATOR = - new Creator() { - @Override - public ActivityResult createFromParcel(Parcel in) { - return new ActivityResult(in); - } - - @Override - public ActivityResult[] newArray(int size) { - return new ActivityResult[size]; - } - }; - - public ActivityResult( - Uri originalUri, - Uri uri, - Exception error, - float[] cropPoints, - Rect cropRect, - int rotation, - Rect wholeImageRect, - int sampleSize) { - super( - null, - originalUri, - null, - uri, - error, - cropPoints, - cropRect, - wholeImageRect, - rotation, - sampleSize); - } - - protected ActivityResult(Parcel in) { - super( - null, - (Uri) in.readParcelable(Uri.class.getClassLoader()), - null, - (Uri) in.readParcelable(Uri.class.getClassLoader()), - (Exception) in.readSerializable(), - in.createFloatArray(), - (Rect) in.readParcelable(Rect.class.getClassLoader()), - (Rect) in.readParcelable(Rect.class.getClassLoader()), - in.readInt(), - in.readInt()); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(getOriginalUri(), flags); - dest.writeParcelable(getUri(), flags); - dest.writeSerializable(getError()); - dest.writeFloatArray(getCropPoints()); - dest.writeParcelable(getCropRect(), flags); - dest.writeParcelable(getWholeImageRect(), flags); - dest.writeInt(getRotation()); - dest.writeInt(getSampleSize()); - } - - @Override - public int describeContents() { - return 0; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java deleted file mode 100644 index bd9d0afe..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java +++ /dev/null @@ -1,367 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.Manifest; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.ContextCompat; - -import java.io.File; -import java.io.IOException; - -/** - * Built-in activity for image cropping.
- * Use {@link CropImage#activity(Uri)} to create a builder to start this activity. - */ -public class CropImageActivity extends AppCompatActivity - implements CropImageView.OnSetImageUriCompleteListener, - CropImageView.OnCropImageCompleteListener { - - /** - * The crop image view library widget used in the activity - */ - private CropImageView mCropImageView; - - /** - * Persist URI image to crop URI if specific permissions are required - */ - private Uri mCropImageUri; - - /** - * the options that were set for the crop image - */ - private CropImageOptions mOptions; - - @Override - @SuppressLint("NewApi") - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.crop_image_activity); - - mCropImageView = findViewById(R.id.cropImageView); - - Bundle bundle = getIntent().getBundleExtra(CropImage.CROP_IMAGE_EXTRA_BUNDLE); - mCropImageUri = bundle.getParcelable(CropImage.CROP_IMAGE_EXTRA_SOURCE); - mOptions = bundle.getParcelable(CropImage.CROP_IMAGE_EXTRA_OPTIONS); - - if (savedInstanceState == null) { - if (mCropImageUri == null || mCropImageUri.equals(Uri.EMPTY)) { - if (CropImage.isExplicitCameraPermissionRequired(this)) { - // request permissions and handle the result in onRequestPermissionsResult() - requestPermissions( - new String[]{Manifest.permission.CAMERA}, - CropImage.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE); - } else { - CropImage.startPickImageActivity(this); - } - } else if (CropImage.isReadExternalStoragePermissionsRequired(this, mCropImageUri)) { - // request permissions and handle the result in onRequestPermissionsResult() - requestPermissions( - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE); - } else { - // no permissions required or already grunted, can start crop image activity - mCropImageView.setImageUriAsync(mCropImageUri); - } - } - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - CharSequence title = mOptions != null && - mOptions.activityTitle != null && mOptions.activityTitle.length() > 0 - ? mOptions.activityTitle - : getResources().getString(R.string.crop_image_activity_title); - actionBar.setTitle(title); - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - @Override - protected void onStart() { - super.onStart(); - mCropImageView.setOnSetImageUriCompleteListener(this); - mCropImageView.setOnCropImageCompleteListener(this); - } - - @Override - protected void onStop() { - super.onStop(); - mCropImageView.setOnSetImageUriCompleteListener(null); - mCropImageView.setOnCropImageCompleteListener(null); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.crop_image_menu, menu); - - if (!mOptions.allowRotation) { - menu.removeItem(R.id.crop_image_menu_rotate_left); - menu.removeItem(R.id.crop_image_menu_rotate_right); - } else if (mOptions.allowCounterRotation) { - menu.findItem(R.id.crop_image_menu_rotate_left).setVisible(true); - } - - if (!mOptions.allowFlipping) { - menu.removeItem(R.id.crop_image_menu_flip); - } - - if (mOptions.cropMenuCropButtonTitle != null) { - menu.findItem(R.id.crop_image_menu_crop).setTitle(mOptions.cropMenuCropButtonTitle); - } - - Drawable cropIcon = null; - try { - if (mOptions.cropMenuCropButtonIcon != 0) { - cropIcon = ContextCompat.getDrawable(this, mOptions.cropMenuCropButtonIcon); - menu.findItem(R.id.crop_image_menu_crop).setIcon(cropIcon); - } - } catch (Exception e) { - e.printStackTrace(); - } - - if (mOptions.activityMenuIconColor != 0) { - updateMenuItemIconColor( - menu, R.id.crop_image_menu_rotate_left, mOptions.activityMenuIconColor); - updateMenuItemIconColor( - menu, R.id.crop_image_menu_rotate_right, mOptions.activityMenuIconColor); - updateMenuItemIconColor(menu, R.id.crop_image_menu_flip, mOptions.activityMenuIconColor); - if (cropIcon != null) { - updateMenuItemIconColor(menu, R.id.crop_image_menu_crop, mOptions.activityMenuIconColor); - } - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.crop_image_menu_crop) { - cropImage(); - return true; - } - if (item.getItemId() == R.id.crop_image_menu_rotate_left) { - rotateImage(-mOptions.rotationDegrees); - return true; - } - if (item.getItemId() == R.id.crop_image_menu_rotate_right) { - rotateImage(mOptions.rotationDegrees); - return true; - } - if (item.getItemId() == R.id.crop_image_menu_flip_horizontally) { - mCropImageView.flipImageHorizontally(); - return true; - } - if (item.getItemId() == R.id.crop_image_menu_flip_vertically) { - mCropImageView.flipImageVertically(); - return true; - } - if (item.getItemId() == android.R.id.home) { - setResultCancel(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onBackPressed() { - super.onBackPressed(); - setResultCancel(); - } - - @Override - @SuppressLint("NewApi") - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - - // handle result of pick image chooser - if (requestCode == CropImage.PICK_IMAGE_CHOOSER_REQUEST_CODE) { - if (resultCode == Activity.RESULT_CANCELED) { - // User cancelled the picker. We don't have anything to crop - setResultCancel(); - } - - if (resultCode == Activity.RESULT_OK) { - mCropImageUri = CropImage.getPickImageResultUri(this, data); - - // For API >= 23 we need to check specifically that we have permissions to read external - // storage. - if (CropImage.isReadExternalStoragePermissionsRequired(this, mCropImageUri)) { - // request permissions and handle the result in onRequestPermissionsResult() - requestPermissions( - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE); - } else { - // no permissions required or already grunted, can start crop image activity - mCropImageView.setImageUriAsync(mCropImageUri); - } - } - } - } - - @Override - public void onRequestPermissionsResult( - int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode == CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE) { - if (mCropImageUri != null - && grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // required permissions granted, start crop image activity - mCropImageView.setImageUriAsync(mCropImageUri); - } else { - Toast.makeText(this, R.string.crop_image_activity_no_permissions, Toast.LENGTH_LONG).show(); - setResultCancel(); - } - } - - if (requestCode == CropImage.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE) { - // Irrespective of whether camera permission was given or not, we show the picker - // The picker will not add the camera intent if permission is not available - CropImage.startPickImageActivity(this); - } - } - - @Override - public void onSetImageUriComplete(CropImageView view, Uri uri, Exception error) { - if (error == null) { - if (mOptions.initialCropWindowRectangle != null) { - mCropImageView.setCropRect(mOptions.initialCropWindowRectangle); - } - if (mOptions.initialRotation > -1) { - mCropImageView.setRotatedDegrees(mOptions.initialRotation); - } - } else { - setResult(null, error, 1); - } - } - - @Override - public void onCropImageComplete(CropImageView view, CropImageView.CropResult result) { - setResult(result.getUri(), result.getError(), result.getSampleSize()); - } - - // region: Private methods - - /** - * Execute crop image and save the result tou output uri. - */ - protected void cropImage() { - if (mOptions.noOutputImage) { - setResult(null, null, 1); - } else { - Uri outputUri = getOutputUri(); - mCropImageView.saveCroppedImageAsync( - outputUri, - mOptions.outputCompressFormat, - mOptions.outputCompressQuality, - mOptions.outputRequestWidth, - mOptions.outputRequestHeight, - mOptions.outputRequestSizeOptions); - } - } - - /** - * Rotate the image in the crop image view. - */ - protected void rotateImage(int degrees) { - mCropImageView.rotateImage(degrees); - } - - /** - * Get Android uri to save the cropped image into.
- * Use the given in options or create a temp file. - */ - protected Uri getOutputUri() { - Uri outputUri = mOptions.outputUri; - if (outputUri == null || outputUri.equals(Uri.EMPTY)) { - try { - String ext = - mOptions.outputCompressFormat == Bitmap.CompressFormat.JPEG - ? ".jpg" - : mOptions.outputCompressFormat == Bitmap.CompressFormat.PNG ? ".png" : ".webp"; - outputUri = Uri.fromFile(File.createTempFile("cropped", ext, getCacheDir())); - } catch (IOException e) { - throw new RuntimeException("Failed to create temp file for output image", e); - } - } - return outputUri; - } - - /** - * Result with cropped image data or error if failed. - */ - protected void setResult(Uri uri, Exception error, int sampleSize) { - int resultCode = error == null ? RESULT_OK : CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE; - setResult(resultCode, getResultIntent(uri, error, sampleSize)); - finish(); - } - - /** - * Cancel of cropping activity. - */ - protected void setResultCancel() { - setResult(RESULT_CANCELED); - finish(); - } - - /** - * Get intent instance to be used for the result of this activity. - */ - protected Intent getResultIntent(Uri uri, Exception error, int sampleSize) { - CropImage.ActivityResult result = - new CropImage.ActivityResult( - mCropImageView.getImageUri(), - uri, - error, - mCropImageView.getCropPoints(), - mCropImageView.getCropRect(), - mCropImageView.getRotatedDegrees(), - mCropImageView.getWholeImageRect(), - sampleSize); - Intent intent = new Intent(); - intent.putExtras(getIntent()); - intent.putExtra(CropImage.CROP_IMAGE_EXTRA_RESULT, result); - return intent; - } - - /** - * Update the color of a specific menu item to the given color. - */ - private void updateMenuItemIconColor(Menu menu, int itemId, int color) { - MenuItem menuItem = menu.findItem(itemId); - if (menuItem != null) { - Drawable menuItemIcon = menuItem.getIcon(); - if (menuItemIcon != null) { - try { - menuItemIcon.mutate(); - menuItemIcon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - menuItem.setIcon(menuItemIcon); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageAnimation.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageAnimation.java deleted file mode 100644 index 2861b857..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageAnimation.java +++ /dev/null @@ -1,123 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.graphics.Matrix; -import android.graphics.RectF; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.Animation; -import android.view.animation.Transformation; -import android.widget.ImageView; - -/** - * Animation to handle smooth cropping image matrix transformation change, specifically for - * zoom-in/out. - */ -final class CropImageAnimation extends Animation implements Animation.AnimationListener { - - // region: Fields and Consts - - private final ImageView mImageView; - - private final CropOverlayView mCropOverlayView; - - private final float[] mStartBoundPoints = new float[8]; - - private final float[] mEndBoundPoints = new float[8]; - - private final RectF mStartCropWindowRect = new RectF(); - - private final RectF mEndCropWindowRect = new RectF(); - - private final float[] mStartImageMatrix = new float[9]; - - private final float[] mEndImageMatrix = new float[9]; - - private final RectF mAnimRect = new RectF(); - - private final float[] mAnimPoints = new float[8]; - - private final float[] mAnimMatrix = new float[9]; - // endregion - - public CropImageAnimation(ImageView cropImageView, CropOverlayView cropOverlayView) { - mImageView = cropImageView; - mCropOverlayView = cropOverlayView; - - setDuration(300); - setFillAfter(true); - setInterpolator(new AccelerateDecelerateInterpolator()); - setAnimationListener(this); - } - - public void setStartState(float[] boundPoints, Matrix imageMatrix) { - reset(); - System.arraycopy(boundPoints, 0, mStartBoundPoints, 0, 8); - mStartCropWindowRect.set(mCropOverlayView.getCropWindowRect()); - imageMatrix.getValues(mStartImageMatrix); - } - - public void setEndState(float[] boundPoints, Matrix imageMatrix) { - System.arraycopy(boundPoints, 0, mEndBoundPoints, 0, 8); - mEndCropWindowRect.set(mCropOverlayView.getCropWindowRect()); - imageMatrix.getValues(mEndImageMatrix); - } - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - - mAnimRect.left = - mStartCropWindowRect.left - + (mEndCropWindowRect.left - mStartCropWindowRect.left) * interpolatedTime; - mAnimRect.top = - mStartCropWindowRect.top - + (mEndCropWindowRect.top - mStartCropWindowRect.top) * interpolatedTime; - mAnimRect.right = - mStartCropWindowRect.right - + (mEndCropWindowRect.right - mStartCropWindowRect.right) * interpolatedTime; - mAnimRect.bottom = - mStartCropWindowRect.bottom - + (mEndCropWindowRect.bottom - mStartCropWindowRect.bottom) * interpolatedTime; - mCropOverlayView.setCropWindowRect(mAnimRect); - - for (int i = 0; i < mAnimPoints.length; i++) { - mAnimPoints[i] = - mStartBoundPoints[i] + (mEndBoundPoints[i] - mStartBoundPoints[i]) * interpolatedTime; - } - mCropOverlayView.setBounds(mAnimPoints, mImageView.getWidth(), mImageView.getHeight()); - - for (int i = 0; i < mAnimMatrix.length; i++) { - mAnimMatrix[i] = - mStartImageMatrix[i] + (mEndImageMatrix[i] - mStartImageMatrix[i]) * interpolatedTime; - } - Matrix m = mImageView.getImageMatrix(); - m.setValues(mAnimMatrix); - mImageView.setImageMatrix(m); - - mImageView.invalidate(); - mCropOverlayView.invalidate(); - } - - @Override - public void onAnimationStart(Animation animation) { - } - - @Override - public void onAnimationEnd(Animation animation) { - mImageView.clearAnimation(); - } - - @Override - public void onAnimationRepeat(Animation animation) { - } -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java deleted file mode 100644 index 5a9256a8..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java +++ /dev/null @@ -1,541 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth; -// inexhaustible as the great rivers. -// When they come to an end; -// they begin again; -// like the days and months; -// they die and are reborn; -// like the four seasons." -// -// - Sun Tsu; -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.graphics.Rect; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.DisplayMetrics; -import android.util.TypedValue; - -/** - * All the possible options that can be set to customize crop image.
- * Initialized with default values. - */ -public class CropImageOptions implements Parcelable { - - public static final Creator CREATOR = - new Creator() { - @Override - public CropImageOptions createFromParcel(Parcel in) { - return new CropImageOptions(in); - } - - @Override - public CropImageOptions[] newArray(int size) { - return new CropImageOptions[size]; - } - }; - - /** - * The shape of the cropping window. - */ - public CropImageView.CropShape cropShape; - - /** - * An edge of the crop window will snap to the corresponding edge of a specified bounding box when - * the crop window edge is less than or equal to this distance (in pixels) away from the bounding - * box edge. (in pixels) - */ - public float snapRadius; - - /** - * The radius of the touchable area around the handle. (in pixels)
- * We are basing this value off of the recommended 48dp Rhythm.
- * See: http://developer.android.com/design/style/metrics-grids.html#48dp-rhythm - */ - public float touchRadius; - - /** - * whether the guidelines should be on, off, or only showing when resizing. - */ - public CropImageView.Guidelines guidelines; - - /** - * The initial scale type of the image in the crop image view - */ - public CropImageView.ScaleType scaleType; - - /** - * if to show crop overlay UI what contains the crop window UI surrounded by background over the - * cropping image.
- * default: true, may disable for animation or frame transition. - */ - public boolean showCropOverlay; - - /** - * if to show progress bar when image async loading/cropping is in progress.
- * default: true, disable to provide custom progress bar UI. - */ - public boolean showProgressBar; - - /** - * if auto-zoom functionality is enabled.
- * default: true. - */ - public boolean autoZoomEnabled; - - /** - * if multi-touch should be enabled on the crop box default: false - */ - public boolean multiTouchEnabled; - - /** - * The max zoom allowed during cropping. - */ - public int maxZoom; - - /** - * The initial crop window padding from image borders in percentage of the cropping image - * dimensions. - */ - public float initialCropWindowPaddingRatio; - - /** - * whether the width to height aspect ratio should be maintained or free to change. - */ - public boolean fixAspectRatio; - - /** - * the X value of the aspect ratio. - */ - public int aspectRatioX; - - /** - * the Y value of the aspect ratio. - */ - public int aspectRatioY; - - /** - * the thickness of the guidelines lines in pixels. (in pixels) - */ - public float borderLineThickness; - - /** - * the color of the guidelines lines - */ - public int borderLineColor; - - /** - * thickness of the corner line. (in pixels) - */ - public float borderCornerThickness; - - /** - * the offset of corner line from crop window border. (in pixels) - */ - public float borderCornerOffset; - - /** - * the length of the corner line away from the corner. (in pixels) - */ - public float borderCornerLength; - - /** - * the color of the corner line - */ - public int borderCornerColor; - - /** - * the thickness of the guidelines lines. (in pixels) - */ - public float guidelinesThickness; - - /** - * the color of the guidelines lines - */ - public int guidelinesColor; - - /** - * the color of the overlay background around the crop window cover the image parts not in the - * crop window. - */ - public int backgroundColor; - - /** - * the min width the crop window is allowed to be. (in pixels) - */ - public int minCropWindowWidth; - - /** - * the min height the crop window is allowed to be. (in pixels) - */ - public int minCropWindowHeight; - - /** - * the min width the resulting cropping image is allowed to be, affects the cropping window - * limits. (in pixels) - */ - public int minCropResultWidth; - - /** - * the min height the resulting cropping image is allowed to be, affects the cropping window - * limits. (in pixels) - */ - public int minCropResultHeight; - - /** - * the max width the resulting cropping image is allowed to be, affects the cropping window - * limits. (in pixels) - */ - public int maxCropResultWidth; - - /** - * the max height the resulting cropping image is allowed to be, affects the cropping window - * limits. (in pixels) - */ - public int maxCropResultHeight; - - /** - * the title of the {@link CropImageActivity} - */ - public CharSequence activityTitle; - - /** - * the color to use for action bar items icons - */ - public int activityMenuIconColor; - - /** - * the Android Uri to save the cropped image to - */ - public Uri outputUri; - - /** - * the compression format to use when writing the image - */ - public Bitmap.CompressFormat outputCompressFormat; - - /** - * the quality (if applicable) to use when writing the image (0 - 100) - */ - public int outputCompressQuality; - - /** - * the width to resize the cropped image to (see options) - */ - public int outputRequestWidth; - - /** - * the height to resize the cropped image to (see options) - */ - public int outputRequestHeight; - - /** - * the resize method to use on the cropped bitmap (see options documentation) - */ - public CropImageView.RequestSizeOptions outputRequestSizeOptions; - - /** - * if the result of crop image activity should not save the cropped image bitmap - */ - public boolean noOutputImage; - - /** - * the initial rectangle to set on the cropping image after loading - */ - public Rect initialCropWindowRectangle; - - /** - * the initial rotation to set on the cropping image after loading (0-360 degrees clockwise) - */ - public int initialRotation; - - /** - * if to allow (all) rotation during cropping (activity) - */ - public boolean allowRotation; - - /** - * if to allow (all) flipping during cropping (activity) - */ - public boolean allowFlipping; - - /** - * if to allow counter-clockwise rotation during cropping (activity) - */ - public boolean allowCounterRotation; - - /** - * the amount of degrees to rotate clockwise or counter-clockwise - */ - public int rotationDegrees; - - /** - * whether the image should be flipped horizontally - */ - public boolean flipHorizontally; - - /** - * whether the image should be flipped vertically - */ - public boolean flipVertically; - - /** - * optional, the text of the crop menu crop button - */ - public CharSequence cropMenuCropButtonTitle; - - /** - * optional image resource to be used for crop menu crop icon instead of text - */ - public int cropMenuCropButtonIcon; - - /** - * Init options with defaults. - */ - public CropImageOptions() { - - DisplayMetrics dm = Resources.getSystem().getDisplayMetrics(); - - cropShape = CropImageView.CropShape.RECTANGLE; - snapRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, dm); - touchRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, dm); - guidelines = CropImageView.Guidelines.ON_TOUCH; - scaleType = CropImageView.ScaleType.FIT_CENTER; - showCropOverlay = true; - showProgressBar = true; - autoZoomEnabled = true; - multiTouchEnabled = false; - maxZoom = 4; - initialCropWindowPaddingRatio = 0.1f; - - fixAspectRatio = false; - aspectRatioX = 1; - aspectRatioY = 1; - - borderLineThickness = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, dm); - borderLineColor = Color.argb(170, 255, 255, 255); - borderCornerThickness = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, dm); - borderCornerOffset = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, dm); - borderCornerLength = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, dm); - borderCornerColor = Color.WHITE; - - guidelinesThickness = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, dm); - guidelinesColor = Color.argb(170, 255, 255, 255); - backgroundColor = Color.argb(119, 0, 0, 0); - - minCropWindowWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, dm); - minCropWindowHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, dm); - minCropResultWidth = 40; - minCropResultHeight = 40; - maxCropResultWidth = 99999; - maxCropResultHeight = 99999; - - activityTitle = ""; - activityMenuIconColor = 0; - - outputUri = Uri.EMPTY; - outputCompressFormat = Bitmap.CompressFormat.JPEG; - outputCompressQuality = 90; - outputRequestWidth = 0; - outputRequestHeight = 0; - outputRequestSizeOptions = CropImageView.RequestSizeOptions.NONE; - noOutputImage = false; - - initialCropWindowRectangle = null; - initialRotation = -1; - allowRotation = true; - allowFlipping = true; - allowCounterRotation = false; - rotationDegrees = 90; - flipHorizontally = false; - flipVertically = false; - cropMenuCropButtonTitle = null; - - cropMenuCropButtonIcon = 0; - } - - /** - * Create object from parcel. - */ - protected CropImageOptions(Parcel in) { - cropShape = CropImageView.CropShape.values()[in.readInt()]; - snapRadius = in.readFloat(); - touchRadius = in.readFloat(); - guidelines = CropImageView.Guidelines.values()[in.readInt()]; - scaleType = CropImageView.ScaleType.values()[in.readInt()]; - showCropOverlay = in.readByte() != 0; - showProgressBar = in.readByte() != 0; - autoZoomEnabled = in.readByte() != 0; - multiTouchEnabled = in.readByte() != 0; - maxZoom = in.readInt(); - initialCropWindowPaddingRatio = in.readFloat(); - fixAspectRatio = in.readByte() != 0; - aspectRatioX = in.readInt(); - aspectRatioY = in.readInt(); - borderLineThickness = in.readFloat(); - borderLineColor = in.readInt(); - borderCornerThickness = in.readFloat(); - borderCornerOffset = in.readFloat(); - borderCornerLength = in.readFloat(); - borderCornerColor = in.readInt(); - guidelinesThickness = in.readFloat(); - guidelinesColor = in.readInt(); - backgroundColor = in.readInt(); - minCropWindowWidth = in.readInt(); - minCropWindowHeight = in.readInt(); - minCropResultWidth = in.readInt(); - minCropResultHeight = in.readInt(); - maxCropResultWidth = in.readInt(); - maxCropResultHeight = in.readInt(); - activityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - activityMenuIconColor = in.readInt(); - outputUri = in.readParcelable(Uri.class.getClassLoader()); - outputCompressFormat = Bitmap.CompressFormat.valueOf(in.readString()); - outputCompressQuality = in.readInt(); - outputRequestWidth = in.readInt(); - outputRequestHeight = in.readInt(); - outputRequestSizeOptions = CropImageView.RequestSizeOptions.values()[in.readInt()]; - noOutputImage = in.readByte() != 0; - initialCropWindowRectangle = in.readParcelable(Rect.class.getClassLoader()); - initialRotation = in.readInt(); - allowRotation = in.readByte() != 0; - allowFlipping = in.readByte() != 0; - allowCounterRotation = in.readByte() != 0; - rotationDegrees = in.readInt(); - flipHorizontally = in.readByte() != 0; - flipVertically = in.readByte() != 0; - cropMenuCropButtonTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - cropMenuCropButtonIcon = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(cropShape.ordinal()); - dest.writeFloat(snapRadius); - dest.writeFloat(touchRadius); - dest.writeInt(guidelines.ordinal()); - dest.writeInt(scaleType.ordinal()); - dest.writeByte((byte) (showCropOverlay ? 1 : 0)); - dest.writeByte((byte) (showProgressBar ? 1 : 0)); - dest.writeByte((byte) (autoZoomEnabled ? 1 : 0)); - dest.writeByte((byte) (multiTouchEnabled ? 1 : 0)); - dest.writeInt(maxZoom); - dest.writeFloat(initialCropWindowPaddingRatio); - dest.writeByte((byte) (fixAspectRatio ? 1 : 0)); - dest.writeInt(aspectRatioX); - dest.writeInt(aspectRatioY); - dest.writeFloat(borderLineThickness); - dest.writeInt(borderLineColor); - dest.writeFloat(borderCornerThickness); - dest.writeFloat(borderCornerOffset); - dest.writeFloat(borderCornerLength); - dest.writeInt(borderCornerColor); - dest.writeFloat(guidelinesThickness); - dest.writeInt(guidelinesColor); - dest.writeInt(backgroundColor); - dest.writeInt(minCropWindowWidth); - dest.writeInt(minCropWindowHeight); - dest.writeInt(minCropResultWidth); - dest.writeInt(minCropResultHeight); - dest.writeInt(maxCropResultWidth); - dest.writeInt(maxCropResultHeight); - TextUtils.writeToParcel(activityTitle, dest, flags); - dest.writeInt(activityMenuIconColor); - dest.writeParcelable(outputUri, flags); - dest.writeString(outputCompressFormat.name()); - dest.writeInt(outputCompressQuality); - dest.writeInt(outputRequestWidth); - dest.writeInt(outputRequestHeight); - dest.writeInt(outputRequestSizeOptions.ordinal()); - dest.writeInt(noOutputImage ? 1 : 0); - dest.writeParcelable(initialCropWindowRectangle, flags); - dest.writeInt(initialRotation); - dest.writeByte((byte) (allowRotation ? 1 : 0)); - dest.writeByte((byte) (allowFlipping ? 1 : 0)); - dest.writeByte((byte) (allowCounterRotation ? 1 : 0)); - dest.writeInt(rotationDegrees); - dest.writeByte((byte) (flipHorizontally ? 1 : 0)); - dest.writeByte((byte) (flipVertically ? 1 : 0)); - TextUtils.writeToParcel(cropMenuCropButtonTitle, dest, flags); - dest.writeInt(cropMenuCropButtonIcon); - } - - @Override - public int describeContents() { - return 0; - } - - /** - * Validate all the options are withing valid range. - * - * @throws IllegalArgumentException if any of the options is not valid - */ - public void validate() { - if (maxZoom < 0) { - throw new IllegalArgumentException("Cannot set max zoom to a number < 1"); - } - if (touchRadius < 0) { - throw new IllegalArgumentException("Cannot set touch radius value to a number <= 0 "); - } - if (initialCropWindowPaddingRatio < 0 || initialCropWindowPaddingRatio >= 0.5) { - throw new IllegalArgumentException( - "Cannot set initial crop window padding value to a number < 0 or >= 0.5"); - } - if (aspectRatioX <= 0) { - throw new IllegalArgumentException( - "Cannot set aspect ratio value to a number less than or equal to 0."); - } - if (aspectRatioY <= 0) { - throw new IllegalArgumentException( - "Cannot set aspect ratio value to a number less than or equal to 0."); - } - if (borderLineThickness < 0) { - throw new IllegalArgumentException( - "Cannot set line thickness value to a number less than 0."); - } - if (borderCornerThickness < 0) { - throw new IllegalArgumentException( - "Cannot set corner thickness value to a number less than 0."); - } - if (guidelinesThickness < 0) { - throw new IllegalArgumentException( - "Cannot set guidelines thickness value to a number less than 0."); - } - if (minCropWindowHeight < 0) { - throw new IllegalArgumentException( - "Cannot set min crop window height value to a number < 0 "); - } - if (minCropResultWidth < 0) { - throw new IllegalArgumentException("Cannot set min crop result width value to a number < 0 "); - } - if (minCropResultHeight < 0) { - throw new IllegalArgumentException( - "Cannot set min crop result height value to a number < 0 "); - } - if (maxCropResultWidth < minCropResultWidth) { - throw new IllegalArgumentException( - "Cannot set max crop result width to smaller value than min crop result width"); - } - if (maxCropResultHeight < minCropResultHeight) { - throw new IllegalArgumentException( - "Cannot set max crop result height to smaller value than min crop result height"); - } - if (outputRequestWidth < 0) { - throw new IllegalArgumentException("Cannot set request width value to a number < 0 "); - } - if (outputRequestHeight < 0) { - throw new IllegalArgumentException("Cannot set request height value to a number < 0 "); - } - if (rotationDegrees < 0 || rotationDegrees > 360) { - throw new IllegalArgumentException( - "Cannot set rotation degrees value to a number < 0 or > 360"); - } - } -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java deleted file mode 100644 index 2e835b07..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ /dev/null @@ -1,2296 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Matrix; -import android.graphics.Rect; -import android.graphics.RectF; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Parcelable; -import android.util.AttributeSet; -import android.util.Pair; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.ProgressBar; - -import androidx.exifinterface.media.ExifInterface; - -import java.lang.ref.WeakReference; -import java.util.UUID; - -/** - * Custom view that provides cropping capabilities to an image. - */ -public class CropImageView extends FrameLayout { - - // region: Fields and Consts - - /** - * Image view widget used to show the image for cropping. - */ - private final ImageView mImageView; - - /** - * Overlay over the image view to show cropping UI. - */ - private final CropOverlayView mCropOverlayView; - - /** - * The matrix used to transform the cropping image in the image view - */ - private final Matrix mImageMatrix = new Matrix(); - - /** - * Reusing matrix instance for reverse matrix calculations. - */ - private final Matrix mImageInverseMatrix = new Matrix(); - - /** - * Progress bar widget to show progress bar on async image loading and cropping. - */ - private final ProgressBar mProgressBar; - - /** - * Rectangle used in image matrix transformation calculation (reusing rect instance) - */ - private final float[] mImagePoints = new float[8]; - - /** - * Rectangle used in image matrix transformation for scale calculation (reusing rect instance) - */ - private final float[] mScaleImagePoints = new float[8]; - - /** - * Animation class to smooth animate zoom-in/out - */ - private CropImageAnimation mAnimation; - - private Bitmap mBitmap; - - /** - * The image rotation value used during loading of the image so we can reset to it - */ - private int mInitialDegreesRotated; - - /** - * How much the image is rotated from original clockwise - */ - private int mDegreesRotated; - - /** - * if the image flipped horizontally - */ - private boolean mFlipHorizontally; - - /** - * if the image flipped vertically - */ - private boolean mFlipVertically; - - private int mLayoutWidth; - - private int mLayoutHeight; - - private int mImageResource; - - /** - * The initial scale type of the image in the crop image view - */ - private ScaleType mScaleType; - - /** - * if to save bitmap on save instance state.
- * It is best to avoid it by using URI in setting image for cropping.
- * If false the bitmap is not saved and if restore is required to view will be empty, storing the - * bitmap requires saving it to file which can be expensive. default: false. - */ - private boolean mSaveBitmapToInstanceState = false; - - /** - * if to show crop overlay UI what contains the crop window UI surrounded by background over the - * cropping image.
- * default: true, may disable for animation or frame transition. - */ - private boolean mShowCropOverlay = true; - - /** - * if to show progress bar when image async loading/cropping is in progress.
- * default: true, disable to provide custom progress bar UI. - */ - private boolean mShowProgressBar = true; - - /** - * if auto-zoom functionality is enabled.
- * default: true. - */ - private boolean mAutoZoomEnabled = true; - - /** - * The max zoom allowed during cropping - */ - private int mMaxZoom; - - /** - * callback to be invoked when crop overlay is released. - */ - private OnSetCropOverlayReleasedListener mOnCropOverlayReleasedListener; - - /** - * callback to be invoked when crop overlay is moved. - */ - private OnSetCropOverlayMovedListener mOnSetCropOverlayMovedListener; - - /** - * callback to be invoked when crop window is changed. - */ - private OnSetCropWindowChangeListener mOnSetCropWindowChangeListener; - - /** - * callback to be invoked when image async loading is complete. - */ - private OnSetImageUriCompleteListener mOnSetImageUriCompleteListener; - - /** - * callback to be invoked when image async cropping is complete. - */ - private OnCropImageCompleteListener mOnCropImageCompleteListener; - - /** - * The URI that the image was loaded from (if loaded from URI) - */ - private Uri mLoadedImageUri; - - /** - * The sample size the image was loaded by if was loaded by URI - */ - private int mLoadedSampleSize = 1; - - /** - * The current zoom level to to scale the cropping image - */ - private float mZoom = 1; - - /** - * The X offset that the cropping image was translated after zooming - */ - private float mZoomOffsetX; - - /** - * The Y offset that the cropping image was translated after zooming - */ - private float mZoomOffsetY; - - /** - * Used to restore the cropping windows rectangle after state restore - */ - private RectF mRestoreCropWindowRect; - - /** - * Used to restore image rotation after state restore - */ - private int mRestoreDegreesRotated; - - /** - * Used to detect size change to handle auto-zoom using {@link #handleCropWindowChanged(boolean, - * boolean)} in {@link #layout(int, int, int, int)}. - */ - private boolean mSizeChanged; - - /** - * Temp URI used to save bitmap image to disk to preserve for instance state in case cropped was - * set with bitmap - */ - private Uri mSaveInstanceStateBitmapUri; - - /** - * Task used to load bitmap async from UI thread - */ - private WeakReference mBitmapLoadingWorkerTask; - - /** - * Task used to crop bitmap async from UI thread - */ - private WeakReference mBitmapCroppingWorkerTask; - // endregion - - public CropImageView(Context context) { - this(context, null); - } - - public CropImageView(Context context, AttributeSet attrs) { - super(context, attrs); - - CropImageOptions options = null; - Intent intent = context instanceof Activity ? ((Activity) context).getIntent() : null; - if (intent != null) { - Bundle bundle = intent.getBundleExtra(CropImage.CROP_IMAGE_EXTRA_BUNDLE); - if (bundle != null) { - options = bundle.getParcelable(CropImage.CROP_IMAGE_EXTRA_OPTIONS); - } - } - - if (options == null) { - - options = new CropImageOptions(); - - if (attrs != null) { - TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CropImageView, 0, 0); - try { - options.fixAspectRatio = - ta.getBoolean(R.styleable.CropImageView_cropFixAspectRatio, options.fixAspectRatio); - options.aspectRatioX = - ta.getInteger(R.styleable.CropImageView_cropAspectRatioX, options.aspectRatioX); - options.aspectRatioY = - ta.getInteger(R.styleable.CropImageView_cropAspectRatioY, options.aspectRatioY); - options.scaleType = - ScaleType.values()[ - ta.getInt(R.styleable.CropImageView_cropScaleType, options.scaleType.ordinal())]; - options.autoZoomEnabled = - ta.getBoolean(R.styleable.CropImageView_cropAutoZoomEnabled, options.autoZoomEnabled); - options.multiTouchEnabled = - ta.getBoolean( - R.styleable.CropImageView_cropMultiTouchEnabled, options.multiTouchEnabled); - options.maxZoom = ta.getInteger(R.styleable.CropImageView_cropMaxZoom, options.maxZoom); - options.cropShape = - CropShape.values()[ - ta.getInt(R.styleable.CropImageView_cropShape, options.cropShape.ordinal())]; - options.guidelines = - Guidelines.values()[ - ta.getInt( - R.styleable.CropImageView_cropGuidelines, options.guidelines.ordinal())]; - options.snapRadius = - ta.getDimension(R.styleable.CropImageView_cropSnapRadius, options.snapRadius); - options.touchRadius = - ta.getDimension(R.styleable.CropImageView_cropTouchRadius, options.touchRadius); - options.initialCropWindowPaddingRatio = - ta.getFloat( - R.styleable.CropImageView_cropInitialCropWindowPaddingRatio, - options.initialCropWindowPaddingRatio); - options.borderLineThickness = - ta.getDimension( - R.styleable.CropImageView_cropBorderLineThickness, options.borderLineThickness); - options.borderLineColor = - ta.getInteger(R.styleable.CropImageView_cropBorderLineColor, options.borderLineColor); - options.borderCornerThickness = - ta.getDimension( - R.styleable.CropImageView_cropBorderCornerThickness, - options.borderCornerThickness); - options.borderCornerOffset = - ta.getDimension( - R.styleable.CropImageView_cropBorderCornerOffset, options.borderCornerOffset); - options.borderCornerLength = - ta.getDimension( - R.styleable.CropImageView_cropBorderCornerLength, options.borderCornerLength); - options.borderCornerColor = - ta.getInteger( - R.styleable.CropImageView_cropBorderCornerColor, options.borderCornerColor); - options.guidelinesThickness = - ta.getDimension( - R.styleable.CropImageView_cropGuidelinesThickness, options.guidelinesThickness); - options.guidelinesColor = - ta.getInteger(R.styleable.CropImageView_cropGuidelinesColor, options.guidelinesColor); - options.backgroundColor = - ta.getInteger(R.styleable.CropImageView_cropBackgroundColor, options.backgroundColor); - options.showCropOverlay = - ta.getBoolean(R.styleable.CropImageView_cropShowCropOverlay, mShowCropOverlay); - options.showProgressBar = - ta.getBoolean(R.styleable.CropImageView_cropShowProgressBar, mShowProgressBar); - options.borderCornerThickness = - ta.getDimension( - R.styleable.CropImageView_cropBorderCornerThickness, - options.borderCornerThickness); - options.minCropWindowWidth = - (int) - ta.getDimension( - R.styleable.CropImageView_cropMinCropWindowWidth, options.minCropWindowWidth); - options.minCropWindowHeight = - (int) - ta.getDimension( - R.styleable.CropImageView_cropMinCropWindowHeight, - options.minCropWindowHeight); - options.minCropResultWidth = - (int) - ta.getFloat( - R.styleable.CropImageView_cropMinCropResultWidthPX, - options.minCropResultWidth); - options.minCropResultHeight = - (int) - ta.getFloat( - R.styleable.CropImageView_cropMinCropResultHeightPX, - options.minCropResultHeight); - options.maxCropResultWidth = - (int) - ta.getFloat( - R.styleable.CropImageView_cropMaxCropResultWidthPX, - options.maxCropResultWidth); - options.maxCropResultHeight = - (int) - ta.getFloat( - R.styleable.CropImageView_cropMaxCropResultHeightPX, - options.maxCropResultHeight); - options.flipHorizontally = - ta.getBoolean( - R.styleable.CropImageView_cropFlipHorizontally, options.flipHorizontally); - options.flipVertically = - ta.getBoolean(R.styleable.CropImageView_cropFlipHorizontally, options.flipVertically); - - mSaveBitmapToInstanceState = - ta.getBoolean( - R.styleable.CropImageView_cropSaveBitmapToInstanceState, - mSaveBitmapToInstanceState); - - // if aspect ratio is set then set fixed to true - if (ta.hasValue(R.styleable.CropImageView_cropAspectRatioX) - && ta.hasValue(R.styleable.CropImageView_cropAspectRatioX) - && !ta.hasValue(R.styleable.CropImageView_cropFixAspectRatio)) { - options.fixAspectRatio = true; - } - } finally { - ta.recycle(); - } - } - } - - options.validate(); - - mScaleType = options.scaleType; - mAutoZoomEnabled = options.autoZoomEnabled; - mMaxZoom = options.maxZoom; - mShowCropOverlay = options.showCropOverlay; - mShowProgressBar = options.showProgressBar; - mFlipHorizontally = options.flipHorizontally; - mFlipVertically = options.flipVertically; - - LayoutInflater inflater = LayoutInflater.from(context); - View v = inflater.inflate(R.layout.crop_image_view, this, true); - - mImageView = v.findViewById(R.id.ImageView_image); - mImageView.setScaleType(ImageView.ScaleType.MATRIX); - - mCropOverlayView = v.findViewById(R.id.CropOverlayView); - mCropOverlayView.setCropWindowChangeListener( - new CropOverlayView.CropWindowChangeListener() { - @Override - public void onCropWindowChanged(boolean inProgress) { - handleCropWindowChanged(inProgress, true); - OnSetCropOverlayReleasedListener listener = mOnCropOverlayReleasedListener; - if (listener != null && !inProgress) { - listener.onCropOverlayReleased(getCropRect()); - } - OnSetCropOverlayMovedListener movedListener = mOnSetCropOverlayMovedListener; - if (movedListener != null && inProgress) { - movedListener.onCropOverlayMoved(getCropRect()); - } - } - }); - mCropOverlayView.setInitialAttributeValues(options); - - mProgressBar = v.findViewById(R.id.CropProgressBar); - setProgressBarVisibility(); - } - - /** - * Determines the specs for the onMeasure function. Calculates the width or height depending on - * the mode. - * - * @param measureSpecMode The mode of the measured width or height. - * @param measureSpecSize The size of the measured width or height. - * @param desiredSize The desired size of the measured width or height. - * @return The final size of the width or height. - */ - private static int getOnMeasureSpec(int measureSpecMode, int measureSpecSize, int desiredSize) { - - // Measure Width - int spec; - if (measureSpecMode == MeasureSpec.EXACTLY) { - // Must be this size - spec = measureSpecSize; - } else if (measureSpecMode == MeasureSpec.AT_MOST) { - // Can't be bigger than...; match_parent value - spec = Math.min(desiredSize, measureSpecSize); - } else { - // Be whatever you want; wrap_content - spec = desiredSize; - } - - return spec; - } - - /** - * Get the scale type of the image in the crop view. - */ - public ScaleType getScaleType() { - return mScaleType; - } - - /** - * Set the scale type of the image in the crop view - */ - public void setScaleType(ScaleType scaleType) { - if (scaleType != mScaleType) { - mScaleType = scaleType; - mZoom = 1; - mZoomOffsetX = mZoomOffsetY = 0; - mCropOverlayView.resetCropOverlayView(); - requestLayout(); - } - } - - /** - * The shape of the cropping area - rectangle/circular. - */ - public CropShape getCropShape() { - return mCropOverlayView.getCropShape(); - } - - /** - * The shape of the cropping area - rectangle/circular.
- * To set square/circle crop shape set aspect ratio to 1:1. - */ - public void setCropShape(CropShape cropShape) { - mCropOverlayView.setCropShape(cropShape); - } - - /** - * if auto-zoom functionality is enabled. default: true. - */ - public boolean isAutoZoomEnabled() { - return mAutoZoomEnabled; - } - - /** - * Set auto-zoom functionality to enabled/disabled. - */ - public void setAutoZoomEnabled(boolean autoZoomEnabled) { - if (mAutoZoomEnabled != autoZoomEnabled) { - mAutoZoomEnabled = autoZoomEnabled; - handleCropWindowChanged(false, false); - mCropOverlayView.invalidate(); - } - } - - /** - * Set multi touch functionality to enabled/disabled. - */ - public void setMultiTouchEnabled(boolean multiTouchEnabled) { - if (mCropOverlayView.setMultiTouchEnabled(multiTouchEnabled)) { - handleCropWindowChanged(false, false); - mCropOverlayView.invalidate(); - } - } - - /** - * The max zoom allowed during cropping. - */ - public int getMaxZoom() { - return mMaxZoom; - } - - /** - * The max zoom allowed during cropping. - */ - public void setMaxZoom(int maxZoom) { - if (mMaxZoom != maxZoom && maxZoom > 0) { - mMaxZoom = maxZoom; - handleCropWindowChanged(false, false); - mCropOverlayView.invalidate(); - } - } - - /** - * the min size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMinCropResultSize(int minCropResultWidth, int minCropResultHeight) { - mCropOverlayView.setMinCropResultSize(minCropResultWidth, minCropResultHeight); - } - - /** - * the max size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMaxCropResultSize(int maxCropResultWidth, int maxCropResultHeight) { - mCropOverlayView.setMaxCropResultSize(maxCropResultWidth, maxCropResultHeight); - } - - /** - * Get the amount of degrees the cropping image is rotated cloackwise.
- * - * @return 0-360 - */ - public int getRotatedDegrees() { - return mDegreesRotated; - } - - /** - * Set the amount of degrees the cropping image is rotated cloackwise.
- * - * @param degrees 0-360 - */ - public void setRotatedDegrees(int degrees) { - if (mDegreesRotated != degrees) { - rotateImage(degrees - mDegreesRotated); - } - } - - /** - * whether the aspect ratio is fixed or not; true fixes the aspect ratio, while false allows it to - * be changed. - */ - public boolean isFixAspectRatio() { - return mCropOverlayView.isFixAspectRatio(); - } - - /** - * Sets whether the aspect ratio is fixed or not; true fixes the aspect ratio, while false allows - * it to be changed. - */ - public void setFixedAspectRatio(boolean fixAspectRatio) { - mCropOverlayView.setFixedAspectRatio(fixAspectRatio); - } - - /** - * whether the image should be flipped horizontally - */ - public boolean isFlippedHorizontally() { - return mFlipHorizontally; - } - - /** - * Sets whether the image should be flipped horizontally - */ - public void setFlippedHorizontally(boolean flipHorizontally) { - if (mFlipHorizontally != flipHorizontally) { - mFlipHorizontally = flipHorizontally; - applyImageMatrix(getWidth(), getHeight(), true, false); - } - } - - /** - * whether the image should be flipped vertically - */ - public boolean isFlippedVertically() { - return mFlipVertically; - } - - /** - * Sets whether the image should be flipped vertically - */ - public void setFlippedVertically(boolean flipVertically) { - if (mFlipVertically != flipVertically) { - mFlipVertically = flipVertically; - applyImageMatrix(getWidth(), getHeight(), true, false); - } - } - - /** - * Get the current guidelines option set. - */ - public Guidelines getGuidelines() { - return mCropOverlayView.getGuidelines(); - } - - /** - * Sets the guidelines for the CropOverlayView to be either on, off, or to show when resizing the - * application. - */ - public void setGuidelines(Guidelines guidelines) { - mCropOverlayView.setGuidelines(guidelines); - } - - /** - * both the X and Y values of the aspectRatio. - */ - public Pair getAspectRatio() { - return new Pair<>(mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY()); - } - - /** - * Sets the both the X and Y values of the aspectRatio.
- * Sets fixed aspect ratio to TRUE. - * - * @param aspectRatioX int that specifies the new X value of the aspect ratio - * @param aspectRatioY int that specifies the new Y value of the aspect ratio - */ - public void setAspectRatio(int aspectRatioX, int aspectRatioY) { - mCropOverlayView.setAspectRatioX(aspectRatioX); - mCropOverlayView.setAspectRatioY(aspectRatioY); - setFixedAspectRatio(true); - } - - /** - * Clears set aspect ratio values and sets fixed aspect ratio to FALSE. - */ - public void clearAspectRatio() { - mCropOverlayView.setAspectRatioX(1); - mCropOverlayView.setAspectRatioY(1); - setFixedAspectRatio(false); - } - - /** - * An edge of the crop window will snap to the corresponding edge of a specified bounding box when - * the crop window edge is less than or equal to this distance (in pixels) away from the bounding - * box edge. (default: 3dp) - */ - public void setSnapRadius(float snapRadius) { - if (snapRadius >= 0) { - mCropOverlayView.setSnapRadius(snapRadius); - } - } - - /** - * if to show progress bar when image async loading/cropping is in progress.
- * default: true, disable to provide custom progress bar UI. - */ - public boolean isShowProgressBar() { - return mShowProgressBar; - } - - /** - * if to show progress bar when image async loading/cropping is in progress.
- * default: true, disable to provide custom progress bar UI. - */ - public void setShowProgressBar(boolean showProgressBar) { - if (mShowProgressBar != showProgressBar) { - mShowProgressBar = showProgressBar; - setProgressBarVisibility(); - } - } - - /** - * if to show crop overlay UI what contains the crop window UI surrounded by background over the - * cropping image.
- * default: true, may disable for animation or frame transition. - */ - public boolean isShowCropOverlay() { - return mShowCropOverlay; - } - - /** - * if to show crop overlay UI what contains the crop window UI surrounded by background over the - * cropping image.
- * default: true, may disable for animation or frame transition. - */ - public void setShowCropOverlay(boolean showCropOverlay) { - if (mShowCropOverlay != showCropOverlay) { - mShowCropOverlay = showCropOverlay; - setCropOverlayVisibility(); - } - } - - /** - * if to save bitmap on save instance state.
- * It is best to avoid it by using URI in setting image for cropping.
- * If false the bitmap is not saved and if restore is required to view will be empty, storing the - * bitmap requires saving it to file which can be expensive. default: false. - */ - public boolean isSaveBitmapToInstanceState() { - return mSaveBitmapToInstanceState; - } - - /** - * if to save bitmap on save instance state.
- * It is best to avoid it by using URI in setting image for cropping.
- * If false the bitmap is not saved and if restore is required to view will be empty, storing the - * bitmap requires saving it to file which can be expensive. default: false. - */ - public void setSaveBitmapToInstanceState(boolean saveBitmapToInstanceState) { - mSaveBitmapToInstanceState = saveBitmapToInstanceState; - } - - /** - * Returns the integer of the imageResource - */ - public int getImageResource() { - return mImageResource; - } - - /** - * Sets a Drawable as the content of the CropImageView. - * - * @param resId the drawable resource ID to set - */ - public void setImageResource(int resId) { - if (resId != 0) { - mCropOverlayView.setInitialCropWindowRect(null); - Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId); - setBitmap(bitmap, resId, null, 1, 0); - } - } - - /** - * Get the URI of an image that was set by URI, null otherwise. - */ - public Uri getImageUri() { - return mLoadedImageUri; - } - - /** - * Gets the source Bitmap's dimensions. This represents the largest possible crop rectangle. - * - * @return a Rect instance dimensions of the source Bitmap - */ - public Rect getWholeImageRect() { - int loadedSampleSize = mLoadedSampleSize; - Bitmap bitmap = mBitmap; - if (bitmap == null) { - return null; - } - - int orgWidth = bitmap.getWidth() * loadedSampleSize; - int orgHeight = bitmap.getHeight() * loadedSampleSize; - return new Rect(0, 0, orgWidth, orgHeight); - } - - /** - * Gets the crop window's position relative to the source Bitmap (not the image displayed in the - * CropImageView) using the original image rotation. - * - * @return a Rect instance containing cropped area boundaries of the source Bitmap - */ - public Rect getCropRect() { - int loadedSampleSize = mLoadedSampleSize; - Bitmap bitmap = mBitmap; - if (bitmap == null) { - return null; - } - - // get the points of the crop rectangle adjusted to source bitmap - float[] points = getCropPoints(); - - int orgWidth = bitmap.getWidth() * loadedSampleSize; - int orgHeight = bitmap.getHeight() * loadedSampleSize; - - // get the rectangle for the points (it may be larger than original if rotation is not stright) - return BitmapUtils.getRectFromPoints( - points, - orgWidth, - orgHeight, - mCropOverlayView.isFixAspectRatio(), - mCropOverlayView.getAspectRatioX(), - mCropOverlayView.getAspectRatioY()); - } - - /** - * Set the crop window position and size to the given rectangle.
- * Image to crop must be first set before invoking this, for async - after complete callback. - * - * @param rect window rectangle (position and size) relative to source bitmap - */ - public void setCropRect(Rect rect) { - mCropOverlayView.setInitialCropWindowRect(rect); - } - - /** - * Gets the crop window's position relative to the parent's view at screen. - * - * @return a Rect instance containing cropped area boundaries of the source Bitmap - */ - public RectF getCropWindowRect() { - if (mCropOverlayView == null) { - return null; - } - return mCropOverlayView.getCropWindowRect(); - } - - /** - * Gets the 4 points of crop window's position relative to the source Bitmap (not the image - * displayed in the CropImageView) using the original image rotation.
- * Note: the 4 points may not be a rectangle if the image was rotates to NOT stright angle (!= - * 90/180/270). - * - * @return 4 points (x0,y0,x1,y1,x2,y2,x3,y3) of cropped area boundaries - */ - public float[] getCropPoints() { - - // Get crop window position relative to the displayed image. - RectF cropWindowRect = mCropOverlayView.getCropWindowRect(); - - float[] points = - new float[]{ - cropWindowRect.left, - cropWindowRect.top, - cropWindowRect.right, - cropWindowRect.top, - cropWindowRect.right, - cropWindowRect.bottom, - cropWindowRect.left, - cropWindowRect.bottom - }; - - mImageMatrix.invert(mImageInverseMatrix); - mImageInverseMatrix.mapPoints(points); - - for (int i = 0; i < points.length; i++) { - points[i] *= mLoadedSampleSize; - } - - return points; - } - - /** - * Reset crop window to initial rectangle. - */ - public void resetCropRect() { - mZoom = 1; - mZoomOffsetX = 0; - mZoomOffsetY = 0; - mDegreesRotated = mInitialDegreesRotated; - mFlipHorizontally = false; - mFlipVertically = false; - applyImageMatrix(getWidth(), getHeight(), false, false); - mCropOverlayView.resetCropWindowRect(); - } - - /** - * Gets the cropped image based on the current crop window. - * - * @return a new Bitmap representing the cropped image - */ - public Bitmap getCroppedImage() { - return getCroppedImage(0, 0, RequestSizeOptions.NONE); - } - - /** - * Gets the cropped image based on the current crop window.
- * Uses {@link RequestSizeOptions#RESIZE_INSIDE} option. - * - * @param reqWidth the width to resize the cropped image to - * @param reqHeight the height to resize the cropped image to - * @return a new Bitmap representing the cropped image - */ - public Bitmap getCroppedImage(int reqWidth, int reqHeight) { - return getCroppedImage(reqWidth, reqHeight, RequestSizeOptions.RESIZE_INSIDE); - } - - /** - * Gets the cropped image based on the current crop window.
- * - * @param reqWidth the width to resize the cropped image to (see options) - * @param reqHeight the height to resize the cropped image to (see options) - * @param options the resize method to use, see its documentation - * @return a new Bitmap representing the cropped image - */ - public Bitmap getCroppedImage(int reqWidth, int reqHeight, RequestSizeOptions options) { - Bitmap croppedBitmap = null; - if (mBitmap != null) { - mImageView.clearAnimation(); - - reqWidth = options != RequestSizeOptions.NONE ? reqWidth : 0; - reqHeight = options != RequestSizeOptions.NONE ? reqHeight : 0; - - if (mLoadedImageUri != null - && (mLoadedSampleSize > 1 || options == RequestSizeOptions.SAMPLING)) { - int orgWidth = mBitmap.getWidth() * mLoadedSampleSize; - int orgHeight = mBitmap.getHeight() * mLoadedSampleSize; - BitmapUtils.BitmapSampled bitmapSampled = - BitmapUtils.cropBitmap( - getContext(), - mLoadedImageUri, - getCropPoints(), - mDegreesRotated, - orgWidth, - orgHeight, - mCropOverlayView.isFixAspectRatio(), - mCropOverlayView.getAspectRatioX(), - mCropOverlayView.getAspectRatioY(), - reqWidth, - reqHeight, - mFlipHorizontally, - mFlipVertically); - croppedBitmap = bitmapSampled.bitmap; - } else { - croppedBitmap = - BitmapUtils.cropBitmapObjectHandleOOM( - mBitmap, - getCropPoints(), - mDegreesRotated, - mCropOverlayView.isFixAspectRatio(), - mCropOverlayView.getAspectRatioX(), - mCropOverlayView.getAspectRatioY(), - mFlipHorizontally, - mFlipVertically) - .bitmap; - } - - croppedBitmap = BitmapUtils.resizeBitmap(croppedBitmap, reqWidth, reqHeight, options); - } - - return croppedBitmap; - } - - /** - * Gets the cropped image based on the current crop window.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - */ - public void getCroppedImageAsync() { - getCroppedImageAsync(0, 0, RequestSizeOptions.NONE); - } - - /** - * Gets the cropped image based on the current crop window.
- * Uses {@link RequestSizeOptions#RESIZE_INSIDE} option.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param reqWidth the width to resize the cropped image to - * @param reqHeight the height to resize the cropped image to - */ - public void getCroppedImageAsync(int reqWidth, int reqHeight) { - getCroppedImageAsync(reqWidth, reqHeight, RequestSizeOptions.RESIZE_INSIDE); - } - - /** - * Gets the cropped image based on the current crop window.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param reqWidth the width to resize the cropped image to (see options) - * @param reqHeight the height to resize the cropped image to (see options) - * @param options the resize method to use, see its documentation - */ - public void getCroppedImageAsync(int reqWidth, int reqHeight, RequestSizeOptions options) { - if (mOnCropImageCompleteListener == null) { - throw new IllegalArgumentException("mOnCropImageCompleteListener is not set"); - } - startCropWorkerTask(reqWidth, reqHeight, options, null, null, 0); - } - - /** - * Save the cropped image based on the current crop window to the given uri.
- * Uses JPEG image compression with 90 compression quality.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param saveUri the Android Uri to save the cropped image to - */ - public void saveCroppedImageAsync(Uri saveUri) { - saveCroppedImageAsync(saveUri, Bitmap.CompressFormat.JPEG, 90, 0, 0, RequestSizeOptions.NONE); - } - - /** - * Save the cropped image based on the current crop window to the given uri.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param saveUri the Android Uri to save the cropped image to - * @param saveCompressFormat the compression format to use when writing the image - * @param saveCompressQuality the quality (if applicable) to use when writing the image (0 - 100) - */ - public void saveCroppedImageAsync( - Uri saveUri, Bitmap.CompressFormat saveCompressFormat, int saveCompressQuality) { - saveCroppedImageAsync( - saveUri, saveCompressFormat, saveCompressQuality, 0, 0, RequestSizeOptions.NONE); - } - - /** - * Save the cropped image based on the current crop window to the given uri.
- * Uses {@link RequestSizeOptions#RESIZE_INSIDE} option.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param saveUri the Android Uri to save the cropped image to - * @param saveCompressFormat the compression format to use when writing the image - * @param saveCompressQuality the quality (if applicable) to use when writing the image (0 - 100) - * @param reqWidth the width to resize the cropped image to - * @param reqHeight the height to resize the cropped image to - */ - public void saveCroppedImageAsync( - Uri saveUri, - Bitmap.CompressFormat saveCompressFormat, - int saveCompressQuality, - int reqWidth, - int reqHeight) { - saveCroppedImageAsync( - saveUri, - saveCompressFormat, - saveCompressQuality, - reqWidth, - reqHeight, - RequestSizeOptions.RESIZE_INSIDE); - } - - /** - * Save the cropped image based on the current crop window to the given uri.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param saveUri the Android Uri to save the cropped image to - * @param saveCompressFormat the compression format to use when writing the image - * @param saveCompressQuality the quality (if applicable) to use when writing the image (0 - 100) - * @param reqWidth the width to resize the cropped image to (see options) - * @param reqHeight the height to resize the cropped image to (see options) - * @param options the resize method to use, see its documentation - */ - public void saveCroppedImageAsync( - Uri saveUri, - Bitmap.CompressFormat saveCompressFormat, - int saveCompressQuality, - int reqWidth, - int reqHeight, - RequestSizeOptions options) { - if (mOnCropImageCompleteListener == null) { - throw new IllegalArgumentException("mOnCropImageCompleteListener is not set"); - } - startCropWorkerTask( - reqWidth, reqHeight, options, saveUri, saveCompressFormat, saveCompressQuality); - } - - /** - * Set the callback t - */ - public void setOnSetCropOverlayReleasedListener(OnSetCropOverlayReleasedListener listener) { - mOnCropOverlayReleasedListener = listener; - } - - /** - * Set the callback when the cropping is moved - */ - public void setOnSetCropOverlayMovedListener(OnSetCropOverlayMovedListener listener) { - mOnSetCropOverlayMovedListener = listener; - } - - /** - * Set the callback when the crop window is changed - */ - public void setOnCropWindowChangedListener(OnSetCropWindowChangeListener listener) { - mOnSetCropWindowChangeListener = listener; - } - - /** - * Set the callback to be invoked when image async loading ({@link #setImageUriAsync(Uri)}) is - * complete (successful or failed). - */ - public void setOnSetImageUriCompleteListener(OnSetImageUriCompleteListener listener) { - mOnSetImageUriCompleteListener = listener; - } - - /** - * Set the callback to be invoked when image async cropping image ({@link #getCroppedImageAsync()} - * or {@link #saveCroppedImageAsync(Uri)}) is complete (successful or failed). - */ - public void setOnCropImageCompleteListener(OnCropImageCompleteListener listener) { - mOnCropImageCompleteListener = listener; - } - - /** - * Sets a Bitmap as the content of the CropImageView. - * - * @param bitmap the Bitmap to set - */ - public void setImageBitmap(Bitmap bitmap) { - mCropOverlayView.setInitialCropWindowRect(null); - setBitmap(bitmap, 0, null, 1, 0); - } - - /** - * Sets a Bitmap and initializes the image rotation according to the EXIT data.
- *
- * The EXIF can be retrieved by doing the following: - * ExifInterface exif = new ExifInterface(path); - * - * @param bitmap the original bitmap to set; if null, this - * @param exif the EXIF information about this bitmap; may be null - */ - public void setImageBitmap(Bitmap bitmap, ExifInterface exif) { - Bitmap setBitmap; - int degreesRotated = 0; - if (bitmap != null && exif != null) { - BitmapUtils.RotateBitmapResult result = BitmapUtils.rotateBitmapByExif(bitmap, exif); - setBitmap = result.bitmap; - degreesRotated = result.degrees; - mInitialDegreesRotated = result.degrees; - } else { - setBitmap = bitmap; - } - mCropOverlayView.setInitialCropWindowRect(null); - setBitmap(setBitmap, 0, null, 1, degreesRotated); - } - - /** - * Sets a bitmap loaded from the given Android URI as the content of the CropImageView.
- * Can be used with URI from gallery or camera source.
- * Will rotate the image by exif data.
- * - * @param uri the URI to load the image from - */ - public void setImageUriAsync(Uri uri) { - if (uri != null) { - BitmapLoadingWorkerTask currentTask = - mBitmapLoadingWorkerTask != null ? mBitmapLoadingWorkerTask.get() : null; - if (currentTask != null) { - // cancel previous loading (no check if the same URI because camera URI can be the same for - // different images) - currentTask.cancel(true); - } - - // either no existing task is working or we canceled it, need to load new URI - clearImageInt(); - mRestoreCropWindowRect = null; - mRestoreDegreesRotated = 0; - mCropOverlayView.setInitialCropWindowRect(null); - mBitmapLoadingWorkerTask = new WeakReference<>(new BitmapLoadingWorkerTask(this, uri)); - mBitmapLoadingWorkerTask.get().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - setProgressBarVisibility(); - } - } - - /** - * Clear the current image set for cropping. - */ - public void clearImage() { - clearImageInt(); - mCropOverlayView.setInitialCropWindowRect(null); - } - - /** - * Rotates image by the specified number of degrees clockwise.
- * Negative values represent counter-clockwise rotations. - * - * @param degrees Integer specifying the number of degrees to rotate. - */ - public void rotateImage(int degrees) { - if (mBitmap != null) { - // Force degrees to be a non-zero value between 0 and 360 (inclusive) - if (degrees < 0) { - degrees = (degrees % 360) + 360; - } else { - degrees = degrees % 360; - } - - boolean flipAxes = - !mCropOverlayView.isFixAspectRatio() - && ((degrees > 45 && degrees < 135) || (degrees > 215 && degrees < 305)); - BitmapUtils.RECT.set(mCropOverlayView.getCropWindowRect()); - float halfWidth = (flipAxes ? BitmapUtils.RECT.height() : BitmapUtils.RECT.width()) / 2f; - float halfHeight = (flipAxes ? BitmapUtils.RECT.width() : BitmapUtils.RECT.height()) / 2f; - if (flipAxes) { - boolean isFlippedHorizontally = mFlipHorizontally; - mFlipHorizontally = mFlipVertically; - mFlipVertically = isFlippedHorizontally; - } - - mImageMatrix.invert(mImageInverseMatrix); - - BitmapUtils.POINTS[0] = BitmapUtils.RECT.centerX(); - BitmapUtils.POINTS[1] = BitmapUtils.RECT.centerY(); - BitmapUtils.POINTS[2] = 0; - BitmapUtils.POINTS[3] = 0; - BitmapUtils.POINTS[4] = 1; - BitmapUtils.POINTS[5] = 0; - mImageInverseMatrix.mapPoints(BitmapUtils.POINTS); - - // This is valid because degrees is not negative. - mDegreesRotated = (mDegreesRotated + degrees) % 360; - - applyImageMatrix(getWidth(), getHeight(), true, false); - - // adjust the zoom so the crop window size remains the same even after image scale change - mImageMatrix.mapPoints(BitmapUtils.POINTS2, BitmapUtils.POINTS); - mZoom /= - Math.sqrt( - Math.pow(BitmapUtils.POINTS2[4] - BitmapUtils.POINTS2[2], 2) - + Math.pow(BitmapUtils.POINTS2[5] - BitmapUtils.POINTS2[3], 2)); - mZoom = Math.max(mZoom, 1); - - applyImageMatrix(getWidth(), getHeight(), true, false); - - mImageMatrix.mapPoints(BitmapUtils.POINTS2, BitmapUtils.POINTS); - - // adjust the width/height by the changes in scaling to the image - double change = - Math.sqrt( - Math.pow(BitmapUtils.POINTS2[4] - BitmapUtils.POINTS2[2], 2) - + Math.pow(BitmapUtils.POINTS2[5] - BitmapUtils.POINTS2[3], 2)); - halfWidth *= change; - halfHeight *= change; - - // calculate the new crop window rectangle to center in the same location and have proper - // width/height - BitmapUtils.RECT.set( - BitmapUtils.POINTS2[0] - halfWidth, - BitmapUtils.POINTS2[1] - halfHeight, - BitmapUtils.POINTS2[0] + halfWidth, - BitmapUtils.POINTS2[1] + halfHeight); - - mCropOverlayView.resetCropOverlayView(); - mCropOverlayView.setCropWindowRect(BitmapUtils.RECT); - applyImageMatrix(getWidth(), getHeight(), true, false); - handleCropWindowChanged(false, false); - - // make sure the crop window rectangle is within the cropping image bounds after all the - // changes - mCropOverlayView.fixCurrentCropWindowRect(); - } - } - - /** - * Flips the image horizontally. - */ - public void flipImageHorizontally() { - mFlipHorizontally = !mFlipHorizontally; - applyImageMatrix(getWidth(), getHeight(), true, false); - } - - // region: Private methods - - /** - * Flips the image vertically. - */ - public void flipImageVertically() { - mFlipVertically = !mFlipVertically; - applyImageMatrix(getWidth(), getHeight(), true, false); - } - - /** - * On complete of the async bitmap loading by {@link #setImageUriAsync(Uri)} set the result to the - * widget if still relevant and call listener if set. - * - * @param result the result of bitmap loading - */ - void onSetImageUriAsyncComplete(BitmapLoadingWorkerTask.Result result) { - - mBitmapLoadingWorkerTask = null; - setProgressBarVisibility(); - - if (result.error == null) { - mInitialDegreesRotated = result.degreesRotated; - setBitmap(result.bitmap, 0, result.uri, result.loadSampleSize, result.degreesRotated); - } - - OnSetImageUriCompleteListener listener = mOnSetImageUriCompleteListener; - if (listener != null) { - listener.onSetImageUriComplete(this, result.uri, result.error); - } - } - - /** - * On complete of the async bitmap cropping by {@link #getCroppedImageAsync()} call listener if - * set. - * - * @param result the result of bitmap cropping - */ - void onImageCroppingAsyncComplete(BitmapCroppingWorkerTask.Result result) { - - mBitmapCroppingWorkerTask = null; - setProgressBarVisibility(); - - OnCropImageCompleteListener listener = mOnCropImageCompleteListener; - if (listener != null) { - CropResult cropResult = - new CropResult( - mBitmap, - mLoadedImageUri, - result.bitmap, - result.uri, - result.error, - getCropPoints(), - getCropRect(), - getWholeImageRect(), - getRotatedDegrees(), - result.sampleSize); - listener.onCropImageComplete(this, cropResult); - } - } - - /** - * Set the given bitmap to be used in for cropping
- * Optionally clear full if the bitmap is new, or partial clear if the bitmap has been - * manipulated. - */ - private void setBitmap( - Bitmap bitmap, int imageResource, Uri imageUri, int loadSampleSize, int degreesRotated) { - if (mBitmap == null || !mBitmap.equals(bitmap)) { - - mImageView.clearAnimation(); - - clearImageInt(); - - mBitmap = bitmap; - mImageView.setImageBitmap(mBitmap); - - mLoadedImageUri = imageUri; - mImageResource = imageResource; - mLoadedSampleSize = loadSampleSize; - mDegreesRotated = degreesRotated; - - applyImageMatrix(getWidth(), getHeight(), true, false); - - if (mCropOverlayView != null) { - mCropOverlayView.resetCropOverlayView(); - setCropOverlayVisibility(); - } - } - } - - /** - * Clear the current image set for cropping.
- * Full clear will also clear the data of the set image like Uri or Resource id while partial - * clear will only clear the bitmap and recycle if required. - */ - private void clearImageInt() { - - // if we allocated the bitmap, release it as fast as possible - if (mBitmap != null && (mImageResource > 0 || mLoadedImageUri != null)) { - mBitmap.recycle(); - } - mBitmap = null; - - // clean the loaded image flags for new image - mImageResource = 0; - mLoadedImageUri = null; - mLoadedSampleSize = 1; - mDegreesRotated = 0; - mZoom = 1; - mZoomOffsetX = 0; - mZoomOffsetY = 0; - mImageMatrix.reset(); - mSaveInstanceStateBitmapUri = null; - - mImageView.setImageBitmap(null); - - setCropOverlayVisibility(); - } - - /** - * Gets the cropped image based on the current crop window.
- * If (reqWidth,reqHeight) is given AND image is loaded from URI cropping will try to use sample - * size to fit in the requested width and height down-sampling if possible - optimization to get - * best size to quality.
- * The result will be invoked to listener set by {@link - * #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - * - * @param reqWidth the width to resize the cropped image to (see options) - * @param reqHeight the height to resize the cropped image to (see options) - * @param options the resize method to use on the cropped bitmap - * @param saveUri optional: to save the cropped image to - * @param saveCompressFormat if saveUri is given, the given compression will be used for saving - * the image - * @param saveCompressQuality if saveUri is given, the given quality will be used for the - * compression. - */ - public void startCropWorkerTask( - int reqWidth, - int reqHeight, - RequestSizeOptions options, - Uri saveUri, - Bitmap.CompressFormat saveCompressFormat, - int saveCompressQuality) { - Bitmap bitmap = mBitmap; - if (bitmap != null) { - mImageView.clearAnimation(); - - BitmapCroppingWorkerTask currentTask = - mBitmapCroppingWorkerTask != null ? mBitmapCroppingWorkerTask.get() : null; - if (currentTask != null) { - // cancel previous cropping - currentTask.cancel(true); - } - - reqWidth = options != RequestSizeOptions.NONE ? reqWidth : 0; - reqHeight = options != RequestSizeOptions.NONE ? reqHeight : 0; - - int orgWidth = bitmap.getWidth() * mLoadedSampleSize; - int orgHeight = bitmap.getHeight() * mLoadedSampleSize; - if (mLoadedImageUri != null - && (mLoadedSampleSize > 1 || options == RequestSizeOptions.SAMPLING)) { - mBitmapCroppingWorkerTask = - new WeakReference<>( - new BitmapCroppingWorkerTask( - this, - mLoadedImageUri, - getCropPoints(), - mDegreesRotated, - orgWidth, - orgHeight, - mCropOverlayView.isFixAspectRatio(), - mCropOverlayView.getAspectRatioX(), - mCropOverlayView.getAspectRatioY(), - reqWidth, - reqHeight, - mFlipHorizontally, - mFlipVertically, - options, - saveUri, - saveCompressFormat, - saveCompressQuality)); - } else { - mBitmapCroppingWorkerTask = - new WeakReference<>( - new BitmapCroppingWorkerTask( - this, - bitmap, - getCropPoints(), - mDegreesRotated, - mCropOverlayView.isFixAspectRatio(), - mCropOverlayView.getAspectRatioX(), - mCropOverlayView.getAspectRatioY(), - reqWidth, - reqHeight, - mFlipHorizontally, - mFlipVertically, - options, - saveUri, - saveCompressFormat, - saveCompressQuality)); - } - mBitmapCroppingWorkerTask.get().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - setProgressBarVisibility(); - } - } - - @Override - public Parcelable onSaveInstanceState() { - if (mLoadedImageUri == null && mBitmap == null && mImageResource < 1) { - return super.onSaveInstanceState(); - } - - Bundle bundle = new Bundle(); - Uri imageUri = mLoadedImageUri; - if (mSaveBitmapToInstanceState && imageUri == null && mImageResource < 1) { - mSaveInstanceStateBitmapUri = - imageUri = - BitmapUtils.writeTempStateStoreBitmap( - getContext(), mBitmap, mSaveInstanceStateBitmapUri); - } - if (imageUri != null && mBitmap != null) { - String key = UUID.randomUUID().toString(); - BitmapUtils.mStateBitmap = new Pair<>(key, new WeakReference<>(mBitmap)); - bundle.putString("LOADED_IMAGE_STATE_BITMAP_KEY", key); - } - if (mBitmapLoadingWorkerTask != null) { - BitmapLoadingWorkerTask task = mBitmapLoadingWorkerTask.get(); - if (task != null) { - bundle.putParcelable("LOADING_IMAGE_URI", task.getUri()); - } - } - bundle.putParcelable("instanceState", super.onSaveInstanceState()); - bundle.putParcelable("LOADED_IMAGE_URI", imageUri); - bundle.putInt("LOADED_IMAGE_RESOURCE", mImageResource); - bundle.putInt("LOADED_SAMPLE_SIZE", mLoadedSampleSize); - bundle.putInt("DEGREES_ROTATED", mDegreesRotated); - bundle.putParcelable("INITIAL_CROP_RECT", mCropOverlayView.getInitialCropWindowRect()); - - BitmapUtils.RECT.set(mCropOverlayView.getCropWindowRect()); - - mImageMatrix.invert(mImageInverseMatrix); - mImageInverseMatrix.mapRect(BitmapUtils.RECT); - - bundle.putParcelable("CROP_WINDOW_RECT", BitmapUtils.RECT); - bundle.putString("CROP_SHAPE", mCropOverlayView.getCropShape().name()); - bundle.putBoolean("CROP_AUTO_ZOOM_ENABLED", mAutoZoomEnabled); - bundle.putInt("CROP_MAX_ZOOM", mMaxZoom); - bundle.putBoolean("CROP_FLIP_HORIZONTALLY", mFlipHorizontally); - bundle.putBoolean("CROP_FLIP_VERTICALLY", mFlipVertically); - - return bundle; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - - if (state instanceof Bundle) { - Bundle bundle = (Bundle) state; - - // prevent restoring state if already set by outside code - if (mBitmapLoadingWorkerTask == null - && mLoadedImageUri == null - && mBitmap == null - && mImageResource == 0) { - - Uri uri = bundle.getParcelable("LOADED_IMAGE_URI"); - if (uri != null) { - String key = bundle.getString("LOADED_IMAGE_STATE_BITMAP_KEY"); - if (key != null) { - Bitmap stateBitmap = - BitmapUtils.mStateBitmap != null && BitmapUtils.mStateBitmap.first.equals(key) - ? BitmapUtils.mStateBitmap.second.get() - : null; - BitmapUtils.mStateBitmap = null; - if (stateBitmap != null && !stateBitmap.isRecycled()) { - setBitmap(stateBitmap, 0, uri, bundle.getInt("LOADED_SAMPLE_SIZE"), 0); - } - } - if (mLoadedImageUri == null) { - setImageUriAsync(uri); - } - } else { - int resId = bundle.getInt("LOADED_IMAGE_RESOURCE"); - if (resId > 0) { - setImageResource(resId); - } else { - uri = bundle.getParcelable("LOADING_IMAGE_URI"); - if (uri != null) { - setImageUriAsync(uri); - } - } - } - - mDegreesRotated = mRestoreDegreesRotated = bundle.getInt("DEGREES_ROTATED"); - - Rect initialCropRect = bundle.getParcelable("INITIAL_CROP_RECT"); - if (initialCropRect != null - && (initialCropRect.width() > 0 || initialCropRect.height() > 0)) { - mCropOverlayView.setInitialCropWindowRect(initialCropRect); - } - - RectF cropWindowRect = bundle.getParcelable("CROP_WINDOW_RECT"); - if (cropWindowRect != null && (cropWindowRect.width() > 0 || cropWindowRect.height() > 0)) { - mRestoreCropWindowRect = cropWindowRect; - } - - mCropOverlayView.setCropShape(CropShape.valueOf(bundle.getString("CROP_SHAPE"))); - - mAutoZoomEnabled = bundle.getBoolean("CROP_AUTO_ZOOM_ENABLED"); - mMaxZoom = bundle.getInt("CROP_MAX_ZOOM"); - - mFlipHorizontally = bundle.getBoolean("CROP_FLIP_HORIZONTALLY"); - mFlipVertically = bundle.getBoolean("CROP_FLIP_VERTICALLY"); - } - - super.onRestoreInstanceState(bundle.getParcelable("instanceState")); - } else { - super.onRestoreInstanceState(state); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); - - if (mBitmap != null) { - - // Bypasses a baffling bug when used within a ScrollView, where heightSize is set to 0. - if (heightSize == 0) { - heightSize = mBitmap.getHeight(); - } - - int desiredWidth; - int desiredHeight; - - double viewToBitmapWidthRatio = Double.POSITIVE_INFINITY; - double viewToBitmapHeightRatio = Double.POSITIVE_INFINITY; - - // Checks if either width or height needs to be fixed - if (widthSize < mBitmap.getWidth()) { - viewToBitmapWidthRatio = (double) widthSize / (double) mBitmap.getWidth(); - } - if (heightSize < mBitmap.getHeight()) { - viewToBitmapHeightRatio = (double) heightSize / (double) mBitmap.getHeight(); - } - - // If either needs to be fixed, choose smallest ratio and calculate from there - if (viewToBitmapWidthRatio != Double.POSITIVE_INFINITY - || viewToBitmapHeightRatio != Double.POSITIVE_INFINITY) { - if (viewToBitmapWidthRatio <= viewToBitmapHeightRatio) { - desiredWidth = widthSize; - desiredHeight = (int) (mBitmap.getHeight() * viewToBitmapWidthRatio); - } else { - desiredHeight = heightSize; - desiredWidth = (int) (mBitmap.getWidth() * viewToBitmapHeightRatio); - } - } else { - // Otherwise, the picture is within frame layout bounds. Desired width is simply picture - // size - desiredWidth = mBitmap.getWidth(); - desiredHeight = mBitmap.getHeight(); - } - - int width = getOnMeasureSpec(widthMode, widthSize, desiredWidth); - int height = getOnMeasureSpec(heightMode, heightSize, desiredHeight); - - mLayoutWidth = width; - mLayoutHeight = height; - - setMeasuredDimension(mLayoutWidth, mLayoutHeight); - - } else { - setMeasuredDimension(widthSize, heightSize); - } - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - - super.onLayout(changed, l, t, r, b); - - if (mLayoutWidth > 0 && mLayoutHeight > 0) { - // Gets original parameters, and creates the new parameters - ViewGroup.LayoutParams origParams = this.getLayoutParams(); - origParams.width = mLayoutWidth; - origParams.height = mLayoutHeight; - setLayoutParams(origParams); - - if (mBitmap != null) { - applyImageMatrix(r - l, b - t, true, false); - - // after state restore we want to restore the window crop, possible only after widget size - // is known - if (mRestoreCropWindowRect != null) { - if (mRestoreDegreesRotated != mInitialDegreesRotated) { - mDegreesRotated = mRestoreDegreesRotated; - applyImageMatrix(r - l, b - t, true, false); - } - mImageMatrix.mapRect(mRestoreCropWindowRect); - mCropOverlayView.setCropWindowRect(mRestoreCropWindowRect); - handleCropWindowChanged(false, false); - mCropOverlayView.fixCurrentCropWindowRect(); - mRestoreCropWindowRect = null; - } else if (mSizeChanged) { - mSizeChanged = false; - handleCropWindowChanged(false, false); - } - } else { - updateImageBounds(true); - } - } else { - updateImageBounds(true); - } - } - - /** - * Detect size change to handle auto-zoom using {@link #handleCropWindowChanged(boolean, boolean)} - * in {@link #layout(int, int, int, int)}. - */ - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - mSizeChanged = oldw > 0 && oldh > 0; - } - - /** - * Handle crop window change to:
- * 1. Execute auto-zoom-in/out depending on the area covered of cropping window relative to the - * available view area.
- * 2. Slide the zoomed sub-area if the cropping window is outside of the visible view sub-area. - *
- * - * @param inProgress is the crop window change is still in progress by the user - * @param animate if to animate the change to the image matrix, or set it directly - */ - private void handleCropWindowChanged(boolean inProgress, boolean animate) { - int width = getWidth(); - int height = getHeight(); - if (mBitmap != null && width > 0 && height > 0) { - - RectF cropRect = mCropOverlayView.getCropWindowRect(); - if (inProgress) { - if (cropRect.left < 0 - || cropRect.top < 0 - || cropRect.right > width - || cropRect.bottom > height) { - applyImageMatrix(width, height, false, false); - } - } else if (mAutoZoomEnabled || mZoom > 1) { - float newZoom = 0; - // keep the cropping window covered area to 50%-65% of zoomed sub-area - if (mZoom < mMaxZoom - && cropRect.width() < width * 0.5f - && cropRect.height() < height * 0.5f) { - newZoom = - Math.min( - mMaxZoom, - Math.min( - width / (cropRect.width() / mZoom / 0.64f), - height / (cropRect.height() / mZoom / 0.64f))); - } - if (mZoom > 1 && (cropRect.width() > width * 0.65f || cropRect.height() > height * 0.65f)) { - newZoom = - Math.max( - 1, - Math.min( - width / (cropRect.width() / mZoom / 0.51f), - height / (cropRect.height() / mZoom / 0.51f))); - } - if (!mAutoZoomEnabled) { - newZoom = 1; - } - - if (newZoom > 0 && newZoom != mZoom) { - if (animate) { - if (mAnimation == null) { - // lazy create animation single instance - mAnimation = new CropImageAnimation(mImageView, mCropOverlayView); - } - // set the state for animation to start from - mAnimation.setStartState(mImagePoints, mImageMatrix); - } - - mZoom = newZoom; - - applyImageMatrix(width, height, true, animate); - } - } - if (mOnSetCropWindowChangeListener != null && !inProgress) { - mOnSetCropWindowChangeListener.onCropWindowChanged(); - } - } - } - - /** - * Apply matrix to handle the image inside the image view. - * - * @param width the width of the image view - * @param height the height of the image view - */ - private void applyImageMatrix(float width, float height, boolean center, boolean animate) { - if (mBitmap != null && width > 0 && height > 0) { - - mImageMatrix.invert(mImageInverseMatrix); - RectF cropRect = mCropOverlayView.getCropWindowRect(); - mImageInverseMatrix.mapRect(cropRect); - - mImageMatrix.reset(); - - // move the image to the center of the image view first so we can manipulate it from there - mImageMatrix.postTranslate( - (width - mBitmap.getWidth()) / 2, (height - mBitmap.getHeight()) / 2); - mapImagePointsByImageMatrix(); - - // rotate the image the required degrees from center of image - if (mDegreesRotated > 0) { - mImageMatrix.postRotate( - mDegreesRotated, - BitmapUtils.getRectCenterX(mImagePoints), - BitmapUtils.getRectCenterY(mImagePoints)); - mapImagePointsByImageMatrix(); - } - - // scale the image to the image view, image rect transformed to know new width/height - float scale = - Math.min( - width / BitmapUtils.getRectWidth(mImagePoints), - height / BitmapUtils.getRectHeight(mImagePoints)); - if (mScaleType == ScaleType.FIT_CENTER - || (mScaleType == ScaleType.CENTER_INSIDE && scale < 1) - || (scale > 1 && mAutoZoomEnabled)) { - mImageMatrix.postScale( - scale, - scale, - BitmapUtils.getRectCenterX(mImagePoints), - BitmapUtils.getRectCenterY(mImagePoints)); - mapImagePointsByImageMatrix(); - } - - // scale by the current zoom level - float scaleX = mFlipHorizontally ? -mZoom : mZoom; - float scaleY = mFlipVertically ? -mZoom : mZoom; - mImageMatrix.postScale( - scaleX, - scaleY, - BitmapUtils.getRectCenterX(mImagePoints), - BitmapUtils.getRectCenterY(mImagePoints)); - mapImagePointsByImageMatrix(); - - mImageMatrix.mapRect(cropRect); - - if (center) { - // set the zoomed area to be as to the center of cropping window as possible - mZoomOffsetX = - width > BitmapUtils.getRectWidth(mImagePoints) - ? 0 - : Math.max( - Math.min( - width / 2 - cropRect.centerX(), -BitmapUtils.getRectLeft(mImagePoints)), - getWidth() - BitmapUtils.getRectRight(mImagePoints)) - / scaleX; - mZoomOffsetY = - height > BitmapUtils.getRectHeight(mImagePoints) - ? 0 - : Math.max( - Math.min( - height / 2 - cropRect.centerY(), -BitmapUtils.getRectTop(mImagePoints)), - getHeight() - BitmapUtils.getRectBottom(mImagePoints)) - / scaleY; - } else { - // adjust the zoomed area so the crop window rectangle will be inside the area in case it - // was moved outside - mZoomOffsetX = - Math.min(Math.max(mZoomOffsetX * scaleX, -cropRect.left), -cropRect.right + width) - / scaleX; - mZoomOffsetY = - Math.min(Math.max(mZoomOffsetY * scaleY, -cropRect.top), -cropRect.bottom + height) - / scaleY; - } - - // apply to zoom offset translate and update the crop rectangle to offset correctly - mImageMatrix.postTranslate(mZoomOffsetX * scaleX, mZoomOffsetY * scaleY); - cropRect.offset(mZoomOffsetX * scaleX, mZoomOffsetY * scaleY); - mCropOverlayView.setCropWindowRect(cropRect); - mapImagePointsByImageMatrix(); - mCropOverlayView.invalidate(); - - // set matrix to apply - if (animate) { - // set the state for animation to end in, start animation now - mAnimation.setEndState(mImagePoints, mImageMatrix); - mImageView.startAnimation(mAnimation); - } else { - mImageView.setImageMatrix(mImageMatrix); - } - - // update the image rectangle in the crop overlay - updateImageBounds(false); - } - } - - /** - * Adjust the given image rectangle by image transformation matrix to know the final rectangle of - * the image.
- * To get the proper rectangle it must be first reset to original image rectangle. - */ - private void mapImagePointsByImageMatrix() { - mImagePoints[0] = 0; - mImagePoints[1] = 0; - mImagePoints[2] = mBitmap.getWidth(); - mImagePoints[3] = 0; - mImagePoints[4] = mBitmap.getWidth(); - mImagePoints[5] = mBitmap.getHeight(); - mImagePoints[6] = 0; - mImagePoints[7] = mBitmap.getHeight(); - mImageMatrix.mapPoints(mImagePoints); - mScaleImagePoints[0] = 0; - mScaleImagePoints[1] = 0; - mScaleImagePoints[2] = 100; - mScaleImagePoints[3] = 0; - mScaleImagePoints[4] = 100; - mScaleImagePoints[5] = 100; - mScaleImagePoints[6] = 0; - mScaleImagePoints[7] = 100; - mImageMatrix.mapPoints(mScaleImagePoints); - } - - /** - * Set visibility of crop overlay to hide it when there is no image or specificly set by client. - */ - private void setCropOverlayVisibility() { - if (mCropOverlayView != null) { - mCropOverlayView.setVisibility(mShowCropOverlay && mBitmap != null ? VISIBLE : INVISIBLE); - } - } - - /** - * Set visibility of progress bar when async loading/cropping is in process and show is enabled. - */ - private void setProgressBarVisibility() { - boolean visible = - mShowProgressBar - && (mBitmap == null && mBitmapLoadingWorkerTask != null - || mBitmapCroppingWorkerTask != null); - mProgressBar.setVisibility(visible ? VISIBLE : INVISIBLE); - } - - /** - * Update the scale factor between the actual image bitmap and the shown image.
- */ - private void updateImageBounds(boolean clear) { - if (mBitmap != null && !clear) { - - // Get the scale factor between the actual Bitmap dimensions and the displayed dimensions for - // width/height. - float scaleFactorWidth = - 100f * mLoadedSampleSize / BitmapUtils.getRectWidth(mScaleImagePoints); - float scaleFactorHeight = - 100f * mLoadedSampleSize / BitmapUtils.getRectHeight(mScaleImagePoints); - mCropOverlayView.setCropWindowLimits( - getWidth(), getHeight(), scaleFactorWidth, scaleFactorHeight); - } - - // set the bitmap rectangle and update the crop window after scale factor is set - mCropOverlayView.setBounds(clear ? null : mImagePoints, getWidth(), getHeight()); - } - // endregion - - // region: Inner class: CropShape - - /** - * The possible cropping area shape.
- * To set square/circle crop shape set aspect ratio to 1:1. - */ - public enum CropShape { - RECTANGLE, - OVAL - } - // endregion - - // region: Inner class: ScaleType - - /** - * Options for scaling the bounds of cropping image to the bounds of Crop Image View.
- * Note: Some options are affected by auto-zoom, if enabled. - */ - public enum ScaleType { - - /** - * Scale the image uniformly (maintain the image's aspect ratio) to fit in crop image view.
- * The largest dimension will be equals to crop image view and the second dimension will be - * smaller. - */ - FIT_CENTER, - - /** - * Center the image in the view, but perform no scaling.
- * Note: If auto-zoom is enabled and the source image is smaller than crop image view then it - * will be scaled uniformly to fit the crop image view. - */ - CENTER, - - /** - * Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width - * and height) of the image will be equal to or larger than the corresponding dimension - * of the view (minus padding).
- * The image is then centered in the view. - */ - CENTER_CROP, - - /** - * Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width - * and height) of the image will be equal to or less than the corresponding dimension of - * the view (minus padding).
- * The image is then centered in the view.
- * Note: If auto-zoom is enabled and the source image is smaller than crop image view then it - * will be scaled uniformly to fit the crop image view. - */ - CENTER_INSIDE - } - // endregion - - // region: Inner class: Guidelines - - /** - * The possible guidelines showing types. - */ - public enum Guidelines { - /** - * Never show - */ - OFF, - - /** - * Show when crop move action is live - */ - ON_TOUCH, - - /** - * Always show - */ - ON - } - // endregion - - // region: Inner class: RequestSizeOptions - - /** - * Possible options for handling requested width/height for cropping. - */ - public enum RequestSizeOptions { - - /** - * No resize/sampling is done unless required for memory management (OOM). - */ - NONE, - - /** - * Only sample the image during loading (if image set using URI) so the smallest of the image - * dimensions will be between the requested size and x2 requested size.
- * NOTE: resulting image will not be exactly requested width/height see: Loading - * Large Bitmaps Efficiently. - */ - SAMPLING, - - /** - * Resize the image uniformly (maintain the image's aspect ratio) so that both dimensions (width - * and height) of the image will be equal to or less than the corresponding requested - * dimension.
- * If the image is smaller than the requested size it will NOT change. - */ - RESIZE_INSIDE, - - /** - * Resize the image uniformly (maintain the image's aspect ratio) to fit in the given - * width/height.
- * The largest dimension will be equals to the requested and the second dimension will be - * smaller.
- * If the image is smaller than the requested size it will enlarge it. - */ - RESIZE_FIT, - - /** - * Resize the image to fit exactly in the given width/height.
- * This resize method does NOT preserve aspect ratio.
- * If the image is smaller than the requested size it will enlarge it. - */ - RESIZE_EXACT - } - // endregion - - // region: Inner class: OnSetImageUriCompleteListener - - /** - * Interface definition for a callback to be invoked when the crop overlay is released. - */ - public interface OnSetCropOverlayReleasedListener { - - /** - * Called when the crop overlay changed listener is called and inProgress is false. - * - * @param rect The rect coordinates of the cropped overlay - */ - void onCropOverlayReleased(Rect rect); - } - - /** - * Interface definition for a callback to be invoked when the crop overlay is released. - */ - public interface OnSetCropOverlayMovedListener { - - /** - * Called when the crop overlay is moved - * - * @param rect The rect coordinates of the cropped overlay - */ - void onCropOverlayMoved(Rect rect); - } - - /** - * Interface definition for a callback to be invoked when the crop overlay is released. - */ - public interface OnSetCropWindowChangeListener { - - /** - * Called when the crop window is changed - */ - void onCropWindowChanged(); - } - - /** - * Interface definition for a callback to be invoked when image async loading is complete. - */ - public interface OnSetImageUriCompleteListener { - - /** - * Called when a crop image view has completed loading image for cropping.
- * If loading failed error parameter will contain the error. - * - * @param view The crop image view that loading of image was complete. - * @param uri the URI of the image that was loading - * @param error if error occurred during loading will contain the error, otherwise null. - */ - void onSetImageUriComplete(CropImageView view, Uri uri, Exception error); - } - // endregion - - // region: Inner class: OnGetCroppedImageCompleteListener - - /** - * Interface definition for a callback to be invoked when image async crop is complete. - */ - public interface OnCropImageCompleteListener { - - /** - * Called when a crop image view has completed cropping image.
- * Result object contains the cropped bitmap, saved cropped image uri, crop points data or the - * error occured during cropping. - * - * @param view The crop image view that cropping of image was complete. - * @param result the crop image result data (with cropped image or error) - */ - void onCropImageComplete(CropImageView view, CropResult result); - } - // endregion - - // region: Inner class: ActivityResult - - /** - * Result data of crop image. - */ - public static class CropResult { - - /** - * The image bitmap of the original image loaded for cropping.
- * Null if uri used to load image or activity result is used. - */ - private final Bitmap mOriginalBitmap; - - /** - * The Android uri of the original image loaded for cropping.
- * Null if bitmap was used to load image. - */ - private final Uri mOriginalUri; - - /** - * The cropped image bitmap result.
- * Null if save cropped image was executed, no output requested or failure. - */ - private final Bitmap mBitmap; - - /** - * The Android uri of the saved cropped image result.
- * Null if get cropped image was executed, no output requested or failure. - */ - private final Uri mUri; - - /** - * The error that failed the loading/cropping (null if successful) - */ - private final Exception mError; - - /** - * The 4 points of the cropping window in the source image - */ - private final float[] mCropPoints; - - /** - * The rectangle of the cropping window in the source image - */ - private final Rect mCropRect; - - /** - * The rectangle of the source image dimensions - */ - private final Rect mWholeImageRect; - - /** - * The final rotation of the cropped image relative to source - */ - private final int mRotation; - - /** - * sample size used creating the crop bitmap to lower its size - */ - private final int mSampleSize; - - CropResult( - Bitmap originalBitmap, - Uri originalUri, - Bitmap bitmap, - Uri uri, - Exception error, - float[] cropPoints, - Rect cropRect, - Rect wholeImageRect, - int rotation, - int sampleSize) { - mOriginalBitmap = originalBitmap; - mOriginalUri = originalUri; - mBitmap = bitmap; - mUri = uri; - mError = error; - mCropPoints = cropPoints; - mCropRect = cropRect; - mWholeImageRect = wholeImageRect; - mRotation = rotation; - mSampleSize = sampleSize; - } - - /** - * The image bitmap of the original image loaded for cropping.
- * Null if uri used to load image or activity result is used. - */ - public Bitmap getOriginalBitmap() { - return mOriginalBitmap; - } - - /** - * The Android uri of the original image loaded for cropping.
- * Null if bitmap was used to load image. - */ - public Uri getOriginalUri() { - return mOriginalUri; - } - - /** - * Is the result is success or error. - */ - public boolean isSuccessful() { - return mError == null; - } - - /** - * The cropped image bitmap result.
- * Null if save cropped image was executed, no output requested or failure. - */ - public Bitmap getBitmap() { - return mBitmap; - } - - /** - * The Android uri of the saved cropped image result Null if get cropped image was executed, no - * output requested or failure. - */ - public Uri getUri() { - return mUri; - } - - /** - * The error that failed the loading/cropping (null if successful) - */ - public Exception getError() { - return mError; - } - - /** - * The 4 points of the cropping window in the source image - */ - public float[] getCropPoints() { - return mCropPoints; - } - - /** - * The rectangle of the cropping window in the source image - */ - public Rect getCropRect() { - return mCropRect; - } - - /** - * The rectangle of the source image dimensions - */ - public Rect getWholeImageRect() { - return mWholeImageRect; - } - - /** - * The final rotation of the cropped image relative to source - */ - public int getRotation() { - return mRotation; - } - - /** - * sample size used creating the crop bitmap to lower its size - */ - public int getSampleSize() { - return mSampleSize; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java deleted file mode 100644 index 2a774fe6..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java +++ /dev/null @@ -1,1118 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.annotation.TargetApi; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Region; -import android.os.Build; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; -import android.view.View; - -import java.util.Arrays; - -/** - * A custom View representing the crop window and the shaded background outside the crop window. - */ -public class CropOverlayView extends View { - - // region: Fields and Consts - - /** - * Handler from crop window stuff, moving and knowing possition. - */ - private final CropWindowHandler mCropWindowHandler = new CropWindowHandler(); - /** - * Rectangle used for drawing - */ - private final RectF mDrawRect = new RectF(); - /** - * Used for oval crop window shape or non-straight rotation drawing. - */ - private final Path mPath = new Path(); - /** - * The bounding box around the Bitmap that we are cropping. - */ - private final float[] mBoundsPoints = new float[8]; - /** - * The bounding box around the Bitmap that we are cropping. - */ - private final RectF mCalcBounds = new RectF(); - /** - * the initial crop window rectangle to set - */ - private final Rect mInitialCropWindowRect = new Rect(); - /** - * Gesture detector used for multi touch box scaling - */ - private ScaleGestureDetector mScaleDetector; - /** - * Boolean to see if multi touch is enabled for the crop rectangle - */ - private boolean mMultiTouchEnabled; - /** - * Listener to publicj crop window changes - */ - private CropWindowChangeListener mCropWindowChangeListener; - /** - * The Paint used to draw the white rectangle around the crop area. - */ - private Paint mBorderPaint; - /** - * The Paint used to draw the corners of the Border - */ - private Paint mBorderCornerPaint; - /** - * The Paint used to draw the guidelines within the crop area when pressed. - */ - private Paint mGuidelinePaint; - /** - * The Paint used to darken the surrounding areas outside the crop area. - */ - private Paint mBackgroundPaint; - /** - * The bounding image view width used to know the crop overlay is at view edges. - */ - private int mViewWidth; - /** - * The bounding image view height used to know the crop overlay is at view edges. - */ - private int mViewHeight; - /** - * The offset to draw the border corener from the border - */ - private float mBorderCornerOffset; - /** - * the length of the border corner to draw - */ - private float mBorderCornerLength; - /** - * The initial crop window padding from image borders - */ - private float mInitialCropWindowPaddingRatio; - /** - * The radius of the touch zone (in pixels) around a given Handle. - */ - private float mTouchRadius; - /** - * An edge of the crop window will snap to the corresponding edge of a specified bounding box when - * the crop window edge is less than or equal to this distance (in pixels) away from the bounding - * box edge. - */ - private float mSnapRadius; - /** - * The Handle that is currently pressed; null if no Handle is pressed. - */ - private CropWindowMoveHandler mMoveHandler; - /** - * Flag indicating if the crop area should always be a certain aspect ratio (indicated by - * mTargetAspectRatio). - */ - private boolean mFixAspectRatio; - /** - * save the current aspect ratio of the image - */ - private int mAspectRatioX; - /** - * save the current aspect ratio of the image - */ - private int mAspectRatioY; - /** - * The aspect ratio that the crop area should maintain; this variable is only used when - * mMaintainAspectRatio is true. - */ - private float mTargetAspectRatio = ((float) mAspectRatioX) / mAspectRatioY; - /** - * Instance variables for customizable attributes - */ - private CropImageView.Guidelines mGuidelines; - /** - * The shape of the cropping area - rectangle/circular. - */ - private CropImageView.CropShape mCropShape; - /** - * Whether the Crop View has been initialized for the first time - */ - private boolean initializedCropWindow; - - /** - * Used to set back LayerType after changing to software. - */ - private Integer mOriginalLayerType; - // endregion - - public CropOverlayView(Context context) { - this(context, null); - } - - public CropOverlayView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - /** - * Creates the Paint object for drawing. - */ - private static Paint getNewPaint(int color) { - Paint paint = new Paint(); - paint.setColor(color); - return paint; - } - - /** - * Creates the Paint object for given thickness and color, if thickness < 0 return null. - */ - private static Paint getNewPaintOrNull(float thickness, int color) { - if (thickness > 0) { - Paint borderPaint = new Paint(); - borderPaint.setColor(color); - borderPaint.setStrokeWidth(thickness); - borderPaint.setStyle(Paint.Style.STROKE); - borderPaint.setAntiAlias(true); - return borderPaint; - } else { - return null; - } - } - - /** - * Set the crop window change listener. - */ - public void setCropWindowChangeListener(CropWindowChangeListener listener) { - mCropWindowChangeListener = listener; - } - - /** - * Get the left/top/right/bottom coordinates of the crop window. - */ - public RectF getCropWindowRect() { - return mCropWindowHandler.getRect(); - } - - /** - * Set the left/top/right/bottom coordinates of the crop window. - */ - public void setCropWindowRect(RectF rect) { - mCropWindowHandler.setRect(rect); - } - - /** - * Fix the current crop window rectangle if it is outside of cropping image or view bounds. - */ - public void fixCurrentCropWindowRect() { - RectF rect = getCropWindowRect(); - fixCropWindowRectByRules(rect); - mCropWindowHandler.setRect(rect); - } - - /** - * Informs the CropOverlayView of the image's position relative to the ImageView. This is - * necessary to call in order to draw the crop window. - * - * @param boundsPoints the image's bounding points - * @param viewWidth The bounding image view width. - * @param viewHeight The bounding image view height. - */ - public void setBounds(float[] boundsPoints, int viewWidth, int viewHeight) { - if (boundsPoints == null || !Arrays.equals(mBoundsPoints, boundsPoints)) { - if (boundsPoints == null) { - Arrays.fill(mBoundsPoints, 0); - } else { - System.arraycopy(boundsPoints, 0, mBoundsPoints, 0, boundsPoints.length); - } - mViewWidth = viewWidth; - mViewHeight = viewHeight; - RectF cropRect = mCropWindowHandler.getRect(); - if (cropRect.width() == 0 || cropRect.height() == 0) { - initCropWindow(); - } - } - } - - /** - * Resets the crop overlay view. - */ - public void resetCropOverlayView() { - if (initializedCropWindow) { - setCropWindowRect(BitmapUtils.EMPTY_RECT_F); - initCropWindow(); - invalidate(); - } - } - - /** - * The shape of the cropping area - rectangle/circular. - */ - public CropImageView.CropShape getCropShape() { - return mCropShape; - } - - /** - * The shape of the cropping area - rectangle/circular. - */ - public void setCropShape(CropImageView.CropShape cropShape) { - if (mCropShape != cropShape) { - mCropShape = cropShape; - if (Build.VERSION.SDK_INT <= 17) { - if (mCropShape == CropImageView.CropShape.OVAL) { - mOriginalLayerType = getLayerType(); - if (mOriginalLayerType != View.LAYER_TYPE_SOFTWARE) { - // TURN off hardware acceleration - setLayerType(View.LAYER_TYPE_SOFTWARE, null); - } else { - mOriginalLayerType = null; - } - } else if (mOriginalLayerType != null) { - // return hardware acceleration back - setLayerType(mOriginalLayerType, null); - mOriginalLayerType = null; - } - } - invalidate(); - } - } - - /** - * Get the current guidelines option set. - */ - public CropImageView.Guidelines getGuidelines() { - return mGuidelines; - } - - /** - * Sets the guidelines for the CropOverlayView to be either on, off, or to show when resizing the - * application. - */ - public void setGuidelines(CropImageView.Guidelines guidelines) { - if (mGuidelines != guidelines) { - mGuidelines = guidelines; - if (initializedCropWindow) { - invalidate(); - } - } - } - - /** - * whether the aspect ratio is fixed or not; true fixes the aspect ratio, while false allows it to - * be changed. - */ - public boolean isFixAspectRatio() { - return mFixAspectRatio; - } - - /** - * Sets whether the aspect ratio is fixed or not; true fixes the aspect ratio, while false allows - * it to be changed. - */ - public void setFixedAspectRatio(boolean fixAspectRatio) { - if (mFixAspectRatio != fixAspectRatio) { - mFixAspectRatio = fixAspectRatio; - if (initializedCropWindow) { - initCropWindow(); - invalidate(); - } - } - } - - /** - * the X value of the aspect ratio; - */ - public int getAspectRatioX() { - return mAspectRatioX; - } - - /** - * Sets the X value of the aspect ratio; is defaulted to 1. - */ - public void setAspectRatioX(int aspectRatioX) { - if (aspectRatioX <= 0) { - throw new IllegalArgumentException( - "Cannot set aspect ratio value to a number less than or equal to 0."); - } else if (mAspectRatioX != aspectRatioX) { - mAspectRatioX = aspectRatioX; - mTargetAspectRatio = ((float) mAspectRatioX) / mAspectRatioY; - - if (initializedCropWindow) { - initCropWindow(); - invalidate(); - } - } - } - - /** - * the Y value of the aspect ratio; - */ - public int getAspectRatioY() { - return mAspectRatioY; - } - - /** - * Sets the Y value of the aspect ratio; is defaulted to 1. - * - * @param aspectRatioY int that specifies the new Y value of the aspect ratio - */ - public void setAspectRatioY(int aspectRatioY) { - if (aspectRatioY <= 0) { - throw new IllegalArgumentException( - "Cannot set aspect ratio value to a number less than or equal to 0."); - } else if (mAspectRatioY != aspectRatioY) { - mAspectRatioY = aspectRatioY; - mTargetAspectRatio = ((float) mAspectRatioX) / mAspectRatioY; - - if (initializedCropWindow) { - initCropWindow(); - invalidate(); - } - } - } - - /** - * An edge of the crop window will snap to the corresponding edge of a specified bounding box when - * the crop window edge is less than or equal to this distance (in pixels) away from the bounding - * box edge. (default: 3) - */ - public void setSnapRadius(float snapRadius) { - mSnapRadius = snapRadius; - } - - /** - * Set multi touch functionality to enabled/disabled. - */ - public boolean setMultiTouchEnabled(boolean multiTouchEnabled) { - if (mMultiTouchEnabled != multiTouchEnabled) { - mMultiTouchEnabled = multiTouchEnabled; - if (mMultiTouchEnabled && mScaleDetector == null) { - mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener()); - } - return true; - } - return false; - } - - /** - * the min size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMinCropResultSize(int minCropResultWidth, int minCropResultHeight) { - mCropWindowHandler.setMinCropResultSize(minCropResultWidth, minCropResultHeight); - } - - /** - * the max size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMaxCropResultSize(int maxCropResultWidth, int maxCropResultHeight) { - mCropWindowHandler.setMaxCropResultSize(maxCropResultWidth, maxCropResultHeight); - } - - /** - * set the max width/height and scale factor of the shown image to original image to scale the - * limits appropriately. - */ - public void setCropWindowLimits( - float maxWidth, float maxHeight, float scaleFactorWidth, float scaleFactorHeight) { - mCropWindowHandler.setCropWindowLimits( - maxWidth, maxHeight, scaleFactorWidth, scaleFactorHeight); - } - - /** - * Get crop window initial rectangle. - */ - public Rect getInitialCropWindowRect() { - return mInitialCropWindowRect; - } - - /** - * Set crop window initial rectangle to be used instead of default. - */ - public void setInitialCropWindowRect(Rect rect) { - mInitialCropWindowRect.set(rect != null ? rect : BitmapUtils.EMPTY_RECT); - if (initializedCropWindow) { - initCropWindow(); - invalidate(); - callOnCropWindowChanged(false); - } - } - - // region: Private methods - - /** - * Reset crop window to initial rectangle. - */ - public void resetCropWindowRect() { - if (initializedCropWindow) { - initCropWindow(); - invalidate(); - callOnCropWindowChanged(false); - } - } - - /** - * Sets all initial values, but does not call initCropWindow to reset the views.
- * Used once at the very start to initialize the attributes. - */ - public void setInitialAttributeValues(CropImageOptions options) { - - mCropWindowHandler.setInitialAttributeValues(options); - - setCropShape(options.cropShape); - - setSnapRadius(options.snapRadius); - - setGuidelines(options.guidelines); - - setFixedAspectRatio(options.fixAspectRatio); - - setAspectRatioX(options.aspectRatioX); - - setAspectRatioY(options.aspectRatioY); - - setMultiTouchEnabled(options.multiTouchEnabled); - - mTouchRadius = options.touchRadius; - - mInitialCropWindowPaddingRatio = options.initialCropWindowPaddingRatio; - - mBorderPaint = getNewPaintOrNull(options.borderLineThickness, options.borderLineColor); - - mBorderCornerOffset = options.borderCornerOffset; - mBorderCornerLength = options.borderCornerLength; - mBorderCornerPaint = - getNewPaintOrNull(options.borderCornerThickness, options.borderCornerColor); - - mGuidelinePaint = getNewPaintOrNull(options.guidelinesThickness, options.guidelinesColor); - - mBackgroundPaint = getNewPaint(options.backgroundColor); - } - - /** - * Set the initial crop window size and position. This is dependent on the size and position of - * the image being cropped. - */ - private void initCropWindow() { - - float leftLimit = Math.max(BitmapUtils.getRectLeft(mBoundsPoints), 0); - float topLimit = Math.max(BitmapUtils.getRectTop(mBoundsPoints), 0); - float rightLimit = Math.min(BitmapUtils.getRectRight(mBoundsPoints), getWidth()); - float bottomLimit = Math.min(BitmapUtils.getRectBottom(mBoundsPoints), getHeight()); - - if (rightLimit <= leftLimit || bottomLimit <= topLimit) { - return; - } - - RectF rect = new RectF(); - - // Tells the attribute functions the crop window has already been initialized - initializedCropWindow = true; - - float horizontalPadding = mInitialCropWindowPaddingRatio * (rightLimit - leftLimit); - float verticalPadding = mInitialCropWindowPaddingRatio * (bottomLimit - topLimit); - - if (mInitialCropWindowRect.width() > 0 && mInitialCropWindowRect.height() > 0) { - // Get crop window position relative to the displayed image. - rect.left = - leftLimit + mInitialCropWindowRect.left / mCropWindowHandler.getScaleFactorWidth(); - rect.top = topLimit + mInitialCropWindowRect.top / mCropWindowHandler.getScaleFactorHeight(); - rect.right = - rect.left + mInitialCropWindowRect.width() / mCropWindowHandler.getScaleFactorWidth(); - rect.bottom = - rect.top + mInitialCropWindowRect.height() / mCropWindowHandler.getScaleFactorHeight(); - - // Correct for floating point errors. Crop rect boundaries should not exceed the source Bitmap - // bounds. - rect.left = Math.max(leftLimit, rect.left); - rect.top = Math.max(topLimit, rect.top); - rect.right = Math.min(rightLimit, rect.right); - rect.bottom = Math.min(bottomLimit, rect.bottom); - - } else if (mFixAspectRatio && rightLimit > leftLimit && bottomLimit > topLimit) { - - // If the image aspect ratio is wider than the crop aspect ratio, - // then the image height is the determining initial length. Else, vice-versa. - float bitmapAspectRatio = (rightLimit - leftLimit) / (bottomLimit - topLimit); - if (bitmapAspectRatio > mTargetAspectRatio) { - - rect.top = topLimit + verticalPadding; - rect.bottom = bottomLimit - verticalPadding; - - float centerX = getWidth() / 2f; - - // dirty fix for wrong crop overlay aspect ratio when using fixed aspect ratio - mTargetAspectRatio = (float) mAspectRatioX / mAspectRatioY; - - // Limits the aspect ratio to no less than 40 wide or 40 tall - float cropWidth = - Math.max(mCropWindowHandler.getMinCropWidth(), rect.height() * mTargetAspectRatio); - - float halfCropWidth = cropWidth / 2f; - rect.left = centerX - halfCropWidth; - rect.right = centerX + halfCropWidth; - - } else { - - rect.left = leftLimit + horizontalPadding; - rect.right = rightLimit - horizontalPadding; - - float centerY = getHeight() / 2f; - - // Limits the aspect ratio to no less than 40 wide or 40 tall - float cropHeight = - Math.max(mCropWindowHandler.getMinCropHeight(), rect.width() / mTargetAspectRatio); - - float halfCropHeight = cropHeight / 2f; - rect.top = centerY - halfCropHeight; - rect.bottom = centerY + halfCropHeight; - } - } else { - // Initialize crop window to have 10% padding w/ respect to image. - rect.left = leftLimit + horizontalPadding; - rect.top = topLimit + verticalPadding; - rect.right = rightLimit - horizontalPadding; - rect.bottom = bottomLimit - verticalPadding; - } - - fixCropWindowRectByRules(rect); - - mCropWindowHandler.setRect(rect); - } - - /** - * Fix the given rect to fit into bitmap rect and follow min, max and aspect ratio rules. - */ - private void fixCropWindowRectByRules(RectF rect) { - if (rect.width() < mCropWindowHandler.getMinCropWidth()) { - float adj = (mCropWindowHandler.getMinCropWidth() - rect.width()) / 2; - rect.left -= adj; - rect.right += adj; - } - if (rect.height() < mCropWindowHandler.getMinCropHeight()) { - float adj = (mCropWindowHandler.getMinCropHeight() - rect.height()) / 2; - rect.top -= adj; - rect.bottom += adj; - } - if (rect.width() > mCropWindowHandler.getMaxCropWidth()) { - float adj = (rect.width() - mCropWindowHandler.getMaxCropWidth()) / 2; - rect.left += adj; - rect.right -= adj; - } - if (rect.height() > mCropWindowHandler.getMaxCropHeight()) { - float adj = (rect.height() - mCropWindowHandler.getMaxCropHeight()) / 2; - rect.top += adj; - rect.bottom -= adj; - } - - calculateBounds(rect); - if (mCalcBounds.width() > 0 && mCalcBounds.height() > 0) { - float leftLimit = Math.max(mCalcBounds.left, 0); - float topLimit = Math.max(mCalcBounds.top, 0); - float rightLimit = Math.min(mCalcBounds.right, getWidth()); - float bottomLimit = Math.min(mCalcBounds.bottom, getHeight()); - if (rect.left < leftLimit) { - rect.left = leftLimit; - } - if (rect.top < topLimit) { - rect.top = topLimit; - } - if (rect.right > rightLimit) { - rect.right = rightLimit; - } - if (rect.bottom > bottomLimit) { - rect.bottom = bottomLimit; - } - } - if (mFixAspectRatio && Math.abs(rect.width() - rect.height() * mTargetAspectRatio) > 0.1) { - if (rect.width() > rect.height() * mTargetAspectRatio) { - float adj = Math.abs(rect.height() * mTargetAspectRatio - rect.width()) / 2; - rect.left += adj; - rect.right -= adj; - } else { - float adj = Math.abs(rect.width() / mTargetAspectRatio - rect.height()) / 2; - rect.top += adj; - rect.bottom -= adj; - } - } - } - - /** - * Draw crop overview by drawing background over image not in the cripping area, then borders and - * guidelines. - */ - @Override - protected void onDraw(Canvas canvas) { - - super.onDraw(canvas); - - // Draw translucent background for the cropped area. - drawBackground(canvas); - - if (mCropWindowHandler.showGuidelines()) { - // Determines whether guidelines should be drawn or not - if (mGuidelines == CropImageView.Guidelines.ON) { - drawGuidelines(canvas); - } else if (mGuidelines == CropImageView.Guidelines.ON_TOUCH && mMoveHandler != null) { - // Draw only when resizing - drawGuidelines(canvas); - } - } - - drawBorders(canvas); - - drawCorners(canvas); - } - - /** - * Draw shadow background over the image not including the crop area. - */ - private void drawBackground(Canvas canvas) { - - RectF rect = mCropWindowHandler.getRect(); - - float left = Math.max(BitmapUtils.getRectLeft(mBoundsPoints), 0); - float top = Math.max(BitmapUtils.getRectTop(mBoundsPoints), 0); - float right = Math.min(BitmapUtils.getRectRight(mBoundsPoints), getWidth()); - float bottom = Math.min(BitmapUtils.getRectBottom(mBoundsPoints), getHeight()); - - if (mCropShape == CropImageView.CropShape.RECTANGLE) { - if (!isNonStraightAngleRotated() || Build.VERSION.SDK_INT <= 17) { - canvas.drawRect(left, top, right, rect.top, mBackgroundPaint); - canvas.drawRect(left, rect.bottom, right, bottom, mBackgroundPaint); - canvas.drawRect(left, rect.top, rect.left, rect.bottom, mBackgroundPaint); - canvas.drawRect(rect.right, rect.top, right, rect.bottom, mBackgroundPaint); - } else { - mPath.reset(); - mPath.moveTo(mBoundsPoints[0], mBoundsPoints[1]); - mPath.lineTo(mBoundsPoints[2], mBoundsPoints[3]); - mPath.lineTo(mBoundsPoints[4], mBoundsPoints[5]); - mPath.lineTo(mBoundsPoints[6], mBoundsPoints[7]); - mPath.close(); - - canvas.save(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - canvas.clipOutPath(mPath); - } else { - canvas.clipPath(mPath, Region.Op.INTERSECT); - } - canvas.clipRect(rect, Region.Op.XOR); - canvas.drawRect(left, top, right, bottom, mBackgroundPaint); - canvas.restore(); - } - } else { - mPath.reset(); - if (Build.VERSION.SDK_INT <= 17 && mCropShape == CropImageView.CropShape.OVAL) { - mDrawRect.set(rect.left + 2, rect.top + 2, rect.right - 2, rect.bottom - 2); - } else { - mDrawRect.set(rect.left, rect.top, rect.right, rect.bottom); - } - mPath.addOval(mDrawRect, Path.Direction.CW); - canvas.save(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - canvas.clipOutPath(mPath); - } else { - canvas.clipPath(mPath, Region.Op.XOR); - } - canvas.drawRect(left, top, right, bottom, mBackgroundPaint); - canvas.restore(); - } - } - - /** - * Draw 2 veritcal and 2 horizontal guidelines inside the cropping area to split it into 9 equal - * parts. - */ - private void drawGuidelines(Canvas canvas) { - if (mGuidelinePaint != null) { - float sw = mBorderPaint != null ? mBorderPaint.getStrokeWidth() : 0; - RectF rect = mCropWindowHandler.getRect(); - rect.inset(sw, sw); - - float oneThirdCropWidth = rect.width() / 3; - float oneThirdCropHeight = rect.height() / 3; - - if (mCropShape == CropImageView.CropShape.OVAL) { - - float w = rect.width() / 2 - sw; - float h = rect.height() / 2 - sw; - - // Draw vertical guidelines. - float x1 = rect.left + oneThirdCropWidth; - float x2 = rect.right - oneThirdCropWidth; - float yv = (float) (h * Math.sin(Math.acos((w - oneThirdCropWidth) / w))); - canvas.drawLine(x1, rect.top + h - yv, x1, rect.bottom - h + yv, mGuidelinePaint); - canvas.drawLine(x2, rect.top + h - yv, x2, rect.bottom - h + yv, mGuidelinePaint); - - // Draw horizontal guidelines. - float y1 = rect.top + oneThirdCropHeight; - float y2 = rect.bottom - oneThirdCropHeight; - float xv = (float) (w * Math.cos(Math.asin((h - oneThirdCropHeight) / h))); - canvas.drawLine(rect.left + w - xv, y1, rect.right - w + xv, y1, mGuidelinePaint); - canvas.drawLine(rect.left + w - xv, y2, rect.right - w + xv, y2, mGuidelinePaint); - } else { - - // Draw vertical guidelines. - float x1 = rect.left + oneThirdCropWidth; - float x2 = rect.right - oneThirdCropWidth; - canvas.drawLine(x1, rect.top, x1, rect.bottom, mGuidelinePaint); - canvas.drawLine(x2, rect.top, x2, rect.bottom, mGuidelinePaint); - - // Draw horizontal guidelines. - float y1 = rect.top + oneThirdCropHeight; - float y2 = rect.bottom - oneThirdCropHeight; - canvas.drawLine(rect.left, y1, rect.right, y1, mGuidelinePaint); - canvas.drawLine(rect.left, y2, rect.right, y2, mGuidelinePaint); - } - } - } - - /** - * Draw borders of the crop area. - */ - private void drawBorders(Canvas canvas) { - if (mBorderPaint != null) { - float w = mBorderPaint.getStrokeWidth(); - RectF rect = mCropWindowHandler.getRect(); - rect.inset(w / 2, w / 2); - - if (mCropShape == CropImageView.CropShape.RECTANGLE) { - // Draw rectangle crop window border. - canvas.drawRect(rect, mBorderPaint); - } else { - // Draw circular crop window border - canvas.drawOval(rect, mBorderPaint); - } - } - } - - /** - * Draw the corner of crop overlay. - */ - private void drawCorners(Canvas canvas) { - if (mBorderCornerPaint != null) { - - float lineWidth = mBorderPaint != null ? mBorderPaint.getStrokeWidth() : 0; - float cornerWidth = mBorderCornerPaint.getStrokeWidth(); - - // for rectangle crop shape we allow the corners to be offset from the borders - float w = - cornerWidth / 2 - + (mCropShape == CropImageView.CropShape.RECTANGLE ? mBorderCornerOffset : 0); - - RectF rect = mCropWindowHandler.getRect(); - rect.inset(w, w); - - float cornerOffset = (cornerWidth - lineWidth) / 2; - float cornerExtension = cornerWidth / 2 + cornerOffset; - - // Top left - canvas.drawLine( - rect.left - cornerOffset, - rect.top - cornerExtension, - rect.left - cornerOffset, - rect.top + mBorderCornerLength, - mBorderCornerPaint); - canvas.drawLine( - rect.left - cornerExtension, - rect.top - cornerOffset, - rect.left + mBorderCornerLength, - rect.top - cornerOffset, - mBorderCornerPaint); - - // Top right - canvas.drawLine( - rect.right + cornerOffset, - rect.top - cornerExtension, - rect.right + cornerOffset, - rect.top + mBorderCornerLength, - mBorderCornerPaint); - canvas.drawLine( - rect.right + cornerExtension, - rect.top - cornerOffset, - rect.right - mBorderCornerLength, - rect.top - cornerOffset, - mBorderCornerPaint); - - // Bottom left - canvas.drawLine( - rect.left - cornerOffset, - rect.bottom + cornerExtension, - rect.left - cornerOffset, - rect.bottom - mBorderCornerLength, - mBorderCornerPaint); - canvas.drawLine( - rect.left - cornerExtension, - rect.bottom + cornerOffset, - rect.left + mBorderCornerLength, - rect.bottom + cornerOffset, - mBorderCornerPaint); - - // Bottom left - canvas.drawLine( - rect.right + cornerOffset, - rect.bottom + cornerExtension, - rect.right + cornerOffset, - rect.bottom - mBorderCornerLength, - mBorderCornerPaint); - canvas.drawLine( - rect.right + cornerExtension, - rect.bottom + cornerOffset, - rect.right - mBorderCornerLength, - rect.bottom + cornerOffset, - mBorderCornerPaint); - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - // If this View is not enabled, don't allow for touch interactions. - if (isEnabled()) { - if (mMultiTouchEnabled) { - mScaleDetector.onTouchEvent(event); - } - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - onActionDown(event.getX(), event.getY()); - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - getParent().requestDisallowInterceptTouchEvent(false); - onActionUp(); - return true; - case MotionEvent.ACTION_MOVE: - onActionMove(event.getX(), event.getY()); - getParent().requestDisallowInterceptTouchEvent(true); - return true; - default: - return false; - } - } else { - return false; - } - } - - /** - * On press down start crop window movment depending on the location of the press.
- * if press is far from crop window then no move handler is returned (null). - */ - private void onActionDown(float x, float y) { - mMoveHandler = mCropWindowHandler.getMoveHandler(x, y, mTouchRadius, mCropShape); - if (mMoveHandler != null) { - invalidate(); - } - } - - /** - * Clear move handler starting in {@link #onActionDown(float, float)} if exists. - */ - private void onActionUp() { - if (mMoveHandler != null) { - mMoveHandler = null; - callOnCropWindowChanged(false); - invalidate(); - } - } - - /** - * Handle move of crop window using the move handler created in {@link #onActionDown(float, - * float)}.
- * The move handler will do the proper move/resize of the crop window. - */ - private void onActionMove(float x, float y) { - if (mMoveHandler != null) { - float snapRadius = mSnapRadius; - RectF rect = mCropWindowHandler.getRect(); - - if (calculateBounds(rect)) { - snapRadius = 0; - } - - mMoveHandler.move( - rect, - x, - y, - mCalcBounds, - mViewWidth, - mViewHeight, - snapRadius, - mFixAspectRatio, - mTargetAspectRatio); - mCropWindowHandler.setRect(rect); - callOnCropWindowChanged(true); - invalidate(); - } - } - - /** - * Calculate the bounding rectangle for current crop window, handle non-straight rotation angles. - *
- * If the rotation angle is straight then the bounds rectangle is the bitmap rectangle, otherwsie - * we find the max rectangle that is within the image bounds starting from the crop window - * rectangle. - * - * @param rect the crop window rectangle to start finsing bounded rectangle from - * @return true - non straight rotation in place, false - otherwise. - */ - private boolean calculateBounds(RectF rect) { - - float left = BitmapUtils.getRectLeft(mBoundsPoints); - float top = BitmapUtils.getRectTop(mBoundsPoints); - float right = BitmapUtils.getRectRight(mBoundsPoints); - float bottom = BitmapUtils.getRectBottom(mBoundsPoints); - - if (!isNonStraightAngleRotated()) { - mCalcBounds.set(left, top, right, bottom); - return false; - } else { - float x0 = mBoundsPoints[0]; - float y0 = mBoundsPoints[1]; - float x2 = mBoundsPoints[4]; - float y2 = mBoundsPoints[5]; - float x3 = mBoundsPoints[6]; - float y3 = mBoundsPoints[7]; - - if (mBoundsPoints[7] < mBoundsPoints[1]) { - if (mBoundsPoints[1] < mBoundsPoints[3]) { - x0 = mBoundsPoints[6]; - y0 = mBoundsPoints[7]; - x2 = mBoundsPoints[2]; - y2 = mBoundsPoints[3]; - x3 = mBoundsPoints[4]; - y3 = mBoundsPoints[5]; - } else { - x0 = mBoundsPoints[4]; - y0 = mBoundsPoints[5]; - x2 = mBoundsPoints[0]; - y2 = mBoundsPoints[1]; - x3 = mBoundsPoints[2]; - y3 = mBoundsPoints[3]; - } - } else if (mBoundsPoints[1] > mBoundsPoints[3]) { - x0 = mBoundsPoints[2]; - y0 = mBoundsPoints[3]; - x2 = mBoundsPoints[6]; - y2 = mBoundsPoints[7]; - x3 = mBoundsPoints[0]; - y3 = mBoundsPoints[1]; - } - - float a0 = (y3 - y0) / (x3 - x0); - float a1 = -1f / a0; - float b0 = y0 - a0 * x0; - float b1 = y0 - a1 * x0; - float b2 = y2 - a0 * x2; - float b3 = y2 - a1 * x2; - - float c0 = (rect.centerY() - rect.top) / (rect.centerX() - rect.left); - float c1 = -c0; - float d0 = rect.top - c0 * rect.left; - float d1 = rect.top - c1 * rect.right; - - left = Math.max(left, (d0 - b0) / (a0 - c0) < rect.right ? (d0 - b0) / (a0 - c0) : left); - left = Math.max(left, (d0 - b1) / (a1 - c0) < rect.right ? (d0 - b1) / (a1 - c0) : left); - left = Math.max(left, (d1 - b3) / (a1 - c1) < rect.right ? (d1 - b3) / (a1 - c1) : left); - right = Math.min(right, (d1 - b1) / (a1 - c1) > rect.left ? (d1 - b1) / (a1 - c1) : right); - right = Math.min(right, (d1 - b2) / (a0 - c1) > rect.left ? (d1 - b2) / (a0 - c1) : right); - right = Math.min(right, (d0 - b2) / (a0 - c0) > rect.left ? (d0 - b2) / (a0 - c0) : right); - - top = Math.max(top, Math.max(a0 * left + b0, a1 * right + b1)); - bottom = Math.min(bottom, Math.min(a1 * left + b3, a0 * right + b2)); - - mCalcBounds.left = left; - mCalcBounds.top = top; - mCalcBounds.right = right; - mCalcBounds.bottom = bottom; - return true; - } - } - - /** - * Is the cropping image has been rotated by NOT 0,90,180 or 270 degrees. - */ - private boolean isNonStraightAngleRotated() { - return mBoundsPoints[0] != mBoundsPoints[6] && mBoundsPoints[1] != mBoundsPoints[7]; - } - - /** - * Invoke on crop change listener safe, don't let the app crash on exception. - */ - private void callOnCropWindowChanged(boolean inProgress) { - try { - if (mCropWindowChangeListener != null) { - mCropWindowChangeListener.onCropWindowChanged(inProgress); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - // endregion - - // region: Inner class: CropWindowChangeListener - - /** - * Interface definition for a callback to be invoked when crop window rectangle is changing. - */ - public interface CropWindowChangeListener { - - /** - * Called after a change in crop window rectangle. - * - * @param inProgress is the crop window change operation is still in progress by user touch - */ - void onCropWindowChanged(boolean inProgress); - } - // endregion - - // region: Inner class: ScaleListener - - /** - * Handle scaling the rectangle based on two finger input - */ - private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { - - @Override - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public boolean onScale(ScaleGestureDetector detector) { - RectF rect = mCropWindowHandler.getRect(); - - float x = detector.getFocusX(); - float y = detector.getFocusY(); - float dY = detector.getCurrentSpanY() / 2; - float dX = detector.getCurrentSpanX() / 2; - - float newTop = y - dY; - float newLeft = x - dX; - float newRight = x + dX; - float newBottom = y + dY; - - if (newLeft < newRight - && newTop <= newBottom - && newLeft >= 0 - && newRight <= mCropWindowHandler.getMaxCropWidth() - && newTop >= 0 - && newBottom <= mCropWindowHandler.getMaxCropHeight()) { - - rect.set(newLeft, newTop, newRight, newBottom); - mCropWindowHandler.setRect(rect); - invalidate(); - } - - return true; - } - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowHandler.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowHandler.java deleted file mode 100644 index d9785531..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowHandler.java +++ /dev/null @@ -1,405 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.graphics.RectF; - -/** - * Handler from crop window stuff, moving and knowing possition. - */ -final class CropWindowHandler { - - // region: Fields and Consts - - /** - * The 4 edges of the crop window defining its coordinates and size - */ - private final RectF mEdges = new RectF(); - - /** - * Rectangle used to return the edges rectangle without ability to change it and without creating - * new all the time. - */ - private final RectF mGetEdges = new RectF(); - - /** - * Minimum width in pixels that the crop window can get. - */ - private float mMinCropWindowWidth; - - /** - * Minimum height in pixels that the crop window can get. - */ - private float mMinCropWindowHeight; - - /** - * Maximum width in pixels that the crop window can CURRENTLY get. - */ - private float mMaxCropWindowWidth; - - /** - * Maximum height in pixels that the crop window can CURRENTLY get. - */ - private float mMaxCropWindowHeight; - - /** - * Minimum width in pixels that the result of cropping an image can get, affects crop window width - * adjusted by width scale factor. - */ - private float mMinCropResultWidth; - - /** - * Minimum height in pixels that the result of cropping an image can get, affects crop window - * height adjusted by height scale factor. - */ - private float mMinCropResultHeight; - - /** - * Maximum width in pixels that the result of cropping an image can get, affects crop window width - * adjusted by width scale factor. - */ - private float mMaxCropResultWidth; - - /** - * Maximum height in pixels that the result of cropping an image can get, affects crop window - * height adjusted by height scale factor. - */ - private float mMaxCropResultHeight; - - /** - * The width scale factor of shown image and actual image - */ - private float mScaleFactorWidth = 1; - - /** - * The height scale factor of shown image and actual image - */ - private float mScaleFactorHeight = 1; - // endregion - - /** - * Determines if the specified coordinate is in the target touch zone for a corner handle. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param handleX the x-coordinate of the corner handle - * @param handleY the y-coordinate of the corner handle - * @param targetRadius the target radius in pixels - * @return true if the touch point is in the target touch zone; false otherwise - */ - private static boolean isInCornerTargetZone( - float x, float y, float handleX, float handleY, float targetRadius) { - return Math.abs(x - handleX) <= targetRadius && Math.abs(y - handleY) <= targetRadius; - } - - /** - * Determines if the specified coordinate is in the target touch zone for a horizontal bar handle. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param handleXStart the left x-coordinate of the horizontal bar handle - * @param handleXEnd the right x-coordinate of the horizontal bar handle - * @param handleY the y-coordinate of the horizontal bar handle - * @param targetRadius the target radius in pixels - * @return true if the touch point is in the target touch zone; false otherwise - */ - private static boolean isInHorizontalTargetZone( - float x, float y, float handleXStart, float handleXEnd, float handleY, float targetRadius) { - return x > handleXStart && x < handleXEnd && Math.abs(y - handleY) <= targetRadius; - } - - /** - * Determines if the specified coordinate is in the target touch zone for a vertical bar handle. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param handleX the x-coordinate of the vertical bar handle - * @param handleYStart the top y-coordinate of the vertical bar handle - * @param handleYEnd the bottom y-coordinate of the vertical bar handle - * @param targetRadius the target radius in pixels - * @return true if the touch point is in the target touch zone; false otherwise - */ - private static boolean isInVerticalTargetZone( - float x, float y, float handleX, float handleYStart, float handleYEnd, float targetRadius) { - return Math.abs(x - handleX) <= targetRadius && y > handleYStart && y < handleYEnd; - } - - /** - * Determines if the specified coordinate falls anywhere inside the given bounds. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param left the x-coordinate of the left bound - * @param top the y-coordinate of the top bound - * @param right the x-coordinate of the right bound - * @param bottom the y-coordinate of the bottom bound - * @return true if the touch point is inside the bounding rectangle; false otherwise - */ - private static boolean isInCenterTargetZone( - float x, float y, float left, float top, float right, float bottom) { - return x > left && x < right && y > top && y < bottom; - } - - /** - * Get the left/top/right/bottom coordinates of the crop window. - */ - public RectF getRect() { - mGetEdges.set(mEdges); - return mGetEdges; - } - - /** - * Set the left/top/right/bottom coordinates of the crop window. - */ - public void setRect(RectF rect) { - mEdges.set(rect); - } - - /** - * Minimum width in pixels that the crop window can get. - */ - public float getMinCropWidth() { - return Math.max(mMinCropWindowWidth, mMinCropResultWidth / mScaleFactorWidth); - } - - /** - * Minimum height in pixels that the crop window can get. - */ - public float getMinCropHeight() { - return Math.max(mMinCropWindowHeight, mMinCropResultHeight / mScaleFactorHeight); - } - - /** - * Maximum width in pixels that the crop window can get. - */ - public float getMaxCropWidth() { - return Math.min(mMaxCropWindowWidth, mMaxCropResultWidth / mScaleFactorWidth); - } - - /** - * Maximum height in pixels that the crop window can get. - */ - public float getMaxCropHeight() { - return Math.min(mMaxCropWindowHeight, mMaxCropResultHeight / mScaleFactorHeight); - } - - /** - * get the scale factor (on width) of the showen image to original image. - */ - public float getScaleFactorWidth() { - return mScaleFactorWidth; - } - - /** - * get the scale factor (on height) of the showen image to original image. - */ - public float getScaleFactorHeight() { - return mScaleFactorHeight; - } - - /** - * the min size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMinCropResultSize(int minCropResultWidth, int minCropResultHeight) { - mMinCropResultWidth = minCropResultWidth; - mMinCropResultHeight = minCropResultHeight; - } - - /** - * the max size the resulting cropping image is allowed to be, affects the cropping window limits - * (in pixels).
- */ - public void setMaxCropResultSize(int maxCropResultWidth, int maxCropResultHeight) { - mMaxCropResultWidth = maxCropResultWidth; - mMaxCropResultHeight = maxCropResultHeight; - } - - // region: Private methods - - /** - * set the max width/height and scale factor of the showen image to original image to scale the - * limits appropriately. - */ - public void setCropWindowLimits( - float maxWidth, float maxHeight, float scaleFactorWidth, float scaleFactorHeight) { - mMaxCropWindowWidth = maxWidth; - mMaxCropWindowHeight = maxHeight; - mScaleFactorWidth = scaleFactorWidth; - mScaleFactorHeight = scaleFactorHeight; - } - - /** - * Set the variables to be used during crop window handling. - */ - public void setInitialAttributeValues(CropImageOptions options) { - mMinCropWindowWidth = options.minCropWindowWidth; - mMinCropWindowHeight = options.minCropWindowHeight; - mMinCropResultWidth = options.minCropResultWidth; - mMinCropResultHeight = options.minCropResultHeight; - mMaxCropResultWidth = options.maxCropResultWidth; - mMaxCropResultHeight = options.maxCropResultHeight; - } - - /** - * Indicates whether the crop window is small enough that the guidelines should be shown. Public - * because this function is also used to determine if the center handle should be focused. - * - * @return boolean Whether the guidelines should be shown or not - */ - public boolean showGuidelines() { - return !(mEdges.width() < 100 || mEdges.height() < 100); - } - - /** - * Determines which, if any, of the handles are pressed given the touch coordinates, the bounding - * box, and the touch radius. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param targetRadius the target radius in pixels - * @return the Handle that was pressed; null if no Handle was pressed - */ - public CropWindowMoveHandler getMoveHandler( - float x, float y, float targetRadius, CropImageView.CropShape cropShape) { - CropWindowMoveHandler.Type type = - cropShape == CropImageView.CropShape.OVAL - ? getOvalPressedMoveType(x, y) - : getRectanglePressedMoveType(x, y, targetRadius); - return type != null ? new CropWindowMoveHandler(type, this, x, y) : null; - } - - /** - * Determines which, if any, of the handles are pressed given the touch coordinates, the bounding - * box, and the touch radius. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @param targetRadius the target radius in pixels - * @return the Handle that was pressed; null if no Handle was pressed - */ - private CropWindowMoveHandler.Type getRectanglePressedMoveType( - float x, float y, float targetRadius) { - CropWindowMoveHandler.Type moveType = null; - - // Note: corner-handles take precedence, then side-handles, then center. - if (CropWindowHandler.isInCornerTargetZone(x, y, mEdges.left, mEdges.top, targetRadius)) { - moveType = CropWindowMoveHandler.Type.TOP_LEFT; - } else if (CropWindowHandler.isInCornerTargetZone( - x, y, mEdges.right, mEdges.top, targetRadius)) { - moveType = CropWindowMoveHandler.Type.TOP_RIGHT; - } else if (CropWindowHandler.isInCornerTargetZone( - x, y, mEdges.left, mEdges.bottom, targetRadius)) { - moveType = CropWindowMoveHandler.Type.BOTTOM_LEFT; - } else if (CropWindowHandler.isInCornerTargetZone( - x, y, mEdges.right, mEdges.bottom, targetRadius)) { - moveType = CropWindowMoveHandler.Type.BOTTOM_RIGHT; - } else if (CropWindowHandler.isInCenterTargetZone( - x, y, mEdges.left, mEdges.top, mEdges.right, mEdges.bottom) - && focusCenter()) { - moveType = CropWindowMoveHandler.Type.CENTER; - } else if (CropWindowHandler.isInHorizontalTargetZone( - x, y, mEdges.left, mEdges.right, mEdges.top, targetRadius)) { - moveType = CropWindowMoveHandler.Type.TOP; - } else if (CropWindowHandler.isInHorizontalTargetZone( - x, y, mEdges.left, mEdges.right, mEdges.bottom, targetRadius)) { - moveType = CropWindowMoveHandler.Type.BOTTOM; - } else if (CropWindowHandler.isInVerticalTargetZone( - x, y, mEdges.left, mEdges.top, mEdges.bottom, targetRadius)) { - moveType = CropWindowMoveHandler.Type.LEFT; - } else if (CropWindowHandler.isInVerticalTargetZone( - x, y, mEdges.right, mEdges.top, mEdges.bottom, targetRadius)) { - moveType = CropWindowMoveHandler.Type.RIGHT; - } else if (CropWindowHandler.isInCenterTargetZone( - x, y, mEdges.left, mEdges.top, mEdges.right, mEdges.bottom) - && !focusCenter()) { - moveType = CropWindowMoveHandler.Type.CENTER; - } - - return moveType; - } - - /** - * Determines which, if any, of the handles are pressed given the touch coordinates, the bounding - * box/oval, and the touch radius. - * - * @param x the x-coordinate of the touch point - * @param y the y-coordinate of the touch point - * @return the Handle that was pressed; null if no Handle was pressed - */ - private CropWindowMoveHandler.Type getOvalPressedMoveType(float x, float y) { - - /* - Use a 6x6 grid system divided into 9 "handles", with the center the biggest region. While - this is not perfect, it's a good quick-to-ship approach. - - TL T T T T TR - L C C C C R - L C C C C R - L C C C C R - L C C C C R - BL B B B B BR - */ - - float cellLength = mEdges.width() / 6; - float leftCenter = mEdges.left + cellLength; - float rightCenter = mEdges.left + (5 * cellLength); - - float cellHeight = mEdges.height() / 6; - float topCenter = mEdges.top + cellHeight; - float bottomCenter = mEdges.top + 5 * cellHeight; - - CropWindowMoveHandler.Type moveType; - if (x < leftCenter) { - if (y < topCenter) { - moveType = CropWindowMoveHandler.Type.TOP_LEFT; - } else if (y < bottomCenter) { - moveType = CropWindowMoveHandler.Type.LEFT; - } else { - moveType = CropWindowMoveHandler.Type.BOTTOM_LEFT; - } - } else if (x < rightCenter) { - if (y < topCenter) { - moveType = CropWindowMoveHandler.Type.TOP; - } else if (y < bottomCenter) { - moveType = CropWindowMoveHandler.Type.CENTER; - } else { - moveType = CropWindowMoveHandler.Type.BOTTOM; - } - } else { - if (y < topCenter) { - moveType = CropWindowMoveHandler.Type.TOP_RIGHT; - } else if (y < bottomCenter) { - moveType = CropWindowMoveHandler.Type.RIGHT; - } else { - moveType = CropWindowMoveHandler.Type.BOTTOM_RIGHT; - } - } - - return moveType; - } - - /** - * Determines if the cropper should focus on the center handle or the side handles. If it is a - * small image, focus on the center handle so the user can move it. If it is a large image, focus - * on the side handles so user can grab them. Corresponds to the appearance of the - * RuleOfThirdsGuidelines. - * - * @return true if it is small enough such that it should focus on the center; less than - * show_guidelines limit - */ - private boolean focusCenter() { - return !showGuidelines(); - } - // endregion -} diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowMoveHandler.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowMoveHandler.java deleted file mode 100644 index 0f1eaab4..00000000 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropWindowMoveHandler.java +++ /dev/null @@ -1,786 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -package com.theartofdev.edmodo.cropper; - -import android.graphics.Matrix; -import android.graphics.PointF; -import android.graphics.RectF; - -/** - * Handler to update crop window edges by the move type - Horizontal, Vertical, Corner or Center. - *
- */ -final class CropWindowMoveHandler { - - // region: Fields and Consts - - /** - * Matrix used for rectangle rotation handling - */ - private static final Matrix MATRIX = new Matrix(); - - /** - * Minimum width in pixels that the crop window can get. - */ - private final float mMinCropWidth; - - /** - * Minimum width in pixels that the crop window can get. - */ - private final float mMinCropHeight; - - /** - * Maximum height in pixels that the crop window can get. - */ - private final float mMaxCropWidth; - - /** - * Maximum height in pixels that the crop window can get. - */ - private final float mMaxCropHeight; - - /** - * The type of crop window move that is handled. - */ - private final Type mType; - - /** - * Holds the x and y offset between the exact touch location and the exact handle location that is - * activated. There may be an offset because we allow for some leeway (specified by mHandleRadius) - * in activating a handle. However, we want to maintain these offset values while the handle is - * being dragged so that the handle doesn't jump. - */ - private final PointF mTouchOffset = new PointF(); - // endregion - - /** - * @param edgeMoveType the type of move this handler is executing - * @param horizontalEdge the primary edge associated with this handle; may be null - * @param verticalEdge the secondary edge associated with this handle; may be null - * @param cropWindowHandler main crop window handle to get and update the crop window edges - * @param touchX the location of the initial toch possition to measure move distance - * @param touchY the location of the initial toch possition to measure move distance - */ - public CropWindowMoveHandler( - Type type, CropWindowHandler cropWindowHandler, float touchX, float touchY) { - mType = type; - mMinCropWidth = cropWindowHandler.getMinCropWidth(); - mMinCropHeight = cropWindowHandler.getMinCropHeight(); - mMaxCropWidth = cropWindowHandler.getMaxCropWidth(); - mMaxCropHeight = cropWindowHandler.getMaxCropHeight(); - calculateTouchOffset(cropWindowHandler.getRect(), touchX, touchY); - } - - /** - * Calculates the aspect ratio given a rectangle. - */ - private static float calculateAspectRatio(float left, float top, float right, float bottom) { - return (right - left) / (bottom - top); - } - - // region: Private methods - - /** - * Updates the crop window by change in the toch location.
- * Move type handled by this instance, as initialized in creation, affects how the change in toch - * location changes the crop window position and size.
- * After the crop window position/size is changed by toch move it may result in values that - * vialate contraints: outside the bounds of the shown bitmap, smaller/larger than min/max size or - * missmatch in aspect ratio. So a series of fixes is executed on "secondary" edges to adjust it - * by the "primary" edge movement.
- * Primary is the edge directly affected by move type, secondary is the other edge.
- * The crop window is changed by directly setting the Edge coordinates. - * - * @param x the new x-coordinate of this handle - * @param y the new y-coordinate of this handle - * @param bounds the bounding rectangle of the image - * @param viewWidth The bounding image view width used to know the crop overlay is at view edges. - * @param viewHeight The bounding image view height used to know the crop overlay is at view - * edges. - * @param parentView the parent View containing the image - * @param snapMargin the maximum distance (in pixels) at which the crop window should snap to the - * image - * @param fixedAspectRatio is the aspect ration fixed and 'targetAspectRatio' should be used - * @param aspectRatio the aspect ratio to maintain - */ - public void move( - RectF rect, - float x, - float y, - RectF bounds, - int viewWidth, - int viewHeight, - float snapMargin, - boolean fixedAspectRatio, - float aspectRatio) { - - // Adjust the coordinates for the finger position's offset (i.e. the - // distance from the initial touch to the precise handle location). - // We want to maintain the initial touch's distance to the pressed - // handle so that the crop window size does not "jump". - float adjX = x + mTouchOffset.x; - float adjY = y + mTouchOffset.y; - - if (mType == Type.CENTER) { - moveCenter(rect, adjX, adjY, bounds, viewWidth, viewHeight, snapMargin); - } else { - if (fixedAspectRatio) { - moveSizeWithFixedAspectRatio( - rect, adjX, adjY, bounds, viewWidth, viewHeight, snapMargin, aspectRatio); - } else { - moveSizeWithFreeAspectRatio(rect, adjX, adjY, bounds, viewWidth, viewHeight, snapMargin); - } - } - } - - /** - * Calculates the offset of the touch point from the precise location of the specified handle.
- * Save these values in a member variable since we want to maintain this offset as we drag the - * handle. - */ - private void calculateTouchOffset(RectF rect, float touchX, float touchY) { - - float touchOffsetX = 0; - float touchOffsetY = 0; - - // Calculate the offset from the appropriate handle. - switch (mType) { - case TOP_LEFT: - touchOffsetX = rect.left - touchX; - touchOffsetY = rect.top - touchY; - break; - case TOP_RIGHT: - touchOffsetX = rect.right - touchX; - touchOffsetY = rect.top - touchY; - break; - case BOTTOM_LEFT: - touchOffsetX = rect.left - touchX; - touchOffsetY = rect.bottom - touchY; - break; - case BOTTOM_RIGHT: - touchOffsetX = rect.right - touchX; - touchOffsetY = rect.bottom - touchY; - break; - case LEFT: - touchOffsetX = rect.left - touchX; - touchOffsetY = 0; - break; - case TOP: - touchOffsetX = 0; - touchOffsetY = rect.top - touchY; - break; - case RIGHT: - touchOffsetX = rect.right - touchX; - touchOffsetY = 0; - break; - case BOTTOM: - touchOffsetX = 0; - touchOffsetY = rect.bottom - touchY; - break; - case CENTER: - touchOffsetX = rect.centerX() - touchX; - touchOffsetY = rect.centerY() - touchY; - break; - default: - break; - } - - mTouchOffset.x = touchOffsetX; - mTouchOffset.y = touchOffsetY; - } - - /** - * Center move only changes the position of the crop window without changing the size. - */ - private void moveCenter( - RectF rect, float x, float y, RectF bounds, int viewWidth, int viewHeight, float snapRadius) { - float dx = x - rect.centerX(); - float dy = y - rect.centerY(); - if (rect.left + dx < 0 - || rect.right + dx > viewWidth - || rect.left + dx < bounds.left - || rect.right + dx > bounds.right) { - dx /= 1.05f; - mTouchOffset.x -= dx / 2; - } - if (rect.top + dy < 0 - || rect.bottom + dy > viewHeight - || rect.top + dy < bounds.top - || rect.bottom + dy > bounds.bottom) { - dy /= 1.05f; - mTouchOffset.y -= dy / 2; - } - rect.offset(dx, dy); - snapEdgesToBounds(rect, bounds, snapRadius); - } - - /** - * Change the size of the crop window on the required edge (or edges for corner size move) without - * affecting "secondary" edges.
- * Only the primary edge(s) are fixed to stay within limits. - */ - private void moveSizeWithFreeAspectRatio( - RectF rect, float x, float y, RectF bounds, int viewWidth, int viewHeight, float snapMargin) { - switch (mType) { - case TOP_LEFT: - adjustTop(rect, y, bounds, snapMargin, 0, false, false); - adjustLeft(rect, x, bounds, snapMargin, 0, false, false); - break; - case TOP_RIGHT: - adjustTop(rect, y, bounds, snapMargin, 0, false, false); - adjustRight(rect, x, bounds, viewWidth, snapMargin, 0, false, false); - break; - case BOTTOM_LEFT: - adjustBottom(rect, y, bounds, viewHeight, snapMargin, 0, false, false); - adjustLeft(rect, x, bounds, snapMargin, 0, false, false); - break; - case BOTTOM_RIGHT: - adjustBottom(rect, y, bounds, viewHeight, snapMargin, 0, false, false); - adjustRight(rect, x, bounds, viewWidth, snapMargin, 0, false, false); - break; - case LEFT: - adjustLeft(rect, x, bounds, snapMargin, 0, false, false); - break; - case TOP: - adjustTop(rect, y, bounds, snapMargin, 0, false, false); - break; - case RIGHT: - adjustRight(rect, x, bounds, viewWidth, snapMargin, 0, false, false); - break; - case BOTTOM: - adjustBottom(rect, y, bounds, viewHeight, snapMargin, 0, false, false); - break; - default: - break; - } - } - - /** - * Change the size of the crop window on the required "primary" edge WITH affect to relevant - * "secondary" edge via aspect ratio.
- * Example: change in the left edge (primary) will affect top and bottom edges (secondary) to - * preserve the given aspect ratio. - */ - private void moveSizeWithFixedAspectRatio( - RectF rect, - float x, - float y, - RectF bounds, - int viewWidth, - int viewHeight, - float snapMargin, - float aspectRatio) { - switch (mType) { - case TOP_LEFT: - if (calculateAspectRatio(x, y, rect.right, rect.bottom) < aspectRatio) { - adjustTop(rect, y, bounds, snapMargin, aspectRatio, true, false); - adjustLeftByAspectRatio(rect, aspectRatio); - } else { - adjustLeft(rect, x, bounds, snapMargin, aspectRatio, true, false); - adjustTopByAspectRatio(rect, aspectRatio); - } - break; - case TOP_RIGHT: - if (calculateAspectRatio(rect.left, y, x, rect.bottom) < aspectRatio) { - adjustTop(rect, y, bounds, snapMargin, aspectRatio, false, true); - adjustRightByAspectRatio(rect, aspectRatio); - } else { - adjustRight(rect, x, bounds, viewWidth, snapMargin, aspectRatio, true, false); - adjustTopByAspectRatio(rect, aspectRatio); - } - break; - case BOTTOM_LEFT: - if (calculateAspectRatio(x, rect.top, rect.right, y) < aspectRatio) { - adjustBottom(rect, y, bounds, viewHeight, snapMargin, aspectRatio, true, false); - adjustLeftByAspectRatio(rect, aspectRatio); - } else { - adjustLeft(rect, x, bounds, snapMargin, aspectRatio, false, true); - adjustBottomByAspectRatio(rect, aspectRatio); - } - break; - case BOTTOM_RIGHT: - if (calculateAspectRatio(rect.left, rect.top, x, y) < aspectRatio) { - adjustBottom(rect, y, bounds, viewHeight, snapMargin, aspectRatio, false, true); - adjustRightByAspectRatio(rect, aspectRatio); - } else { - adjustRight(rect, x, bounds, viewWidth, snapMargin, aspectRatio, false, true); - adjustBottomByAspectRatio(rect, aspectRatio); - } - break; - case LEFT: - adjustLeft(rect, x, bounds, snapMargin, aspectRatio, true, true); - adjustTopBottomByAspectRatio(rect, bounds, aspectRatio); - break; - case TOP: - adjustTop(rect, y, bounds, snapMargin, aspectRatio, true, true); - adjustLeftRightByAspectRatio(rect, bounds, aspectRatio); - break; - case RIGHT: - adjustRight(rect, x, bounds, viewWidth, snapMargin, aspectRatio, true, true); - adjustTopBottomByAspectRatio(rect, bounds, aspectRatio); - break; - case BOTTOM: - adjustBottom(rect, y, bounds, viewHeight, snapMargin, aspectRatio, true, true); - adjustLeftRightByAspectRatio(rect, bounds, aspectRatio); - break; - default: - break; - } - } - - /** - * Check if edges have gone out of bounds (including snap margin), and fix if needed. - */ - private void snapEdgesToBounds(RectF edges, RectF bounds, float margin) { - if (edges.left < bounds.left + margin) { - edges.offset(bounds.left - edges.left, 0); - } - if (edges.top < bounds.top + margin) { - edges.offset(0, bounds.top - edges.top); - } - if (edges.right > bounds.right - margin) { - edges.offset(bounds.right - edges.right, 0); - } - if (edges.bottom > bounds.bottom - margin) { - edges.offset(0, bounds.bottom - edges.bottom); - } - } - - /** - * Get the resulting x-position of the left edge of the crop window given the handle's position - * and the image's bounding box and snap radius. - * - * @param left the position that the left edge is dragged to - * @param bounds the bounding box of the image that is being cropped - * @param snapMargin the snap distance to the image edge (in pixels) - */ - private void adjustLeft( - RectF rect, - float left, - RectF bounds, - float snapMargin, - float aspectRatio, - boolean topMoves, - boolean bottomMoves) { - - float newLeft = left; - - if (newLeft < 0) { - newLeft /= 1.05f; - mTouchOffset.x -= newLeft / 1.1f; - } - - if (newLeft < bounds.left) { - mTouchOffset.x -= (newLeft - bounds.left) / 2f; - } - - if (newLeft - bounds.left < snapMargin) { - newLeft = bounds.left; - } - - // Checks if the window is too small horizontally - if (rect.right - newLeft < mMinCropWidth) { - newLeft = rect.right - mMinCropWidth; - } - - // Checks if the window is too large horizontally - if (rect.right - newLeft > mMaxCropWidth) { - newLeft = rect.right - mMaxCropWidth; - } - - if (newLeft - bounds.left < snapMargin) { - newLeft = bounds.left; - } - - // check vertical bounds if aspect ratio is in play - if (aspectRatio > 0) { - float newHeight = (rect.right - newLeft) / aspectRatio; - - // Checks if the window is too small vertically - if (newHeight < mMinCropHeight) { - newLeft = Math.max(bounds.left, rect.right - mMinCropHeight * aspectRatio); - newHeight = (rect.right - newLeft) / aspectRatio; - } - - // Checks if the window is too large vertically - if (newHeight > mMaxCropHeight) { - newLeft = Math.max(bounds.left, rect.right - mMaxCropHeight * aspectRatio); - newHeight = (rect.right - newLeft) / aspectRatio; - } - - // if top AND bottom edge moves by aspect ratio check that it is within full height bounds - if (topMoves && bottomMoves) { - newLeft = - Math.max(newLeft, Math.max(bounds.left, rect.right - bounds.height() * aspectRatio)); - } else { - // if top edge moves by aspect ratio check that it is within bounds - if (topMoves && rect.bottom - newHeight < bounds.top) { - newLeft = Math.max(bounds.left, rect.right - (rect.bottom - bounds.top) * aspectRatio); - newHeight = (rect.right - newLeft) / aspectRatio; - } - - // if bottom edge moves by aspect ratio check that it is within bounds - if (bottomMoves && rect.top + newHeight > bounds.bottom) { - newLeft = - Math.max( - newLeft, - Math.max(bounds.left, rect.right - (bounds.bottom - rect.top) * aspectRatio)); - } - } - } - - rect.left = newLeft; - } - - /** - * Get the resulting x-position of the right edge of the crop window given the handle's position - * and the image's bounding box and snap radius. - * - * @param right the position that the right edge is dragged to - * @param bounds the bounding box of the image that is being cropped - * @param viewWidth - * @param snapMargin the snap distance to the image edge (in pixels) - */ - private void adjustRight( - RectF rect, - float right, - RectF bounds, - int viewWidth, - float snapMargin, - float aspectRatio, - boolean topMoves, - boolean bottomMoves) { - - float newRight = right; - - if (newRight > viewWidth) { - newRight = viewWidth + (newRight - viewWidth) / 1.05f; - mTouchOffset.x -= (newRight - viewWidth) / 1.1f; - } - - if (newRight > bounds.right) { - mTouchOffset.x -= (newRight - bounds.right) / 2f; - } - - // If close to the edge - if (bounds.right - newRight < snapMargin) { - newRight = bounds.right; - } - - // Checks if the window is too small horizontally - if (newRight - rect.left < mMinCropWidth) { - newRight = rect.left + mMinCropWidth; - } - - // Checks if the window is too large horizontally - if (newRight - rect.left > mMaxCropWidth) { - newRight = rect.left + mMaxCropWidth; - } - - // If close to the edge - if (bounds.right - newRight < snapMargin) { - newRight = bounds.right; - } - - // check vertical bounds if aspect ratio is in play - if (aspectRatio > 0) { - float newHeight = (newRight - rect.left) / aspectRatio; - - // Checks if the window is too small vertically - if (newHeight < mMinCropHeight) { - newRight = Math.min(bounds.right, rect.left + mMinCropHeight * aspectRatio); - newHeight = (newRight - rect.left) / aspectRatio; - } - - // Checks if the window is too large vertically - if (newHeight > mMaxCropHeight) { - newRight = Math.min(bounds.right, rect.left + mMaxCropHeight * aspectRatio); - newHeight = (newRight - rect.left) / aspectRatio; - } - - // if top AND bottom edge moves by aspect ratio check that it is within full height bounds - if (topMoves && bottomMoves) { - newRight = - Math.min(newRight, Math.min(bounds.right, rect.left + bounds.height() * aspectRatio)); - } else { - // if top edge moves by aspect ratio check that it is within bounds - if (topMoves && rect.bottom - newHeight < bounds.top) { - newRight = Math.min(bounds.right, rect.left + (rect.bottom - bounds.top) * aspectRatio); - newHeight = (newRight - rect.left) / aspectRatio; - } - - // if bottom edge moves by aspect ratio check that it is within bounds - if (bottomMoves && rect.top + newHeight > bounds.bottom) { - newRight = - Math.min( - newRight, - Math.min(bounds.right, rect.left + (bounds.bottom - rect.top) * aspectRatio)); - } - } - } - - rect.right = newRight; - } - - /** - * Get the resulting y-position of the top edge of the crop window given the handle's position and - * the image's bounding box and snap radius. - * - * @param top the x-position that the top edge is dragged to - * @param bounds the bounding box of the image that is being cropped - * @param snapMargin the snap distance to the image edge (in pixels) - */ - private void adjustTop( - RectF rect, - float top, - RectF bounds, - float snapMargin, - float aspectRatio, - boolean leftMoves, - boolean rightMoves) { - - float newTop = top; - - if (newTop < 0) { - newTop /= 1.05f; - mTouchOffset.y -= newTop / 1.1f; - } - - if (newTop < bounds.top) { - mTouchOffset.y -= (newTop - bounds.top) / 2f; - } - - if (newTop - bounds.top < snapMargin) { - newTop = bounds.top; - } - - // Checks if the window is too small vertically - if (rect.bottom - newTop < mMinCropHeight) { - newTop = rect.bottom - mMinCropHeight; - } - - // Checks if the window is too large vertically - if (rect.bottom - newTop > mMaxCropHeight) { - newTop = rect.bottom - mMaxCropHeight; - } - - if (newTop - bounds.top < snapMargin) { - newTop = bounds.top; - } - - // check horizontal bounds if aspect ratio is in play - if (aspectRatio > 0) { - float newWidth = (rect.bottom - newTop) * aspectRatio; - - // Checks if the crop window is too small horizontally due to aspect ratio adjustment - if (newWidth < mMinCropWidth) { - newTop = Math.max(bounds.top, rect.bottom - (mMinCropWidth / aspectRatio)); - newWidth = (rect.bottom - newTop) * aspectRatio; - } - - // Checks if the crop window is too large horizontally due to aspect ratio adjustment - if (newWidth > mMaxCropWidth) { - newTop = Math.max(bounds.top, rect.bottom - (mMaxCropWidth / aspectRatio)); - newWidth = (rect.bottom - newTop) * aspectRatio; - } - - // if left AND right edge moves by aspect ratio check that it is within full width bounds - if (leftMoves && rightMoves) { - newTop = Math.max(newTop, Math.max(bounds.top, rect.bottom - bounds.width() / aspectRatio)); - } else { - // if left edge moves by aspect ratio check that it is within bounds - if (leftMoves && rect.right - newWidth < bounds.left) { - newTop = Math.max(bounds.top, rect.bottom - (rect.right - bounds.left) / aspectRatio); - newWidth = (rect.bottom - newTop) * aspectRatio; - } - - // if right edge moves by aspect ratio check that it is within bounds - if (rightMoves && rect.left + newWidth > bounds.right) { - newTop = - Math.max( - newTop, - Math.max(bounds.top, rect.bottom - (bounds.right - rect.left) / aspectRatio)); - } - } - } - - rect.top = newTop; - } - - /** - * Get the resulting y-position of the bottom edge of the crop window given the handle's position - * and the image's bounding box and snap radius. - * - * @param bottom the position that the bottom edge is dragged to - * @param bounds the bounding box of the image that is being cropped - * @param viewHeight - * @param snapMargin the snap distance to the image edge (in pixels) - */ - private void adjustBottom( - RectF rect, - float bottom, - RectF bounds, - int viewHeight, - float snapMargin, - float aspectRatio, - boolean leftMoves, - boolean rightMoves) { - - float newBottom = bottom; - - if (newBottom > viewHeight) { - newBottom = viewHeight + (newBottom - viewHeight) / 1.05f; - mTouchOffset.y -= (newBottom - viewHeight) / 1.1f; - } - - if (newBottom > bounds.bottom) { - mTouchOffset.y -= (newBottom - bounds.bottom) / 2f; - } - - if (bounds.bottom - newBottom < snapMargin) { - newBottom = bounds.bottom; - } - - // Checks if the window is too small vertically - if (newBottom - rect.top < mMinCropHeight) { - newBottom = rect.top + mMinCropHeight; - } - - // Checks if the window is too small vertically - if (newBottom - rect.top > mMaxCropHeight) { - newBottom = rect.top + mMaxCropHeight; - } - - if (bounds.bottom - newBottom < snapMargin) { - newBottom = bounds.bottom; - } - - // check horizontal bounds if aspect ratio is in play - if (aspectRatio > 0) { - float newWidth = (newBottom - rect.top) * aspectRatio; - - // Checks if the window is too small horizontally - if (newWidth < mMinCropWidth) { - newBottom = Math.min(bounds.bottom, rect.top + mMinCropWidth / aspectRatio); - newWidth = (newBottom - rect.top) * aspectRatio; - } - - // Checks if the window is too large horizontally - if (newWidth > mMaxCropWidth) { - newBottom = Math.min(bounds.bottom, rect.top + mMaxCropWidth / aspectRatio); - newWidth = (newBottom - rect.top) * aspectRatio; - } - - // if left AND right edge moves by aspect ratio check that it is within full width bounds - if (leftMoves && rightMoves) { - newBottom = - Math.min(newBottom, Math.min(bounds.bottom, rect.top + bounds.width() / aspectRatio)); - } else { - // if left edge moves by aspect ratio check that it is within bounds - if (leftMoves && rect.right - newWidth < bounds.left) { - newBottom = Math.min(bounds.bottom, rect.top + (rect.right - bounds.left) / aspectRatio); - newWidth = (newBottom - rect.top) * aspectRatio; - } - - // if right edge moves by aspect ratio check that it is within bounds - if (rightMoves && rect.left + newWidth > bounds.right) { - newBottom = - Math.min( - newBottom, - Math.min(bounds.bottom, rect.top + (bounds.right - rect.left) / aspectRatio)); - } - } - } - - rect.bottom = newBottom; - } - - /** - * Adjust left edge by current crop window height and the given aspect ratio, the right edge - * remains in possition while the left adjusts to keep aspect ratio to the height. - */ - private void adjustLeftByAspectRatio(RectF rect, float aspectRatio) { - rect.left = rect.right - rect.height() * aspectRatio; - } - - /** - * Adjust top edge by current crop window width and the given aspect ratio, the bottom edge - * remains in possition while the top adjusts to keep aspect ratio to the width. - */ - private void adjustTopByAspectRatio(RectF rect, float aspectRatio) { - rect.top = rect.bottom - rect.width() / aspectRatio; - } - - /** - * Adjust right edge by current crop window height and the given aspect ratio, the left edge - * remains in possition while the left adjusts to keep aspect ratio to the height. - */ - private void adjustRightByAspectRatio(RectF rect, float aspectRatio) { - rect.right = rect.left + rect.height() * aspectRatio; - } - - /** - * Adjust bottom edge by current crop window width and the given aspect ratio, the top edge - * remains in possition while the top adjusts to keep aspect ratio to the width. - */ - private void adjustBottomByAspectRatio(RectF rect, float aspectRatio) { - rect.bottom = rect.top + rect.width() / aspectRatio; - } - - /** - * Adjust left and right edges by current crop window height and the given aspect ratio, both - * right and left edges adjusts equally relative to center to keep aspect ratio to the height. - */ - private void adjustLeftRightByAspectRatio(RectF rect, RectF bounds, float aspectRatio) { - rect.inset((rect.width() - rect.height() * aspectRatio) / 2, 0); - if (rect.left < bounds.left) { - rect.offset(bounds.left - rect.left, 0); - } - if (rect.right > bounds.right) { - rect.offset(bounds.right - rect.right, 0); - } - } - - /** - * Adjust top and bottom edges by current crop window width and the given aspect ratio, both top - * and bottom edges adjusts equally relative to center to keep aspect ratio to the width. - */ - private void adjustTopBottomByAspectRatio(RectF rect, RectF bounds, float aspectRatio) { - rect.inset(0, (rect.height() - rect.width() / aspectRatio) / 2); - if (rect.top < bounds.top) { - rect.offset(0, bounds.top - rect.top); - } - if (rect.bottom > bounds.bottom) { - rect.offset(0, bounds.bottom - rect.bottom); - } - } - // endregion - - // region: Inner class: Type - - /** - * The type of crop window move that is handled. - */ - public enum Type { - TOP_LEFT, - TOP_RIGHT, - BOTTOM_LEFT, - BOTTOM_RIGHT, - LEFT, - TOP, - RIGHT, - BOTTOM, - CENTER - } - // endregion -} diff --git a/cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png b/cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png deleted file mode 100644 index 133395df364ccbc3a7e6356252a911d3adbb604b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmV+h0r~!kP)r6oV>^ zwVy-JQwj3jDNd!eSn4abduH{DS7Jy0Ua@;&DHBACT8mmSEo#NIs1?(qzAu)vWva!S zK^w+$W>IX6w7JI6i#G6&RHKP;m+~`%>h#dXMlVnYWofaL!_B{m7s({l@QL1$Hvj+t M07*qoM6N<$f&|cTX8-^I diff --git a/cropper/src/main/res/drawable-hdpi/crop_image_menu_rotate_left.png b/cropper/src/main/res/drawable-hdpi/crop_image_menu_rotate_left.png deleted file mode 100644 index e4e26f8c0ec0386544969c3a7ef152baf773daa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmV-=0)_pFP)($=7eh+6zY6DL6sMFgi(sb4tw-2^um5$oXOzaT|~R;e^a5QI7iqB!Vc zq0v@Tj33l%3vPARMJbA=y^kQAgC{w$=k2-NLGrv)?-_nj4sY%an$<>@Z3MCjSlncp zp)(mQ#|-#l0?HQ?P|099K7kJ=rxL)n8Wc=(hx2R^V{%Ft@tguFF(#*UQ|ylq8)e}J z$;5+gt`a3Cu?iCq1)mGNs7#jL3@3Gs1C}#QmAOiF4d$K>vM%TbyNs{4+O+X<|*Ri6t<<0Y}mO*56olryf?y5|OgP`pLWukREQiaBJ9mbA(x5tbxJ~+ROQM_cOPDLb z1h{f6z?EYGt{e++j$G^S1!PXv4{Kw#JD(itv6lV$I3Cc`dYIS zN1E}YiE?bbar@3~m^ETXv+s>drPx^GTYYJ|<gc2Y zoVvL%Hm~lPZrGH%%`o;ppfb@7OZEVjyF%36D*5;BiY=+zGZer+SNCY-&+}N_3ju7= z8Tcx8ESQt?e1LnxnREBXu;dLnFBuMSeJP5K+Lv?S9;toqb6}zLka~+BrZ2?`LbIhK+*@W#6`pSe`ijBR)z4*} HQ$iB}?Eq(9 diff --git a/cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_left.png b/cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_left.png deleted file mode 100644 index bdfcbca828b68fd778f7d7e6e89ba3c04578d249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmV+(1L6FMP)Fp+FQyA*Y^A}RzeEb`(-L4*zx zl!a7ar1ts`NI`W83Q64+cGI12m*~f^&W`&$&)7ioeU7t-4?8cauHl@;Ya*=H2bthV zF*;al5TwD8qFf};YfuB3^^T3+f>!X1%!*Ru?I~N%Qx@(t-FzjrB+cGl)XR7T;P4#U z#{fy}Su}Zj+vhV#YI3}S=P9J4CP3>6I~>X5fyiS-(~99 z#SbKSPp%#)0+5!}>oS*Zv6Hy011jPt{2_%M|HB@a$#o}jq$s88pqof>${c=`MYqdr z--HBrR6#45K^jU+?{Zmw3?s!TR0B05%~9@hwRNNgZDk(myc%c>sV^-?PO$UQexxxK zP$?GD?nN%yoR956vRIQj=oHdNLi&TxNVS=RZX0|C0F*i?_S-4jfi$6a+t(Wb)$85%ok(|$fbQ!(7*8U7G6MR7RI59= zR%vtg>Q1g9#*zB8K?6vmYU`nMDGN09QArZ1MGaKI4ANr_P8KhaqO4L~n% zfc*|r1r;;(m$P4)Q$+%4ni8EC#TEc&H8>SaBEbdSSLs*GazNu|w{zZ*qr2I#A%#;( z_98FkR(>JD6y@f(V`@n7*8MGnZM?)@l4|q&L)9bzfFZ&Te}5JS8N|Y#MT7Ybt0Tk# z={vogwf&-z9=?&<9B0gL>4k;kxCOIt(;V_*({mFaltAN@d9^K^%OzqNfu?9B*V~Qr zQaXt(3N+0PN|xr+LLm`Gu^d73jL=BIQh%N*;W)RjuL2%&onsXG;WN3$2tWZS00p1` c6o53wZ-Cqgpa}7w>;M1&07*qoM6N<$f}b#H$p8QV diff --git a/cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_right.png b/cropper/src/main/res/drawable-xhdpi/crop_image_menu_rotate_right.png deleted file mode 100644 index 6d73012561e6e9418f2d630d8193a4fd87f61049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 787 zcmV+u1MK{XP)hVL z2{Sx34oW;V3ZC-R7%-k10WMGJqnxL-QOQ#}Si<{!%4Mo~nqPD>$e&D8o2U6g7pIwI zcAk<)h67A6SDuo^t6U?T50o5sFiAMSu~122FGZ@|;B!7C*d-PyDGX4l$Pe`D34&bY z1toaNT0PDp2lQ+7yUBe8y;1 z92~-Ril<1Xh_~>W@rk0Ni%HBB>l6U<6)g%x7N3$lor;Qcxb`RzPkly<0@00+ zIj(5v`L z?Ld9u2od{>k2}mKtaUx2{M2C4wABK^b}zqcD{Yoi|FkFnxBHJ!V=?Qa|K*Z-j9-PN zi>%K(_&WNs-(Ua4LoJ-bYCaJsCz(pW+FvHtU~6_{`I^W8JASig2YTIu+Y|ct@7$FB zh37^Kw}X_#ftjnca}MQuus2(Wir<*Qy`<$}XQE75!xn=Zu8FGKuWV?mRSMbW~IJ&5bnI1XkxVlgtF(Xtwj#A(zt6y?Wd3 u6;^Zc^A?})ToChr`qw^NZ;;6On|-w&d+>q$zt4a{&*16m=d#Wzp$PzI|y9LMqhc5ls|ge+$g#hsF@gl!pZ)Ry!_fiE(qnZ-c2bhFGX2+D}MyQ3GDy@ z#|b91;SrQRQq8B6uS)#3wZ;i1v{EPyJG-md!8pY#uqsY4VKoyF`VgFD7sZ<3<~YHG zm5dvm?r-N;f*T?m1uVk{T!)0%a>fi`!fd(;uAf=%Vb1_3L(-OUrUXoH3&Cx34XbAY zfImXg?%=c$OlYHkKaXaYuyXnU&eE13A$BW&8^MHjg8G>Xcd!QljA={x%LpbsNl+VI z!OrD4Oo?_Qr;K1i7ybsB?FP0PfBTV8Yv802>;ewqZ;K091xL|&+<=7K5=IPQ!fp6F zPNjX=O8mWv7_62d1DNnO{#xzBK1Fw$`H0aL^Sc2o%NV*ZZNo0bL-z_|yc&KB4HLGb z^O$EBwgH{Tl?dj$iesT+HB6%0XczV&x=)ZPZUJkNkoz3n$2MUZ{zSJ1!TmbWjZ$t8 zR*%l(;z(d~@zB-TgSDgk28n3>=sN7dwxN49GT3%>FWG~wAg9(C8EhT8-3G82?-q3Z z$$(|i9Z3dk4!V(Kz|KK8mcr6UF@1Tsf88hX5A^%VI8wci?nQgBHgw-c20MUmy**eR zI*&^tVO8UytF;Hqa0*>pB(P3&Cn>iF6ZW9{EE3ok==LHuVV&qES?HW~4gMaq3!6s) z-D}QaJJ1!VwhI$_(EY<@PFV{WN4F2L4Qs*QPN%SU@pr#{Scb#sCTVuYx)XoLsI(6g zHsP<=5oyD_9x5004|o@AkBz zI!J{(m{7~OV^#+q1b;hq2@{@j$SNa8a9a`AuyVS&)(Pt(_7L26RGGu1;ftdUWQ^$TyY6j5tpCkH9jX8V(@>%POy%$_+7I)pT{{qW!ND$P!->c zah0s1hk_AojQ6;U%uKkWIhS_287c`o!7kP?XQthQE@Kg^$p;*a@8(%nun2KCA#qD# vDJ+GhuoRZUQdkO0VJR$yrLYv1!W`^hu2AEoBTAo?00000NkvXXu0mjfp*bNJ diff --git a/cropper/src/main/res/drawable-xxhdpi/crop_image_menu_rotate_right.png b/cropper/src/main/res/drawable-xxhdpi/crop_image_menu_rotate_right.png deleted file mode 100644 index 796114cc4a028793ed39cb0b2a49175b45e0101c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1165 zcmV;81akX{P)?x|hpY&+N4b)B6ZuJ`9Jc*#7w4m+3l zrg}afi;?svxSvAh6$UD=Fi?4gfyyfkR9<1A@(Kf$R~V?g!a(H}1}d*GPd~4$)7X)YO2@pn)$bVv@=_tcqvoB}po~uxae1K=M>JVYQrQ zqN%LGDtVOv8|}>!teWq!RaM0j)?@U`-4&b^$-|E=L)!5>Fsmfi)8_R>#@F zJOn|F%X%Ei3hYrzjMfluQ4{N|2vDQ}$qH;8BaBuDi((&wVT6Z~tiW!dkLY@+GdkT5 zu@T7%Y$n}AcaT|#0c?;BNQ~XZrRJMj9?d8gT&aX%UA%7u3%TuN4Nus z5$pnY$7Bug|9+>^4eUk2^-yI5>t_`bYu^yA)dj4QbLa)sA_lMmw;?fiKLL8bP;MW# znQ-qT2C(z2Kn(UF;U2UPJAvLMt}}q0WjSKB1q`D1xoz0Bl+b$}i4E&zDPp|0(Hmio zUD#9T1>6)H_6Ij6d_ND+YqksPM6VNxxh-6eB;0ZI4%viF<05)nkrcKay*|q9!B(PI zWKJruc?9S!vj=NMuM0_Or_p=N9<1H`iD+%_ptsK+>=lLA?X?^F;*vOV*xV8mhd!PXxX9($+w9? z#_K0OV0FaDDIJ_a%Pvir$X4@rqB{@@09?|9iERmAJAlEl$%Y9PyiCa|EZ`MpWaHA# zJ#<-vb+aZ**R0Cf!MO>;&eO*9>|KnT$&>t+7}m>fsm)!#vEx fJj}y9%)|Zziy-WXhtC%200000NkvXXu0mjfSN$KD diff --git a/cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_flip.png b/cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_flip.png deleted file mode 100644 index 4200cb86992ebb9a57da74735668d5f43e0d74f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ)^zFdp`FaSW+oe0$gM)T00q_mA5r z7#8}PHNA8EF~hOYG)(E8!Xv+&qr5Xrx<2}(u2iT@RGVJ>Z|#yFrQ1KM8XFtG7JBdX zzpnFtB8SQZ2PRH9A*!>&BJgwS-3F^a|IW24XCM2^+q`xx9n$JOLJtw4IG^CITEQmYv|<(iq^d;WTH+g*N6a&CiUw3Niv~ zJ~4(WHuC*!@KbC&_p{;E1c&W44*8!VL_HK5S%eV8io@Sok+>iU3`L(JdYRzvg}D65 zMlBRyaAF9kOgO#@*`J&$7w+2s{lBOCyj#sZLzRH3{28)B88i7ae5CnaI8Nl(*vQYm zMfE9*R;CkU?9Zv<8ixF=CaO=_y#8=9e{p`rtYNrV&gQ~Y&6WBKTn_e?ZE)b<*5gsj zxHoLmqXRQPgg&ebxsLQ E0OOCgjQ{`u diff --git a/cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_rotate_left.png b/cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_rotate_left.png deleted file mode 100644 index 1eb686127baefb68d3453e1717cd6eb10702856a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 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 - \ No newline at end of file diff --git a/cropper/src/main/res/layout/crop_image_view.xml b/cropper/src/main/res/layout/crop_image_view.xml deleted file mode 100644 index 50f897b5..00000000 --- a/cropper/src/main/res/layout/crop_image_view.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/cropper/src/main/res/menu/crop_image_menu.xml b/cropper/src/main/res/menu/crop_image_menu.xml deleted file mode 100644 index ff42bc69..00000000 --- a/cropper/src/main/res/menu/crop_image_menu.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cropper/src/main/res/values-ar/strings.xml b/cropper/src/main/res/values-ar/strings.xml deleted file mode 100644 index 4b570989..00000000 --- a/cropper/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - أدر عكس اتجاه عقارب الساعة - أدر - قُصّ - اقلب - اقلب أفقيًا - اقلب رأسيًا - - اختر مصدرًا - - إلغاء؛ الأذونات المطلوبة غير ممنوحة - - diff --git a/cropper/src/main/res/values-cs/strings.xml b/cropper/src/main/res/values-cs/strings.xml deleted file mode 100644 index a8cef3c9..00000000 --- a/cropper/src/main/res/values-cs/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Otočit proti směru hodinových ručiček - Otočit - Oříznout - Překlopit - Překlopit vodorovně - Překlopit svisle - - Vybrat zdroj - - Probíhá storno, požadovaná povolení nejsou udělena - - diff --git a/cropper/src/main/res/values-de/strings.xml b/cropper/src/main/res/values-de/strings.xml deleted file mode 100644 index 1ef0f3d7..00000000 --- a/cropper/src/main/res/values-de/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - gegen den Uhrzeigersinn drehen - drehen - zuschneiden - spiegeln - horizontal spiegeln - vertikal spiegeln - - Quelle wählen - - Vorgang wird abgebrochen, benötigte Berechtigungen wurden nicht erteilt. - - diff --git a/cropper/src/main/res/values-es-rGT/strings.xml b/cropper/src/main/res/values-es-rGT/strings.xml deleted file mode 100644 index c9b0864f..00000000 --- a/cropper/src/main/res/values-es-rGT/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Girar a la izquierda - Girar a la derecha - Cortar - Dar la vuelta - Voltear horizontalmente - Voltear verticalmente - Seleccionar fuente - Cancelando, los permisos requeridos no se otorgaron - \ No newline at end of file diff --git a/cropper/src/main/res/values-es/strings.xml b/cropper/src/main/res/values-es/strings.xml deleted file mode 100644 index a14c240a..00000000 --- a/cropper/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Rotar a la izquierda - Rotar a la derecha - Cortar - Dar la vuelta - Voltear horizontalmente - Voltear verticalmente - Seleccionar fuente - Cancelando, los permisos requeridos no han sido otorgados - \ No newline at end of file diff --git a/cropper/src/main/res/values-fa/strings.xml b/cropper/src/main/res/values-fa/strings.xml deleted file mode 100644 index b6745743..00000000 --- a/cropper/src/main/res/values-fa/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - چرخش در جهت عقربه های ساعت - چرخش - بریدن (کراپ) - آیینه کردن - آیینه کردن به صورت افقی - آیینه کردن به صورت عمودی - منبع را انتخاب کنید - لغو، مجوزهای مورد نیاز ارائه نشده - \ No newline at end of file diff --git a/cropper/src/main/res/values-fr/strings.xml b/cropper/src/main/res/values-fr/strings.xml deleted file mode 100644 index b0ec3bd0..00000000 --- a/cropper/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Pivoter à gauche - Pivoter à droite - Redimensionner - Retourner - Retourner horizontalement - Retourner verticalement - Sélectionner la source - Annulation, il manque des permissions requises - diff --git a/cropper/src/main/res/values-he/strings.xml b/cropper/src/main/res/values-he/strings.xml deleted file mode 100644 index 8a781d36..00000000 --- a/cropper/src/main/res/values-he/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - סובב נגד כיוון השעון - סובב - חתוך - הפוך - הפוך אופקית - הפוך אנכית - - בחר מקור - - ההרשאות הנדרשות חסרות, מבטל - - diff --git a/cropper/src/main/res/values-hi/strings.xml b/cropper/src/main/res/values-hi/strings.xml deleted file mode 100644 index 8549a125..00000000 --- a/cropper/src/main/res/values-hi/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - घड़ी की सुई के विपरीत दिशा में घुमाइए - घुमाएँ - फ़सल - फ्लिप - क्षैतिज फ्लिप - लंबवत फ्लिप करें - सोर्स चुनें - रद्द करना, आवश्यक अनुमतियां नहीं दी गई हैं - \ No newline at end of file diff --git a/cropper/src/main/res/values-id/strings.xml b/cropper/src/main/res/values-id/strings.xml deleted file mode 100644 index 5d0570ea..00000000 --- a/cropper/src/main/res/values-id/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Putar berlawanan arah jarum jam - Putar - Potong - Balik - Balik secara horizontal - Balik secara vertikal - Pilih sumber - Membatalkan, tidak mendapatkan izin yang diperlukan - - \ No newline at end of file diff --git a/cropper/src/main/res/values-in/strings.xml b/cropper/src/main/res/values-in/strings.xml deleted file mode 100644 index 5d0570ea..00000000 --- a/cropper/src/main/res/values-in/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Putar berlawanan arah jarum jam - Putar - Potong - Balik - Balik secara horizontal - Balik secara vertikal - Pilih sumber - Membatalkan, tidak mendapatkan izin yang diperlukan - - \ No newline at end of file diff --git a/cropper/src/main/res/values-it/strings.xml b/cropper/src/main/res/values-it/strings.xml deleted file mode 100644 index fa266660..00000000 --- a/cropper/src/main/res/values-it/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Ruota in senso antiorario - Ruota - Ritaglia - Capovolgi - Capovolgi orizzontalmente - Capovolgi verticalmente - - Seleziona origine - - Annullamento in corso, autorizzazione richieste non concesse - - diff --git a/cropper/src/main/res/values-ja/strings.xml b/cropper/src/main/res/values-ja/strings.xml deleted file mode 100644 index 4ab0ca56..00000000 --- a/cropper/src/main/res/values-ja/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - 左回転 - 右回転 - 切り取り - 反転 - 左右反転 - 上下反転 - 画像を選択 - 必要な権限がありません、キャンセルしています。 - diff --git a/cropper/src/main/res/values-ko/strings.xml b/cropper/src/main/res/values-ko/strings.xml deleted file mode 100644 index a33967bd..00000000 --- a/cropper/src/main/res/values-ko/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 반시계 회전 - 회전 - 자르기 - 반전 - 좌우반전 - 상하반전 - - 이미지 선택 - - 필수 권한이 없어서 취소합니다. - - diff --git a/cropper/src/main/res/values-ms/strings.xml b/cropper/src/main/res/values-ms/strings.xml deleted file mode 100644 index 000ac2eb..00000000 --- a/cropper/src/main/res/values-ms/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Putar arah berlawanan jam - Putar - Potong - Flip - Flip melintang - Flip menegak - Pilih sumber - Membatal, tidak mendapat kebenaran yang diperlukan - - \ No newline at end of file diff --git a/cropper/src/main/res/values-nb/strings.xml b/cropper/src/main/res/values-nb/strings.xml deleted file mode 100644 index c177d252..00000000 --- a/cropper/src/main/res/values-nb/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Roter teller med urviseren - Roter - Beskjær - Vend - Vend vannrett - Vend loddrett - - Velg kilde - - Avbryter, nødvendige tillatelser er ikke gitt - - diff --git a/cropper/src/main/res/values-nl/strings.xml b/cropper/src/main/res/values-nl/strings.xml deleted file mode 100644 index 6b25e03b..00000000 --- a/cropper/src/main/res/values-nl/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Tegen de klok in draaien - Draaien - Bijsnijden - Spiegelen - Horizontaal spiegelen - Verticaal spiegelen - - Bron selecteren - - Wordt geannuleerd, vereiste machtigingen zijn niet toegekend - - diff --git a/cropper/src/main/res/values-pl/strings.xml b/cropper/src/main/res/values-pl/strings.xml deleted file mode 100644 index 9db22a14..00000000 --- a/cropper/src/main/res/values-pl/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Obróć w lewo - Obróć - Przytnij - Odbij - Odbij poziomo - Odbij pionowo - - Wybierz źródło - - Przerywaniem, potrzebne uprawnienia nie zostały nadane - - diff --git a/cropper/src/main/res/values-pt-rBR/strings.xml b/cropper/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index e60b8bfb..00000000 --- a/cropper/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Girar para a esquerda - Girar para a direita - Cortar - Espelhar - Espelhar na horizontal - Espelhar na vertifcal - - Escolher foto a partir de - - diff --git a/cropper/src/main/res/values-ru-rRU/strings.xml b/cropper/src/main/res/values-ru-rRU/strings.xml deleted file mode 100644 index cd8e62d9..00000000 --- a/cropper/src/main/res/values-ru-rRU/strings.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - Повернуть налево - Повернуть направо - Обрезать - Отразить - Отразить по горизонтали - Отразить по вертикали - Выбрать источник - \ No newline at end of file diff --git a/cropper/src/main/res/values-sv/strings.xml b/cropper/src/main/res/values-sv/strings.xml deleted file mode 100644 index ce8beb96..00000000 --- a/cropper/src/main/res/values-sv/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Rotera vänster - Rotera höger - Beskär - Vänd - Vänd horisontellt - Vänd vertikalt - - Välj bild - - Avbryter, nödvändiga behörigheter beviljas inte - - diff --git a/cropper/src/main/res/values-tr/strings.xml b/cropper/src/main/res/values-tr/strings.xml deleted file mode 100644 index ba0f6f4e..00000000 --- a/cropper/src/main/res/values-tr/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Saat yönünde döndür - döndürmek - ekin - fiske - Yatay olarak çevir - Dikey olarak çevir - Kaynağı seçin - İptal ediliyor, gerekli izinler verilmiyor - - \ No newline at end of file diff --git a/cropper/src/main/res/values-ur/strings.xml b/cropper/src/main/res/values-ur/strings.xml deleted file mode 100644 index b62a923f..00000000 --- a/cropper/src/main/res/values-ur/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - گھڑی وار گھڑی گھومیں - گھمائیں - فصل - پلٹائیں - افقی پلٹائیں - عمودی طور پر پلٹائیں - ذریعہ منتخب کریں - منسوخ کرنا، ضروری اجازت نہیں دی جاتی ہیں - - \ No newline at end of file diff --git a/cropper/src/main/res/values-vi/strings.xml b/cropper/src/main/res/values-vi/strings.xml deleted file mode 100644 index d6301f41..00000000 --- a/cropper/src/main/res/values-vi/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Xoay theo chiều kim đồng hồ - Xoay - Cắt - Lật - Lật theo chiều ngang - Lật theo chiều dọc - - Chọn nguồn - - Đang hủy, các quyền đã yêu cầu không được cấp - - diff --git a/cropper/src/main/res/values-zh-rCN/strings.xml b/cropper/src/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index 7ceb799a..00000000 --- a/cropper/src/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 逆时针旋转 - 旋转 - 裁切 - 翻转 - 水平翻转 - 垂直翻转 - - 选择来源 - - 取消中,未授予所需权限 - - \ No newline at end of file diff --git a/cropper/src/main/res/values-zh-rTW/strings.xml b/cropper/src/main/res/values-zh-rTW/strings.xml deleted file mode 100644 index 269b9653..00000000 --- a/cropper/src/main/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 逆時針旋轉 - 旋轉 - 裁切 - 翻轉 - 水平翻轉 - 垂直翻轉 - - 選擇來源 - - 取消中,未授予所需權限 - - \ No newline at end of file diff --git a/cropper/src/main/res/values-zh/strings.xml b/cropper/src/main/res/values-zh/strings.xml deleted file mode 100644 index b197f48f..00000000 --- a/cropper/src/main/res/values-zh/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 逆时针旋转 - 旋转 - 裁剪 - 翻转 - 水平翻转 - 垂直翻转 - - 选择来源 - - 正在取消,该操作未获得所需权限。 - - diff --git a/cropper/src/main/res/values/attrs.xml b/cropper/src/main/res/values/attrs.xml deleted file mode 100644 index 756a2c1b..00000000 --- a/cropper/src/main/res/values/attrs.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cropper/src/main/res/values/strings.xml b/cropper/src/main/res/values/strings.xml deleted file mode 100644 index 6dc1fd22..00000000 --- a/cropper/src/main/res/values/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Rotate counter clockwise - Rotate - Crop - Flip - Flip horizontally - Flip vertically - - Select source - - Cancelling, required permissions are not granted - - diff --git a/settings.gradle b/settings.gradle index 48eb5e95..eea69bc0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,4 +3,3 @@ include ':app' include ':autoimageslider' include ':mytransl' include ':ratethisapp' -include ':cropper' From ba7c404699c5954dcead58d888c4e2b9028ea3d9 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 23 Dec 2022 17:34:00 +0100 Subject: [PATCH 31/68] some fixes --- app/src/main/AndroidManifest.xml | 1 + .../app/fedilab/android/helper/Helper.java | 46 +-- .../fedilab/android/helper/MediaHelper.java | 305 +++++++++--------- 3 files changed, 164 insertions(+), 188 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7c0b89c5..6543017c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index da475df5..572e96d5 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -36,7 +36,6 @@ import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; @@ -157,7 +156,6 @@ import app.fedilab.android.client.entities.app.Timeline; import app.fedilab.android.databinding.PopupReleaseNotesBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.interfaces.OnDownloadInterface; -import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.ui.drawer.ReleaseNoteAdapter; import app.fedilab.android.viewmodel.mastodon.AccountsVM; import app.fedilab.android.viewmodel.mastodon.OauthVM; @@ -171,10 +169,6 @@ import okhttp3.RequestBody; public class Helper { public static final String TAG = "fedilab_app"; - public static final String APP_CLIENT_ID = "APP_CLIENT_ID"; - public static final String APP_CLIENT_SECRET = "APP_CLIENT_SECRET"; - public static final String APP_INSTANCE = "APP_INSTANCE"; - public static final String APP_API = "APP_API"; public static final String CLIP_BOARD = "CLIP_BOARD"; public static final String INSTANCE_SOCIAL_KEY = "jGj9gW3z9ptyIpB8CMGhAlTlslcemMV6AgoiImfw3vPP98birAJTHOWiu5ZWfCkLvcaLsFZw9e3Pb7TIwkbIyrj3z6S7r2oE6uy6EFHvls3YtapP8QKNZ980p9RfzTb4"; @@ -1244,18 +1238,14 @@ public class Helper { Date now = new Date(); attachment.filename = formatter.format(now) + "." + extension; if (attachment.mimeType.startsWith("image")) { - try { - final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); - boolean isCertCacheDirExists = certCacheDir.exists(); - if (!isCertCacheDirExists) { - certCacheDir.mkdirs(); - } - String filePath = certCacheDir.getAbsolutePath() + "/" + attachment.filename; - MediaHelper.ResizedImageRequestBody(context, uri, filePath); - attachment.local_path = filePath; - } catch (IOException e) { - e.printStackTrace(); + final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); + boolean isCertCacheDirExists = certCacheDir.exists(); + if (!isCertCacheDirExists) { + certCacheDir.mkdirs(); } + String filePath = certCacheDir.getAbsolutePath() + "/" + attachment.filename; + MediaHelper.ResizedImageRequestBody(context, uri, new File(filePath)); + attachment.local_path = filePath; } else { InputStream selectedFileInputStream; try { @@ -1616,28 +1606,6 @@ public class Helper { } } - public static void transfertIfExist(Context context) { - File dbFile = context.getDatabasePath(OLD_DB_NAME); - if (!dbFile.exists()) { - return; - } - int version = -1; - try { - SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase - (context.getDatabasePath(OLD_DB_NAME).getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY); - version = sqlDb.getVersion(); - } catch (Exception ignored) { - } - try { - if (version == -1) { - version = 38; - } - SQLiteDatabase oldDb = Sqlite.getInstance(context.getApplicationContext(), OLD_DB_NAME, null, version).open(); - - } catch (Exception ignored) { - } - context.deleteDatabase(OLD_DB_NAME); - } public static String dateDiffFull(Date dateToot) { SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault()); diff --git a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java index 586df508..8a45fdb0 100644 --- a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java @@ -21,26 +21,19 @@ import static app.fedilab.android.helper.LogoHelper.getMainLogo; import android.app.Activity; import android.app.DownloadManager; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.ImageDecoder; import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.media.ExifInterface; import android.media.MediaRecorder; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; -import android.text.TextUtils; import android.text.format.DateFormat; import android.view.View; import android.webkit.MimeTypeMap; @@ -51,7 +44,7 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.core.content.FileProvider; -import androidx.preference.PreferenceManager; +import androidx.exifinterface.media.ExifInterface; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; @@ -62,6 +55,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -84,7 +78,6 @@ import app.fedilab.android.client.entities.api.Attachment; import app.fedilab.android.databinding.DatetimePickerBinding; import app.fedilab.android.databinding.PopupRecordBinding; import es.dmoral.toasty.Toasty; -import okhttp3.MediaType; public class MediaHelper { @@ -96,7 +89,6 @@ public class MediaHelper { * @param url String download url */ public static long manageDownloadsNoPopup(final Context context, final String url) { - final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); final DownloadManager.Request request; try { @@ -120,7 +112,11 @@ public class MediaHelper { } if (!new File(myDir).exists()) { - new File(myDir).mkdir(); + boolean created = new File(myDir).mkdir(); + if (!created) { + Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); + return -1; + } } if (mime.toLowerCase().startsWith("video")) { request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, context.getString(R.string.app_name) + "/" + fileName); @@ -160,7 +156,11 @@ public class MediaHelper { File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File targeted_folder = new File(path, context.getString(R.string.app_name)); if (!targeted_folder.exists()) { - targeted_folder.mkdir(); + boolean created = targeted_folder.mkdir(); + if (!created) { + Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); + return; + } } FileInputStream fis = null; FileOutputStream fos = null; @@ -229,20 +229,6 @@ public class MediaHelper { }); } - public static String formatSeconds(int seconds) { - return getTwoDecimalsValue(seconds / 3600) + ":" - + getTwoDecimalsValue(seconds / 60) + ":" - + getTwoDecimalsValue(seconds % 60); - } - - private static String getTwoDecimalsValue(int value) { - if (value >= 0 && value <= 9) { - return "0" + value; - } else { - return value + ""; - } - } - public static String getMimeType(String url) { String type = null; @@ -284,14 +270,12 @@ public class MediaHelper { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); - File image = File.createTempFile( + // Save a file: path for use with ACTION_VIEW intents + return File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); - // Save a file: path for use with ACTION_VIEW intents - String mCurrentPhotoPath = image.getAbsolutePath(); - return image; } /** @@ -412,6 +396,7 @@ public class MediaHelper { * @param attachmentList - List * @return int - The max height */ + @SuppressWarnings("unused") public static int returnMaxHeightForPreviews(Context context, List attachmentList) { int maxHeight = RelativeLayout.LayoutParams.WRAP_CONTENT; if (attachmentList != null && attachmentList.size() > 0) { @@ -433,145 +418,167 @@ public class MediaHelper { void scheduledAt(String scheduledDate); } - - public static void ResizedImageRequestBody(Context context, Uri uri, String fullpatch) throws IOException { - - BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inJustDecodeBounds = true; - String contentType; - if ("file".equals(uri.getScheme())) { - BitmapFactory.decodeFile(uri.getPath(), opts); - contentType = MediaHelper.getFileMediaType(new File(uri.getPath())).type(); - } else { - try (InputStream in = context.getContentResolver().openInputStream(uri)) { - BitmapFactory.decodeStream(in, null, opts); - } - contentType = context.getContentResolver().getType(uri); - } - if (TextUtils.isEmpty(contentType)) - contentType = "image/jpeg"; - Bitmap bitmap; - if (Build.VERSION.SDK_INT >= 28) { - ImageDecoder.Source source; - if ("file".equals(uri.getScheme())) { - source = ImageDecoder.createSource(new File(uri.getPath())); - } else { - source = ImageDecoder.createSource(context.getContentResolver(), uri); - } - BitmapFactory.Options finalOpts = opts; - bitmap = ImageDecoder.decodeBitmap(source, (decoder, info, _source) -> { - int[] size = getTargetSize(info.getSize().getWidth(), info.getSize().getHeight()); - decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); - if (needResize(finalOpts.outWidth, finalOpts.outHeight)) { - decoder.setTargetSize(size[0], size[1]); - } - }); - } else { - int[] size = getTargetSize(opts.outWidth, opts.outHeight); - int targetWidth; - int targetHeight; - if (needResize(opts.outWidth, opts.outHeight)) { - targetWidth = size[0]; - targetHeight = size[1]; - } else { - targetWidth = opts.outWidth; - targetHeight = opts.outHeight; - } - float factor = opts.outWidth / (float) targetWidth; - opts = new BitmapFactory.Options(); - opts.inSampleSize = (int) factor; - int orientation = 0; - String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION}; + public static void ResizedImageRequestBody(Context context, Uri uri, File targetedFile) { + InputStream decodeBitmapInputStream = null; + try { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeStream(inputStream, null, options); try { - Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); - if (cursor.moveToFirst()) { - int photoRotation = cursor.getInt(0); - } - cursor.close(); - } catch (Exception e) { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); } - - if ("file".equals(uri.getScheme())) { - ExifInterface exif = new ExifInterface(uri.getPath()); - orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - try (InputStream in = context.getContentResolver().openInputStream(uri)) { - ExifInterface exif = new ExifInterface(in); - orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + int orientation = getImageOrientation(uri, context.getContentResolver()); + int scaledImageSize = 1024; + do { + FileOutputStream outputStream = new FileOutputStream(targetedFile); + decodeBitmapInputStream = context.getContentResolver().openInputStream(uri); + options.inSampleSize = calculateInSampleSize(options, scaledImageSize, scaledImageSize); + options.inJustDecodeBounds = false; + Bitmap scaledBitmap = BitmapFactory.decodeStream(decodeBitmapInputStream, null, options); + Bitmap reorientedBitmap = reorientBitmap(scaledBitmap, orientation); + if (reorientedBitmap == null) { + scaledBitmap.recycle(); + return; } - } - if ("file".equals(uri.getScheme())) { - bitmap = BitmapFactory.decodeFile(uri.getPath(), opts); - } else { - try (InputStream in = context.getContentResolver().openInputStream(uri)) { - bitmap = BitmapFactory.decodeStream(in, null, opts); + Bitmap.CompressFormat format; + if (!reorientedBitmap.hasAlpha()) { + format = Bitmap.CompressFormat.JPEG; + } else { + format = Bitmap.CompressFormat.PNG; + } + reorientedBitmap.compress(format, 100, outputStream); + reorientedBitmap.recycle(); + scaledImageSize /= 2; + } while (targetedFile.length() > getMaxSize(targetedFile.length())); + } catch (Exception e) { + e.printStackTrace(); + if (decodeBitmapInputStream != null) { + try { + decodeBitmapInputStream.close(); + } catch (IOException ex) { + ex.printStackTrace(); } } - if (factor % 1f != 0f) { - Rect srcBounds = null; - Rect dstBounds; - dstBounds = new Rect(0, 0, targetWidth, targetHeight); - Bitmap scaled = Bitmap.createBitmap(dstBounds.width(), dstBounds.height(), Bitmap.Config.ARGB_8888); - new Canvas(scaled).drawBitmap(bitmap, srcBounds, dstBounds, new Paint(Paint.FILTER_BITMAP_FLAG)); - bitmap = scaled; - } + } + } + private static int calculateInSampleSize(BitmapFactory.Options options, int rqWidth, int rqHeight) { + int height = options.outHeight; + int width = options.outWidth; + int inSampleSize = 1; + if (height > rqHeight || width > rqWidth) { - int rotation = 0; - switch (orientation) { - case ExifInterface.ORIENTATION_ROTATE_90: - rotation = 90; - break; - case ExifInterface.ORIENTATION_ROTATE_180: - rotation = 180; - break; - case ExifInterface.ORIENTATION_ROTATE_270: - rotation = 270; - break; - } - if (rotation != 0) { - Matrix matrix = new Matrix(); - matrix.setRotate(rotation); - bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); + int halfHeight = height / 2; + int halfWidth = width / 2; + while ((halfHeight / inSampleSize) > rqHeight && (halfWidth / inSampleSize) > rqWidth) { + inSampleSize *= 2; } } + return inSampleSize; + } - boolean isPNG = "image/png".equals(contentType); - File tempFile = new File(fullpatch); - try (FileOutputStream out = new FileOutputStream(tempFile)) { - if (isPNG) { - bitmap.compress(Bitmap.CompressFormat.PNG, 0, out); - } else { - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + private static int getImageOrientation(Uri uri, ContentResolver contentResolver) { + InputStream inputStream; + try { + inputStream = contentResolver.openInputStream(uri); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return ExifInterface.ORIENTATION_UNDEFINED; + } + if (inputStream == null) { + return ExifInterface.ORIENTATION_UNDEFINED; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + try { + ExifInterface exifInterface = new ExifInterface(inputStream); + int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + inputStream.close(); + return orientation; + } catch (IOException e) { + try { + inputStream.close(); + } catch (IOException ex) { + ex.printStackTrace(); + return ExifInterface.ORIENTATION_UNDEFINED; + } + e.printStackTrace(); + return ExifInterface.ORIENTATION_UNDEFINED; + } + } else { + try { + ExifInterface exifInterface = new ExifInterface(uri.getPath()); + int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + inputStream.close(); + return orientation; + } catch (IOException e) { + try { + inputStream.close(); + } catch (IOException ex) { + ex.printStackTrace(); + return ExifInterface.ORIENTATION_UNDEFINED; + } + e.printStackTrace(); + return ExifInterface.ORIENTATION_UNDEFINED; } } - } - private static int[] getTargetSize(int srcWidth, int srcHeight) { - int maxSize = 1; + private static long getMaxSize(long maxSize) { if (MainActivity.instanceInfo != null && MainActivity.instanceInfo.configuration != null && MainActivity.instanceInfo.configuration.media_attachments != null) { maxSize = MainActivity.instanceInfo.configuration.media_attachments.image_size_limit; } - int targetWidth = Math.round((float) Math.sqrt((float) maxSize * ((float) srcWidth / srcHeight))); - int targetHeight = Math.round((float) Math.sqrt((float) maxSize * ((float) srcHeight / srcWidth))); - return new int[]{targetWidth, targetHeight}; + return maxSize; } - private static boolean needResize(int srcWidth, int srcHeight) { - int maxSize; - if (MainActivity.instanceInfo != null && MainActivity.instanceInfo.configuration != null && MainActivity.instanceInfo.configuration.media_attachments != null) { - maxSize = MainActivity.instanceInfo.configuration.media_attachments.image_size_limit; - } else { - return false; + public static Bitmap reorientBitmap(Bitmap bitmap, int orientation) { + Matrix matrix = new Matrix(); + switch (orientation) { + case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: + matrix.setScale(-1.0f, 1.0f); + break; + case ExifInterface.ORIENTATION_ROTATE_180: + matrix.setRotate(180.0f); + break; + case ExifInterface.ORIENTATION_FLIP_VERTICAL: + matrix.setRotate(180.0f); + matrix.postScale(-1.0f, 1.0f); + break; + case ExifInterface.ORIENTATION_TRANSPOSE: + matrix.setRotate(90.0f); + matrix.postScale(-1.0f, 1.0f); + break; + case ExifInterface.ORIENTATION_ROTATE_90: + matrix.setRotate(90.0f); + break; + case ExifInterface.ORIENTATION_TRANSVERSE: + matrix.setRotate(-90.0f); + matrix.postScale(-1.0f, 1.0f); + break; + case ExifInterface.ORIENTATION_ROTATE_270: + matrix.setRotate(-90.0f); + break; + default: + return bitmap; + } + if (bitmap == null) { + return null; } - return srcWidth * srcHeight > maxSize; + try { + Bitmap result = Bitmap.createBitmap( + bitmap, 0, 0, bitmap.getWidth(), + bitmap.getHeight(), matrix, true); + if (!bitmap.sameAs(result)) { + bitmap.recycle(); + } + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - - public static MediaType getFileMediaType(File file) { - String name = file.getName(); - return MediaType.parse(MimeTypeMap.getSingleton().getMimeTypeFromExtension(name.substring(name.lastIndexOf('.') + 1))); - } } From ebb809a0ddc2da28041bcd8636881aa3b60370ec Mon Sep 17 00:00:00 2001 From: 0xd9a <0xd9a@noreply.codeberg.org> Date: Fri, 23 Dec 2022 22:21:14 +0530 Subject: [PATCH 32/68] Remove scrim color in profile activity --- app/src/main/res/layout/activity_profile.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 7f3b6ac4..f98dcda6 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -32,7 +32,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" - app:contentScrim="?colorPrimary" app:expandedTitleGravity="top" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" From f7f2ac542e077b24ccf3a67c7c3b1a2f273674ad Mon Sep 17 00:00:00 2001 From: 0xd9a <0xd9a@noreply.codeberg.org> Date: Fri, 23 Dec 2022 22:24:13 +0530 Subject: [PATCH 33/68] Update screenshots --- .../android/en/images/phoneScreenshots/1.png | Bin 105643 -> 84754 bytes .../android/en/images/phoneScreenshots/2.png | Bin 107497 -> 118398 bytes .../android/en/images/phoneScreenshots/3.png | Bin 225446 -> 250683 bytes .../android/en/images/phoneScreenshots/4.png | Bin 74247 -> 68337 bytes .../android/en/images/phoneScreenshots/5.png | Bin 120363 -> 100027 bytes .../android/en/images/phoneScreenshots/6.png | Bin 93325 -> 94261 bytes .../android/en/images/phoneScreenshots/7.png | Bin 25455 -> 37311 bytes .../android/en/images/phoneScreenshots/8.png | Bin 34639 -> 35087 bytes .../android/en/images/phoneScreenshots/9.png | Bin 93809 -> 83669 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/1.png b/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/1.png index 1da1009044026f1a27fd274e7f5b15a0f6202307..4be53baad65d05f4928694c8cab20d5bf84b3cb1 100644 GIT binary patch literal 84754 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 Y`%LN_>9e?lWPnr*bWF9YG?D240D@c0fdBvi diff --git a/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/2.png b/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/2.png index 809b813d28260aeb29a214f3477688be1637005b..afcefe3271d8bb97c9b7be5f9def36a6a1615eae 100644 GIT binary patch literal 118398 zcmd?Rbx@p7_b-SH?(P!Yncz+c?!g@f8{92848bk9L-644I%x3V4gmrL5ALvh-}n99 zx_j^5y;WQL$5!oAHP4(r=kz(}>F(3rGySP2@{@`z1}Z5k3=9m0yquIe3=BL71_qH8 z8UBrxq$w@ytn|hqC!^$G<#{7WNl5`HujuILc>lUS7GDF|`6s$wUl0Eg zv9oY@b#>9v(P3a<;NalEppd{~kg+jyG0}4{Fficb~&1ft@-JJa|y zI=P5|MK$qr2@Vd9h=^!^dv9`P1qlg>it1hR*UWeC-VOek!6KxipkW&xn|pnI%`dJR z9r%e)%1B4ULQKh$6rT|jnP_GLmX?-9#HXB|T^;Fp4e}48p$GO2P4)JVD=8`Qatl(i zawNp1$;ry2lTk|v@v9jDa|_D3Ir)V6ML31ohuR<1KB);yarQ!g80ndLdj`ChVq)ZC zfk7bDR}$&y9wK3;R~F}&)@Bn|X1CP*ps38Hqi!oMDxKsl4Q;u?rlAoMdLRBJro>0Y z(2kRnjW;V;E6bav?`RtVMiKfrCrPUJbiu|zWqHl!Ht6EqGT7X%y1LoY zRN0G5YZJWOe7~2~HGS3TZ_9PGb9Hoi?-EA8xw0W`%GmhLXR9rUOI&btcr4K6Lsx0A zpR?v*PqnqRB3sgcj;8+kKuBA2+sxF=w`_iQ4fdXN%i0o Rj4c{4~7?M%H_ex|aX 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 vr7WlOZtu1 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 diff --git a/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/3.png b/src/fdroid/fastlane/metadata/android/en/images/phoneScreenshots/3.png index c04aae18847e207aecf91e725307836df7f03b69..625654ab19952420727f1e431d88a542066699cc 100644 GIT binary patch literal 250683 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

sUXadzoyjVoUsvUEns}{wb6it(rNFWA6Y0K&? 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