diff --git a/README.md b/README.md index 7af15f7..1e3c602 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Github project: [/omarroth/invidious](https://github.com/omarroth/invidious) ### Screenshots: -![A simple interface to cusomize instances](./images/img1.png) ![A YouTube link received via a text message](./images/img2.png) +![A simple interface to cusomize instances](./images/img1.png) ![Clicking on app will open settings](./images/img2.png) -![The app handled and transformed it before delegating the action](./images/img3.png) ![The app opened the transformed link](./images/img4.png) + ![A YouTube link received via a text message](./images/img3.png) ![The app handled and transformed it before delegating the action](./images/img4.png) ![The app opened the transformed link](./images/img5.png) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2d9a98a..7c8c64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,14 @@ + + + + + + @@ -44,14 +52,14 @@ + android:host="www.youtube.com" /> + android:host="m.youtube.com" /> diff --git a/app/src/main/java/app/fedilab/nitterizeme/AppInfo.java b/app/src/main/java/app/fedilab/nitterizeme/AppInfo.java new file mode 100644 index 0000000..5faa321 --- /dev/null +++ b/app/src/main/java/app/fedilab/nitterizeme/AppInfo.java @@ -0,0 +1,38 @@ +package app.fedilab.nitterizeme; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of NitterizeMe + * + * 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. + * + * NitterizeMe 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 NitterizeMe; if not, + * see . */ + + +public class AppInfo { + + private String domain; + private android.content.pm.ApplicationInfo ApplicationInfo; + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public android.content.pm.ApplicationInfo getApplicationInfo() { + return ApplicationInfo; + } + + public void setApplicationInfo(android.content.pm.ApplicationInfo applicationInfo) { + ApplicationInfo = applicationInfo; + } +} diff --git a/app/src/main/java/app/fedilab/nitterizeme/AppInfoAdapter.java b/app/src/main/java/app/fedilab/nitterizeme/AppInfoAdapter.java new file mode 100644 index 0000000..7959e7a --- /dev/null +++ b/app/src/main/java/app/fedilab/nitterizeme/AppInfoAdapter.java @@ -0,0 +1,116 @@ +package app.fedilab.nitterizeme; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of NitterizeMe + * + * 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. + * + * NitterizeMe 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 NitterizeMe; if not, + * see . */ + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class AppInfoAdapter extends RecyclerView.Adapter { + + private List appInfos; + + AppInfoAdapter(List appInfos) { + this.appInfos = appInfos; + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) { + Context context = parent.getContext(); + LayoutInflater layoutInflater = LayoutInflater.from(context); + return new ViewHolder(layoutInflater.inflate(R.layout.drawer_app_info, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { + + ViewHolder holder = (ViewHolder) viewHolder; + AppInfo appInfo = appInfos.get(viewHolder.getAdapterPosition()); + Context context = holder.itemView.getContext(); + holder.domain.setText(appInfo.getDomain()); + if( appInfo.getApplicationInfo() != null ) { + Drawable icon = appInfo.getApplicationInfo().loadIcon(context.getPackageManager()); + try { + holder.app_icon.setImageDrawable(icon); + } catch (Resources.NotFoundException e) { + holder.app_icon.setImageResource(R.drawable.ic_android); + } + holder.information.setText(appInfo.getApplicationInfo().packageName); + if( appInfo.getApplicationInfo().packageName.compareTo(BuildConfig.APPLICATION_ID) == 0 ) { + holder.valid.setImageResource(R.drawable.ic_check); + }else { + holder.valid.setImageResource(R.drawable.ic_error); + } + holder.main_container.setOnClickListener(v -> { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", appInfo.getApplicationInfo().packageName, null); + intent.setData(uri); + context.startActivity(intent); + }); + }else{ + holder.information.setText(R.string.no_apps); + holder.app_icon.setImageResource(R.drawable.ic_android); + holder.valid.setImageResource(R.drawable.ic_warning); + } + + + + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return appInfos.size(); + } + + + class ViewHolder extends RecyclerView.ViewHolder { + ImageView app_icon, valid; + TextView information, domain; + LinearLayout main_container; + + ViewHolder(@NonNull View itemView) { + super(itemView); + app_icon = itemView.findViewById(R.id.app_icon); + valid = itemView.findViewById(R.id.valid); + information = itemView.findViewById(R.id.information); + domain = itemView.findViewById(R.id.domain); + main_container = itemView.findViewById(R.id.main_container); + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/nitterizeme/MainActivity.java b/app/src/main/java/app/fedilab/nitterizeme/MainActivity.java index 67a4b86..1c7bbbe 100644 --- a/app/src/main/java/app/fedilab/nitterizeme/MainActivity.java +++ b/app/src/main/java/app/fedilab/nitterizeme/MainActivity.java @@ -16,11 +16,18 @@ package app.fedilab.nitterizeme; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; @@ -30,6 +37,7 @@ import android.widget.Button; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.textfield.TextInputEditText; +import java.util.ArrayList; import java.util.Objects; public class MainActivity extends AppCompatActivity { @@ -42,6 +50,18 @@ public class MainActivity extends AppCompatActivity { public static String DEFAULT_INVIDIOUS_HOST = "invidio.us"; public static final String APP_PREFS = "app_prefs"; + //Supported domains + private String[] domains = { + "twitter.com", + "mobile.twitter.com", + "www.twitter.com", + "www.youtube.com", + "youtube.com", + "m.youtube.com", + "youtu.be", + "youtube-nocookie.com" + }; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -56,7 +76,7 @@ public class MainActivity extends AppCompatActivity { TextInputEditText nitter_instance = findViewById(R.id.nitter_instance); TextInputEditText invidious_instance = findViewById(R.id.invidious_instance); Button button_save = findViewById(R.id.button_save); - + RecyclerView list_apps = findViewById(R.id.list_apps); String nitterHost = sharedpreferences.getString(SET_NITTER_HOST, null); String invidiousHost = sharedpreferences.getString(SET_INVIDIOUS_HOST, null); if(nitterHost!=null) { @@ -82,6 +102,40 @@ public class MainActivity extends AppCompatActivity { View parentLayout = findViewById(android.R.id.content); Snackbar.make(parentLayout, R.string.instances_saved, Snackbar.LENGTH_LONG).show(); }); + + ArrayList appInfos = new ArrayList<>(); + for(String domain: domains) { + AppInfo appInfo = new AppInfo(); + appInfo.setDomain(domain); + appInfo.setApplicationInfo(getDefaultApp("https://"+domain)); + appInfos.add(appInfo); + } + + AppInfoAdapter appInfoAdapter = new AppInfoAdapter(appInfos); + list_apps.setAdapter(appInfoAdapter); + final LinearLayoutManager mLayoutManager; + mLayoutManager = new LinearLayoutManager(MainActivity.this); + list_apps.setLayoutManager(mLayoutManager); + } + + + /** + * Allow to get info about application that opens the link by default + * @param url String url for test + * @return ApplicationInfo info about the application + */ + ApplicationInfo getDefaultApp(String url) { + final Intent browserIntent = new Intent(Intent.ACTION_VIEW); + browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + browserIntent.setData(Uri.parse(url)); + final ResolveInfo defaultResolution = getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); + if (defaultResolution != null) { + final ActivityInfo activity = defaultResolution.activityInfo; + if (!activity.name.equals("com.android.internal.app.ResolverActivity")) { + return activity.applicationInfo; + } + } + return null; } @Override diff --git a/app/src/main/res/drawable/ic_android.xml b/app/src/main/res/drawable/ic_android.xml new file mode 100644 index 0000000..6de853c --- /dev/null +++ b/app/src/main/res/drawable/ic_android.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000..55aafa3 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..ac09fe3 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..1e606cc --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index 6a34a55..f3fe746 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -75,4 +75,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"/> + + \ No newline at end of file diff --git a/app/src/main/res/layout/drawer_app_info.xml b/app/src/main/res/layout/drawer_app_info.xml new file mode 100644 index 0000000..971d4e5 --- /dev/null +++ b/app/src/main/res/layout/drawer_app_info.xml @@ -0,0 +1,34 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee6bc0b..31db4ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,4 +14,5 @@ Close Custom instances have been saved! Custom Invidious instance + No applications by default diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/img1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/img1.png index 6579750..050ca15 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/img1.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/img1.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/img2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/img2.png index b1f021d..44c521f 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/img2.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/img2.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/img3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/img3.png index 6258e37..b1f021d 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/img3.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/img3.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/img4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/img4.png index d56c14d..6258e37 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/img4.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/img4.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/img5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/img5.png new file mode 100644 index 0000000..d56c14d Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/img5.png differ diff --git a/images/img1.png b/images/img1.png index 5ac8511..dce33f8 100644 Binary files a/images/img1.png and b/images/img1.png differ diff --git a/images/img2.png b/images/img2.png index 13ab1da..3619e0a 100644 Binary files a/images/img2.png and b/images/img2.png differ diff --git a/images/img3.png b/images/img3.png index a981cb6..efc1fce 100644 Binary files a/images/img3.png and b/images/img3.png differ diff --git a/images/img4.png b/images/img4.png index 8bf26ba..a981cb6 100644 Binary files a/images/img4.png and b/images/img4.png differ diff --git a/images/img5.png b/images/img5.png new file mode 100644 index 0000000..8bf26ba Binary files /dev/null and b/images/img5.png differ