Skip to content

Commit 27d919e

Browse files
committed
Migrate ProfileFragment to kotlin and use viewmodel
1 parent bdad254 commit 27d919e

30 files changed

+2022
-1618
lines changed

app/src/main/java/awais/instagrabber/activities/MainActivity.kt

+51-28
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,10 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
111111

112112
override fun onCreate(savedInstanceState: Bundle?) {
113113
try {
114-
DownloadUtils.init(this,
115-
Utils.settingsHelper.getString(PreferenceKeys.PREF_BARINSTA_DIR_URI))
114+
DownloadUtils.init(
115+
this,
116+
Utils.settingsHelper.getString(PreferenceKeys.PREF_BARINSTA_DIR_URI)
117+
)
116118
} catch (e: ReselectDocumentTreeException) {
117119
super.onCreate(savedInstanceState)
118120
val intent = Intent(this, DirectorySelectActivity::class.java)
@@ -324,6 +326,7 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
324326
// } catch (e: Exception) {
325327
// Log.e(TAG, "onDestroy: ", e)
326328
// }
329+
DownloadUtils.destroy()
327330
instance = null
328331
}
329332

@@ -358,21 +361,27 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
358361
private fun createNotificationChannels() {
359362
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return
360363
val notificationManager = NotificationManagerCompat.from(applicationContext)
361-
notificationManager.createNotificationChannel(NotificationChannel(
362-
Constants.DOWNLOAD_CHANNEL_ID,
363-
Constants.DOWNLOAD_CHANNEL_NAME,
364-
NotificationManager.IMPORTANCE_DEFAULT
365-
))
366-
notificationManager.createNotificationChannel(NotificationChannel(
367-
Constants.ACTIVITY_CHANNEL_ID,
368-
Constants.ACTIVITY_CHANNEL_NAME,
369-
NotificationManager.IMPORTANCE_DEFAULT
370-
))
371-
notificationManager.createNotificationChannel(NotificationChannel(
372-
Constants.DM_UNREAD_CHANNEL_ID,
373-
Constants.DM_UNREAD_CHANNEL_NAME,
374-
NotificationManager.IMPORTANCE_DEFAULT
375-
))
364+
notificationManager.createNotificationChannel(
365+
NotificationChannel(
366+
Constants.DOWNLOAD_CHANNEL_ID,
367+
Constants.DOWNLOAD_CHANNEL_NAME,
368+
NotificationManager.IMPORTANCE_DEFAULT
369+
)
370+
)
371+
notificationManager.createNotificationChannel(
372+
NotificationChannel(
373+
Constants.ACTIVITY_CHANNEL_ID,
374+
Constants.ACTIVITY_CHANNEL_NAME,
375+
NotificationManager.IMPORTANCE_DEFAULT
376+
)
377+
)
378+
notificationManager.createNotificationChannel(
379+
NotificationChannel(
380+
Constants.DM_UNREAD_CHANNEL_ID,
381+
Constants.DM_UNREAD_CHANNEL_NAME,
382+
NotificationManager.IMPORTANCE_DEFAULT
383+
)
384+
)
376385
val silentNotificationChannel = NotificationChannel(
377386
Constants.SILENT_NOTIFICATIONS_CHANNEL_ID,
378387
Constants.SILENT_NOTIFICATIONS_CHANNEL_NAME,
@@ -404,7 +413,8 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
404413
supportFragmentManager,
405414
R.id.main_nav_host,
406415
intent,
407-
firstFragmentGraphIndex)
416+
firstFragmentGraphIndex
417+
)
408418
navControllerLiveData.observe(this, { navController: NavController? -> setupNavigation(binding.toolbar, navController) })
409419
currentNavControllerLiveData = navControllerLiveData
410420
}
@@ -432,27 +442,33 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
432442

