From fda17ee8fe831037b6fb079eef60ed3b7a832430 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 30 May 2022 11:06:24 +0200 Subject: [PATCH] Fix issue #21 - Prompt instances for avoiding default down ones --- app/src/main/assets/categories.json | 1 + app/src/main/assets/languages.json | 1 + .../activities/InstancePickerActivity.java | 60 +++++------- .../fedilabtube/activities/MainActivity.java | 5 + .../client/RetrofitPeertubeAPI.java | 92 ++++++++++++++++--- .../fedilab/fedilabtube/helper/Helper.java | 21 +++++ .../fedilabtube/helper/HelperInstance.java | 45 +-------- .../services/RetrieveInfoService.java | 2 +- 8 files changed, 133 insertions(+), 94 deletions(-) create mode 100644 app/src/main/assets/categories.json create mode 100644 app/src/main/assets/languages.json diff --git a/app/src/main/assets/categories.json b/app/src/main/assets/categories.json new file mode 100644 index 0000000..a82575d --- /dev/null +++ b/app/src/main/assets/categories.json @@ -0,0 +1 @@ +{"1":"Music","2":"Films","3":"Vehicles","4":"Art","5":"Sports","6":"Travels","7":"Gaming","8":"People","9":"Comedy","10":"Entertainment","11":"News & Politics","12":"How To","13":"Education","14":"Activism","15":"Science & Technology","16":"Animals","17":"Kids","18":"Food"} \ No newline at end of file diff --git a/app/src/main/assets/languages.json b/app/src/main/assets/languages.json new file mode 100644 index 0000000..cf328af --- /dev/null +++ b/app/src/main/assets/languages.json @@ -0,0 +1 @@ +{"aa":"Afar","ab":"Abkhazian","af":"Afrikaans","ak":"Akan","am":"Amharic","ar":"Arabic","an":"Aragonese","ase":"American Sign Language","as":"Assamese","av":"Avaric","avk":"Kotava","ay":"Aymara","az":"Azerbaijani","ba":"Bashkir","bm":"Bambara","be":"Belarusian","bn":"Bengali","bfi":"British Sign Language","bi":"Bislama","bo":"Tibetan","bs":"Bosnian","br":"Breton","bg":"Bulgarian","bzs":"Brazilian Sign Language","ca":"Catalan","cs":"Czech","ch":"Chamorro","ce":"Chechen","cv":"Chuvash","kw":"Cornish","co":"Corsican","cr":"Cree","cse":"Czech Sign Language","csl":"Chinese Sign Language","cy":"Welsh","da":"Danish","de":"German","dv":"Dhivehi","dsl":"Danish Sign Language","dz":"Dzongkha","el":"Greek","en":"English","eo":"Esperanto","et":"Estonian","eu":"Basque","ee":"Ewe","fo":"Faroese","fa":"Persian","fj":"Fijian","fi":"Finnish","fr":"French","fy":"Western Frisian","fsl":"French Sign Language","ff":"Fulah","gd":"Scottish Gaelic","ga":"Irish","gl":"Galician","gv":"Manx","gn":"Guarani","gsg":"German Sign Language","gu":"Gujarati","ht":"Haitian","ha":"Hausa","sh":"Serbo-Croatian","he":"Hebrew","hz":"Herero","hi":"Hindi","ho":"Hiri Motu","hr":"Croatian","hu":"Hungarian","hy":"Armenian","ig":"Igbo","ii":"Sichuan Yi","iu":"Inuktitut","id":"Indonesian","ik":"Inupiaq","is":"Icelandic","it":"Italian","jv":"Javanese","jbo":"Lojban","ja":"Japanese","jsl":"Japanese Sign Language","kab":"Kabyle","kl":"Kalaallisut","kn":"Kannada","ks":"Kashmiri","ka":"Georgian","kr":"Kanuri","kk":"Kazakh","km":"Khmer","ki":"Kikuyu","rw":"Kinyarwanda","ky":"Kirghiz","kv":"Komi","kg":"Kongo","ko":"Korean","kj":"Kuanyama","ku":"Kurdish","lo":"Lao","la":"Latin","lv":"Latvian","li":"Limburgan","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","lu":"Luba-Katanga","lg":"Ganda","mh":"Marshallese","ml":"Malayalam","mr":"Marathi","mk":"Macedonian","mg":"Malagasy","mt":"Maltese","mn":"Mongolian","mi":"Maori","ms":"Malay (macrolanguage)","my":"Burmese","na":"Nauru","nv":"Navajo","nr":"South Ndebele","nd":"North Ndebele","ng":"Ndonga","ne":"Nepali (macrolanguage)","nl":"Dutch","nn":"Norwegian Nynorsk","nb":"Norwegian Bokmål","no":"Norwegian","ny":"Nyanja","oc":"Occitan","oj":"Ojibwa","or":"Oriya (macrolanguage)","om":"Oromo","os":"Ossetian","pa":"Panjabi","pks":"Pakistan Sign Language","pl":"Polish","pt":"Portuguese","ps":"Pushto","qu":"Quechua","rm":"Romansh","ro":"Romanian","rsl":"Russian Sign Language","rn":"Rundi","ru":"Russian","sg":"Sango","sdl":"Saudi Arabian Sign Language","sfs":"South African Sign Language","si":"Sinhala","sk":"Slovak","sl":"Slovenian","se":"Northern Sami","sm":"Samoan","sn":"Shona","sd":"Sindhi","so":"Somali","st":"Southern Sotho","es":"Spanish","sq":"Albanian","sc":"Sardinian","sr":"Serbian","ss":"Swati","su":"Sundanese","sw":"Swahili (macrolanguage)","sv":"Swedish","swl":"Swedish Sign Language","ty":"Tahitian","ta":"Tamil","tt":"Tatar","te":"Telugu","tg":"Tajik","tl":"Tagalog","th":"Thai","ti":"Tigrinya","tlh":"Klingon","to":"Tonga (Tonga Islands)","tn":"Tswana","ts":"Tsonga","tk":"Turkmen","tr":"Turkish","tw":"Twi","ug":"Uighur","uk":"Ukrainian","ur":"Urdu","uz":"Uzbek","ve":"Venda","vi":"Vietnamese","wa":"Walloon","wo":"Wolof","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","za":"Zhuang","zh":"Chinese","zu":"Zulu","zxx":"No linguistic content","zh-Hans":"Simplified Chinese","zh-Hant":"Traditional Chinese"} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/fedilabtube/activities/InstancePickerActivity.java b/app/src/main/java/app/fedilab/fedilabtube/activities/InstancePickerActivity.java index 5299532..f70f204 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/activities/InstancePickerActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/activities/InstancePickerActivity.java @@ -24,9 +24,6 @@ import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.RelativeLayout; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -45,6 +42,7 @@ import app.fedilab.fedilabtube.R; import app.fedilab.fedilabtube.client.APIResponse; import app.fedilab.fedilabtube.client.data.InstanceData; import app.fedilab.fedilabtube.client.entities.InstanceParams; +import app.fedilab.fedilabtube.databinding.ActivityInstancePickerBinding; import app.fedilab.fedilabtube.drawer.InstanceAdapter; import app.fedilab.fedilabtube.helper.HelperInstance; import app.fedilab.fedilabtube.helper.RoundedBackgroundSpan; @@ -63,10 +61,8 @@ public class InstancePickerActivity extends BaseActivity { String[] itemsKeyLanguage; String[] itemsLabelLanguage; InstanceParams instanceParams; - private RelativeLayout mainLoader, textviewNoAction; - private TextView categories_view, languages_view; private InstancesVM viewModel; - + private ActivityInstancePickerBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { @@ -75,33 +71,27 @@ public class InstancePickerActivity extends BaseActivity { if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); + binding = ActivityInstancePickerBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - setContentView(R.layout.activity_instance_picker); + binding.loader.setVisibility(View.VISIBLE); - mainLoader = findViewById(R.id.loader); - textviewNoAction = findViewById(R.id.no_action); - mainLoader.setVisibility(View.VISIBLE); - Button pickup_categories = findViewById(R.id.pickup_categories); - Button pickup_languages = findViewById(R.id.pickup_languages); - categories_view = findViewById(R.id.categories_view); - languages_view = findViewById(R.id.languages_view); - Spinner sensitive = findViewById(R.id.sensitive); String[] channelSensitive = new String[]{"do_not_list", "blur", "display", "no_opinion"}; String[] channelSensitivesLabel = new String[]{getString(R.string.do_not_list), getString(R.string.blur), getString(R.string.display), getString(R.string.no_opinion)}; ArrayAdapter adapterChannel = new ArrayAdapter<>(InstancePickerActivity.this, android.R.layout.simple_spinner_dropdown_item, channelSensitivesLabel); - sensitive.setAdapter(adapterChannel); + binding.sensitive.setAdapter(adapterChannel); viewModel = new ViewModelProvider(InstancePickerActivity.this).get(InstancesVM.class); - sensitive.setSelection(1, false); - sensitive.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + binding.sensitive.setSelection(1, false); + binding.sensitive.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { instanceParams.setNsfwPolicy(channelSensitive[position]); - mainLoader.setVisibility(View.VISIBLE); + binding.loader.setVisibility(View.VISIBLE); viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, apiResponse -> manageVIewInstance(apiResponse)); } @@ -117,7 +107,7 @@ public class InstancePickerActivity extends BaseActivity { itemsLabelLanguage = new String[languages.size()]; itemsKeyLanguage = new String[languages.size()]; - pickup_languages.setOnClickListener(v -> { + binding.pickupLanguages.setOnClickListener(v -> { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(InstancePickerActivity.this); int i = 0; @@ -160,13 +150,13 @@ public class InstancePickerActivity extends BaseActivity { j++; } instanceParams.setLanguagesOr(langs); - languages_view.setText(stringBuilder, TextView.BufferType.SPANNABLE); - if (languages_view.getText().toString().trim().length() > 0) { - languages_view.setVisibility(View.VISIBLE); + binding.languagesView.setText(stringBuilder, TextView.BufferType.SPANNABLE); + if (binding.languagesView.getText().toString().trim().length() > 0) { + binding.languagesView.setVisibility(View.VISIBLE); } else { - languages_view.setVisibility(View.GONE); + binding.languagesView.setVisibility(View.GONE); } - mainLoader.setVisibility(View.VISIBLE); + binding.loader.setVisibility(View.VISIBLE); viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, this::manageVIewInstance); }); dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> dialog.dismiss()); @@ -184,7 +174,7 @@ public class InstancePickerActivity extends BaseActivity { itemsKeyCategory = new int[categories.size()]; - pickup_categories.setOnClickListener(v -> { + binding.pickupCategories.setOnClickListener(v -> { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(InstancePickerActivity.this); int i = 0; if (categories.size() > 0) { @@ -225,13 +215,13 @@ public class InstancePickerActivity extends BaseActivity { j++; } instanceParams.setCategoriesOr(cats); - categories_view.setText(stringBuilder, TextView.BufferType.SPANNABLE); - if (categories_view.getText().toString().trim().length() > 0) { - categories_view.setVisibility(View.VISIBLE); + binding.categoriesView.setText(stringBuilder, TextView.BufferType.SPANNABLE); + if (binding.categoriesView.getText().toString().trim().length() > 0) { + binding.categoriesView.setVisibility(View.VISIBLE); } else { - categories_view.setVisibility(View.GONE); + binding.categoriesView.setVisibility(View.GONE); } - mainLoader.setVisibility(View.VISIBLE); + binding.loader.setVisibility(View.VISIBLE); viewModel.getInstances(instanceParams).observe(InstancePickerActivity.this, this::manageVIewInstance); }); dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> dialog.dismiss()); @@ -243,7 +233,7 @@ public class InstancePickerActivity extends BaseActivity { } - mainLoader.setVisibility(View.VISIBLE); + binding.loader.setVisibility(View.VISIBLE); setTitle(R.string.instances_picker); @@ -264,7 +254,7 @@ public class InstancePickerActivity extends BaseActivity { public void manageVIewInstance(APIResponse apiResponse) { - mainLoader.setVisibility(View.GONE); + binding.loader.setVisibility(View.GONE); if (apiResponse.getError() != null) { Toasty.error(InstancePickerActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); return; @@ -272,10 +262,10 @@ public class InstancePickerActivity extends BaseActivity { List instances = apiResponse.getInstances(); RecyclerView lv_instances = findViewById(R.id.lv_instances); if ((instances == null || instances.size() == 0)) { - textviewNoAction.setVisibility(View.VISIBLE); + binding.noAction.setVisibility(View.VISIBLE); lv_instances.setVisibility(View.GONE); } else { - textviewNoAction.setVisibility(View.GONE); + binding.noAction.setVisibility(View.GONE); lv_instances.setVisibility(View.VISIBLE); InstanceAdapter instanceAdapter = new InstanceAdapter(instances); lv_instances.setAdapter(instanceAdapter); diff --git a/app/src/main/java/app/fedilab/fedilabtube/activities/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/activities/MainActivity.java index ea66f28..757d718 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/activities/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/activities/MainActivity.java @@ -346,6 +346,11 @@ public class MainActivity extends BaseMainActivity { if (search_cast == 1) { super.discoverCast(); } + //Instance + if(HelperInstance.getLiveInstance(MainActivity.this) == null) { + Intent intent = new Intent(MainActivity.this, InstancePickerActivity.class); + startActivityForResult(intent, PICK_INSTANCE); + } } public DisplayVideosFragment getSubscriptionFragment() { diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java index 314c018..2fed752 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java @@ -38,6 +38,8 @@ import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -843,16 +845,48 @@ public class RetrofitPeertubeAPI { if (response.isSuccessful()) { peertubeInformation.setCategories(response.body()); } else { - Error error = new Error(); - error.setStatusCode(response.code()); - if (response.errorBody() != null) { - error.setError(response.errorBody().string()); - } else { - error.setError(_context.getString(R.string.toast_error)); + String categoriesStr = Helper.readFileFromAssets(_context, "categories.json"); + try { + JSONObject obj = new JSONObject(categoriesStr); + Iterator iter = obj.keys(); + LinkedHashMap data = new LinkedHashMap<>(); + while (iter.hasNext()) { + String key = iter.next(); + try { + String value = (String) obj.get(key); + data.put(Integer.valueOf(key), value); + } catch (JSONException ignored) {} + } + peertubeInformation.setCategories(data); + } catch (JSONException e) { + e.printStackTrace(); + Error error = new Error(); + error.setStatusCode(response.code()); + if (response.errorBody() != null) { + error.setError(response.errorBody().string()); + } else { + error.setError(_context.getString(R.string.toast_error)); + } } + } } catch (IOException e) { - e.printStackTrace(); + String categoriesStr = Helper.readFileFromAssets(_context, "categories.json"); + try { + JSONObject obj = new JSONObject(categoriesStr); + Iterator iter = obj.keys(); + LinkedHashMap data = new LinkedHashMap<>(); + while (iter.hasNext()) { + String key = iter.next(); + try { + String value = (String) obj.get(key); + data.put(Integer.valueOf(key), value); + } catch (JSONException ignored) {} + } + peertubeInformation.setCategories(data); + } catch (JSONException e2) { + e2.printStackTrace(); + } } Call> languages = peertubeService.getLanguages(); try { @@ -860,16 +894,46 @@ public class RetrofitPeertubeAPI { if (response.isSuccessful()) { peertubeInformation.setLanguages(response.body()); } else { - Error error = new Error(); - error.setStatusCode(response.code()); - if (response.errorBody() != null) { - error.setError(response.errorBody().string()); - } else { - error.setError(_context.getString(R.string.toast_error)); + String languageSrt = Helper.readFileFromAssets(_context, "languages.json"); + try { + JSONObject obj = new JSONObject(languageSrt); + Iterator iter = obj.keys(); + LinkedHashMap data = new LinkedHashMap<>(); + while (iter.hasNext()) { + String key = iter.next(); + try { + String value = (String) obj.get(key); + data.put(key, value); + } catch (JSONException ignored) {} + } + peertubeInformation.setLanguages(data); + } catch (JSONException e) { + Error error = new Error(); + error.setStatusCode(response.code()); + if (response.errorBody() != null) { + error.setError(response.errorBody().string()); + } else { + error.setError(_context.getString(R.string.toast_error)); + } } + } } catch (IOException e) { - e.printStackTrace(); + String languageSrt = Helper.readFileFromAssets(_context, "languages.json"); + try { + JSONObject obj = new JSONObject(languageSrt); + Iterator iter = obj.keys(); + LinkedHashMap data = new LinkedHashMap<>(); + while (iter.hasNext()) { + String key = iter.next(); + try { + String value = (String) obj.get(key); + data.put(key, value); + } catch (JSONException ignored) {} + } + peertubeInformation.setLanguages(data); + } catch (JSONException e2) { + } } Call> privacies = peertubeService.getPrivacies(); try { diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java index 74ec992..3672eb0 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java @@ -57,7 +57,12 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.net.InetAddress; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; @@ -807,4 +812,20 @@ public class Helper { } + public static String readFileFromAssets(Context context, String filename) { + String json; + try { + InputStream is = context.getAssets().open(filename); + int size = is.available(); + byte[] buffer = new byte[size]; + is.read(buffer); + is.close(); + json = new String(buffer, StandardCharsets.UTF_8); + } catch (IOException ex) { + ex.printStackTrace(); + return null; + } + return json; + } + } diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/HelperInstance.java b/app/src/main/java/app/fedilab/fedilabtube/helper/HelperInstance.java index 2f37c39..fd9ab78 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/HelperInstance.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/HelperInstance.java @@ -36,53 +36,10 @@ public class HelperInstance { public static String getLiveInstance(Context context) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if (BuildConfig.FLAVOR.compareTo("fdroid_full") == 0 || BuildConfig.FLAVOR.compareTo("google_full") == 0) { - return sharedpreferences.getString(Helper.PREF_INSTANCE, getDefaultInstance()); + return sharedpreferences.getString(Helper.PREF_INSTANCE, null); } else { return sharedpreferences.getString(Helper.PREF_INSTANCE, "tube-institutionnel.apps.education.fr"); } } - - /** - * Get a default instance host name depending of the device locale - * - * @return peertube host String - */ - private static String getDefaultInstance() { - String lang = Locale.getDefault().getLanguage(); - if (lang.contains("-")) { - if (!lang.split("-")[0].trim().toLowerCase().startsWith("zh")) { - lang = lang.split("-")[0]; - if (lang.split("-")[1].toLowerCase().contains("be")) { - lang = "be"; - } else if (lang.split("-")[1].toLowerCase().contains("gb")) { - lang = "gb"; - } - } else { - lang = lang.split("-")[0] + "-" + lang.split("-")[1].toUpperCase(); - } - } - switch (lang) { - case "it": - return "peertube.uno"; - case "be": - return "peertube.be"; - case "fr": - return "video.liberta.vip"; - case "de": - return "peertube.social"; - case "ru": - return "peertube.su"; - case "gb": - return "peertube.co.uk"; - case "da": - case "sv": - case "nb": - case "fi": - case "is": - return "peertube.dk"; - default: - return "peertube.social"; - } - } } diff --git a/app/src/main/java/app/fedilab/fedilabtube/services/RetrieveInfoService.java b/app/src/main/java/app/fedilab/fedilabtube/services/RetrieveInfoService.java index 801ed42..06b8a33 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/services/RetrieveInfoService.java +++ b/app/src/main/java/app/fedilab/fedilabtube/services/RetrieveInfoService.java @@ -127,7 +127,7 @@ public class RetrieveInfoService extends Service implements NetworkStateReceiver @Override public void run() { EmojiHelper.fillMapEmoji(getApplicationContext()); - if (peertubeInformation == null || peertubeInformation.getCategories().size() == 0) { + if (peertubeInformation == null || peertubeInformation.getCategories() == null || peertubeInformation.getCategories().size() == 0) { peertubeInformation = new PeertubeInformation(); peertubeInformation.setCategories(new LinkedHashMap<>()); peertubeInformation.setLanguages(new LinkedHashMap<>());