separated profile view activity

This commit is contained in:
Austin Huang 2020-08-13 17:08:27 -04:00
parent e02ef0aa09
commit 392b3f6510
No known key found for this signature in database
GPG Key ID: 84C23AA04587A91F
26 changed files with 1131 additions and 274 deletions

42
LICENSE
View File

@ -618,44 +618,4 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
InstaGrabber
Copyright (C) 2019 AWAiS <chapter50000@hotmail.com>
Copyright (C) 2020 Austin Huang <im@austinhuang.me>
Ammar Githam <ammargitham786@gmail.com>
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.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
[we're not terminal program, redacted]
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
END OF TERMS AND CONDITIONS

View File

@ -169,7 +169,7 @@
</activity>
<activity
android:name=".activities.ProfileViewer"
android:name=".activities.ProfilePicViewer"
android:parentActivityName=".activities.Main">
<meta-data
@ -177,6 +177,15 @@
android:value=".activities.Main" />
</activity>
<activity
android:name=".activities.ProfileViewer"
android:parentActivityName=".activities.PostViewer">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.PostViewer" />
</activity>
<activity
android:name=".activities.SavedViewer"
android:parentActivityName=".activities.Main">

View File

@ -13,13 +13,11 @@ import android.view.inputmethod.InputMethodManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@ -39,8 +37,6 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
public final class CommentsViewer extends BaseLanguageActivity implements SwipeRefreshLayout.OnRefreshListener {
private CommentsAdapter commentsAdapter;
private CommentModel commentModel;
@ -117,7 +113,7 @@ public final class CommentsViewer extends BaseLanguageActivity implements SwipeR
if (which == 0) {
searchUsername(profileModel.getUsername());
} else if (which == 1) {
startActivity(new Intent(this, ProfileViewer.class).putExtra(Constants.EXTRAS_PROFILE, profileModel));
startActivity(new Intent(this, ProfilePicViewer.class).putExtra(Constants.EXTRAS_PROFILE, profileModel));
} else if (which == 2) {
Utils.copyText(this, profileModel.getUsername());
} else if (which == 3) {
@ -211,11 +207,10 @@ public final class CommentsViewer extends BaseLanguageActivity implements SwipeR
};
private void searchUsername(final String text) {
if (Main.scanHack != null) {
Main.scanHack.onResult(text);
setResult(6969);
finish();
}
startActivity(
new Intent(getApplicationContext(), ProfileViewer.class)
.putExtra(Constants.EXTRAS_USERNAME, text)
);
}
@Override

View File

@ -77,8 +77,10 @@ public final class FollowViewer extends BaseLanguageActivity implements SwipeRef
final Object tag = v.getTag();
if (tag instanceof FollowModel) {
model = (FollowModel) tag;
Main.scanHack.onResult(model.getUsername());
finish();
startActivity(
new Intent(getApplicationContext(), ProfileViewer.class)
.putExtra(Constants.EXTRAS_USERNAME, model.getUsername())
);
}
};

View File

@ -195,7 +195,7 @@ public final class Main extends BaseLanguageActivity {
profileDialogListener = (dialog, which) -> {
final Intent intent;
if (which == 0 || storyModels == null || storyModels.length < 1) {
intent = new Intent(this, ProfileViewer.class).putExtra(
intent = new Intent(this, ProfilePicViewer.class).putExtra(
((hashtagModel != null) ? Constants.EXTRAS_HASHTAG : (locationModel != null ? Constants.EXTRAS_LOCATION : Constants.EXTRAS_PROFILE)),
((hashtagModel != null) ? hashtagModel : (locationModel != null ? locationModel : profileModel)));
}

View File

@ -122,7 +122,7 @@ public final class PostViewer extends BaseLanguageActivity {
if (which == 0) {
searchUsername(username);
} else if (profileModel != null && which == 1) {
startActivity(new Intent(this, ProfileViewer.class)
startActivity(new Intent(this, ProfilePicViewer.class)
.putExtra(Constants.EXTRAS_PROFILE, profileModel));
}
};
@ -432,13 +432,10 @@ public final class PostViewer extends BaseLanguageActivity {
}
private void searchUsername(final String text) {
if (Main.scanHack != null) {
Main.scanHack.onResult(text);
setResult(6969);
Intent intent = new Intent(getApplicationContext(), Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
startActivity(
new Intent(getApplicationContext(), ProfileViewer.class)
.putExtra(Constants.EXTRAS_USERNAME, text)
);
}
private void setupVideo() {

View File

@ -0,0 +1,214 @@
package awais.instagrabber.activities;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import java.io.File;
import awais.instagrabber.R;
import awais.instagrabber.asyncs.DownloadAsync;
import awais.instagrabber.asyncs.ProfilePictureFetcher;
import awais.instagrabber.databinding.ActivityProfilepicBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.HashtagModel;
import awais.instagrabber.models.LocationModel;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
public final class ProfilePicViewer extends BaseLanguageActivity {
private ActivityProfilepicBinding profileBinding;
private ProfileModel profileModel;
private HashtagModel hashtagModel;
private LocationModel locationModel;
private MenuItem menuItemDownload;
private String profilePicUrl;
private FragmentManager fragmentManager;
private FetchListener<String> fetchListener;
private boolean errorHandled = false;
private boolean fallbackToProfile = false;
private boolean destroyed = false;
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
profileBinding = ActivityProfilepicBinding.inflate(getLayoutInflater());
setContentView(profileBinding.getRoot());
setSupportActionBar(profileBinding.toolbar.toolbar);
final Intent intent = getIntent();
if (intent == null || (!intent.hasExtra(Constants.EXTRAS_PROFILE) && !intent.hasExtra(Constants.EXTRAS_HASHTAG) && !intent.hasExtra(Constants.EXTRAS_LOCATION))
|| ((profileModel = (ProfileModel) intent.getSerializableExtra(Constants.EXTRAS_PROFILE)) == null
&& (hashtagModel = (HashtagModel) intent.getSerializableExtra(Constants.EXTRAS_HASHTAG)) == null
&& (locationModel = (LocationModel) intent.getSerializableExtra(Constants.EXTRAS_LOCATION)) == null)) {
Utils.errorFinish(this);
return;
}
fragmentManager = getSupportFragmentManager();
final String id = hashtagModel != null ? hashtagModel.getId() : (locationModel != null ? locationModel.getId() : profileModel.getId());
final String username = hashtagModel != null ? hashtagModel.getName() : (locationModel != null ? locationModel.getName() : profileModel.getUsername());
profileBinding.toolbar.toolbar.setTitle(username);
profileBinding.progressView.setVisibility(View.VISIBLE);
profileBinding.imageViewer.setVisibility(View.VISIBLE);
profileBinding.imageViewer.setZoomable(true);
profileBinding.imageViewer.setZoomTransitionDuration(420);
profileBinding.imageViewer.setMaximumScale(7.2f);
fetchListener = profileUrl -> {
profilePicUrl = profileUrl;
if (!fallbackToProfile && Utils.isEmpty(profilePicUrl)) {
fallbackToProfile = true;
new ProfilePictureFetcher(username, id, fetchListener, profilePicUrl, (hashtagModel != null || locationModel != null)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
return;
}
if (errorHandled && fallbackToProfile || Utils.isEmpty(profilePicUrl))
profilePicUrl = hashtagModel != null ? hashtagModel.getSdProfilePic() : (locationModel != null ? locationModel.getSdProfilePic() : profileModel.getHdProfilePic());
if (destroyed == true) return;
final RequestManager glideRequestManager = Glide.with(this);
glideRequestManager.load(profilePicUrl).addListener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable final GlideException e, final Object model, final Target<Drawable> target, final boolean isFirstResource) {
fallbackToProfile = true;
if (!errorHandled) {
errorHandled = true;
new ProfilePictureFetcher(username, id, fetchListener, profilePicUrl, (hashtagModel != null || locationModel != null))
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
glideRequestManager.load(profilePicUrl).into(profileBinding.imageViewer);
showImageInfo();
}
profileBinding.progressView.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(final Drawable resource, final Object model, final Target<Drawable> target, final DataSource dataSource, final boolean isFirstResource) {
if (menuItemDownload != null) menuItemDownload.setEnabled(true);
showImageInfo();
profileBinding.progressView.setVisibility(View.GONE);
return false;
}
private void showImageInfo() {
final Drawable drawable = profileBinding.imageViewer.getDrawable();
if (drawable != null) {
final StringBuilder info = new StringBuilder(getString(R.string.profile_viewer_imageinfo, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()));
if (drawable instanceof BitmapDrawable) {
final Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
if (bitmap != null) {
final String colorDepthPrefix = getString(R.string.profile_viewer_colordepth_prefix);
switch (bitmap.getConfig()) {
case ALPHA_8:
info.append(colorDepthPrefix).append(" 8-bits(A)");
break;
case RGB_565:
info.append(colorDepthPrefix).append(" 16-bits-A");
break;
case ARGB_4444:
info.append(colorDepthPrefix).append(" 16-bits+A");
break;
case ARGB_8888:
info.append(colorDepthPrefix).append(" 32-bits+A");
break;
case RGBA_F16:
info.append(colorDepthPrefix).append(" 64-bits+A");
break;
case HARDWARE:
info.append(colorDepthPrefix).append(" auto");
break;
}
}
}
profileBinding.imageInfo.setText(info);
profileBinding.imageInfo.setVisibility(View.VISIBLE);
}
}
}).into(profileBinding.imageViewer);
};
new ProfilePictureFetcher(username, id, fetchListener, profilePicUrl, (hashtagModel != null || locationModel != null))
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private void downloadProfilePicture() {
int error = 0;
if (profileModel != null) {
final File dir = new File(Environment.getExternalStorageDirectory(), "Download");
if (dir.exists() || dir.mkdirs()) {
final File saveFile = new File(dir, profileModel.getUsername() + '_' + System.currentTimeMillis()
+ Utils.getExtensionFromModel(profilePicUrl, profileModel));
new DownloadAsync(this,
profilePicUrl,
saveFile,
result -> {
final int toastRes = result != null && result.exists() ?
R.string.downloader_downloaded_in_folder : R.string.downloader_error_download_file;
Toast.makeText(this, toastRes, Toast.LENGTH_SHORT).show();
}).setItems(null, profileModel.getUsername()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else error = 1;
} else error = 2;
if (error == 1) Toast.makeText(this, R.string.downloader_error_creating_folder, Toast.LENGTH_SHORT).show();
else if (error == 2) Toast.makeText(this, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
getDelegate().onDestroy();
destroyed = true;
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
final MenuItem.OnMenuItemClickListener menuItemClickListener = item -> {
if (item == menuItemDownload) {
downloadProfilePicture();
}
return true;
};
menu.findItem(R.id.action_search).setVisible(false);
menuItemDownload = menu.findItem(R.id.action_download);
menuItemDownload.setVisible(true);
menuItemDownload.setEnabled(false);
menuItemDownload.setOnMenuItemClickListener(menuItemClickListener);
return true;
}
}

View File

@ -527,13 +527,10 @@ public final class StoryViewer extends BaseLanguageActivity {
}
private void searchUsername(final String text) {
if (Main.scanHack != null) {
Main.scanHack.onResult(text);
setResult(6969);
Intent intent = new Intent(getApplicationContext(), Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
startActivity(
new Intent(getApplicationContext(), ProfileViewer.class)
.putExtra(Constants.EXTRAS_USERNAME, text)
);
}
private void releasePlayer() {

View File

@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicReference;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.R;
import awais.instagrabber.activities.ProfileViewer;
import awais.instagrabber.activities.ProfilePicViewer;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.utils.Utils;
@ -76,7 +76,7 @@ public final class DownloadAsync extends AsyncTask<Void, Float, File> {
isChannelCreated = true;
}
@StringRes final int titleRes = context instanceof ProfileViewer ? R.string.downloader_downloading_pfp : R.string.downloader_downloading_post;
@StringRes final int titleRes = context instanceof ProfilePicViewer ? R.string.downloader_downloading_pfp : R.string.downloader_downloading_post;
downloadNotif = new NotificationCompat.Builder(context, CHANNEL_ID).setCategory(NotificationCompat.CATEGORY_STATUS)
.setSmallIcon(R.mipmap.ic_launcher).setContentText(shortCode == null ? username : shortCode).setOngoing(true)

View File

@ -42,7 +42,7 @@ public final class AboutDialog extends BottomSheetDialogFragment {
else if (v == btnMatrix) {
intent.setData(Uri.parse("https://matrix.to/#/#instagrabber:matrix.org"));
} else
intent.setData(Uri.parse("https://github.com/austinhuang0131/instagrabber/"));
intent.setData(Uri.parse("https://instagrabber.austinhuang.me"));
startActivity(intent);
};
btnProject.setOnClickListener(onClickListener);

View File

@ -10,28 +10,8 @@
android:id="@+id/toolbar"
layout="@layout/layout_include_toolbar" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/profile_view"
layout="@layout/layout_profile_view" />
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/imageViewer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/imageInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:background="#40000000"
android:padding="8dp"
android:visibility="gone" />
<ProgressBar
android:id="@+id/progressView"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_gravity="center" />
</FrameLayout>
</LinearLayout>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activities.ProfilePicViewer">
<include
android:id="@+id/toolbar"
layout="@layout/layout_include_toolbar" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/imageViewer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/imageInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:background="#40000000"
android:padding="8dp"
android:visibility="gone" />
<ProgressBar
android:id="@+id/progressView"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_gravity="center" />
</FrameLayout>
</LinearLayout>

View File

@ -75,6 +75,16 @@
android:textColor="@color/btn_green_text_color"
android:textSize="20sp"
app:backgroundTint="@color/btn_green_background" />
<awais.instagrabber.customviews.RamboTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:padding="8dp"
android:text="@string/license"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="16sp"
android:textColor="?android:textColorPrimary" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.core.widget.NestedScrollView>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@ -3,7 +3,6 @@
<string name="description">Der ursprüngliche Maintainer, AWAiS, entwickelte InstaGrabber als kleine und einfache App mit dem Ziel, Beiträge vom Instagram herunterzuladen. Leider wurde das Projekt aufgegeben und ich, Austin Huang, übernahm die Entwicklung. Die App ist vollständig Open Source, Werbe- und Trackerfrei [abgesehen von dem, was Instagram weiß]. Auch wenn Dir die Downloadfunktion egal ist, [genau so wie mir], ist es immer noch ein großartiger Instagram-Client!\n\nHast du Fragen, [oder andere Anmerkungen]? Kontaktiere mich unter instagrabber@austinhuang.me oder klicke auf einen der Buttons.</string>
<string name="action_quickaccess">Schnellzugriff</string>
<string name="action_about">Über</string>
<string name="action_notif">Benachrichtigungen</string>
<string name="action_dms">Direktnachrichten</string>
<string name="action_setting">Einstellungen (v%s)</string>
<string name="action_settings">Einstellungen</string>

View File

@ -3,7 +3,6 @@
<string name="description">El mantenedor original, AWAiS, hizo de InstaGrabber una pequeña y básica aplicación personal con intenciones de [robar] descargar posts fuera de Instagram. Desafortunadamente lo abandonó, y yo, Austin Huang, me apoderé del proyecto. Esperemos que haya alguna ayuda económica. Después de todo, esta aplicación es completamente de código abierto, sin anuncios y sin seguimiento [aparte de lo que Instagram ya conoce]. Incluso si te da igual la función de descargar cosas [como yo], ¡sigue siendo un gran cliente Instagram para usar!\n\n¿Tienes preguntas [o simplemente quieres hablar]? Contacta con instagrabber@austinhuang. o haga clic en uno de los botones de abajo.</string>
<string name="action_quickaccess">Acceso rápido</string>
<string name="action_about">Sobre</string>
<string name="action_notif">Notificaciones</string>
<string name="action_dms">Mensajes Directos</string>
<string name="action_setting">Ajustes (v%s)</string>
<string name="action_settings">Ajustes</string>

View File

@ -3,7 +3,6 @@
<string name="description">Le mainteneur original, AWAiS, a fait d\'InstaGrabber une petite application personnelle de base avec l\'intention de \"voler\" les messages d\'Instagram. Très malheureusement, elle a été abandonnée et moi, Austin Huang, j\'ai repris le navire. Après tout, cette application est entièrement open source, sans publicité, et sans suivi (en dehors de ce que sait Instagram). Même si vous ne vous souciez pas de télécharger des choses (comme moi), ça reste un excellent client Instagram à utiliser ! Contactez instagrabber@austinhuang.me ou cliquez sur l\'un des boutons ci-dessous.</string>
<string name="action_quickaccess">Accès rapide</string>
<string name="action_about">À propos</string>
<string name="action_notif">Notifications</string>
<string name="action_dms">Messages privés</string>
<string name="action_setting">Paramètres (v%s)</string>
<string name="action_settings">Paramètres</string>

View File

@ -3,7 +3,6 @@
<string name="description">Pengembang original, AWAiS, membuat InstaGrabber sebagai aplikasi personal yang kecil dan sederhana untuk men[cu-]ngunduh kiriman di Instagram. Sayangnya, dia pergi dan saya, Austin Huang, mengambil alih kendali. [Mari berharap paling nggak sedikit uang.] Toh, aplikasi ini sepenuhnya bersumber terbuka, tanpa iklan, dan tanpa pelacak [disamping apa yang diketahui Instagram]. Meski anda tidak peduli dengan mengunduh kiriman [seperti saya], aplikasi ini masih menjadi klien Instagram yang bagus untuk digunakan!\n\nAda pertanyaan [atau mau ngobrol]? Hubungi instagrabber@austinhuang.me atau klik salah satu tombol di bawah ini.</string>
<string name="action_quickaccess">Akses Cepat</string>
<string name="action_about">Tentang</string>
<string name="action_notif">Pemberitahuan</string>
<string name="action_dms">Pesan Langsung</string>
<string name="action_setting">Pengaturan (v%s)</string>
<string name="action_settings">Pengaturan</string>

View File

@ -3,7 +3,6 @@
<string name="description">Il manutentore originale, AWAiS, ha reso InstaGrabber una piccola e semplice app personale con le intenzioni di [rub-] scaricare post da Instagram. Sfortunatamente, questo è stato abbandonato e io, Austin Huang, ho preso il timone. [Speriamo che sia almeno un po \'di denaro contante.] Dopotutto, questa app è completamente open source, senza pubblicità e senza tracciamento [a parte ciò che Instagram sa]. Anche se non ti importa di scaricare roba [come me], è comunque un ottimo client Instagram da usare! \n\nFai domande [o vuoi solo parlare]? Contatta instagrabber@austinhuang.me o fai clic su uno dei pulsanti di seguito.</string>
<string name="action_quickaccess">Accesso rapido</string>
<string name="action_about">Riguardo</string>
<string name="action_notif">Notifiche</string>
<string name="action_dms">Messaggi Direct</string>
<string name="action_setting">Impostazioni (v%s)</string>
<string name="action_settings">Impostazioni</string>

View File

@ -3,7 +3,6 @@
<string name="description">Pierwotny opiekun projektu, AWAiS, stworzył InstaGrabber jako małą i podstawową, osobistą aplikację z zamiarem [kradzieży-]pobierania postów z Instagrama. Niestety, projekt został porzucony, a ja, Austin Huang, przejąłem statek. [Miejmy nadzieję, że przyniesie to trochę gotówki.] W końcu ta aplikacja jest w pełni open source, bez reklam i bez śledzenia [poza tym, co wie już o Tobie Instagram]. Nawet jeśli nie zależy ci na pobieraniu rzeczy, nadal jest to świetny klient Instagrama!\n\nMasz pytania [lub po prostu chcesz porozmawiać]? Skontaktuj się ze mną drogą mailową: instagrabber@austinhuang.me lub kliknij jeden z poniższych przycisków.</string>
<string name="action_quickaccess">Szybki dostęp</string>
<string name="action_about">O aplikacji</string>
<string name="action_notif">Powiadomienia</string>
<string name="action_dms">Prywatne wiadomości</string>
<string name="action_setting">Ustawienia (v%s)</string>
<string name="action_settings">Ustawienia</string>

View File

@ -3,7 +3,6 @@
<string name="description">O mantenedor original, AWAiS, fez do InstaGrabber um pequeno e básico aplicativo pessoal com intenções de [roubar] baixar postagens do Instagram. Infelizmente, isso foi abandonado e eu, Austin Huang, assumi o navio. [Vamos torcer para que seja pelo menos um pouco de dinheiro em espécie.] Afinal, este aplicativo é totalmente de código aberto, sem anúncios e sem rastreamento [além do que o Instagram sabe]. Mesmo que você não se importe em baixar coisas [como eu], ainda é um ótimo cliente do Instagram para usar!Tem dúvidas [ou apenas quer conversar]? Entre em contato com instagrabber@austinhuang ou clique em um dos botões abaixo.</string>
<string name="action_quickaccess">Acesso rápido</string>
<string name="action_about">Sobre</string>
<string name="action_notif">Notificações</string>
<string name="action_dms">Mensagens diretas</string>
<string name="action_setting">Configurações (v%s)</string>
<string name="action_settings">Configurações</string>

View File

@ -3,7 +3,6 @@
<string name="description">The original maintainer, AWAiS, made InstaGrabber as a small and basic little personal app with intentions of [steali-]downloading posts off Instagram. Very unfortunately, this was abandoned and me, Austin Huang, took over the ship. [Let\'s hope that\'s at least a lil\' bit cash money.] After all, this app is fully open source, ad-less, and tracking-less [aside from what Instagram knows]. Even if you don\'t care about downloading stuff [like me], it\'s still a great Instagram client to use!\n\nGot questions [or just wanna talk]? Contact instagrabber@austinhuang.me or click one of the buttons below.</string>
<string name="action_quickaccess">Quick Access</string>
<string name="action_about">About</string>
<string name="action_notif">Notifications</string>
<string name="action_dms">Direct Messages</string>
<string name="action_setting">Settings (v%s)</string>
<string name="action_settings">Settings</string>

View File

@ -3,7 +3,6 @@
<string name="description">İlk geliştiricisi olan AWAIS, InstaGrabber adında küçük ve basit bir uygulama yaptı. Amacı Instagram paylaşımlarını [çalma-] indirmekti. Ne yazık ki bir süre sonra projeyi bıraktı ve ben, Austin Huang, devraldım. [Umarım biraz para da kazanırım.] Her şeyden önce bu uygulama tamamen açık kaynak kodlu, reklamsız ve gizliliğe önem veriyor [Instagram\'ın zaten bildikleri ayrı konu]. Eğer paylaşım indirmek amacınız olmasa bile [benim gibi], bir Instagram alternatifi olarak kullanmak için bile harika bir uygulama!\n\nSorun varsa ya da sadece konuşmak istiyorsan instagrabber@austinhuang.me üzerinden ulaşabilir ya da aşağıdaki butonlara tıklayabilirsin. Hatırlatmakta fayda var, Türkçe bilmiyorum.</string>
<string name="action_quickaccess">Hızlı Erişim</string>
<string name="action_about">Hakkında</string>
<string name="action_notif">Bildirimler</string>
<string name="action_dms">Direkt Mesajlar</string>
<string name="action_setting">Ayarlar (v%s)</string>
<string name="action_settings">Ayarlar</string>

View File

@ -3,7 +3,6 @@
<string name="description">原作者 AWAiS 将 InstaGrabber 做成了一个小巧玲珑的 Instagram 帖子下载 [写作下载读作剽窃] 程序不过他跳槽了所以我Austin Huang就把它接了下来。 [希望此举有所值得。] 不管怎样InstaGrabber 完全开源,无广告,无跟踪 [Instagram 原生跟踪除外]998都不要你还等啥\n有问题 [或者只是想谈谈心] ?请联系 instagrabber@austinhuang.me 或点击下方各按钮。</string>
<string name="action_quickaccess">快捷通道</string>
<string name="action_about">关于</string>
<string name="action_notif">通知</string>
<string name="action_dms">私聊</string>
<string name="action_setting">设定 (v%s)</string>
<string name="action_settings">设定</string>
@ -209,4 +208,5 @@
<string name="crash_title">应用崩溃了</string>
<string name="crash_descr">糟糕.. 应用崩溃了,不过别担心,你可以向开发者发送错误报告来帮助他修复问题。(:</string>
<string name="use_amoled_dark_theme">Use AMOLED mode for Dark theme</string>
<string name="action_notif">动态</string>
</resources>

View File

@ -4,7 +4,6 @@
<string name="description">The original maintainer, AWAiS, made InstaGrabber as a small and basic little personal app with intentions of [steali-]downloading posts off Instagram. Very unfortunately, this was abandoned and me, Austin Huang, took over the ship. [Let\'s hope that\'s at least a lil\' bit cash money.] After all, this app is fully open source, ad-less, and tracking-less [aside from what Instagram knows]. Even if you don\'t care about downloading stuff [like me], it\'s still a great Instagram client to use!\n\nGot questions [or just wanna talk]? Contact instagrabber@austinhuang.me or click one of the buttons below.</string>
<string name="action_quickaccess">Quick Access</string>
<string name="action_about">About</string>
<string name="action_notif">Notifications</string>
<string name="action_dms">Direct Messages</string>
<string name="action_setting">Settings (v%s)</string>
<string name="action_settings">Settings</string>
@ -212,4 +211,6 @@
<string name="crash_title">App crashed</string>
<string name="crash_descr">Oops.. the app crashed, but don\'t worry you can send error report to the developer to help him fix the issue. (:</string>
<string name="use_amoled_dark_theme">Use AMOLED mode for Dark theme</string>
<string name="action_notif">Activity</string>
<string name="license" translatable="false">InstaGrabber\nCopyright (C) 2019 AWAiS\nCopyright (C) 2020 Austin Huang, Ammar Githam\n\nThis 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. See https://www.gnu.org/licenses/.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR \'\'AS IS\'\' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nSee project page for third-party attributions.</string>
</resources>

View File

@ -5,7 +5,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.android.tools.build:gradle:4.0.1'
}
}