433443
private fun setupAnonBottomNav(): List<Tab> {
434444
val selectedItemId = binding.bottomNavView.selectedItemId
435-
val favoriteTab = Tab(R.drawable.ic_star_24,
445+
val favoriteTab = Tab(
446+
R.drawable.ic_star_24,
436447
getString(R.string.title_favorites),
437448
false,
438449
"favorites_nav_graph",
439450
R.navigation.favorites_nav_graph,
440451
R.id.favorites_nav_graph,
441-
R.id.favoritesFragment)
442-
val profileTab = Tab(R.drawable.ic_person_24,
452+
R.id.favoritesFragment
453+
)
454+
val profileTab = Tab(
455+
R.drawable.ic_person_24,
443456
getString(R.string.profile),
444457
false,
445458
"profile_nav_graph",
446459
R.navigation.profile_nav_graph,
447460
R.id.profile_nav_graph,
448-
R.id.profileFragment)
449-
val moreTab = Tab(R.drawable.ic_more_horiz_24,
461+
R.id.profileFragment
462+
)
463+
val moreTab = Tab(
464+
R.drawable.ic_more_horiz_24,
450465
getString(R.string.more),
451466
false,
452467
"more_nav_graph",
453468
R.navigation.more_nav_graph,
454469
R.id.more_nav_graph,
455-
R.id.morePreferencesFragment)
470+
R.id.morePreferencesFragment
471+
)
456472
val menu = binding.bottomNavView.menu
457473
menu.clear()
458474
menu.add(0, favoriteTab.navigationRootId, 0, favoriteTab.title).setIcon(favoriteTab.iconResId)
@@ -489,9 +505,15 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
489505
if (destination.id == R.id.directMessagesThreadFragment && arguments != null) {
490506
// Set the thread title earlier for better ux
491507
val title = arguments.getString("title")
492-
val actionBar = supportActionBar
493-
if (actionBar != null && !isEmpty(title)) {
494-
actionBar.title = title
508+
if (!title.isNullOrBlank()) {
509+
supportActionBar?.title = title
510+
}
511+
}
512+
if (destination.id == R.id.profileFragment && arguments != null) {
513+
// Set the title to username
514+
val username = arguments.getString("username")
515+
if (!username.isNullOrBlank()) {
516+
supportActionBar?.title = username.substringAfter("@")
495517
}
496518
}
497519
// below is a hack to check if we are at the end of the current stack, to setup the search view
@@ -764,7 +786,8 @@ class MainActivity : BaseLanguageActivity(), FragmentManager.OnBackStackChangedL
764786
"com.google.android.gms.fonts",
765787
"com.google.android.gms",
766788
"Noto Color Emoji Compat",
767-
R.array.com_google_android_gms_fonts_certs)
789+
R.array.com_google_android_gms_fonts_certs
790+
)
768791
val config: EmojiCompat.Config = FontRequestEmojiCompatConfig(applicationContext, fontRequest)
769792
config.setReplaceAll(true) // .setUseEmojiAsDefaultStyle(true)
770793
.registerInitCallback(object : InitCallback() {

app/src/main/java/awais/instagrabber/customviews/RamboTextViewV2.java

+7
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,13 @@ public void clearOnEmailClickListeners() {
156156
onEmailClickListeners.clear();
157157
}
158158

159+
public void clearAllAutoLinkListeners() {
160+
clearOnMentionClickListeners();
161+
clearOnHashtagClickListeners();
162+
clearOnURLClickListeners();
163+
clearOnEmailClickListeners();
164+
}
165+
159166
public interface OnMentionClickListener {
160167
void onMentionClick(final AutoLinkItem autoLinkItem);
161168
}

app/src/main/java/awais/instagrabber/dialogs/MultiOptionDialogFragment.java

+42-16
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import androidx.annotation.StringRes;
1111
import androidx.appcompat.app.AlertDialog;
1212
import androidx.fragment.app.DialogFragment;
13+
import androidx.fragment.app.Fragment;
14+
import androidx.fragment.app.FragmentActivity;
1315

1416
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
1517
import com.google.common.primitives.Booleans;
@@ -36,18 +38,21 @@ public enum Type {
3638
private List<Option<?>> options;
3739

3840
@NonNull
39-
public static <E extends Serializable> MultiOptionDialogFragment<E> newInstance(@StringRes final int title,
41+
public static <E extends Serializable> MultiOptionDialogFragment<E> newInstance(final int requestCode,
42+
@StringRes final int title,
4043
@NonNull final ArrayList<Option<E>> options) {
41-
return newInstance(title, 0, 0, options, Type.SINGLE);
44+
return newInstance(requestCode, title, 0, 0, options, Type.SINGLE);
4245
}
4346

4447
@NonNull
45-
public static <E extends Serializable> MultiOptionDialogFragment<E> newInstance(@StringRes final int title,
48+
public static <E extends Serializable> MultiOptionDialogFragment<E> newInstance(final int requestCode,
49+
@StringRes final int title,
4650
@StringRes final int positiveButtonText,
4751
@StringRes final int negativeButtonText,
4852
@NonNull final ArrayList<Option<E>> options,
4953
@NonNull final Type type) {
5054
Bundle args = new Bundle();
55+
args.putInt("requestCode", requestCode);
5156
args.putInt("title", title);
5257
args.putInt("positiveButtonText", positiveButtonText);
5358
args.putInt("negativeButtonText", negativeButtonText);
@@ -58,23 +63,44 @@ public static <E extends Serializable> MultiOptionDialogFragment<E> newInstance(
5863
return fragment;
5964
}
6065

66+
@SuppressWarnings({"rawtypes", "unchecked"})
6167
@Override
6268
public void onAttach(@NonNull final Context context) {
6369
super.onAttach(context);
6470
this.context = context;
71+
final Fragment parentFragment = getParentFragment();
72+
if (parentFragment != null) {
73+
if (parentFragment instanceof MultiOptionDialogCallback) {
74+
callback = (MultiOptionDialogCallback) parentFragment;
75+
}
76+
if (parentFragment instanceof MultiOptionDialogSingleCallback) {
77+
singleCallback = (MultiOptionDialogSingleCallback) parentFragment;
78+
}
79+
return;
80+
}
81+
final FragmentActivity fragmentActivity = getActivity();
82+
if (fragmentActivity instanceof MultiOptionDialogCallback) {
83+
callback = (MultiOptionDialogCallback) fragmentActivity;
84+
}
85+
if (fragmentActivity instanceof MultiOptionDialogSingleCallback) {
86+
singleCallback = (MultiOptionDialogSingleCallback) fragmentActivity;
87+
}
6588
}
6689

6790
@NonNull
6891
@Override
6992
public Dialog onCreateDialog(Bundle savedInstanceState) {
7093
final Bundle arguments = getArguments();
7194
int title = 0;
95+
int rc = 0;
7296
if (arguments != null) {
97+
rc = arguments.getInt("requestCode");
7398
title = arguments.getInt("title");
7499
type = (Type) arguments.getSerializable("type");
75100
}
101+
final int requestCode = rc;
76102
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
77-
if (title > 0) {
103+
if (title != 0) {
78104
builder.setTitle(title);
79105
}
80106
try {
@@ -89,11 +115,11 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
89115
if (negativeButtonText > 0) {
90116
builder.setNegativeButton(negativeButtonText, (dialog, which) -> {
91117
if (callback != null) {
92-
callback.onCancel();
118+
callback.onCancel(requestCode);
93119
return;
94120
}
95121
if (singleCallback != null) {
96-
singleCallback.onCancel();
122+
singleCallback.onCancel(requestCode);
97123
}
98124
});
99125
}
@@ -113,7 +139,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
113139
final Option<T> option = (Option<T>) options.get(position);
114140
selected.add(option.value);
115141
}
116-
callback.onMultipleSelect(selected);
142+
callback.onMultipleSelect(requestCode, selected);
117143
} catch (Exception e) {
118144
Log.e(TAG, "onCreateDialog: ", e);
119145
}
@@ -133,7 +159,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
133159
try {
134160
final Option<?> option = options.get(which);
135161
//noinspection unchecked
136-
callback.onCheckChange((T) option.value, isChecked);
162+
callback.onCheckChange(requestCode, (T) option.value, isChecked);
137163
} catch (Exception e) {
138164
Log.e(TAG, "onCreateDialog: ", e);
139165
}
@@ -157,7 +183,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
157183
try {
158184
final Option<?> option = options.get(which);
159185
//noinspection unchecked
160-
callback.onCheckChange((T) option.value, true);
186+
callback.onCheckChange(requestCode, (T) option.value, true);
161187
} catch (Exception e) {
162188
Log.e(TAG, "onCreateDialog: ", e);
163189
}
@@ -168,7 +194,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
168194
try {
169195
final Option<?> option = options.get(which);
170196
//noinspection unchecked
171-
singleCallback.onSelect((T) option.value);
197+
singleCallback.onSelect(requestCode, (T) option.value);
172198
} catch (Exception e) {
173199
Log.e(TAG, "onCreateDialog: ", e);
174200
}
@@ -190,19 +216,19 @@ public void setSingleCallback(final MultiOptionDialogSingleCallback<T> callback)
190216
}
191217

192218
public interface MultiOptionDialogCallback<T> {
193-
void onSelect(T result);
219+
void onSelect(int requestCode, T result);
194220

195-
void onMultipleSelect(List<T> result);
221+
void onMultipleSelect(int requestCode, List<T> result);
196222

197-
void onCheckChange(T item, boolean isChecked);
223+
void onCheckChange(int requestCode, T item, boolean isChecked);
198224

199-
void onCancel();
225+
void onCancel(int requestCode);
200226
}
201227

202228
public interface MultiOptionDialogSingleCallback<T> {
203-
void onSelect(T result);
229+
void onSelect(int requestCode, T result);
204230

205-
void onCancel();
231+
void onCancel(int requestCode);
206232
}
207233

208234
public static class Option<T extends Serializable> {

app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java

+4-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.annotation.SuppressLint;
44
import android.content.Context;
5-
import android.content.pm.PackageManager;
65
import android.graphics.drawable.Animatable;
76
import android.net.Uri;
87
import android.os.Bundle;
@@ -31,8 +30,6 @@
3130
import androidx.appcompat.app.ActionBar;
3231
import androidx.appcompat.app.AlertDialog;
3332
import androidx.appcompat.app.AppCompatActivity;
34-
import androidx.core.app.ActivityCompat;
35-
import androidx.core.content.ContextCompat;
3633
import androidx.core.view.GestureDetectorCompat;
3734
import androidx.fragment.app.Fragment;
3835
import androidx.lifecycle.ViewModel;
@@ -98,7 +95,7 @@
9895
import awais.instagrabber.viewmodels.FeedStoriesViewModel;
9996
import awais.instagrabber.viewmodels.HighlightsViewModel;
10097
import awais.instagrabber.viewmodels.StoriesViewModel;
101-
import awais.instagrabber.webservices.DirectMessagesService;
98+
import awais.instagrabber.webservices.DirectMessagesRepository;
10299
import awais.instagrabber.webservices.MediaRepository;
103100
import awais.instagrabber.webservices.ServiceCallback;
104101
import awais.instagrabber.webservices.StoriesRepository;
@@ -148,7 +145,7 @@ public class StoryViewerFragment extends Fragment {
148145
// private boolean isHighlight;
149146
// private boolean isArchive;
150147
// private boolean isNotification;
151-
private DirectMessagesService directMessagesService;
148+
private DirectMessagesRepository directMessagesRepository;
152149
private StoryViewerOptions options;
153150
private String csrfToken;
154151
private String deviceId;
@@ -164,7 +161,7 @@ public void onCreate(@Nullable final Bundle savedInstanceState) {
164161
fragmentActivity = (AppCompatActivity) requireActivity();
165162
storiesRepository = StoriesRepository.Companion.getInstance();
166163
mediaRepository = MediaRepository.Companion.getInstance();
167-
directMessagesService = DirectMessagesService.INSTANCE;
164+
directMessagesRepository = DirectMessagesRepository.Companion.getInstance();
168165
setHasOptionsMenu(true);
169166
}
170167

@@ -218,7 +215,7 @@ public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
218215
final AlertDialog ad = new AlertDialog.Builder(context)
219216
.setTitle(R.string.reply_story)
220217
.setView(input)
221-
.setPositiveButton(R.string.confirm, (d, w) -> directMessagesService.broadcastStoryReply(
218+
.setPositiveButton(R.string.confirm, (d, w) -> directMessagesRepository.broadcastStoryReply(
222219
csrfToken,
223220
userId,
224221
deviceId,

app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageSettingsFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -308,17 +308,17 @@ class DirectMessageSettingsFragment : Fragment(), ConfirmDialogFragmentCallback
308308
{ _: Int, user: User? ->
309309
val options = viewModel.createUserOptions(user)
310310
if (options.isEmpty()) return@DirectUsersAdapter true
311-
val fragment = MultiOptionDialogFragment.newInstance(-1, options)
311+
val fragment = MultiOptionDialogFragment.newInstance(0, -1, options)
312312
fragment.setSingleCallback(object : MultiOptionDialogSingleCallback<String?> {
313-
override fun onSelect(action: String?) {
313+
override fun onSelect(requestCode: Int, action: String?) {
314314
if (action == null) return
315315
val resourceLiveData = viewModel.doAction(user, action)
316316
if (resourceLiveData != null) {
317317
observeDetailsChange(resourceLiveData)
318318
}
319319
}
320320

321-
override fun onCancel() {}
321+
override fun onCancel(requestCode: Int) {}
322322
})
323323
val fragmentManager = childFragmentManager
324324
fragment.show(fragmentManager, "actions")

0 commit comments

Comments
 (0)