diff --git a/app/build.gradle b/app/build.gradle
index dc65dd1..6829b5d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -24,11 +24,12 @@ android {
defaultConfig {
applicationId "net.iGap"
- minSdkVersion 15
+ minSdkVersion 16
targetSdkVersion 27
- versionCode 80
- versionName "0.9.6"
+ versionCode 84
+ versionName "1.0.0"
multiDexEnabled true
+ useLibrary 'org.apache.http.legacy'
vectorDrawables.useSupportLibrary = true
ndk {
@@ -71,11 +72,11 @@ android {
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation project(':libwebrtc')
+ implementation 'org.webrtc:google-webrtc:1.0.23995'
implementation('com.afollestad.material-dialogs:core:0.9.6.0') {
transitive = true
}
- implementation('com.crashlytics.sdk.android:crashlytics:2.9.3@aar') {
+ implementation('com.crashlytics.sdk.android:crashlytics:2.9.6@aar') {
transitive = true
}
implementation project(path: ':lvl')
@@ -136,7 +137,7 @@ dependencies {
}
implementation 'com.github.RooyeKhat-Media:Websocket:1.0.0'
implementation 'com.github.RooyeKhat-Media:MessageProgress:1.0.0'
- implementation 'com.github.RooyeKhat-Media:Proto:Build91_Lite'
+ implementation 'com.github.RooyeKhat-Media:Proto:Build96'
implementation project(':pecpayment-release')
implementation project(':raadcore')
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
@@ -148,6 +149,8 @@ dependencies {
implementation 'com.mcxiaoke.volley:library:1.0.19'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.andrognito.patternlockview:patternlockview:1.0.0'
+ implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
+ implementation 'com.google.code.gson:gson:2.8.5'
}
configurations.all {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5bc6699..5603283 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -43,6 +43,7 @@
+
@@ -260,7 +261,7 @@
+ >
@@ -329,7 +330,7 @@
+ >
diff --git a/app/src/main/java/net/iGap/Config.java b/app/src/main/java/net/iGap/Config.java
index 0b5b405..21f1ee8 100644
--- a/app/src/main/java/net/iGap/Config.java
+++ b/app/src/main/java/net/iGap/Config.java
@@ -16,7 +16,7 @@ public class Config {
public static final int ACCEPT = 1;
public static final int REJECT = 0;
- public static final int REALM_SCHEMA_VERSION = 23;
+ public static final int REALM_SCHEMA_VERSION = 26;
public static final int REALM_LATEST_MIGRATION_VERSION = REALM_SCHEMA_VERSION - 1;
public static final int LOOKUP_MAP_RESPONSE_OFFSET = 30000;
public static final int MAX_TEXT_ATTACHMENT_LENGTH = 200;
@@ -31,6 +31,7 @@ public class Config {
public static final int FAST_START_PAGE_TIME = (int) 20;
public static final int LOW_START_PAGE_TIME = (int) 25;
public static final int PHONE_CONTACT_MAX_COUNT_LIMIT = 9999;
+ public static final long drIgapPeerId = 2297310;
public static final int TIME_OUT_DELAY_MS = (int) (DateUtils.SECOND_IN_MILLIS);
public static final int FAKE_PM_DELAY = (int) (10 * DateUtils.SECOND_IN_MILLIS);
diff --git a/app/src/main/java/net/iGap/G.java b/app/src/main/java/net/iGap/G.java
index ff998d5..deeb8e2 100644
--- a/app/src/main/java/net/iGap/G.java
+++ b/app/src/main/java/net/iGap/G.java
@@ -23,18 +23,19 @@
import android.support.multidex.MultiDexApplication;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
+import android.util.Log;
import android.view.LayoutInflater;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
+import com.google.firebase.iid.FirebaseInstanceId;
import com.nostra13.universalimageloader.core.ImageLoader;
import net.iGap.activities.ActivityCustomError;
import net.iGap.activities.ActivityMain;
import net.iGap.helper.HelperCheckInternetConnection;
-import net.iGap.helper.HelperNotificationAndBadge;
import net.iGap.interfaces.*;
import net.iGap.module.ChatSendMessageUtil;
import net.iGap.module.ChatUpdateStatusUtil;
@@ -82,7 +83,6 @@ public class G extends MultiDexApplication {
public static Handler handler;
public static long mLastClickTime = SystemClock.elapsedRealtime();
public static LayoutInflater inflater;
- public static HelperNotificationAndBadge helperNotificationAndBadge;
public static ConcurrentHashMap requestQueueMap = new ConcurrentHashMap<>();
public static List smsNumbers = new ArrayList<>();
public static AtomicBoolean pullRequestQueueRunned = new AtomicBoolean(false);
@@ -143,6 +143,7 @@ public class G extends MultiDexApplication {
public static String textSubTheme;
public static String tintImage;
public static String lineBorder;
+ public static Ipromote ipromote;
public static String menuBackgroundColor;
public static String authorHash;
public static String displayName;
@@ -258,6 +259,7 @@ public class G extends MultiDexApplication {
public static OnUpdateUserStatusInChangePage onUpdateUserStatusInChangePage;
public static OnLastSeenUpdateTiming onLastSeenUpdateTiming;
public static OnSetAction onSetAction;
+ public static OnBotClick onBotClick;
public static OnSetActionInRoom onSetActionInRoom;
public static OnUserSessionGetActiveList onUserSessionGetActiveList;
public static OnUserSessionTerminate onUserSessionTerminate;
@@ -318,6 +320,7 @@ public class G extends MultiDexApplication {
public static OnBackgroundChanged onBackgroundChanged;
public static IClientSearchUserName onClientSearchUserName;
public static OnCallLeaveView onCallLeaveView;
+ public static OnVideoCallFrame onVideoCallFrame;
public static ICallFinish iCallFinishChat;
public static ICallFinish iCallFinishMain;
public static IMainFinish iMainFinish;
@@ -361,6 +364,7 @@ public class G extends MultiDexApplication {
public static OnNotifyTime onNotifyTime;
public static OnPayment onPayment;
public static OnMplResult onMplResult;
+ public static OnVersionCallBack onVersionCallBack;
public static ISignalingOffer iSignalingOffer;
public static ISignalingRinging iSignalingRinging;
public static ISignalingAccept iSignalingAccept;
@@ -415,6 +419,7 @@ public void run() {
WebBase.apiKey = "5aa7e856ae7fbc00016ac5a01c65909797d94a16a279f46a4abb5faa";
new StartupActions();
+
}
@Override
diff --git a/app/src/main/java/net/iGap/activities/ActivityCall.java b/app/src/main/java/net/iGap/activities/ActivityCall.java
index 7cf5e45..ee8a78b 100644
--- a/app/src/main/java/net/iGap/activities/ActivityCall.java
+++ b/app/src/main/java/net/iGap/activities/ActivityCall.java
@@ -38,16 +38,22 @@
import net.iGap.helper.HelperPermission;
import net.iGap.interfaces.OnCallLeaveView;
import net.iGap.interfaces.OnGetPermission;
+import net.iGap.interfaces.OnVideoCallFrame;
import net.iGap.module.MaterialDesignTextView;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.viewmodel.ActivityCallViewModel;
import net.iGap.webrtc.WebRTC;
+import org.webrtc.EglBase;
+import org.webrtc.VideoFrame;
+
import java.io.IOException;
-public class ActivityCall extends ActivityEnhanced implements OnCallLeaveView {
+public class ActivityCall extends ActivityEnhanced implements OnCallLeaveView, OnVideoCallFrame {
public static final String USER_ID_STR = "USER_ID";
public static final String INCOMING_CALL_STR = "INCOMING_CALL_STR";
+ public static final String CALL_TYPE = "CALL_TYPE";
private static final int SENSOR_SENSITIVITY = 4;
//public static TextView txtTimeChat, txtTimerMain;
@@ -75,6 +81,7 @@ public class ActivityCall extends ActivityEnhanced implements OnCallLeaveView {
private Sensor mProximity;
private ActivityCallViewModel activityCallViewModel;
private ActivityCallBinding activityCallBinding;
+ private ProtoSignalingOffer.SignalingOffer.Type callTYpe;
/**
* Enables/Disables all child views in a view group.
@@ -137,29 +144,36 @@ public void onCreate(Bundle savedInstanceState) {
G.isInCall = true;
+ userId = getIntent().getExtras().getLong(USER_ID_STR);
+ isIncomingCall = getIntent().getExtras().getBoolean(INCOMING_CALL_STR);
+ callTYpe = (ProtoSignalingOffer.SignalingOffer.Type) getIntent().getExtras().getSerializable(CALL_TYPE);
+
try {
HelperPermission.getMicroPhonePermission(this, new OnGetPermission() {
@Override
public void Allow() throws IOException {
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
- userId = getIntent().getExtras().getLong(USER_ID_STR);
- isIncomingCall = getIntent().getExtras().getBoolean(INCOMING_CALL_STR);
-
- //setContentView(R.layout.activity_call);
- activityCallBinding = DataBindingUtil.setContentView(ActivityCall.this, R.layout.activity_call);
- activityCallViewModel = new ActivityCallViewModel(ActivityCall.this, userId, isIncomingCall, activityCallBinding);
- activityCallBinding.setActivityCallViewModel(activityCallViewModel);
-
-
- initComponent();
- //initCallBack();
+ HelperPermission.getCameraPermission(ActivityCall.this, new OnGetPermission() {
+ @Override
+ public void Allow() throws IOException {
+ init();
+ }
- G.onCallLeaveView = ActivityCall.this;
+ @Override
+ public void deny() {
+ G.isInCall = false;
+ finish();
+ if (isIncomingCall) {
+ WebRTC.getInstance().leaveCall();
+ }
+ }
+ });
- if (!isIncomingCall) {
- new WebRTC().createOffer(userId);
+ } else {
+ init();
}
}
@@ -167,7 +181,9 @@ public void Allow() throws IOException {
public void deny() {
G.isInCall = false;
finish();
- new WebRTC().leaveCall();
+ if (isIncomingCall) {
+ WebRTC.getInstance().leaveCall();
+ }
}
});
} catch (IOException e) {
@@ -181,11 +197,36 @@ public void deny() {
onFinishActivity = new OnFinishActivity() {
@Override
public void finishActivity() {
+
+ try {
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
+ activityCallBinding.fcrSurfacePeer.release();
+ activityCallBinding.fcrSurfaceRemote.release();
+ }
+ } catch (RuntimeException e) {
+
+ }
+
+
finish();
}
};
}
+ private void init() {
+ WebRTC.getInstance().setCallType(callTYpe);
+ //setContentView(R.layout.activity_call);
+ activityCallBinding = DataBindingUtil.setContentView(ActivityCall.this, R.layout.activity_call);
+ activityCallViewModel = new ActivityCallViewModel(ActivityCall.this, userId, isIncomingCall, activityCallBinding);
+ activityCallBinding.setActivityCallViewModel(activityCallViewModel);
+ initComponent();
+ //initCallBack();
+ G.onCallLeaveView = ActivityCall.this;
+ if (!isIncomingCall) {
+ WebRTC.getInstance().createOffer(userId);
+ }
+ }
+
//***************************************************************************************
@Override
@@ -206,6 +247,28 @@ public void onLeaveView(String type) {
}
private void initComponent() {
+
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
+
+ EglBase rootEglBase = EglBase.create();
+ activityCallBinding.fcrSurfacePeer.init(rootEglBase.getEglBaseContext(), null);
+ activityCallBinding.fcrSurfacePeer.setEnableHardwareScaler(true);
+ activityCallBinding.fcrSurfacePeer.setMirror(true);
+ activityCallBinding.fcrSurfacePeer.setVisibility(View.VISIBLE);
+
+ activityCallBinding.fcrSurfaceRemote.init(rootEglBase.getEglBaseContext(), null);
+ activityCallBinding.fcrSurfaceRemote.setEnableHardwareScaler(true);
+ activityCallBinding.fcrSurfaceRemote.setMirror(true);
+ activityCallBinding.fcrSurfaceRemote.setVisibility(View.VISIBLE);
+
+ activityCallBinding.fcrImvBackground.setVisibility(View.GONE);
+ activityCallBinding.fcrTxtCallType.setText(getResources().getString(R.string.video_calls));
+
+ activityCallBinding.fcrBtnSwichCamera.setVisibility(View.VISIBLE);
+ } else {
+ activityCallBinding.fcrBtnSwichCamera.setVisibility(View.GONE);
+ }
+
verticalSwipe = new VerticalSwipe();
layoutCaller = activityCallBinding.fcrLayoutCaller;
@@ -316,7 +379,7 @@ private void answer(FrameLayout layoutAnswer, FrameLayout layoutChat) {
layoutAnswer.setVisibility(View.GONE);
layoutChat.setVisibility(View.GONE);
- new WebRTC().createAnswer();
+ WebRTC.getInstance().createAnswer();
cancelRingtone();
btnEndCall.setOnTouchListener(null);
@@ -453,8 +516,13 @@ private void screenOff() {
@Override
protected void onResume() {
super.onResume();
- mSensorManager.registerListener(sensorEventListener, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
+ G.onVideoCallFrame = ActivityCall.this;
+ WebRTC.getInstance().startVideoCapture();
+ }
+
+ mSensorManager.registerListener(sensorEventListener, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver(headsetPluginReciver, filter);
}
@@ -462,8 +530,11 @@ protected void onResume() {
@Override
protected void onPause() {
super.onPause();
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
+ WebRTC.getInstance().pauseVideoCapture();
+ }
+ G.onVideoCallFrame = null;
mSensorManager.unregisterListener(sensorEventListener);
-
unregisterReceiver(headsetPluginReciver);
}
@@ -479,6 +550,16 @@ private void setUpSwap(View view) {
}
}
+ @Override
+ public void onRemoteFrame(VideoFrame videoFrame) {
+ activityCallBinding.fcrSurfaceRemote.onFrame(videoFrame);
+ }
+
+ @Override
+ public void onPeerFrame(VideoFrame videoFrame) {
+ activityCallBinding.fcrSurfacePeer.onFrame(videoFrame);
+ }
+
//***************************************************************************************
public interface OnFinishActivity {
diff --git a/app/src/main/java/net/iGap/activities/ActivityEnterPassCode.java b/app/src/main/java/net/iGap/activities/ActivityEnterPassCode.java
index dacaad5..39fc1c6 100644
--- a/app/src/main/java/net/iGap/activities/ActivityEnterPassCode.java
+++ b/app/src/main/java/net/iGap/activities/ActivityEnterPassCode.java
@@ -10,6 +10,7 @@
*/
import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
import android.databinding.DataBindingUtil;
import android.databinding.ObservableField;
import android.graphics.Color;
@@ -35,6 +36,8 @@ public class ActivityEnterPassCode extends ActivityEnhanced {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ActivityEnterPassCodeBinding activityEnterPassCodeBinding = DataBindingUtil.setContentView(this, R.layout.activity_enter_pass_code);
activityManageSpaceViewModel = new ActivityEnterPassCodeViewModel(this, activityEnterPassCodeBinding);
diff --git a/app/src/main/java/net/iGap/activities/ActivityMain.java b/app/src/main/java/net/iGap/activities/ActivityMain.java
index a8c90c0..1357146 100644
--- a/app/src/main/java/net/iGap/activities/ActivityMain.java
+++ b/app/src/main/java/net/iGap/activities/ActivityMain.java
@@ -10,6 +10,12 @@
package net.iGap.activities;
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
@@ -31,19 +37,21 @@
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
+import android.widget.Toast;
import android.widget.ToggleButton;
import com.afollestad.materialdialogs.DialogAction;
@@ -52,6 +60,7 @@
import com.crashlytics.android.Crashlytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
+import com.google.firebase.iid.FirebaseInstanceId;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
@@ -63,7 +72,6 @@
import net.iGap.eventbus.EventManager;
import net.iGap.eventbus.socketMessages;
import net.iGap.fragments.FragmentCall;
-import net.iGap.fragments.FragmentIgapSearch;
import net.iGap.fragments.FragmentLanguage;
import net.iGap.fragments.FragmentMain;
import net.iGap.fragments.FragmentMediaPlayer;
@@ -85,7 +93,7 @@
import net.iGap.helper.HelperImageBackColor;
import net.iGap.helper.HelperLog;
import net.iGap.helper.HelperLogout;
-import net.iGap.helper.HelperNotificationAndBadge;
+import net.iGap.helper.HelperNotification;
import net.iGap.helper.HelperPermission;
import net.iGap.helper.HelperPublicMethod;
import net.iGap.helper.HelperUrl;
@@ -121,6 +129,7 @@
import net.iGap.libs.tabBar.NavigationTabStrip;
import net.iGap.module.AndroidUtils;
import net.iGap.module.AppUtils;
+import net.iGap.module.BotInit;
import net.iGap.module.ContactUtils;
import net.iGap.module.EmojiTextViewE;
import net.iGap.module.FileUtils;
@@ -132,6 +141,7 @@
import net.iGap.module.enums.ConnectionState;
import net.iGap.proto.ProtoGlobal;
import net.iGap.proto.ProtoResponse;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmCallConfig;
import net.iGap.realm.RealmRoom;
import net.iGap.realm.RealmRoomFields;
@@ -416,7 +426,10 @@ public String detectLanguage() {
}
};
-
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ if (Build.BRAND.equalsIgnoreCase("xiaomi") || Build.BRAND.equalsIgnoreCase("Honor") || Build.BRAND.equalsIgnoreCase("oppo"))
+ isChinesPhone();
+ }
// setTheme(R.style.AppThemeTranslucent);
if (G.isFirstPassCode) {
@@ -644,6 +657,7 @@ public void onAppBarLayoutMove(AppBarLayout appBarLayout, int verticalOffset, bo
initComponent();
G.onPayment = this;
+
sharedPreferences = getSharedPreferences(SHP_SETTING.FILE_NAME, MODE_PRIVATE);
boolean isGetContactList = sharedPreferences.getBoolean(SHP_SETTING.KEY_GET_CONTACT, false);
/**
@@ -682,7 +696,7 @@ public void deny() {
}
}
- G.helperNotificationAndBadge.cancelNotification();
+ HelperNotification.getInstance().cancelNotification();
G.onGroupAvatarResponse = this;
G.onConvertToGroup = new OpenFragment() {
@@ -746,6 +760,9 @@ public void run() {
});
}
};
+
+
+ // Log.i("#token",FirebaseInstanceId.getInstance().getToken().toString());
}
@@ -1185,6 +1202,7 @@ public void run() {
pages.add(FragmentMain.newInstance(FragmentMain.MainType.all));
sampleFragmentPagerAdapter = new SampleFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(sampleFragmentPagerAdapter);
+ mViewPager.setCurrentItem(4);
setViewPagerSelectedItem();
findViewById(R.id.loadingContent).setVisibility(View.GONE);
}
@@ -1266,6 +1284,7 @@ protected void onStart() {
//});
}
+ @SuppressLint("MissingSuperCall")
@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState);
@@ -1415,21 +1434,21 @@ public void onClick(View v) {
}
});
- ViewGroup igapSearch = (ViewGroup) findViewById(R.id.lm_ll_igap_search);
- igapSearch.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final Fragment fragment = FragmentIgapSearch.newInstance();
- try {
- new HelperFragment(fragment).load();
- } catch (Exception e) {
- e.getStackTrace();
- }
-
- lockNavigation();
- closeDrawer();
- }
- });
+// ViewGroup igapSearch = (ViewGroup) findViewById(R.id.lm_ll_igap_search);
+// igapSearch.setOnClickListener(new View.OnClickListener() {
+// @Override
+// public void onClick(View v) {
+// final Fragment fragment = FragmentIgapSearch.newInstance();
+// try {
+// new HelperFragment(fragment).load();
+// } catch (Exception e) {
+// e.getStackTrace();
+// }
+//
+// lockNavigation();
+// closeDrawer();
+// }
+// });
ViewGroup itemNavContacts = (ViewGroup) findViewById(R.id.lm_ll_contacts);
itemNavContacts.setOnClickListener(new View.OnClickListener() {
@@ -2077,7 +2096,7 @@ public void startAnimationLocation() {
private void connectionState() {
final TextView txtIgap = (TextView) findViewById(R.id.cl_txt_igap);
- Typeface typeface = G.typeface_IRANSansMobile;
+ Typeface typeface = G.typeface_IRANSansMobile;
if (G.connectionState == ConnectionState.WAITING_FOR_NETWORK) {
txtIgap.setText(R.string.waiting_for_network);
@@ -2328,6 +2347,7 @@ protected void onResume() {
resume();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
+
}
public void resume() {
@@ -2470,7 +2490,7 @@ protected void onPause() {
return;
}
- HelperNotificationAndBadge.updateBadgeOnly(getRealm(), -1);
+ AppUtils.updateBadgeOnly(getRealm(), -1);
G.onUnreadChange = null;
@@ -2548,7 +2568,7 @@ public void onAvatarAddError() {
private void check(final long userId) {
if (G.userLogin) {
- FragmentCall.call(userId, false);
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING);
} else {
G.handler.postDelayed(new Runnable() {
@Override
@@ -2927,6 +2947,7 @@ public void run() {
});
}
+
public enum MainAction {
downScrool, clinetCondition
}
@@ -3037,4 +3058,82 @@ public void run() {
}
}
+ private void isChinesPhone() {
+ final SharedPreferences settings = getSharedPreferences("ProtectedApps", Context.MODE_PRIVATE);
+ final String saveIfSkip = "skipProtectedAppsMessage";
+ boolean skipMessage = settings.getBoolean(saveIfSkip, false);
+ if (!skipMessage) {
+ final SharedPreferences.Editor editor = settings.edit();
+
+
+ new MaterialDialog.Builder(ActivityMain.this)
+ .title(R.string.attention).titleColor(Color.parseColor("#1DE9B6"))
+ .titleGravity(GravityEnum.CENTER)
+ .buttonsGravity(GravityEnum.CENTER)
+ .checkBoxPrompt(getString(R.string.dont_show_again), false, new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ /* if (isChecked) {
+ editor.putBoolean(saveIfSkip, isChecked);
+ editor.apply();
+
+ }*/
+
+ }
+ })
+ .content(R.string.permission_auto_start).contentGravity(GravityEnum.CENTER)
+ .negativeText(R.string.ignore).onNegative(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ if (dialog.isPromptCheckBoxChecked()){
+ editor.putBoolean(saveIfSkip, true);
+ editor.apply();
+ }
+ dialog.dismiss();
+ }
+ })
+ .positiveText(R.string.ok).onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+
+ if (dialog.isPromptCheckBoxChecked()){
+ editor.putBoolean(saveIfSkip, true);
+ editor.apply();
+ }
+ dialog.dismiss();
+ try {
+
+ if (Build.BRAND.equalsIgnoreCase("xiaomi")) {
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
+ startActivity(intent);
+
+
+ } else if (Build.BRAND.equalsIgnoreCase("oppo")) {
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity"));
+
+ } else if (Build.BRAND.equalsIgnoreCase("Letv")) {
+
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity"));
+ startActivity(intent);
+
+ } else if (Build.BRAND.equalsIgnoreCase("Honor")) {
+
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"));
+ startActivity(intent);
+
+ }
+ } catch (ActivityNotFoundException e) {
+ } catch (Exception ee) {
+ }
+
+
+ }
+ }).show();
+
+ }
+ }
}
diff --git a/app/src/main/java/net/iGap/activities/ActivityPopUpNotification.java b/app/src/main/java/net/iGap/activities/ActivityPopUpNotification.java
index 00bea81..c095eae 100644
--- a/app/src/main/java/net/iGap/activities/ActivityPopUpNotification.java
+++ b/app/src/main/java/net/iGap/activities/ActivityPopUpNotification.java
@@ -12,8 +12,6 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.app.ActivityManager;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -47,6 +45,7 @@
import net.iGap.G;
import net.iGap.R;
import net.iGap.Theme;
+import net.iGap.helper.HelperNotification;
import net.iGap.interfaces.IPopUpListener;
import net.iGap.interfaces.OnVoiceRecord;
import net.iGap.libs.rippleeffect.RippleView;
@@ -58,17 +57,12 @@
import net.iGap.module.SHP_SETTING;
import net.iGap.module.UploadService;
import net.iGap.module.VoiceRecord;
-import net.iGap.module.enums.StructPopUp;
import net.iGap.proto.ProtoGlobal;
-import net.iGap.realm.RealmChatRoom;
import net.iGap.realm.RealmRegisteredInfo;
-import net.iGap.realm.RealmRoom;
-import net.iGap.realm.RealmRoomFields;
import net.iGap.realm.RealmRoomMessage;
import java.io.File;
import java.util.ArrayList;
-import java.util.List;
import io.realm.Realm;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
@@ -76,14 +70,12 @@
public class ActivityPopUpNotification extends AppCompatActivity {
public static boolean isPopUpVisible = false;
-
public static IPopUpListener popUpListener;
- public static String ARGUMENTLIST = "argument_list";
////////////////////////////////////////// appbar component
ViewPager viewPager;
- ArrayList mList;
+ ArrayList mList;
private TextView txtName;
private TextView txtLastSeen;
@@ -104,59 +96,13 @@ public class ActivityPopUpNotification extends AppCompatActivity {
private boolean sendByEnter = false;
private AdapterViewPagerClass mAdapter;
private int listSize = 0;
- private InitComponnet initComponnet;
private String initialize;
private String color;
- private long chatPeerId;
/////////////////////////////////////////////////////////////////////////////////////////
private EmojiPopup emojiPopup;
- public static String getTextOfMessageType(ProtoGlobal.RoomMessageType messageType) {
-
- switch (messageType) {
- case VOICE:
- return G.context.getString(R.string.voice_message);
- case VIDEO:
- return G.context.getString(R.string.video_message);
- case FILE:
- return G.context.getString(R.string.file_message);
- case AUDIO:
- return G.context.getString(R.string.audio_message);
- case IMAGE:
- return G.context.getString(R.string.image_message);
- case CONTACT:
- return G.context.getString(R.string.contact_message);
- case GIF:
- return G.context.getString(R.string.gif_message);
- case LOCATION:
- return G.context.getString(R.string.location_message);
- }
-
- return "";
- }
-
- /**
- * Checks if the application is being sent in the background (i.e behind
- * another application's Activity).
- *
- * @param context the context
- * @return true
if another application will be above this one.
- */
- public static boolean isApplicationSentToBackground(Context context) {
- ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- List tasks = am.getRunningTasks(1);
- if (!tasks.isEmpty()) {
- ComponentName topActivity = tasks.get(0).topActivity;
- if (!topActivity.getPackageName().equals(context.getPackageName())) {
- return true;
- }
- }
-
- return false;
- }
-
@Override
protected void onResume() {
super.onResume();
@@ -167,7 +113,6 @@ protected void onResume() {
protected void onPause() {
super.onPause();
isPopUpVisible = false;
-
}
@Override
@@ -186,26 +131,13 @@ protected void attachBaseContext(Context newBase) {
@Override
public void onCreate(Bundle savedInstanceState) {
-
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
-
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
+ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
super.onCreate(savedInstanceState);
-
- if (getIntent() == null || getIntent().getExtras() == null) {
- finish();
- return;
- }
-
- mList = (ArrayList) getIntent().getExtras().getSerializable(ARGUMENTLIST);
-
- if (mList == null) {
- finish();
- return;
- }
-
setContentView(R.layout.activity_popup_notification);
- initComponnet = new InitComponnet();
+ mList = HelperNotification.getInstance().getMessageList();
+ new InitComponent();
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -214,8 +146,6 @@ private void changeEmojiButtonImageResource(@StringRes int drawableResourceId) {
btnSmileButton.setText(drawableResourceId);
}
-
-
private void setUpEmojiPopup() {
switch (G.themeColor) {
case Theme.BLUE_GREY_COMPLETE:
@@ -229,16 +159,11 @@ private void setUpEmojiPopup() {
break;
default:
setEmojiColor("#eceff1", "#61000000", "#61000000");
-
-
}
-
}
private void setEmojiColor(String BackgroundColor, String iconColor, String dividerColor) {
-
- emojiPopup = emojiPopup = EmojiPopup.Builder.fromRootView(findViewById(R.id.ac_ll_parent_notification)).setOnEmojiBackspaceClickListener(new OnEmojiBackspaceClickListener() {
-
+ emojiPopup = EmojiPopup.Builder.fromRootView(findViewById(R.id.ac_ll_parent_notification)).setOnEmojiBackspaceClickListener(new OnEmojiBackspaceClickListener() {
@Override
public void onEmojiBackspaceClick(View v) {
@@ -268,66 +193,40 @@ public void onKeyboardClose() {
.setIconColor(Color.parseColor(iconColor))
.setDividerColor(Color.parseColor(dividerColor))
.build(edtChat);
-
}
-
-
private void setImageAndTextAppBar(int position) {
- if (mList.isEmpty() || position > mList.size() - 1 || position < 0) {
- return;
- }
- Realm realm = Realm.getDefaultInstance();
+ initialize = mList.get(position).initialize;
+ color = mList.get(position).color;
+ txtName.setText(mList.get(position).name);
- final RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, mList.get(position).getRoomId()).findFirst();
-
- if (realmRoom != null) { // room exist
-
- mList.get(position).setRoomType(realmRoom.getType().toString());
-
- initialize = realmRoom.getInitials();
- color = realmRoom.getColor();
+ Realm realm = Realm.getDefaultInstance();
- txtName.setText(realmRoom.getTitle());
- setLastSeen(realmRoom, realm);
- setAvatar(realm);
+ RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, mList.get(position).senderId);
+ if (realmRegisteredInfo != null) {
+ if (realmRegisteredInfo.getStatus().equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
+ txtLastSeen.setText(LastSeenTimeUtil.computeTime(realmRegisteredInfo.getId(), realmRegisteredInfo.getLastSeen(), false));
+ } else {
+ txtLastSeen.setText(realmRegisteredInfo.getStatus());
+ }
+ } else {
+ txtLastSeen.setText("");
}
+ setAvatar(realmRegisteredInfo);
+
realm.close();
- }
- private void setLastSeen(RealmRoom realmRoom, Realm realm) {
- try {
- RealmChatRoom realmChatRoom = realmRoom.getChatRoom();
- if (realmRoom.getChatRoom() != null) {
- RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, realmChatRoom.getPeerId());
- if (realmRegisteredInfo != null) {
- if (realmRegisteredInfo.getStatus().equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
- txtLastSeen.setText(LastSeenTimeUtil.computeTime(realmRegisteredInfo.getId(), realmRegisteredInfo.getLastSeen(), false));
- } else {
- txtLastSeen.setText(realmRegisteredInfo.getStatus());
- }
- }
- } else {
- txtLastSeen.setText("");
- }
- } catch (NullPointerException e) {
- e.printStackTrace();
- }
}
/////////////////////////////////////////////////////////////////////////////////////////
- private void setAvatar(Realm realm) {
+ private void setAvatar(RealmRegisteredInfo realmRegisteredInfo) {
String avatarPath = null;
-
- RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, chatPeerId);
if (realmRegisteredInfo != null && realmRegisteredInfo.getAvatars() != null && realmRegisteredInfo.getLastAvatar() != null) {
-
String mainFilePath = realmRegisteredInfo.getLastAvatar().getFile().getLocalFilePath();
-
if (mainFilePath != null && new File(mainFilePath).exists()) { // if main image is exist showing that
avatarPath = mainFilePath;
} else {
@@ -342,15 +241,15 @@ private void setAvatar(Realm realm) {
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imvUserPicture.setImageBitmap(myBitmap);
} else {
- if (realmRegisteredInfo != null && realmRegisteredInfo.getLastAvatar() != null && realmRegisteredInfo.getLastAvatar().getFile() != null) {
- // onRequestDownloadAvatar(realmRegisteredInfo.getLastAvatar().getFile());
- }
+// if (realmRegisteredInfo != null && realmRegisteredInfo.getLastAvatar() != null && realmRegisteredInfo.getLastAvatar().getFile() != null) {
+// onRequestDownloadAvatar(realmRegisteredInfo.getLastAvatar().getFile());
+// }
imvUserPicture.setImageBitmap(net.iGap.helper.HelperImageBackColor.drawAlphabetOnPicture((int) imvUserPicture.getContext().getResources().getDimension(R.dimen.dp60), initialize, color));
}
} else {
- if (realmRegisteredInfo != null && realmRegisteredInfo.getLastAvatar() != null && realmRegisteredInfo.getLastAvatar().getFile() != null) {
- // onRequestDownloadAvatar(realmRegisteredInfo.getLastAvatar().getFile());
- }
+// if (realmRegisteredInfo != null && realmRegisteredInfo.getLastAvatar() != null && realmRegisteredInfo.getLastAvatar().getFile() != null) {
+// onRequestDownloadAvatar(realmRegisteredInfo.getLastAvatar().getFile());
+// }
imvUserPicture.setImageBitmap(net.iGap.helper.HelperImageBackColor.drawAlphabetOnPicture((int) imvUserPicture.getContext().getResources().getDimension(R.dimen.dp60), initialize, color));
}
}
@@ -365,51 +264,41 @@ public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
- private void sendMessage(final String message, final long mRoomId, ProtoGlobal.Room.Type chatType) {
+ public static void sendMessage(final String message, final long mRoomId, ProtoGlobal.Room.Type chatType) {
String identity = Long.toString(System.currentTimeMillis());
-
RealmRoomMessage.makeTextMessage(mRoomId, Long.parseLong(identity), message);
-
new ChatSendMessageUtil().newBuilder(chatType, ProtoGlobal.RoomMessageType.TEXT, mRoomId).message(message).sendMessage(identity);
}
private void goToChatActivity() {
-
Intent intent = new Intent(ActivityPopUpNotification.this, ActivityMain.class);
- intent.putExtra(ActivityMain.openChat, mList.get(viewPager.getCurrentItem()).getRoomId());
+ intent.putExtra(ActivityMain.openChat, mList.get(viewPager.getCurrentItem()).roomId);
startActivity(intent);
-
finish();
}
- private class InitComponnet {
-
- public InitComponnet() {
+ private class InitComponent {
- initMethode();
+ InitComponent() {
+ initMethod();
initAppbar();
initViewPager();
initLayoutAttach();
-
setUpEmojiPopup();
}
- private void initMethode() {
+ private void initMethod() {
popUpListener = new IPopUpListener() {
@Override
- public void onMessageRecive(final ArrayList list) {
+ public void onMessageReceive() {
viewPager.post(new Runnable() {
@Override
public void run() {
-
- mList.clear();
- mList = (ArrayList) list.clone();
-
+ mList = HelperNotification.getInstance().getMessageList();
viewPager.setAdapter(mAdapter);
btnMessageCounter.setText(1 + "/" + mList.size());
-
setImageAndTextAppBar(viewPager.getCurrentItem());
listSize = mList.size();
}
@@ -424,10 +313,9 @@ public void run() {
voiceRecord = new VoiceRecord(ActivityPopUpNotification.this, viewMicRecorder, viewAttachFile, new OnVoiceRecord() {
@Override
public void onVoiceRecordDone(String savedPath) {
-
Intent uploadService = new Intent(ActivityPopUpNotification.this, UploadService.class);
uploadService.putExtra("Path", savedPath);
- uploadService.putExtra("Roomid", mList.get(viewPager.getCurrentItem()).getRoomId());
+ uploadService.putExtra("Roomid", mList.get(viewPager.getCurrentItem()).roomId);
startService(uploadService);
// sendVoice(savedPath, unreadList.get(viewPager.getCurrentItem()).getRoomId());
@@ -620,7 +508,7 @@ public void onClick(View v) {
int position = viewPager.getCurrentItem();
- sendMessage(edtChat.getText().toString(), mList.get(position).getRoomId(), ProtoGlobal.Room.Type.valueOf(mList.get(position).getRoomType()));
+ sendMessage(edtChat.getText().toString(), mList.get(position).roomId, ProtoGlobal.Room.Type.valueOf(mList.get(position).roomType.toString()));
edtChat.setText("");
@@ -649,7 +537,7 @@ public Object instantiateItem(View container, final int position) {
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.sub_layout_activity_popup_notification, (ViewGroup) container, false);
TextView txtMessage = (TextView) layout.findViewById(R.id.slapn_txt_message);
- txtMessage.setText(mList.get(position).getMessage());
+ txtMessage.setText(mList.get(position).message);
layout.setOnClickListener(new View.OnClickListener() {
@Override
diff --git a/app/src/main/java/net/iGap/adapter/AdapterChatBackground.java b/app/src/main/java/net/iGap/adapter/AdapterChatBackground.java
index 182c74c..bbaad72 100644
--- a/app/src/main/java/net/iGap/adapter/AdapterChatBackground.java
+++ b/app/src/main/java/net/iGap/adapter/AdapterChatBackground.java
@@ -1,15 +1,16 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.adapter;
+import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@@ -46,10 +47,13 @@ public class AdapterChatBackground extends RecyclerView.Adapter List, FragmentChatBackground.OnImageClick onImageClick) {
this.fragment = fragment;
this.mList = List;
this.onImageClick = onImageClick;
+
+ ;
}
@Override
@@ -80,10 +84,10 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
if (wallpaper.getWallpaperType() == FragmentChatBackground.WallpaperType.proto) {
RealmAttachment pf = wallpaper.getProtoWallpaper().getFile();
- final String path = G.DIR_CHAT_BACKGROUND + "/" + "thumb_" + pf.getCacheId() + "_" + pf.getName();
+ final String path = G.DIR_CHAT_BACKGROUND + "/" + "thumb_" + pf.getCacheId() + "_" + pf.getName();
if (!new File(path).exists()) {
- HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE,System.currentTimeMillis() + "", pf.getToken(), pf.getUrl(), pf.getCacheId(), pf.getName(), pf.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, path, 4, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE, System.currentTimeMillis() + "", pf.getToken(), pf.getUrl(), pf.getCacheId(), pf.getName(), pf.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, path, 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(String mPath, int progress) {
if (progress == 100) {
@@ -107,6 +111,7 @@ public void OnError(String token) {
}
} else {
G.imageLoader.displayImage(AndroidUtils.suitablePath(wallpaper.getPath()), holder2.img);
+
}
String bigImagePath;
@@ -119,7 +124,9 @@ public void OnError(String token) {
if (new File(bigImagePath).exists()) {
holder2.messageProgress.setVisibility(View.GONE);
- holder2.mPath = bigImagePath;
+
+ holder2.mPath = bigImagePath;
+
} else {
holder2.mPath = "";
holder2.messageProgress.setVisibility(View.VISIBLE);
@@ -168,7 +175,7 @@ public void run() {
}
});
- HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE,System.currentTimeMillis() + "", pf.getToken(), pf.getUrl(), pf.getCacheId(), pf.getName(), pf.getSize(), ProtoFileDownload.FileDownload.Selector.FILE, path, 2, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE, System.currentTimeMillis() + "", pf.getToken(), pf.getUrl(), pf.getCacheId(), pf.getName(), pf.getSize(), ProtoFileDownload.FileDownload.Selector.FILE, path, 2, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(String mPath, final int progress) {
messageProgress.post(new Runnable() {
diff --git a/app/src/main/java/net/iGap/adapter/AdapterDrBot.java b/app/src/main/java/net/iGap/adapter/AdapterDrBot.java
new file mode 100644
index 0000000..39ef645
--- /dev/null
+++ b/app/src/main/java/net/iGap/adapter/AdapterDrBot.java
@@ -0,0 +1,124 @@
+package net.iGap.adapter;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.GradientDrawable;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.util.Base64;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import net.iGap.G;
+import net.iGap.R;
+import net.iGap.fragments.FragmentChat;
+import net.iGap.libs.rippleeffect.RippleView;
+import net.iGap.module.webserviceDrBot.Favorite;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AdapterDrBot extends RecyclerView.Adapter {
+
+
+ private List itemDrBots;
+
+ public AdapterDrBot(List itemDrBots) {
+ this.itemDrBots = itemDrBots;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+
+ View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_rcv_dr_bot, viewGroup, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
+ Favorite itemDrBot = itemDrBots.get(i);
+
+ if (itemDrBot.getFavoriteImage() != null && !itemDrBot.getFavoriteImage().equals("")) {
+
+ byte[] theByteArray = Base64.decode(itemDrBot.getFavoriteImage(), Base64.DEFAULT);
+ Bitmap bmp = BitmapFactory.decodeByteArray(theByteArray, 0, theByteArray.length);
+ holder.icon.setImageBitmap(bmp);
+
+ } else {
+ holder.icon.setVisibility(View.GONE);
+ }
+ GradientDrawable gd = new GradientDrawable();
+ gd.setCornerRadius(75);
+ String bgColor = "#"+itemDrBot.getFavoriteBgColor();
+ if (checkColor(bgColor)){
+ gd.setColor(Color.parseColor(bgColor));
+ }else {
+ gd.setColor(G.context.getResources().getColor(R.color.colorOldBlack));
+ }
+
+ holder.itemView.setBackgroundDrawable(gd);
+ holder.title.setText(itemDrBot.getFavoriteName());
+
+ String txtColor = "#"+itemDrBot.getFavoriteColor();
+ if (checkColor(txtColor)){
+ holder.title.setTextColor(Color.parseColor(txtColor));
+ }else {
+ holder.title.setTextColor(G.context.getResources().getColor(R.color.white));
+ }
+ }
+
+ private boolean checkColor(String color) {
+ Pattern mPattern = Pattern.compile("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$");
+
+ Matcher matcher = mPattern.matcher(color);
+
+ return matcher.matches();
+ }
+
+ @Override
+ public int getItemCount() {
+ return itemDrBots.size();
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder {
+
+ private ImageView icon;
+ private TextView title;
+ private RippleView rippleView;
+
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+
+ icon = itemView.findViewById(R.id.imgDrBot);
+ title = itemView.findViewById(R.id.txtTitleDrBot);
+ title = itemView.findViewById(R.id.txtTitleDrBot);
+ rippleView = itemView.findViewById(R.id.rippleBot);
+ rippleView.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
+ @Override
+ public void onComplete(RippleView rippleView) throws IOException {
+
+ Favorite item = itemDrBots.get(getAdapterPosition());
+
+ if (item.getFavoriteValue().startsWith("@")){
+ FragmentChat.onHandleDrBot.goToRoomBot(item);
+ }else{
+ FragmentChat.onHandleDrBot.sendMessageBOt(item);
+ }
+
+ }
+ });
+ }
+ }
+
+ public void update(List itemDrBots) {
+ this.itemDrBots = itemDrBots;
+ notifyDataSetChanged();
+ }
+}
diff --git a/app/src/main/java/net/iGap/adapter/AdapterSolidChatBackground.java b/app/src/main/java/net/iGap/adapter/AdapterSolidChatBackground.java
new file mode 100644
index 0000000..1caf2c1
--- /dev/null
+++ b/app/src/main/java/net/iGap/adapter/AdapterSolidChatBackground.java
@@ -0,0 +1,201 @@
+/*
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
+
+package net.iGap.adapter;
+
+import android.graphics.Color;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.afollestad.materialdialogs.MaterialDialog;
+
+import net.iGap.G;
+import net.iGap.R;
+import net.iGap.fragments.FragmentChatBackground;
+import net.iGap.helper.HelperDownloadFile;
+import net.iGap.messageprogress.MessageProgress;
+import net.iGap.messageprogress.OnProgress;
+import net.iGap.module.AndroidUtils;
+import net.iGap.module.AppUtils;
+import net.iGap.module.AttachFile;
+import net.iGap.proto.ProtoFileDownload;
+import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmAttachment;
+import net.iGap.realm.RealmWallpaperProto;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class AdapterSolidChatBackground extends RecyclerView.Adapter {
+
+
+
+ private ArrayList mList;
+ private FragmentChatBackground.OnImageClick onImageClick;
+ private Fragment fragment;
+ private Enum imgSwitcher;
+ArrayList palletList=new ArrayList<>(Arrays.asList("#2962ff","#00b8d4",
+ "#b71c1c","#e53935","#e57373",
+ "#880e4f","#d81b60","#f06292",
+ "#4a148c","#8e24aa","#ba68c8",
+ "#311b92","#5e35b1","#9575cd",
+ "#1a237e","#3949ab","#7986cb",
+ "#0d47a1","#1e88e5","#64b5f6",
+ "#01579b","#039be5","#4fc3f7",
+ "#006064","#00acc1","#4dd0e1",
+ "#004d40","#00897b","#4db6ac",
+ "#1b5e20","#43a047","#81c784",
+ "#33691e","#7cb342","#aed581",
+ "#827717","#c0ca33","#dce775",
+ "#f57f17","#fdd835","#fff176",
+ "#ff6f00","#ffb300","#ffd54f",
+ "#e65100","#fb8c00","#fb8c00",
+ "#bf360c","#f4511e","#ff8a65",
+ "#3e2723","#6d4c41","#a1887f",
+ "#212121","#757575","#e0e0e0",
+ "#263238","#546e7a","#90a4ae"));
+ public AdapterSolidChatBackground(Fragment fragment, ArrayList List, FragmentChatBackground.OnImageClick onImageClick) {
+ this.fragment = fragment;
+ this.mList = List;
+ this.onImageClick = onImageClick;
+ this.imgSwitcher=imgSwitcher;
+ mList.addAll(palletList);
+ ;
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_background_image, parent, false);
+ return new ViewHolderItem(view);
+
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
+
+ final ViewHolderItem holder2 = (ViewHolderItem) holder;
+ holder2.img.setImageDrawable(null);
+
+ if (mList.size() < (position + 1)) {
+ return;
+ }
+ String wallpaper = mList.get(position);
+
+
+ holder2.img.setBackgroundColor(Color.parseColor(wallpaper));
+
+
+ String bigImagePath;
+
+ bigImagePath = wallpaper;
+
+ if (bigImagePath!=null) {
+ holder2.messageProgress.setVisibility(View.GONE);
+ try{
+ if (wallpaper != null)
+ holder2.mPath = wallpaper;
+ else
+ holder2.mPath = bigImagePath;
+ }catch (Exception e){}
+
+ } else {
+ holder2.mPath = "";
+ holder2.messageProgress.setVisibility(View.VISIBLE);
+ }
+
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return mList.size();
+ }
+
+ @Override
+ public int getItemCount() {
+ return mList.size();
+ }
+
+
+ private class ViewHolderImage extends RecyclerView.ViewHolder {
+
+ private ImageView imageView;
+
+ public ViewHolderImage(View itemView) {
+ super(itemView);
+
+ imageView = (ImageView) itemView.findViewById(R.id.imgBackgroundImage);
+
+ imageView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ new MaterialDialog.Builder(G.fragmentActivity).title(G.context.getString(R.string.choose_picture)).negativeText(G.context.getString(R.string.cancel)).items(R.array.profile).itemsCallback(new MaterialDialog.ListCallback() {
+ @Override
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+
+ AttachFile attachFile = new AttachFile(G.fragmentActivity);
+
+ if (text.toString().equals(G.context.getString(R.string.from_camera))) {
+ try {
+ attachFile.requestTakePicture(fragment);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } else {
+ try {
+ attachFile.requestOpenGalleryForImageSingleSelect(fragment);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ dialog.dismiss();
+ }
+ }).show();
+ }
+ });
+ }
+ }
+
+ private class ViewHolderItem extends RecyclerView.ViewHolder {
+
+ public MessageProgress messageProgress;
+ public String mPath = "";
+ private ImageView img;
+
+ ViewHolderItem(View itemView) {
+ super(itemView);
+
+ img = (ImageView) itemView.findViewById(R.id.imgBackground);
+
+ messageProgress = (MessageProgress) itemView.findViewById(R.id.progress);
+ AppUtils.setProgresColor(messageProgress.progressBar);
+
+ messageProgress.withDrawable(R.drawable.ic_download, true);
+ img.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mPath.length() > 0) {
+ if (onImageClick != null) {
+ onImageClick.onClick(mPath);
+ }
+ }
+ }
+ });
+ }
+ }
+}
diff --git a/app/src/main/java/net/iGap/adapter/MessagesAdapter.java b/app/src/main/java/net/iGap/adapter/MessagesAdapter.java
index 030e49d..051f82d 100644
--- a/app/src/main/java/net/iGap/adapter/MessagesAdapter.java
+++ b/app/src/main/java/net/iGap/adapter/MessagesAdapter.java
@@ -12,7 +12,9 @@
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
+import android.os.CountDownTimer;
import android.support.v7.widget.RecyclerView;
+import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
@@ -89,6 +91,18 @@ public MessagesAdapter(OnChatMessageSelectionChanged- OnChatMessageSelectio
@Override
public boolean onClick(View v, IAdapter
- adapter, Item item, int position) {
+ new CountDownTimer(300, 100) {
+
+ public void onTick(long millisUntilFinished) {
+ v.setEnabled(false);
+ }
+
+ public void onFinish() {
+ v.setEnabled(true);
+ }
+ }.start();
+
+
if ((item instanceof LogWallet)) {
return false;
}
diff --git a/app/src/main/java/net/iGap/adapter/items/SearchItem.java b/app/src/main/java/net/iGap/adapter/items/SearchItem.java
index 8a970c4..dfc15d4 100644
--- a/app/src/main/java/net/iGap/adapter/items/SearchItem.java
+++ b/app/src/main/java/net/iGap/adapter/items/SearchItem.java
@@ -60,14 +60,18 @@ public void bindView(ViewHolder holder, List payloads) {
setAvatar(holder);
holder.name.setText(item.name);
- holder.lastSeen.setText(item.comment);
+ if (item.comment.isEmpty()){
+ holder.lastSeen.setText(item.userName);
+ }else {
+ holder.lastSeen.setText(item.comment);
+ }
//holder.txtTime.setText(TimeUtils.toLocal(item.time, G.CHAT_MESSAGE_TIME));
holder.txtTime.setText(HelperCalander.getTimeForMainRoom(item.time));
if (HelperCalander.isPersianUnicode) {
//holder.name.setText(HelperCalander.convertToUnicodeFarsiNumber(holder.name.getText().toString()));
- holder.lastSeen.setText(HelperCalander.convertToUnicodeFarsiNumber(holder.lastSeen.getText().toString()));
+// holder.lastSeen.setText(HelperCalander.convertToUnicodeFarsiNumber(holder.lastSeen.getText().toString()));
holder.txtTime.setText(HelperCalander.convertToUnicodeFarsiNumber(holder.txtTime.getText().toString()));
}
diff --git a/app/src/main/java/net/iGap/adapter/items/chat/AbstractMessage.java b/app/src/main/java/net/iGap/adapter/items/chat/AbstractMessage.java
index 4b74380..dc30d07 100644
--- a/app/src/main/java/net/iGap/adapter/items/chat/AbstractMessage.java
+++ b/app/src/main/java/net/iGap/adapter/items/chat/AbstractMessage.java
@@ -37,7 +37,6 @@
import net.iGap.helper.HelperAvatar;
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperCheckInternetConnection;
-import net.iGap.helper.HelperDataUsage;
import net.iGap.helper.HelperDownloadFile;
import net.iGap.helper.HelperError;
import net.iGap.helper.HelperGetMessageState;
@@ -730,14 +729,24 @@ protected void updateLayoutForSend(VH holder) {
}
// ProtoGlobal.RoomMessageType messageType = mMessage.forwardedFrom == null ? mMessage.messageType : mMessage.forwardedFrom.getMessageType();
- if (ProtoGlobal.RoomMessageStatus.valueOf(mMessage.status) == ProtoGlobal.RoomMessageStatus.SEEN) {
+
+ ProtoGlobal.RoomMessageStatus status = ProtoGlobal.RoomMessageStatus.UNRECOGNIZED;
+ if (mMessage.status != null) {
+ try {
+ status = ProtoGlobal.RoomMessageStatus.valueOf(mMessage.status);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (status == ProtoGlobal.RoomMessageStatus.SEEN) {
if (G.isDarkTheme) {
setTextColor(imgTick, R.color.iGapColor);
} else {
setTextColor(imgTick, R.color.backgroundColorCall2);
}
- } else if (ProtoGlobal.RoomMessageStatus.valueOf(mMessage.status) == ProtoGlobal.RoomMessageStatus.LISTENED) {
+ } else if (status == ProtoGlobal.RoomMessageStatus.LISTENED) {
// iconHearing.setVisibility(View.VISIBLE);
if (G.isDarkTheme) {
setTextColor(imgTick, R.color.iGapColor);
@@ -1294,7 +1303,7 @@ public void onClick(View v) {
SharedPreferences sharedPreferences = holder.itemView.getContext().getSharedPreferences(SHP_SETTING.FILE_NAME, MODE_PRIVATE);
if (sharedPreferences.getInt(SHP_SETTING.KEY_AUTOPLAY_GIFS, SHP_SETTING.Defaults.KEY_AUTOPLAY_GIFS) == 0) {
holder.itemView.findViewById(R.id.progress).setVisibility(View.VISIBLE);
- _Progress.withDrawable(R.drawable.photogif, true);
+ _Progress.withDrawable(R.mipmap.photogif, true);
} else {
holder.itemView.findViewById(R.id.progress).setVisibility(View.INVISIBLE);
}
diff --git a/app/src/main/java/net/iGap/adapter/items/chat/GifWithTextItem.java b/app/src/main/java/net/iGap/adapter/items/chat/GifWithTextItem.java
index ba024b8..df1d507 100644
--- a/app/src/main/java/net/iGap/adapter/items/chat/GifWithTextItem.java
+++ b/app/src/main/java/net/iGap/adapter/items/chat/GifWithTextItem.java
@@ -28,6 +28,8 @@
import net.iGap.module.enums.LocalFileType;
import net.iGap.module.enums.SendingStep;
import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmRoomMessage;
+import net.iGap.realm.RealmRoomMessageFields;
import java.io.File;
import java.util.List;
@@ -36,6 +38,7 @@
import pl.droidsonroids.gif.GifDrawable;
import static android.content.Context.MODE_PRIVATE;
+import static net.iGap.fragments.FragmentChat.getRealmChat;
public class GifWithTextItem extends AbstractMessage {
@@ -50,7 +53,7 @@ public void onPlayPauseGIF(ViewHolder holder, String localPath) throws ClassCast
MessageProgress progress = (MessageProgress) holder.itemView.findViewById(R.id.progress);
AppUtils.setProgresColor(progress.progressBar);
- progress.withDrawable(R.drawable.photogif, true);
+ progress.withDrawable(R.mipmap.photogif, true);
GifDrawable gifDrawable = (GifDrawable) holder.image.getDrawable();
if (gifDrawable != null) {
@@ -150,6 +153,14 @@ public void onClick(View v) {
} catch (ClassCastException e) {
e.printStackTrace();
}
+ } else {
+ if (mMessage.forwardedFrom != null) {
+ downLoadFile(holder, mMessage.forwardedFrom.getAttachment(), 0);
+ } else {
+ RealmRoomMessage roomMessage = RealmRoomMessage.getFinalMessage(getRealmChat().where(RealmRoomMessage.class).
+ equalTo(RealmRoomMessageFields.MESSAGE_ID, Long.parseLong(mMessage.messageID)).findFirst());
+ downLoadFile(holder, roomMessage.getAttachment(), 0);
+ }
}
}
}
diff --git a/app/src/main/java/net/iGap/adapter/items/chat/ViewMaker.java b/app/src/main/java/net/iGap/adapter/items/chat/ViewMaker.java
index 2089bb3..1495e7e 100644
--- a/app/src/main/java/net/iGap/adapter/items/chat/ViewMaker.java
+++ b/app/src/main/java/net/iGap/adapter/items/chat/ViewMaker.java
@@ -1111,7 +1111,7 @@ static View getContactItem() {
layoutParamsImage.rightMargin = 14;
image.setId(R.id.image);
image.setContentDescription(null);
- AppUtils.setImageDrawable(image, R.drawable.user);
+ AppUtils.setImageDrawable(image, R.mipmap.user);
image.setLayoutParams(layoutParamsImage);
LinearLayout container3 = new LinearLayout(context);
diff --git a/app/src/main/java/net/iGap/fragments/FragmentAddContact.java b/app/src/main/java/net/iGap/fragments/FragmentAddContact.java
index fdb80ef..73b422d 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentAddContact.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentAddContact.java
@@ -85,6 +85,18 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
private void initComponent(final View view) {
+ String phoneFromUrl = "";
+ try {
+ phoneFromUrl = getArguments().getString("PHONE");
+ if (phoneFromUrl != null && phoneFromUrl.length() > 0) {
+ if (phoneFromUrl.startsWith("0")) {
+ phoneFromUrl = phoneFromUrl.substring(1);
+ }
+ }
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+
MaterialDesignTextView btnBack = (MaterialDesignTextView) view.findViewById(R.id.ac_txt_back);
final RippleView rippleBack = (RippleView) view.findViewById(R.id.ac_ripple_back);
rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@@ -124,6 +136,9 @@ public void onClick(View v) {
edtLastName = (EditText) view.findViewById(R.id.ac_edt_lastName);
final View viewLastName = view.findViewById(R.id.ac_view_lastName);
edtPhoneNumber = (MaskedEditText) view.findViewById(R.id.ac_edt_phoneNumber);
+ if (phoneFromUrl != null && phoneFromUrl.length() > 0) {
+ edtPhoneNumber.setText(phoneFromUrl);
+ }
final View viewPhoneNumber = view.findViewById(R.id.ac_view_phoneNumber);
edtFirstName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
diff --git a/app/src/main/java/net/iGap/fragments/FragmentBlockedUser.java b/app/src/main/java/net/iGap/fragments/FragmentBlockedUser.java
index ea4a7c7..d2ba784 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentBlockedUser.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentBlockedUser.java
@@ -342,30 +342,17 @@ public void onStartOpen(SwipeLayout layout) {
@Override
public void onOpen(SwipeLayout layout) {
- MaterialDialog dialog = new MaterialDialog.Builder(G.currentActivity).content(R.string.un_block_user).positiveText(R.string.B_ok).onPositive(new MaterialDialog.SingleButtonCallback() {
- @Override
- public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
- new RequestUserContactsUnblock().userContactsUnblock(registeredInfo.getId());
- }
- }).negativeText(R.string.B_cancel).build();
- dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- viewHolder.swipeLayout.close();
- }
- });
- dialog.show();
}
@Override
public void onStartClose(SwipeLayout layout) {
-
}
@Override
public void onClose(SwipeLayout layout) {
+
}
@Override
@@ -376,6 +363,24 @@ public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
@Override
public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
+ if (!viewHolder.isOpenDialog) {
+ viewHolder.isOpenDialog = true;
+ MaterialDialog dialog = new MaterialDialog.Builder(G.currentActivity).content(R.string.un_block_user).positiveText(R.string.B_ok).onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ new RequestUserContactsUnblock().userContactsUnblock(registeredInfo.getId());
+ }
+ }).negativeText(R.string.B_cancel).build();
+
+ dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ viewHolder.swipeLayout.close();
+ viewHolder.isOpenDialog = false;
+ }
+ });
+ dialog.show();
+ }
}
});
}
@@ -388,6 +393,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
RealmRegisteredInfo realmRegisteredInfo;
View bottomLine;
private SwipeLayout swipeLayout;
+ private boolean isOpenDialog = false;
public ViewHolder(View view) {
diff --git a/app/src/main/java/net/iGap/fragments/FragmentCall.java b/app/src/main/java/net/iGap/fragments/FragmentCall.java
index 85d8268..9c3baea 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentCall.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentCall.java
@@ -48,6 +48,7 @@
import net.iGap.module.PreCachingLayoutManager;
import net.iGap.module.TimeUtils;
import net.iGap.proto.ProtoSignalingGetLog;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmCallConfig;
import net.iGap.realm.RealmCallLog;
import net.iGap.realm.RealmCallLogFields;
@@ -63,6 +64,8 @@
import io.realm.RealmResults;
import io.realm.Sort;
+import static net.iGap.proto.ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING;
+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public class FragmentCall extends BaseFragment implements OnCallLogClear {
@@ -95,7 +98,7 @@ public static FragmentCall newInstance(boolean openInFragmentMain) {
return fragmentCall;
}
- public static void call(long userID, boolean isIncomingCall) {
+ public static void call(long userID, boolean isIncomingCall, ProtoSignalingOffer.SignalingOffer.Type callTYpe) {
if (G.userLogin) {
@@ -113,14 +116,15 @@ public static void call(long userID, boolean isIncomingCall) {
Intent intent = new Intent(G.currentActivity, ActivityCall.class);
intent.putExtra(ActivityCall.USER_ID_STR, userID);
intent.putExtra(ActivityCall.INCOMING_CALL_STR, isIncomingCall);
+ intent.putExtra(ActivityCall.CALL_TYPE, callTYpe);
ActivityCall.isGoingfromApp = true;
G.currentActivity.startActivity(intent);
} else {
Intent intent = new Intent(G.context, ActivityCall.class);
intent.putExtra(ActivityCall.USER_ID_STR, userID);
intent.putExtra(ActivityCall.INCOMING_CALL_STR, isIncomingCall);
+ intent.putExtra(ActivityCall.CALL_TYPE, callTYpe);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
ActivityCall.isGoingfromApp = true;
G.context.startActivity(intent);
}
@@ -719,18 +723,10 @@ public void onBindViewHolder(final CallAdapter.ViewHolder viewHolder, int i) {
break;
}
- //switch (item.getType()) {
- //
- // case SCREEN_SHARING:
- // viewHolder.call_type_icon.setText(R.string.md_stay_current_portrait);
- // break;
- // case VIDEO_CALLING:
- // viewHolder.call_type_icon.setText(R.string.md_video_cam);
- // break;
- // case VOICE_CALLING:
- // viewHolder.call_type_icon.setText(R.string.md_phone);
- // break;
- //}
+ if (item.getType() == VIDEO_CALLING) {
+ viewHolder.icon.setText(R.string.md_file_video);
+ }
+
if (HelperCalander.isPersianUnicode) {
viewHolder.timeAndInfo.setText(HelperCalander.checkHijriAndReturnTime(item.getOfferTime()) + " " + TimeUtils.toLocal(item.getOfferTime() * DateUtils.SECOND_IN_MILLIS, G.CHAT_MESSAGE_TIME)); //+ " " + HelperCalander.checkHijriAndReturnTime(item.getOfferTime())
@@ -795,7 +791,7 @@ public void onClick(View v) {
long userId = callLog.getPeer().getId();
if (userId != 134 && G.userId != userId) {
- call(userId, false);
+ call(userId, false, callLog.getType());
}
}
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentChat.java b/app/src/main/java/net/iGap/fragments/FragmentChat.java
index 6ab1db9..579ea43 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentChat.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentChat.java
@@ -17,6 +17,7 @@
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.location.LocationManager;
@@ -29,6 +30,8 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.provider.MediaStore;
import android.support.annotation.ArrayRes;
import android.support.annotation.NonNull;
@@ -46,12 +49,11 @@
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.ViewStubCompat;
+import android.support.v7.widget.helper.ItemTouchHelper;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextWatcher;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
@@ -75,6 +77,8 @@
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.crashlytics.android.Crashlytics;
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
import com.lalongooo.videocompressor.video.MediaController;
import com.mikepenz.fastadapter.IItemAdapter;
import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter;
@@ -94,15 +98,14 @@
import net.iGap.activities.ActivityMain;
import net.iGap.activities.ActivityTrimVideo;
import net.iGap.adapter.AdapterBottomSheet;
+import net.iGap.adapter.AdapterDrBot;
import net.iGap.adapter.MessagesAdapter;
import net.iGap.adapter.items.AdapterBottomSheetForward;
import net.iGap.adapter.items.chat.AbstractMessage;
import net.iGap.adapter.items.chat.AudioItem;
import net.iGap.adapter.items.chat.ContactItem;
import net.iGap.adapter.items.chat.FileItem;
-import net.iGap.adapter.items.chat.GifItem;
import net.iGap.adapter.items.chat.GifWithTextItem;
-import net.iGap.adapter.items.chat.ImageItem;
import net.iGap.adapter.items.chat.ImageWithTextItem;
import net.iGap.adapter.items.chat.LocationItem;
import net.iGap.adapter.items.chat.LogItem;
@@ -111,7 +114,6 @@
import net.iGap.adapter.items.chat.TextItem;
import net.iGap.adapter.items.chat.TimeItem;
import net.iGap.adapter.items.chat.UnreadMessage;
-import net.iGap.adapter.items.chat.VideoItem;
import net.iGap.adapter.items.chat.VideoWithTextItem;
import net.iGap.adapter.items.chat.ViewMaker;
import net.iGap.adapter.items.chat.VoiceItem;
@@ -127,12 +129,11 @@
import net.iGap.helper.HelperGetMessageState;
import net.iGap.helper.HelperLog;
import net.iGap.helper.HelperMimeType;
-import net.iGap.helper.HelperNotificationAndBadge;
+import net.iGap.helper.HelperNotification;
import net.iGap.helper.HelperPermission;
import net.iGap.helper.HelperSaveFile;
import net.iGap.helper.HelperSetAction;
import net.iGap.helper.HelperString;
-import net.iGap.helper.HelperTimeOut;
import net.iGap.helper.HelperUploadFile;
import net.iGap.helper.HelperUrl;
import net.iGap.helper.ImageHelper;
@@ -148,6 +149,7 @@
import net.iGap.interfaces.OnActivityChatStart;
import net.iGap.interfaces.OnAvatarGet;
import net.iGap.interfaces.OnBackgroundChanged;
+import net.iGap.interfaces.OnBotClick;
import net.iGap.interfaces.OnChannelAddMessageReaction;
import net.iGap.interfaces.OnChannelGetMessagesStats;
import net.iGap.interfaces.OnChannelUpdateReactionStatus;
@@ -190,6 +192,7 @@
import net.iGap.module.AndroidUtils;
import net.iGap.module.AppUtils;
import net.iGap.module.AttachFile;
+import net.iGap.module.BotInit;
import net.iGap.module.ChatSendMessageUtil;
import net.iGap.module.CircleImageView;
import net.iGap.module.ContactUtils;
@@ -225,12 +228,16 @@
import net.iGap.module.structs.StructMessageAttachment;
import net.iGap.module.structs.StructMessageInfo;
import net.iGap.module.structs.StructUploadVideo;
+import net.iGap.module.webserviceDrBot.Favorite;
+import net.iGap.module.webserviceDrBot.StructBot;
+import net.iGap.module.webserviceDrBot.WebService;
import net.iGap.proto.ProtoChannelGetMessagesStats;
import net.iGap.proto.ProtoClientGetRoomHistory;
import net.iGap.proto.ProtoClientRoomReport;
import net.iGap.proto.ProtoFileDownload;
import net.iGap.proto.ProtoGlobal;
import net.iGap.proto.ProtoResponse;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmAttachment;
import net.iGap.realm.RealmAttachmentFields;
import net.iGap.realm.RealmCallConfig;
@@ -273,10 +280,8 @@
import org.parceler.Parcels;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -302,6 +307,7 @@
import static android.content.Context.CLIPBOARD_SERVICE;
import static android.content.Context.LOCATION_SERVICE;
import static android.content.Context.MODE_PRIVATE;
+import static android.support.v7.widget.helper.ItemTouchHelper.ACTION_STATE_SWIPE;
import static io.fotoapparat.parameter.selector.LensPositionSelectors.back;
import static io.fotoapparat.parameter.selector.SizeSelectors.biggestSize;
import static java.lang.Long.parseLong;
@@ -310,7 +316,6 @@
import static net.iGap.R.id.ac_ll_parent;
import static net.iGap.R.string.item;
import static net.iGap.helper.HelperCalander.convertToUnicodeFarsiNumber;
-import static net.iGap.helper.HelperGetDataFromOtherApp.messageType;
import static net.iGap.module.AttachFile.getFilePathFromUri;
import static net.iGap.module.AttachFile.request_code_VIDEO_CAPTURED;
import static net.iGap.module.AttachFile.request_code_open_document;
@@ -336,7 +341,7 @@
public class FragmentChat extends BaseFragment
implements IMessageItem, OnChatClearMessageResponse, OnPinedMessage, OnChatSendMessageResponse, OnChatUpdateStatusResponse, OnChatMessageSelectionChanged, OnChatMessageRemove, OnVoiceRecord,
OnUserInfoResponse, OnSetAction, OnUserUpdateStatus, OnLastSeenUpdateTiming, OnGroupAvatarResponse, OnChannelAddMessageReaction, OnChannelGetMessagesStats, OnChatDelete, OnBackgroundChanged,
- OnConnectionChangeStateChat, OnChannelUpdateReactionStatus {
+ OnConnectionChangeStateChat, OnChannelUpdateReactionStatus, OnBotClick {
public static FinishActivity finishActivity;
public static OnComplete onMusicListener;
@@ -361,6 +366,13 @@ public class FragmentChat extends BaseFragment
private static List contacts;
private static ArrayMap compressedPath = new ArrayMap<>(); // keep compressedPath and also keep video path that never be won't compressed
private static ArrayList structUploadVideos = new ArrayList<>();
+ private boolean isShareOk = true;
+ private boolean isDrBot = true;
+ public static OnHandleDrBot onHandleDrBot;
+
+ private Bitmap icon;
+ private boolean isRepley = false;
+ private boolean swipeBack = false;
/**
* *************************** common method ***************************
@@ -429,6 +441,7 @@ public class FragmentChat extends BaseFragment
private ViewGroup vgSpamUser;
private RecyclerView.OnScrollListener scrollListener;
private RecyclerView rcvBottomSheet;
+ private RecyclerView rcvDrBot;
private FrameLayout llScrollNavigate;
private FastItemAdapter fastItemAdapter;
private FastItemAdapter fastItemAdapterForward;
@@ -488,10 +501,12 @@ public class FragmentChat extends BaseFragment
private boolean isShowLayoutUnreadMessage = false;
private boolean isCloudRoom;
private boolean isEditMessage = false;
+ private boolean isBot = false;
private long biggestMessageId = 0;
private long lastMessageId = 0;
private long replyToMessageId = 0;
private long userId;
+ private boolean isShowStartButton = false;
private long lastSeen;
private long chatPeerId;
private long userTime;
@@ -507,6 +522,7 @@ public class FragmentChat extends BaseFragment
private boolean isEmojiSHow = false;
private boolean isCameraStart = false;
private boolean isCameraAttached = false;
+ BotInit botInit;
private boolean isPermissionCamera = false;
private boolean isPublicGroup = false;
private ArrayList bothDeleteMessageId;
@@ -520,6 +536,9 @@ public class FragmentChat extends BaseFragment
private boolean isNewBottomSheet = true;
PaymentDialogBinding paymentDialogBinding;
PaymentFragment paymentDialog;
+ List items = new ArrayList<>();
+ boolean isAnimateStart = false;
+ boolean isScrollEnd = false;
public static Realm getRealmChat() {
if (realmChat == null || realmChat.isClosed()) {
@@ -725,8 +744,6 @@ public void sendSeenStatus(RealmRoomMessage message) {
});
- HelperNotificationAndBadge.updateBadgeOnly(getRealmChat(), mRoomId);
-
}
}, 500);
}
@@ -864,9 +881,10 @@ public void onSuccess() {
G.onChatDelete = this;
G.onBackgroundChanged = this;
G.onConnectionChangeStateChat = this;
- G.helperNotificationAndBadge.cancelNotification();
+ HelperNotification.getInstance().cancelNotification();
G.onChannelUpdateReactionStatusChat = this;
G.onPinedMessage = this;
+ G.onBotClick = this;
finishActivity = new FinishActivity() {
@Override
@@ -877,7 +895,7 @@ public void finishActivity() {
};
initCallbacks();
- HelperNotificationAndBadge.isChatRoomNow = true;
+ HelperNotification.getInstance().isChatRoomNow = true;
onUpdateUserOrRoomInfo = new OnUpdateUserOrRoomInfo() {
@Override
@@ -976,7 +994,7 @@ public void onStop() {
canUpdateAfterDownload = false;
setDraft();
- HelperNotificationAndBadge.isChatRoomNow = false;
+ HelperNotification.getInstance().isChatRoomNow = false;
//if (isNotJoin) { // hint : commented this code, because when going to profile and return can't load message
//
@@ -1156,12 +1174,13 @@ public void onActivityResult(final int requestCode, int resultCode, Intent data)
*/
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (requestCode == AttachFile.requestOpenGalleryForVideoMultipleSelect) {
- if (sharedPreferences.getInt(SHP_SETTING.KEY_TRIM, 1) == 1) {
+ boolean isGif = listPathString.get(0).toLowerCase().endsWith(".gif");
+ if (sharedPreferences.getInt(SHP_SETTING.KEY_TRIM, 1) == 1 && !isGif) {
Intent intent = new Intent(G.fragmentActivity, ActivityTrimVideo.class);
intent.putExtra("PATH", listPathString.get(0));
startActivityForResult(intent, AttachFile.request_code_trim_video);
return;
- } else if ((sharedPreferences.getInt(SHP_SETTING.KEY_COMPRESS, 1) == 1)) {
+ } else if ((sharedPreferences.getInt(SHP_SETTING.KEY_COMPRESS, 1) == 1 && !isGif)) {
mainVideoPath = listPathString.get(0);
@@ -1264,11 +1283,20 @@ public void run() {
});
}
} else {
+ //# get gif there
+
G.handler.post(new Runnable() {
@Override
public void run() {
if (prgWaiting != null) {
- prgWaiting.setVisibility(View.GONE);
+ try {
+
+ sendMessage(requestCode, listPathString.get(0));
+ prgWaiting.setVisibility(View.GONE);
+
+ } catch (Exception e) {
+ }
+
}
}
});
@@ -1388,6 +1416,31 @@ private void startPageFastInitialize() {
title = realmRegisteredInfo.getDisplayName();
lastSeen = realmRegisteredInfo.getLastSeen();
userStatus = realmRegisteredInfo.getStatus();
+ isBot = realmRegisteredInfo.isBot();
+
+ if (isBot) {
+
+ if (getMessagesCount() == 0) {
+ layoutMute = (RelativeLayout) rootView.findViewById(R.id.chl_ll_channel_footer);
+ layoutMute.setVisibility(View.VISIBLE);
+ ((TextView) rootView.findViewById(R.id.chl_txt_mute_channel)).setText(R.string.start);
+ LinearLayout layoutAttach = (LinearLayout) rootView.findViewById(R.id.layout_attach_file);
+ layoutAttach.setVisibility(View.GONE);
+
+ layoutMute.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!isChatReadOnly) {
+ edtChat.setText("/Start");
+ imvSendButton.performClick();
+ }
+ }
+ });
+ isShowStartButton = true;
+ }
+
+ }
+
if (realmRegisteredInfo.isVerified()) {
txtVerifyRoomIcon.setVisibility(View.VISIBLE);
}
@@ -1461,12 +1514,86 @@ private void startPageFastInitialize() {
if (chatPeerId == G.userId) {
isCloudRoom = true;
}
-
//+realm.close();
}
+ private long getMessagesCount() {
+ return getRealmChat().where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.ROOM_ID, mRoomId).findAll().size();
+ }
+
+ private void initDrBot() {
+ rcvDrBot = rootView.findViewById(R.id.rcvDrBot);
+ rcvDrBot.setLayoutManager(new LinearLayoutManager(G.context, LinearLayoutManager.HORIZONTAL, false));
+ AdapterDrBot adapterDrBot = new AdapterDrBot(items);
+ rcvDrBot.setAdapter(adapterDrBot);
+
+ List nameValuePairs = new ArrayList(1);
+ WebService.AsyncCaller caller = new WebService.AsyncCaller(context, nameValuePairs, new WebService.AsyncTaskCompleteListener() {
+ @Override
+ public void onTaskComplete(String result) {
+ Gson gson = new Gson();
+ StructBot item = null;
+ try {
+ item = gson.fromJson(result, StructBot.class);
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ } catch (JsonSyntaxException e1) {
+ e1.printStackTrace();
+ }
+
+
+ if (item != null && item.getResult() == 1) {
+
+ items = item.getFavorite();
+ if (items.size() == 0) {
+ return;
+ }
+
+ rcvDrBot.setVisibility(View.VISIBLE);
+ adapterDrBot.update(items);
+
+ onHandleDrBot = new OnHandleDrBot() {
+ @Override
+ public void goToRoomBot(Favorite item) {
+
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
+
+
+ HelperUrl.checkUsernameAndGoToRoom(item.getFavoriteValue().replace("@", ""), HelperUrl.ChatEntry.chat);
+ }
+ });
+ }
+
+ @Override
+ public void sendMessageBOt(Favorite item) {
+
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (!isChatReadOnly) {
+ edtChat.setText(item.getFavoriteValue());
+ imvSendButton.performClick();
+ }
+ }
+ });
+
+
+ }
+ };
+
+ }
+
+ }
+ }, true);
+ caller.execute("igap/getData");
+
+
+ }
+
private void checkConnection(String action) {
- if (action != null) {
+ if (action != null && !isBot) {
ViewMaker.setLayoutDirection(viewGroupLastSeen, View.LAYOUT_DIRECTION_LOCALE);
txtLastSeen.setText(action);
} else {
@@ -1474,6 +1601,8 @@ private void checkConnection(String action) {
if (chatType == CHAT) {
if (isCloudRoom) {
txtLastSeen.setText(G.fragmentActivity.getResources().getString(R.string.chat_with_yourself));
+ } else if (isBot) {
+ txtLastSeen.setText(G.fragmentActivity.getResources().getString(R.string.bot));
} else {
if (userStatus != null) {
if (userStatus.equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
@@ -1548,6 +1677,10 @@ private void initMain() {
txtEmptyMessages = (TextView) rootView.findViewById(R.id.empty_messages);
+ if (isBot) {
+ txtEmptyMessages.setText(G.fragmentActivity.getResources().getString(R.string.empty_text_dr_bot));
+ }
+
lastDateCalendar.clear();
locationManager = (LocationManager) G.fragmentActivity.getSystemService(LOCATION_SERVICE);
@@ -1661,6 +1794,12 @@ public void onError(int majorCode, int minorCode) {
initialize = realmRegisteredInfo.getInitials();
color = realmRegisteredInfo.getColor();
phoneNumber = realmRegisteredInfo.getPhoneNumber();
+
+ if (realmRegisteredInfo.getId() == Config.drIgapPeerId) {
+ // if (realmRegisteredInfo.getUsername().equalsIgnoreCase("")) {
+ initDrBot();
+ }
+
} else {
title = realmRoom.getTitle();
initialize = realmRoom.getInitials();
@@ -1696,7 +1835,7 @@ public void onError(int majorCode, int minorCode) {
initAppbarSelected();
getDraft();
getUserInfo();
- insertShearedData(HelperGetDataFromOtherApp.messageFileAddress);
+ insertShearedData();
FragmentShearedMedia.goToPositionFromShardMedia = new FragmentShearedMedia.GoToPositionFromShardMedia() {
@@ -1707,17 +1846,14 @@ public void goToPosition(Long messageId) {
savedScrollMessageId = messageId;
firstVisiblePositionOffset = 0;
- int position = mAdapter.findPositionByMessageId(savedScrollMessageId);
- if (position > 0) {
- LinearLayoutManager linearLayout = (LinearLayoutManager) recyclerView.getLayoutManager();
- linearLayout.scrollToPositionWithOffset(position, firstVisiblePositionOffset);
+ if (goToPositionWithAnimation(savedScrollMessageId, 2000)) {
savedScrollMessageId = 0;
} else {
RealmRoomMessage rm = getRealmChat().where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.MESSAGE_ID, messageId).findFirst();
rm = RealmRoomMessage.getFinalMessage(rm);
if (rm != null) {
resetMessagingValue();
- savedScrollMessageId = messageId;
+ savedScrollMessageId = FragmentChat.messageId = messageId;
firstVisiblePositionOffset = 0;
getMessages();
}
@@ -1758,11 +1894,7 @@ public void onClick(View v) {
pinedMessageLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- int position = mAdapter.findPositionByMessageId(pinMessageId);
- if (position != -1) {
- LinearLayoutManager linearLayout = (LinearLayoutManager) recyclerView.getLayoutManager();
- linearLayout.scrollToPositionWithOffset(position, 0);
- } else {
+ if (!goToPositionWithAnimation(pinMessageId, 1000)) {
RealmRoomMessage rm = getRealmChat().where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.MESSAGE_ID, pinMessageId).findFirst();
rm = RealmRoomMessage.getFinalMessage(rm);
@@ -1775,7 +1907,7 @@ public void onClick(View v) {
new RequestClientGetRoomMessage().clientGetRoomMessage(mRoomId, pinMessageId);
G.onClientGetRoomMessage = new OnClientGetRoomMessage() {
@Override
- public void onClientGetRoomMessageResponse(long messageId) {
+ public void onClientGetRoomMessageResponse(ProtoGlobal.RoomMessage message) {
G.onClientGetRoomMessage = null;
G.handler.post(new Runnable() {
@Override
@@ -1845,6 +1977,36 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
}
+ private boolean goToPositionWithAnimation(long messageId, int time) {
+
+ int position = mAdapter.findPositionByMessageId(messageId);
+ if (position != -1) {
+ LinearLayoutManager linearLayout = (LinearLayoutManager) recyclerView.getLayoutManager();
+ linearLayout.scrollToPositionWithOffset(position, 0);
+
+ mAdapter.getItem(position).mMessage.isSelected = true;
+ mAdapter.notifyItemChanged(position);
+
+ G.handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ int position = mAdapter.findPositionByMessageId(messageId);
+ if (position != -1) {
+ mAdapter.getItem(position).mMessage.isSelected = false;
+ mAdapter.notifyItemChanged(position);
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ }, time);
+
+ return true;
+ }
+ return false;
+ }
+
private void registerListener() {
G.dispatchTochEventChat = new IDispatchTochEvent() {
@@ -1917,6 +2079,7 @@ private void pageSettings() {
if (backGroundPath.length() > 0) {
imgBackGround = (ImageView) rootView.findViewById(R.id.chl_img_view_chat);
+
File f = new File(backGroundPath);
if (f.exists()) {
try {
@@ -1928,6 +2091,12 @@ private void pageSettings() {
activityManager.getMemoryInfo(memoryInfo);
Crashlytics.logException(new Exception("FragmentChat -> Device Name : " + Build.BRAND + " || memoryInfo.availMem : " + memoryInfo.availMem + " || memoryInfo.totalMem : " + memoryInfo.totalMem + " || memoryInfo.lowMemory : " + memoryInfo.lowMemory));
}
+ } else {
+ try {
+ imgBackGround.setBackgroundColor(Color.parseColor(backGroundPath));
+ } catch (Exception e) {
+ }
+
}
}
@@ -2145,9 +2314,11 @@ private void initComponent() {
if (chatType == CHAT && !isChatReadOnly) {
- if (G.userId != chatPeerId) {
+ if (G.userId != chatPeerId && !isBot) {
RippleView rippleCall = (RippleView) rootView.findViewById(R.id.acp_ripple_call);
+ RippleView rippleVideoCall = (RippleView) rootView.findViewById(R.id.acp_ripple_video_call);
+
// gone or visible view call
RealmCallConfig callConfig = getRealmChat().where(RealmCallConfig.class).findFirst();
if (callConfig != null) {
@@ -2156,12 +2327,26 @@ private void initComponent() {
rippleCall.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
- FragmentCall.call(chatPeerId, false);
+ FragmentCall.call(chatPeerId, false, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING);
}
});
} else {
rippleCall.setVisibility(View.GONE);
}
+
+ if (callConfig.isVideo_calling()) {
+ rippleVideoCall.setVisibility(View.VISIBLE);
+ rippleVideoCall.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
+ @Override
+ public void onComplete(RippleView rippleView) throws IOException {
+ FragmentCall.call(chatPeerId, false, ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING);
+ }
+ });
+
+ } else {
+ rippleVideoCall.setVisibility(View.GONE);
+ }
+
} else {
new RequestSignalingGetConfiguration().signalingGetConfiguration();
}
@@ -2180,27 +2365,7 @@ public void onClick(View view) {
edtChat.setSelection(edtChat.getText().length());
if (edtChat.getText().length() == 0) {
-
- layoutAttachBottom.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- layoutAttachBottom.setVisibility(View.VISIBLE);
- }
- }).start();
- imvSendButton.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.GONE);
- }
- });
- }
- }).start();
+ sendButtonVisibility(false);
}
}
});
@@ -2287,10 +2452,12 @@ public void onClick(View rippleView) {
if (chatType == CHAT) {
root3.setVisibility(View.VISIBLE);
- if (!isChatReadOnly && !blockUser) {
+ if (!isChatReadOnly && !blockUser && !isBot) {
root5.setVisibility(View.VISIBLE);
+ root9.setVisibility(View.VISIBLE);
} else {
root5.setVisibility(View.GONE);
+ root9.setVisibility(View.GONE);
}
} else {
root3.setVisibility(View.GONE);
@@ -2341,7 +2508,7 @@ public void onClick(View rippleView) {
}
- if (G.isWalletActive && G.isWalletRegister && (chatType == CHAT) && !isCloudRoom) {
+ if (G.isWalletActive && G.isWalletRegister && (chatType == CHAT) && !isCloudRoom && !isBot) {
root8.setVisibility(View.VISIBLE);
} else {
root8.setVisibility(View.GONE);
@@ -2458,7 +2625,7 @@ public void onClick(View view) {
dialog.dismiss();
if (HelperPermission.grantedUseStorage()) {
exportChat();
- }else{
+ } else {
try {
HelperPermission.getStoragePermision(G.fragmentActivity, new OnGetPermission() {
@Override
@@ -2468,7 +2635,7 @@ public void Allow() throws IOException {
@Override
public void deny() {
- Toast.makeText(G.currentActivity,R.string.export_message,Toast.LENGTH_SHORT).show();
+ Toast.makeText(G.currentActivity, R.string.export_message, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
@@ -2490,6 +2657,10 @@ public void onClick(View v) {
}
});
+
+ if (RealmRoom.isBot(chatPeerId)) {
+ root3.setVisibility(View.GONE);
+ }
}
});
@@ -2506,6 +2677,8 @@ public void onClick(View v) {
imvSmileButton.performClick();
}
+
+ if (botInit != null) botInit.close();
}
});
@@ -2523,6 +2696,41 @@ public void onClick(View v) {
imvMicButton = (MaterialDesignTextView) rootView.findViewById(R.id.chl_imv_mic_button);
sendMoney = (MaterialDesignTextView) rootView.findViewById(R.id.chl_imv_sendMoney_button);
+
+ if (isBot) {
+ botInit = new BotInit(rootView, false);
+ sendButtonVisibility(false);
+
+
+ RealmResults result;
+ RealmRoomMessage rm = null;
+ String lastMessage = "";
+ boolean backToMenu = true;
+
+ result = getRealmChat().where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.ROOM_ID, mRoomId).notEqualTo(RealmRoomMessageFields.AUTHOR_HASH, G.authorHash).findAll();
+ if (result.size() > 0) {
+ rm = result.last();
+ if (rm.getMessage() != null) {
+ lastMessage = rm.getMessage();
+ }
+ }
+
+ result = getRealmChat().where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.ROOM_ID, mRoomId).equalTo(RealmRoomMessageFields.AUTHOR_HASH, G.authorHash).findAll();
+ if (result.size() > 0) {
+ rm = result.last();
+ if (rm.getMessage() != null) {
+ if (rm.getMessage().toLowerCase().equals("/start") || rm.getMessage().equals("/back")) {
+ backToMenu = false;
+ }
+ }
+
+ } else {
+ backToMenu = false;
+ }
+
+ botInit.updateCommandList(false, lastMessage, getActivity(), backToMenu);
+ }
+
if (G.isWalletActive && G.isWalletRegister && (chatType == CHAT) && !isCloudRoom) {
sendMoney.setVisibility(View.VISIBLE);
} else {
@@ -2550,36 +2758,106 @@ public boolean filter(AbstractMessage item, CharSequence constraint) {
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(mAdapter);
+ /* icon = BitmapFactory.decodeResource(this.getResources(),
+ R.drawable.ic_launcher_foreground);*/
+
+ if (realmRoom != null && !realmRoom.getReadOnly()) {
+ ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) {
+ @Override
+ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
+ //awesome code when user grabs recycler card to reorder
+
+ return true;
+ }
+
+ @Override
+ public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ super.clearView(recyclerView, viewHolder);
+
+ // recyclerView.getAdapter().notifyItemChanged(viewHolder.getAdapterPosition());
+ // recyclerView.getAdapter().notifyDataSetChanged();
+
+ // if (!((AbstractMessage) mAdapter.getItem(viewHolder.getAdapterPosition())).mMessage.isTimeOrLogMessage())
+ replay(((AbstractMessage) mAdapter.getItem(viewHolder.getAdapterPosition())).mMessage);
+
+ isRepley = false;
+ //awesome code to run when user drops card and completes reorder
+ }
+
+ @Override
+ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+ //awesome code when swiping right to remove recycler card and delete SQLite data
+
+ Log.i("#peyman", "swipe triggered");
+ }
+
+ @Override
+ public void onChildDraw(Canvas c,
+ RecyclerView recyclerView,
+ RecyclerView.ViewHolder viewHolder,
+ float dX, float dY,
+ int actionState, boolean isCurrentlyActive) {
+
+ if (actionState == ACTION_STATE_SWIPE) {
+
+ setTouchListener(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+
+ }
+ super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+
+
+ }
+
+ @Override
+ public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
+ return super.getSwipeThreshold(viewHolder);
+ }
+
+ @Override
+ public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ if (!((AbstractMessage) mAdapter.getItem(viewHolder.getAdapterPosition())).mMessage.isTimeOrLogMessage()) {
+ return makeMovementFlags(0, ItemTouchHelper.LEFT);
+ } else {
+
+ return makeMovementFlags(0, 0);
+ }
+ }
+
+ @Override
+ public int convertToAbsoluteDirection(int flags, int layoutDirection) {
+ if (swipeBack) {
+ swipeBack = false;
+ return 0;
+ }
+ return super.convertToAbsoluteDirection(flags, layoutDirection);
+ }
+
+ @Override
+ public boolean isItemViewSwipeEnabled() {
+ return true;
+ }
+ };
+ ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
+ itemTouchHelper.attachToRecyclerView(recyclerView);
+ }
/**
* load message , use handler for load async
*/
- if (mAdapter.getItemCount() > 0) {
- txtEmptyMessages.setVisibility(View.GONE);
- } else {
- txtEmptyMessages.setVisibility(View.VISIBLE);
- }
+ visibilityTextEmptyMessages();
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
- if (mAdapter.getItemCount() > 0) {
- txtEmptyMessages.setVisibility(View.GONE);
- } else {
- txtEmptyMessages.setVisibility(View.VISIBLE);
- }
+ visibilityTextEmptyMessages();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
super.onItemRangeRemoved(positionStart, itemCount);
- if (mAdapter.getItemCount() > 0) {
- txtEmptyMessages.setVisibility(View.GONE);
- } else {
- txtEmptyMessages.setVisibility(View.VISIBLE);
- }
+ visibilityTextEmptyMessages();
}
});
@@ -2669,63 +2947,53 @@ public void onClick(View v) {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
+ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
- int lastVisiblePosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
+ int visibleItemCount = ((LinearLayoutManager) recyclerView.getLayoutManager()).getChildCount();
+ int totalItemCount = ((LinearLayoutManager) recyclerView.getLayoutManager()).getItemCount();
+ int pastVisibleItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
- if (!firsInitScrollPosition) {
- lastPosition = lastVisiblePosition;
- firsInitScrollPosition = true;
- }
- int state = lastPosition - lastVisiblePosition;
- if (state > 0) { // up
+ if (pastVisibleItems + visibleItemCount >= totalItemCount && !isAnimateStart) {
+ isScrollEnd = false;
+ isAnimateStart = true;
+ llScrollNavigate.animate()
+ .alpha(0.0f)
+ .translationY(llScrollNavigate.getHeight() / 2)
+ .setDuration(200)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ isAnimateStart = false;
+ llScrollNavigate.setVisibility(View.GONE);
+ }
+ });
+
+ } else if (!isScrollEnd && !isAnimateStart) {
+ isScrollEnd = true;
+ isAnimateStart = true;
+ llScrollNavigate.setVisibility(View.VISIBLE);
+ llScrollNavigate.animate()
+ .alpha(1.0f)
+ .translationY(0)
+ .setDuration(200)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ isAnimateStart = false;
+ }
+ });
+ txtNewUnreadMessage.setText(countNewMessage + "");
if (countNewMessage == 0) {
- llScrollNavigate.setVisibility(View.GONE);
+ txtNewUnreadMessage.setVisibility(View.GONE);
} else {
- llScrollNavigate.setVisibility(View.VISIBLE);
-
- txtNewUnreadMessage.setText(countNewMessage + "");
txtNewUnreadMessage.setVisibility(View.VISIBLE);
}
- lastPosition = lastVisiblePosition;
- } else if (state < 0) { //down
-
- if (mAdapter.getItemCount() - lastVisiblePosition > 10) {
- /**
- * show llScrollNavigate if timeout from latest click
- */
- if (HelperTimeOut.timeoutChecking(0, latestButtonClickTime, (int) (2 * DateUtils.SECOND_IN_MILLIS))) {
- llScrollNavigate.setVisibility(View.VISIBLE);
- }
- if (countNewMessage > 0) {
- txtNewUnreadMessage.setText(countNewMessage + "");
- txtNewUnreadMessage.setVisibility(View.VISIBLE);
- } else {
- txtNewUnreadMessage.setVisibility(View.GONE);
- }
- } else {
- /**
- * if addToView is true means that
- */
- if (addToView) {
-
- /**
- * if countNewMessage is bigger than zero in onItemShowingMessageId
- * callback txtNewUnreadMessage visibility will be managed
- */
- if (countNewMessage == 0) {
- if (mAdapter.getItemCount() - lastVisiblePosition < 10) {
- llScrollNavigate.setVisibility(View.GONE);
- }
- }
- }
- }
-
- lastPosition = lastVisiblePosition;
}
}
});
@@ -3003,49 +3271,10 @@ public void afterTextChanged(Editable editable) {
if (ll_attach_text.getVisibility() == View.GONE && hasForward == false) {
if (edtChat.getText().length() > 0) {
- layoutAttachBottom.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- layoutAttachBottom.setVisibility(View.GONE);
- }
- }).start();
- imvSendButton.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.VISIBLE);
- }
- });
- }
- }).start();
+ sendButtonVisibility(true);
} else {
if (!isEditMessage) {
- layoutAttachBottom.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
-
- layoutAttachBottom.setVisibility(View.VISIBLE);
- }
- }).start();
- imvSendButton.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.GONE);
- }
- });
- }
- }).start();
+ sendButtonVisibility(false);
} else {
imvSendButton.setText(G.fragmentActivity.getResources().getString(R.string.md_close_button));
}
@@ -3057,6 +3286,69 @@ public void run() {
//realm.close();
}
+ private void setTouchListener(Canvas c,
+ RecyclerView recyclerView,
+ RecyclerView.ViewHolder viewHolder,
+ float dX, float dY,
+ int actionState, boolean isCurrentlyActive) {
+
+
+ if (dX < -150 && !isRepley) {
+ Log.i("#peyman", "swipe triggered");
+ isRepley = true;
+
+ Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ v.vibrate(VibrationEffect.createOneShot(50, VibrationEffect.PARCELABLE_WRITE_RETURN_VALUE));
+ } else {
+ //deprecated in API 26
+ v.vibrate(50);
+ }
+
+ // replay(message);
+ /* if (!goToPositionWithAnimation(replyMessage.getMessageId(), 1000)) {
+ goToPositionWithAnimation(replyMessage.getMessageId() * (-1), 1000);
+ }*/
+
+ }
+
+ /* icon.setBounds(viewHolder.itemView.getRight() - 0, 0, viewHolder.itemView.getRight() - 0, 0 + icon.getIntrinsicHeight());
+ icon.draw(c);*/
+
+
+ View itemView = viewHolder.itemView;
+
+
+ /* DisplayMetrics displayMetrics = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+
+ Drawable drawable = ContextCompat.getDrawable(G.fragmentActivity, R.mipmap.ic_launcher_round);
+ Bitmap icon = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ // Canvas canvas = new Canvas(icon);
+ drawable.setBounds(displayMetrics.widthPixels - 109, itemView.getTop() + 9, itemView.getRight() - 22, itemView.getBottom() - 9);
+ drawable.draw(c);*/
+
+
+ recyclerView.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+
+ swipeBack = event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP;
+ return false;
+ }
+ });
+
+ }
+
+ private void visibilityTextEmptyMessages() {
+ if (mAdapter.getItemCount() > 0) {
+ txtEmptyMessages.setVisibility(View.GONE);
+ } else {
+ txtEmptyMessages.setVisibility(View.VISIBLE);
+ }
+ }
+
private void dialogReport(final boolean isMessage, final long messageId) {
final MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
@@ -3466,6 +3758,60 @@ public void onMessageReceive(final long roomId, String message, ProtoGlobal.Room
return;
}
+ if (isBot) {
+
+ try {
+
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
+ RealmRoomMessage rm = null;
+ boolean backToMenu = true;
+
+ RealmResults result = getRealmChat().where(RealmRoomMessage.class).
+ equalTo(RealmRoomMessageFields.ROOM_ID, mRoomId).equalTo(RealmRoomMessageFields.AUTHOR_HASH, G.authorHash).findAll();
+ if (result.size() > 0) {
+ rm = result.last();
+ if (rm.getMessage() != null) {
+ if (rm.getMessage().toLowerCase().equals("/start") || rm.getMessage().equals("/back")) {
+ backToMenu = false;
+ }
+ }
+ } else {
+ backToMenu = false;
+ }
+
+ if (getActivity() != null) {
+ botInit.updateCommandList(false, message, getActivity(), backToMenu);
+ }
+ }
+ });
+
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+
+ try {
+ if (isShowStartButton) {
+ if (rootView != null) {
+ rootView.post(new Runnable() {
+ @Override
+ public void run() {
+ rootView.findViewById(R.id.chl_ll_channel_footer).setVisibility(View.GONE);
+ rootView.findViewById(R.id.layout_attach_file).setVisibility(View.VISIBLE);
+ }
+ });
+ }
+ isShowStartButton = false;
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+
+ }
+
G.handler.postDelayed(new Runnable() {
@Override
public void run() {
@@ -3821,6 +4167,7 @@ public boolean getShowVoteChannel() {
@Override
public void onContainerClick(View view, final StructMessageInfo message, int pos) {
+
if (message == null) {
return;
}
@@ -3953,12 +4300,14 @@ public void onContainerClick(View view, final StructMessageInfo message, int pos
txtItemShare.setText(R.string.share_item_dialog);
txtItemForward.setText(R.string.forward_item_dialog);
txtItemDelete.setText(R.string.delete_item_dialog);
+ txtItemEdit.setText(R.string.edit_item_dialog);
rootReplay.setVisibility(View.VISIBLE);
rootShare.setVisibility(View.VISIBLE);
rootForward.setVisibility(View.VISIBLE);
rootDelete.setVisibility(View.VISIBLE);
rootSaveToDownload.setVisibility(View.VISIBLE);
+ rootEdit.setVisibility(View.VISIBLE);
//itemsRes = R.array.fileMessageDialogItems;
break;
@@ -4190,17 +4539,19 @@ public void onClick(View v) {
dialog.dismiss();
// edit message
// put message text to EditText
+ messageEdit = "";
if (message.messageText != null && !message.messageText.isEmpty()) {
edtChat.setText(message.messageText);
edtChat.setSelection(0, edtChat.getText().length());
// put message object to edtChat's tag to obtain it later and
// found is user trying to edit a message
-
- imvSendButton.setText(G.fragmentActivity.getResources().getString(R.string.md_close_button));
- isEditMessage = true;
messageEdit = message.messageText;
- edtChat.setTag(message);
}
+ edtChat.setTag(message);
+ isEditMessage = true;
+ imvSendButton.setText(G.fragmentActivity.getResources().getString(R.string.md_close_button));
+ sendButtonVisibility(true);
+
}
});
rootSaveToDownload.setOnClickListener(new View.OnClickListener() {
@@ -4253,7 +4604,7 @@ public void onClick(View v) {
final String _path = AndroidUtils.getFilePathWithCashId(cacheId, name, _messageType);
if (fileToken != null && fileToken.length() > 0 && size > 0) {
- HelperDownloadFile.getInstance().startDownload(message.messageType,message.messageID, fileToken, fileUrl, cacheId, name, size, selector, _path, 0, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(message.messageType, message.messageID, fileToken, fileUrl, cacheId, name, size, selector, _path, 0, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(String path, int progress) {
@@ -4306,6 +4657,8 @@ public void onClick(View v) {
dialogReport(true, messageId);
}
});
+
+
}
private void deleteMassage(Realm realm, final StructMessageInfo message, final ArrayList list, final ArrayList bothDeleteMessageId, final ProtoGlobal.Room.Type chatType) {
@@ -4378,17 +4731,10 @@ public void run() {
@Override
public void onReplyClick(RealmRoomMessage replyMessage) {
- long replyMessageId = replyMessage.getMessageId();
- /**
- * when i add message to RealmRoomMessage(putOrUpdate) set (replyMessageId * (-1))
- * so i need to (replyMessageId * (-1)) again for use this messageId
- */
- int position = mAdapter.findPositionByMessageId((replyMessageId * (-1)));
- if (position == -1) {
- position = mAdapter.findPositionByMessageId(replyMessageId);
+ if (!goToPositionWithAnimation(replyMessage.getMessageId(), 1000)) {
+ goToPositionWithAnimation(replyMessage.getMessageId() * (-1), 1000);
}
- recyclerView.scrollToPosition(position);
}
@Override
@@ -4422,12 +4768,14 @@ public void onSetAction(final long roomId, final long userIdR, final ProtoGlobal
G.handler.post(new Runnable() {
@Override
public void run() {
- if (action != null) {
+ if (action != null && !isBot) {
ViewMaker.setLayoutDirection(viewGroupLastSeen, View.LAYOUT_DIRECTION_LOCALE);
txtLastSeen.setText(action);
} else if (chatType == CHAT) {
if (isCloudRoom) {
txtLastSeen.setText(G.fragmentActivity.getResources().getString(R.string.chat_with_yourself));
+ } else if (isBot) {
+ txtLastSeen.setText(G.fragmentActivity.getResources().getString(R.string.bot));
} else {
if (userStatus != null) {
if (userStatus.equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
@@ -4583,7 +4931,8 @@ public void run() {
File f = new File(backgroundPath);
if (f.exists()) {
Drawable d = Drawable.createFromPath(f.getAbsolutePath());
- imgBackGround.setImageDrawable(d);
+ //imgBackGround.setImageDrawable(d);
+ imgBackGround.setBackgroundColor(Color.parseColor(backgroundPath));
}
}
}
@@ -4777,6 +5126,8 @@ public void run() {
// //txtLastSeen.setTextDirection(View.TEXT_DIRECTION_LTR);
//}
ViewMaker.setLayoutDirection(viewGroupLastSeen, View.LAYOUT_DIRECTION_LTR);
+ } else if (isBot) {
+ txtLastSeen.setText(G.fragmentActivity.getResources().getString(R.string.bot));
} else {
if (status != null && txtLastSeen != null) {
if (status.equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
@@ -5302,11 +5653,12 @@ public void onEmojiBackspaceClick(View v) {
public void onEmojiPopupShown() {
changeEmojiButtonImageResource(R.string.md_black_keyboard_with_white_keys);
isEmojiSHow = true;
+ if (botInit != null) botInit.close();
}
}).setOnSoftKeyboardOpenListener(new OnSoftKeyboardOpenListener() {
@Override
public void onKeyboardOpen(final int keyBoardHeight) {
-
+ if (botInit != null) botInit.close();
}
}).setOnEmojiPopupDismissListener(new OnEmojiPopupDismissListener() {
@Override
@@ -5428,28 +5780,33 @@ public void run() {
// set maxLength when layout attachment is visible
edtChat.setFilters(new InputFilter[]{new InputFilter.LengthFilter(Config.MAX_TEXT_ATTACHMENT_LENGTH)});
- layoutAttachBottom.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- layoutAttachBottom.setVisibility(View.GONE);
- }
- }).start();
- imvSendButton.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
+ sendButtonVisibility(true);
+ }
+ }, 100);
+ }
+
+
+ private void sendButtonVisibility(boolean visibility) {
+ layoutAttachBottom.animate().alpha(visibility ? 0F : 1F).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ layoutAttachBottom.setVisibility(visibility || isBot ? View.GONE : View.VISIBLE);
+ }
+ }).start();
+ imvSendButton.animate().alpha(visibility ? 1F : 0F).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ G.handler.post(new Runnable() {
@Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.VISIBLE);
- }
- });
+ public void run() {
+ imvSendButton.clearAnimation();
+ imvSendButton.setVisibility(visibility ? View.VISIBLE : View.GONE);
}
- }).start();
+ });
}
- }, 100);
+ }).start();
}
/**
@@ -5530,7 +5887,7 @@ private void clearDraftRequest() {
*/
- private void insertShearedData(final ArrayList pathList) {
+ private void insertShearedData() {
/**
* run this method with delay , because client get local message with delay
* for show messages with async changeState and before run getLocalMessage this shared
@@ -5543,60 +5900,21 @@ public void run() {
if (HelperGetDataFromOtherApp.hasSharedData) {
HelperGetDataFromOtherApp.hasSharedData = false;
- if (messageType == HelperGetDataFromOtherApp.FileType.message) {
- String message = HelperGetDataFromOtherApp.message;
- edtChat.setText(message);
- imvSendButton.performClick();
- } else if (messageType == HelperGetDataFromOtherApp.FileType.image) {
-
- for (int i = 0; i < pathList.size(); i++) {
- sendMessage(AttachFile.request_code_TAKE_PICTURE, pathList.get(i));
- }
- } else if (messageType == HelperGetDataFromOtherApp.FileType.video) {
- if (pathList.size() == 1 && (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && (sharedPreferences.getInt(SHP_SETTING.KEY_COMPRESS, 1) == 1))) {
-// final String savePathVideoCompress = Environment.getExternalStorageDirectory() + File.separator + com.lalongooo.videocompressor.Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + com.lalongooo.videocompressor.Config.VIDEO_COMPRESSOR_COMPRESSED_VIDEOS_DIR + "VIDEO_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()) + ".mp4";
- final String savePathVideoCompress = G.DIR_TEMP + "/VIDEO_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()) + ".mp4";
- mainVideoPath = pathList.get(0);
-
- if (mainVideoPath == null) {
- return;
- }
-
- G.handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- new VideoCompressor().execute(mainVideoPath, savePathVideoCompress);
- }
- }, 200);
- sendMessage(request_code_VIDEO_CAPTURED, savePathVideoCompress);
- } else {
- for (int i = 0; i < pathList.size(); i++) {
- compressedPath.put(pathList.get(i), true);
- sendMessage(request_code_VIDEO_CAPTURED, pathList.get(i));
- }
- }
- } else if (messageType == HelperGetDataFromOtherApp.FileType.audio) {
-
- for (int i = 0; i < pathList.size(); i++) {
- sendMessage(AttachFile.request_code_pic_audi, pathList.get(i));
- }
- } else if (messageType == HelperGetDataFromOtherApp.FileType.file) {
+ for (HelperGetDataFromOtherApp.SharedData sharedData : HelperGetDataFromOtherApp.sharedList) {
- for (int i = 0; i < pathList.size(); i++) {
- HelperGetDataFromOtherApp.FileType fileType = messageType = HelperGetDataFromOtherApp.FileType.file;
- if (HelperGetDataFromOtherApp.fileTypeArray.size() > 0) {
- fileType = HelperGetDataFromOtherApp.fileTypeArray.get(i);
- }
+ edtChat.setText(sharedData.message);
- if (fileType == HelperGetDataFromOtherApp.FileType.image) {
- sendMessage(AttachFile.request_code_TAKE_PICTURE, pathList.get(i));
- } else if (fileType == HelperGetDataFromOtherApp.FileType.video) {
- if (pathList.size() == 1 && (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && (sharedPreferences.getInt(SHP_SETTING.KEY_COMPRESS, 1) == 1))) {
- // final String savePathVideoCompress = Environment.getExternalStorageDirectory() + File.separator + com.lalongooo.videocompressor.Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + com.lalongooo.videocompressor.Config.VIDEO_COMPRESSOR_COMPRESSED_VIDEOS_DIR + "VIDEO_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format
- // (new Date()) + ".mp4";
+ switch (sharedData.fileType) {
+ case message:
+ imvSendButton.performClick();
+ break;
+ case video:
+ if (HelperGetDataFromOtherApp.sharedList.size() == 1 && (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && (sharedPreferences.getInt(SHP_SETTING.KEY_COMPRESS, 1) == 1))) {
final String savePathVideoCompress = G.DIR_TEMP + "/VIDEO_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()) + ".mp4";
- mainVideoPath = pathList.get(0);
-
+ mainVideoPath = sharedData.address;
+ if (mainVideoPath == null) {
+ return;
+ }
G.handler.postDelayed(new Runnable() {
@Override
public void run() {
@@ -5605,16 +5923,26 @@ public void run() {
}, 200);
sendMessage(request_code_VIDEO_CAPTURED, savePathVideoCompress);
} else {
- compressedPath.put(pathList.get(i), true);
- sendMessage(request_code_VIDEO_CAPTURED, pathList.get(i));
+ compressedPath.put(sharedData.address, true);
+ sendMessage(request_code_VIDEO_CAPTURED, sharedData.address);
}
- } else if (fileType == HelperGetDataFromOtherApp.FileType.audio) {
- sendMessage(AttachFile.request_code_pic_audi, pathList.get(i));
- } else if (fileType == HelperGetDataFromOtherApp.FileType.file) {
- sendMessage(AttachFile.request_code_open_document, pathList.get(i));
- }
+ break;
+ case file:
+ sendMessage(AttachFile.request_code_open_document, sharedData.address);
+ break;
+ case audio:
+ sendMessage(AttachFile.request_code_pic_audi, sharedData.address);
+ break;
+ case image:
+ sendMessage(AttachFile.request_code_TAKE_PICTURE, sharedData.address);
+ break;
}
+
+ edtChat.setText("");
}
+
+ HelperGetDataFromOtherApp.sharedList.clear();
+
}
}
}, 300);
@@ -5625,6 +5953,7 @@ private void shearedDataToOtherProgram(StructMessageInfo messageInfo) {
if (messageInfo == null) return;
try {
+ isShareOk = true;
Intent intent = new Intent(Intent.ACTION_SEND);
String chooserDialogText = "";
@@ -5694,6 +6023,8 @@ private void shearedDataToOtherProgram(StructMessageInfo messageInfo) {
intent.putExtra(Intent.EXTRA_STREAM, uri);
chooserDialogText = G.fragmentActivity.getResources().getString(R.string.share_file);
} else {
+
+ isShareOk = false;
G.handler.post(new Runnable() {
@Override
public void run() {
@@ -5701,10 +6032,11 @@ public void run() {
}
});
}
-
break;
}
+ if (!isShareOk) return;
+
startActivity(Intent.createChooser(intent, chooserDialogText));
} catch (Exception e) {
e.printStackTrace();
@@ -6740,15 +7072,16 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
}).checkBoxPrompt(textCheckBox, false, null).show();
} else {
-
- new MaterialDialog.Builder(G.fragmentActivity).title(R.string.message).content(G.context.getResources().getString(R.string.st_desc_delete, count)).positiveText(R.string.ok).negativeText(R.string.cancel).onPositive(new MaterialDialog.SingleButtonCallback() {
- @Override
- public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
- bothDeleteMessageId = null;
- RealmRoomMessage.deleteSelectedMessages(getRealmChat(), mRoomId, list, bothDeleteMessageId, chatType);
- deleteSelectedMessageFromAdapter(list);
- }
- }).show();
+ if (!G.fragmentActivity.isFinishing()) {
+ new MaterialDialog.Builder(G.fragmentActivity).title(R.string.message).content(G.context.getResources().getString(R.string.st_desc_delete, count)).positiveText(R.string.ok).negativeText(R.string.cancel).onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ bothDeleteMessageId = null;
+ RealmRoomMessage.deleteSelectedMessages(getRealmChat(), mRoomId, list, bothDeleteMessageId, chatType);
+ deleteSelectedMessageFromAdapter(list);
+ }
+ }).show();
+ }
}
}
});
@@ -7151,6 +7484,10 @@ private void sendMessage(int requestCode, String filePath) {
StructMessageInfo messageInfo = null;
+ if (requestCode == AttachFile.requestOpenGalleryForVideoMultipleSelect && filePath.toLowerCase().endsWith(".gif")) {
+ requestCode = AttachFile.requestOpenGalleryForImageMultipleSelect;
+ }
+
switch (requestCode) {
case IntentRequests.REQ_CROP:
@@ -7564,51 +7901,12 @@ public void onClick(View v) {
if (edtChat.getText().length() == 0) {
- layoutAttachBottom.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- layoutAttachBottom.setVisibility(View.VISIBLE);
- }
- }).start();
- imvSendButton.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.GONE);
- }
- });
- }
- }).start();
+ sendButtonVisibility(false);
}
}
});
- layoutAttachBottom.animate().alpha(0F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- layoutAttachBottom.setVisibility(View.GONE);
- }
- }).start();
-
- imvSendButton.animate().alpha(1F).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- G.handler.post(new Runnable() {
- @Override
- public void run() {
- imvSendButton.clearAnimation();
- imvSendButton.setVisibility(View.VISIBLE);
- }
- });
- }
- }).start();
+ sendButtonVisibility(true);
int _count = mForwardMessages.size();
String str = _count > 1 ? G.fragmentActivity.getResources().getString(R.string.messages_selected) : G.fragmentActivity.getResources().getString(R.string.message_selected);
@@ -7778,12 +8076,6 @@ private void switchAddItem(ArrayList messageInfos, boolean ad
}
break;
case IMAGE:
- if (!addTop) {
- mAdapter.add(new ImageItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- } else {
- mAdapter.add(index, new ImageItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- }
- break;
case IMAGE_TEXT:
if (!addTop) {
mAdapter.add(new ImageWithTextItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
@@ -7792,12 +8084,6 @@ private void switchAddItem(ArrayList messageInfos, boolean ad
}
break;
case VIDEO:
- if (!addTop) {
- mAdapter.add(new VideoItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- } else {
- mAdapter.add(index, new VideoItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- }
- break;
case VIDEO_TEXT:
if (!addTop) {
mAdapter.add(new VideoWithTextItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
@@ -7843,12 +8129,6 @@ private void switchAddItem(ArrayList messageInfos, boolean ad
}
break;
case GIF:
- if (!addTop) {
- mAdapter.add(new GifItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- } else {
- mAdapter.add(index, new GifItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
- }
- break;
case GIF_TEXT:
if (!addTop) {
mAdapter.add(new GifWithTextItem(getRealmChat(), chatType, this).setMessage(messageInfo).withIdentifier(identifier));
@@ -8059,10 +8339,18 @@ private void getMessages() {
} else {
switchAddItem(messageInfos, false);
if (hasSavedState()) {
- int position = mAdapter.findPositionByMessageId(savedScrollMessageId);
- LinearLayoutManager linearLayout = (LinearLayoutManager) recyclerView.getLayoutManager();
- linearLayout.scrollToPositionWithOffset(position, firstVisiblePositionOffset);
- savedScrollMessageId = 0;
+
+ if (messageId != 0) {
+ if (goToPositionWithAnimation(savedScrollMessageId, 1000)) {
+ savedScrollMessageId = 0;
+ }
+ } else {
+ int position = mAdapter.findPositionByMessageId(savedScrollMessageId);
+ LinearLayoutManager linearLayout = (LinearLayoutManager) recyclerView.getLayoutManager();
+ linearLayout.scrollToPositionWithOffset(position, firstVisiblePositionOffset);
+ savedScrollMessageId = 0;
+ }
+
}
}
@@ -8100,6 +8388,10 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
};
recyclerView.addOnScrollListener(scrollListener);
+ if (unreadCount > 0)
+ recyclerView.scrollToPosition(0);
+
+
//realm.close();
}
@@ -8417,6 +8709,7 @@ private void unreadLayoutMessage() {
RealmRoomMessage unreadMessage = RealmRoomMessage.makeUnreadMessage(unreadMessageCount);
mAdapter.add(0, new UnreadMessage(getRealmChat(), FragmentChat.this).setMessage(StructMessageInfo.convert(getRealmChat(), unreadMessage)).withIdentifier(SUID.id().get()));
isShowLayoutUnreadMessage = true;
+
}
}
@@ -8605,7 +8898,17 @@ private void error(String error) {
@Override
public void onPinMessage() {
+
initPinedMessage();
+
+ }
+
+ @Override
+ public void onBotCommandText(String text) {
+ if (!isChatReadOnly) {
+ edtChat.setText(text);
+ imvSendButton.performClick();
+ }
}
/**
@@ -8926,4 +9229,25 @@ private void showPaymentDialog() {
}
+
+ public interface OnHandleDrBot {
+
+ void goToRoomBot(Favorite favorite);
+
+ void sendMessageBOt(Favorite favorite);
+
+ }
+
+/* private boolean isBot(long userId) {
+ Realm realm=Realm.getDefaultInstance();
+ RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, userId);
+ if (realmRegisteredInfo != null) {
+ if (realmRegisteredInfo.isBot()) {
+ return true;
+ } else
+ return false;
+ } else
+ return false;
+ }*/
+
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentChatBackground.java b/app/src/main/java/net/iGap/fragments/FragmentChatBackground.java
index 531daa4..917d262 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentChatBackground.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentChatBackground.java
@@ -10,6 +10,7 @@
package net.iGap.fragments;
+import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
@@ -23,15 +24,20 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.afollestad.materialdialogs.MaterialDialog;
import net.iGap.G;
import net.iGap.R;
import net.iGap.adapter.AdapterChatBackground;
+import net.iGap.adapter.AdapterSolidChatBackground;
import net.iGap.helper.ImageHelper;
import net.iGap.interfaces.OnGetWallpaper;
import net.iGap.libs.rippleeffect.RippleView;
import net.iGap.module.AndroidUtils;
import net.iGap.module.AttachFile;
+import net.iGap.module.DialogAnimation;
import net.iGap.module.SHP_SETTING;
import net.iGap.module.TimeUtils;
import net.iGap.proto.ProtoGlobal;
@@ -56,12 +62,17 @@ public class FragmentChatBackground extends BaseFragment {
private RippleView rippleBack;
private RippleView rippleSet;
private RippleView rippleSetDefault;
- private RecyclerView mRecyclerView;
+ private RecyclerView mRecyclerView, rcvSolidColor;
private ImageView imgFullImage;
private AdapterChatBackground adapterChatBackgroundSetting;
+ private AdapterSolidChatBackground adapterSolidChatbackground;
private ArrayList wList;
private Realm realmChatBackground;
private Fragment fragment;
+ private RippleView chB_ripple_menu_button;
+
+ ArrayList solidList = new ArrayList<>();
+
public static FragmentChatBackground newInstance() {
return new FragmentChatBackground();
@@ -89,6 +100,60 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
view.findViewById(R.id.stcb_backgroundToolbar).setBackgroundColor(Color.parseColor(G.appBarColor));
rippleBack = (RippleView) view.findViewById(R.id.stcb_ripple_back);
+
+ chB_ripple_menu_button = (RippleView) view.findViewById(R.id.chB_ripple_menu_button);
+
+ chB_ripple_menu_button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ final MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
+ View v = dialog.getCustomView();
+
+ DialogAnimation.animationUp(dialog);
+ dialog.show();
+
+ ViewGroup root1 = (ViewGroup) v.findViewById(R.id.dialog_root_item1_notification);
+ ViewGroup root2 = (ViewGroup) v.findViewById(R.id.dialog_root_item2_notification);
+
+ TextView txtSolidColors = (TextView) v.findViewById(R.id.dialog_text_item1_notification);
+ TextView txtWallpaper = (TextView) v.findViewById(R.id.dialog_text_item2_notification);
+
+ TextView iconSolidColor = (TextView) v.findViewById(R.id.dialog_icon_item1_notification);
+ iconSolidColor.setText(G.fragmentActivity.getResources().getString(R.string.md_solid_colors));
+
+
+
+ TextView iconWallpaper = (TextView) v.findViewById(R.id.dialog_icon_item2_notification);
+
+ iconWallpaper.setText(G.fragmentActivity.getResources().getString(R.string.md_wallpapers));
+
+ root1.setVisibility(View.VISIBLE);
+ root2.setVisibility(View.VISIBLE);
+
+ txtSolidColors.setText(getResources().getString(R.string.solid_colors));
+ txtWallpaper.setText(getResources().getString(R.string.wallpapers));
+
+ root1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ mRecyclerView.setVisibility(View.GONE);
+ rcvSolidColor.setVisibility(View.VISIBLE);
+ dialog.dismiss();
+ }
+ });
+
+ root2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mRecyclerView.setVisibility(View.VISIBLE);
+ rcvSolidColor.setVisibility(View.GONE);
+ dialog.dismiss();
+ }
+ });
+ }
+ });
+
rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
@@ -142,23 +207,51 @@ public void onComplete(RippleView rippleView) {
fillList(true);
mRecyclerView = (RecyclerView) view.findViewById(R.id.rcvContent);
+ rcvSolidColor = (RecyclerView) view.findViewById(R.id.rcvSolidColor);
+
+
adapterChatBackgroundSetting = new AdapterChatBackground(fragment, wList, new OnImageClick() {
+ @SuppressLint("ResourceType")
@Override
public void onClick(String imagePath) {
G.imageLoader.displayImage(AndroidUtils.suitablePath(imagePath), imgFullImage);
+
+ savePath = imagePath;
+
+ rippleSet.setVisibility(View.VISIBLE);
+ rippleSetDefault.setVisibility(View.GONE);
+ }
+ });
+
+ adapterSolidChatbackground = new AdapterSolidChatBackground(fragment, solidList, new OnImageClick() {
+ @SuppressLint("ResourceType")
+ @Override
+ public void onClick(String imagePath) {
+
+ // G.imageLoader.displayImage(AndroidUtils.suitablePath(imagePath), imgFullImage);
+ imgFullImage.setImageDrawable(null);
+ imgFullImage.setBackgroundColor(Color.parseColor(imagePath));
+
savePath = imagePath;
rippleSet.setVisibility(View.VISIBLE);
rippleSetDefault.setVisibility(View.GONE);
}
});
+
+
mRecyclerView.setAdapter(adapterChatBackgroundSetting);
mRecyclerView.setLayoutManager(new LinearLayoutManager(G.fragmentActivity, LinearLayoutManager.HORIZONTAL, false));
mRecyclerView.clearAnimation();
+ rcvSolidColor.setAdapter(adapterSolidChatbackground);
+ rcvSolidColor.setLayoutManager(new LinearLayoutManager(G.fragmentActivity, LinearLayoutManager.HORIZONTAL, false));
+ rcvSolidColor.clearAnimation();
+
+
}
@Override
@@ -229,6 +322,7 @@ public void onGetWallpaperList(final List list) {
public void run() {
fillList(false);
adapterChatBackgroundSetting.notifyDataSetChanged();
+ adapterSolidChatbackground.notifyDataSetChanged();
}
});
}
@@ -243,6 +337,7 @@ private void fillList(boolean getInfoFromServer) {
wList.clear();
+
//add item 0 add new background from local
StructWallpaper sw = new StructWallpaper();
sw.setWallpaperType(WallpaperType.addNew);
@@ -261,6 +356,7 @@ private void fillList(boolean getInfoFromServer) {
_swl.setWallpaperType(WallpaperType.local);
_swl.setPath(localPath);
wList.add(_swl);
+
}
}
}
@@ -271,6 +367,7 @@ private void fillList(boolean getInfoFromServer) {
_swp.setWallpaperType(WallpaperType.proto);
_swp.setProtoWallpaper(wallpaper);
wList.add(_swp);
+ solidList.add(_swp.getProtoWallpaper().getColor());
}
}
@@ -309,6 +406,7 @@ public class StructWallpaper {
private String path;
private RealmWallpaperProto protoWallpaper;
+
public WallpaperType getWallpaperType() {
return wallpaperType;
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentContactsProfile.java b/app/src/main/java/net/iGap/fragments/FragmentContactsProfile.java
index 50bf0f2..be3b499 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentContactsProfile.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentContactsProfile.java
@@ -1,12 +1,12 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.fragments;
@@ -466,105 +466,109 @@ public void onDestroy() {
*/
private void showPopupPhoneNumber(View v, String number) {
- boolean isExist = false;
- Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
- String[] mPhoneNumberProjection = {ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup.DISPLAY_NAME};
- Cursor cur = context.getContentResolver().query(lookupUri, mPhoneNumberProjection, null, null, null);
try {
- if (cur != null) {
- isExist = cur.moveToFirst();
+ boolean isExist = false;
+ Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
+ String[] mPhoneNumberProjection = {ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup.DISPLAY_NAME};
+ Cursor cur = context.getContentResolver().query(lookupUri, mPhoneNumberProjection, null, null, null);
+ try {
+ if (cur != null) {
+ isExist = cur.moveToFirst();
+ }
+ } finally {
+ if (cur != null) cur.close();
}
- } finally {
- if (cur != null) cur.close();
- }
- if (isExist) {
- new MaterialDialog.Builder(G.fragmentActivity).title(R.string.phone_number).items(R.array.phone_number2).itemsCallback(new MaterialDialog.ListCallback() {
- @Override
- public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
- switch (which) {
- case 0:
- String call = "+" + Long.parseLong(fragmentContactsProfileViewModel.phone.get());
- try {
- Intent callIntent = new Intent(Intent.ACTION_DIAL);
- callIntent.setData(Uri.parse("tel:" + Uri.encode(call.trim())));
- callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(callIntent);
- } catch (Exception ex) {
- ex.getStackTrace();
- }
- break;
- case 1:
- String copy;
- copy = fragmentContactsProfileViewModel.phone.get();
- ClipboardManager clipboard = (ClipboardManager) G.fragmentActivity.getSystemService(CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText("PHONE_NUMBER", copy);
- clipboard.setPrimaryClip(clip);
- break;
+ if (isExist) {
+ new MaterialDialog.Builder(G.fragmentActivity).title(R.string.phone_number).items(R.array.phone_number2).itemsCallback(new MaterialDialog.ListCallback() {
+ @Override
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+ switch (which) {
+ case 0:
+ String call = "+" + Long.parseLong(fragmentContactsProfileViewModel.phone.get());
+ try {
+ Intent callIntent = new Intent(Intent.ACTION_DIAL);
+ callIntent.setData(Uri.parse("tel:" + Uri.encode(call.trim())));
+ callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(callIntent);
+ } catch (Exception ex) {
+ ex.getStackTrace();
+ }
+ break;
+ case 1:
+ String copy;
+ copy = fragmentContactsProfileViewModel.phone.get();
+ ClipboardManager clipboard = (ClipboardManager) G.fragmentActivity.getSystemService(CLIPBOARD_SERVICE);
+ ClipData clip = ClipData.newPlainText("PHONE_NUMBER", copy);
+ clipboard.setPrimaryClip(clip);
+ break;
+ }
}
- }
- }).show();
- } else {
- new MaterialDialog.Builder(G.fragmentActivity).title(R.string.phone_number).items(R.array.phone_number).itemsCallback(new MaterialDialog.ListCallback() {
- @Override
- public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
- switch (which) {
- case 0:
+ }).show();
+ } else {
+ new MaterialDialog.Builder(G.fragmentActivity).title(R.string.phone_number).items(R.array.phone_number).itemsCallback(new MaterialDialog.ListCallback() {
+ @Override
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+ switch (which) {
+ case 0:
- String name = fragmentContactsProfileViewModel.contactName.get();
- String phone = "+" + fragmentContactsProfileViewModel.phone.get();
+ String name = fragmentContactsProfileViewModel.contactName.get();
+ String phone = "+" + fragmentContactsProfileViewModel.phone.get();
- ArrayList ops = new ArrayList();
+ ArrayList ops = new ArrayList();
- ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
+ ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
- //------------------------------------------------------ Names
+ //------------------------------------------------------ Names
- ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name).build());
+ ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name).build());
- //------------------------------------------------------ Mobile Number
+ //------------------------------------------------------ Mobile Number
- ops.add(ContentProviderOperation.
- newInsert(ContactsContract.Data.CONTENT_URI)
- .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
- .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
- .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
- .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
- .build());
+ ops.add(ContentProviderOperation.
+ newInsert(ContactsContract.Data.CONTENT_URI)
+ .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+ .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
+ .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
+ .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
+ .build());
- try {
- G.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
- addContactToServer();
- Toast.makeText(G.context, R.string.save_ok, Toast.LENGTH_SHORT).show();
- } catch (Exception e) {
- e.printStackTrace();
- Toast.makeText(G.context, G.fragmentActivity.getResources().getString(R.string.exception) + e.getMessage(), Toast.LENGTH_SHORT).show();
- }
+ try {
+ G.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
+ addContactToServer();
+ Toast.makeText(G.context, R.string.save_ok, Toast.LENGTH_SHORT).show();
+ } catch (Exception e) {
+ e.printStackTrace();
+ Toast.makeText(G.context, G.fragmentActivity.getResources().getString(R.string.exception) + e.getMessage(), Toast.LENGTH_SHORT).show();
+ }
- break;
- case 1:
+ break;
+ case 1:
- String call = "+" + Long.parseLong(fragmentContactsProfileViewModel.phone.get());
- try {
- Intent callIntent = new Intent(Intent.ACTION_DIAL);
- callIntent.setData(Uri.parse("tel:" + Uri.encode(call.trim())));
- callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(callIntent);
- } catch (Exception ex) {
+ String call = "+" + Long.parseLong(fragmentContactsProfileViewModel.phone.get());
+ try {
+ Intent callIntent = new Intent(Intent.ACTION_DIAL);
+ callIntent.setData(Uri.parse("tel:" + Uri.encode(call.trim())));
+ callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(callIntent);
+ } catch (Exception ex) {
- ex.getStackTrace();
- }
- break;
- case 2:
+ ex.getStackTrace();
+ }
+ break;
+ case 2:
- ClipboardManager clipboard = (ClipboardManager) G.fragmentActivity.getSystemService(CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText("PHONE_NUMBER", fragmentContactsProfileViewModel.phone.get());
- clipboard.setPrimaryClip(clip);
+ ClipboardManager clipboard = (ClipboardManager) G.fragmentActivity.getSystemService(CLIPBOARD_SERVICE);
+ ClipData clip = ClipData.newPlainText("PHONE_NUMBER", fragmentContactsProfileViewModel.phone.get());
+ clipboard.setPrimaryClip(clip);
- break;
+ break;
+ }
}
- }
- }).show();
+ }).show();
+ }
+ } catch (SecurityException e) {
+ e.printStackTrace();
}
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentDeleteAccount.java b/app/src/main/java/net/iGap/fragments/FragmentDeleteAccount.java
index df77e40..2a895ad 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentDeleteAccount.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentDeleteAccount.java
@@ -197,7 +197,6 @@ public void onClick(View view) {
if (phone != null) txtPhoneNumber.setText("" + phone);
txtSet = (RippleView) view.findViewById(R.id.stda_ripple_set);
- txtSet.setEnabled(false);
txtSet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -270,7 +269,6 @@ public void run() {
});
edtDeleteAccount = (EditTextAdjustPan) view.findViewById(R.id.stda_edt_dleteAccount);
- edtDeleteAccount.setEnabled(false);
final View viewLineBottom = view.findViewById(R.id.stda_line_below_editText);
txtSet.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@@ -308,8 +306,7 @@ public void onTick(long millisUntilFinished) {
@Override
public void onFinish() {
- edtDeleteAccount.setEnabled(true);
- txtSet.setEnabled(true);
+
ltTime.setVisibility(View.GONE);
}
};
@@ -323,8 +320,7 @@ private void setCode() {
countDownTimer.cancel();
String verificationCode = HelperString.regexExtractValue(smsMessage, regex);
if (verificationCode.length() > 0) {
- edtDeleteAccount.setEnabled(true);
- txtSet.setEnabled(true);
+
edtDeleteAccount.setText("" + verificationCode);
}
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentEditImage.java b/app/src/main/java/net/iGap/fragments/FragmentEditImage.java
index 1633956..cb8ec09 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentEditImage.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentEditImage.java
@@ -165,13 +165,6 @@ public void onViewCreated(final View view, @Nullable Bundle savedInstanceState)
*/
- setViewPager();
- setCheckBoxItem();
- messageBox(view);
-
-
-// G.imageLoader.displayImage(suitablePath(path), imgEditImage);
-
updateImage = new UpdateImage() {
@Override
public void result(String pathImageFilter) {
@@ -183,12 +176,15 @@ public void run() {
mAdapter.notifyDataSetChanged();
}
});
-
-
-// G.imageLoader.displayImage(suitablePath(path), imgEditImage);
}
};
+ setViewPager();
+ setCheckBoxItem();
+ messageBox(view);
+
+
+// G.imageLoader.displayImage(suitablePath(path), imgEditImage);
view.findViewById(R.id.pu_ripple_back).setOnClickListener(new View.OnClickListener() {
@Override
@@ -454,11 +450,6 @@ public interface UpdateImage {
void result(String path);
}
-
-
-
-
-
private void setUpEmojiPopup(View view) {
switch (G.themeColor) {
case Theme.BLUE_GREY_COMPLETE:
@@ -660,6 +651,9 @@ private void initView(View view) {
private void goToCropPage(View v) {
AndroidUtils.closeKeyboard(v);
+ if (itemGalleryList.size() == 0){
+ return;
+ }
String newPath = "file://" + itemGalleryList.get(viewPager.getCurrentItem()).path;
String fileNameWithOutExt = newPath.substring(newPath.lastIndexOf("/"));
String extension = newPath.substring(newPath.lastIndexOf("."));
diff --git a/app/src/main/java/net/iGap/fragments/FragmentIgapSearch.java b/app/src/main/java/net/iGap/fragments/FragmentIgapSearch.java
index ffc38fa..2957e93 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentIgapSearch.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentIgapSearch.java
@@ -22,7 +22,6 @@
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -52,8 +51,6 @@
import net.iGap.realm.RealmRoomFields;
import net.iGap.request.RequestClientSearchUsername;
-import org.paygear.wallet.WalletActivity;
-
import java.util.ArrayList;
import java.util.List;
diff --git a/app/src/main/java/net/iGap/fragments/FragmentMain.java b/app/src/main/java/net/iGap/fragments/FragmentMain.java
index 4854033..584d21f 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentMain.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentMain.java
@@ -5,6 +5,9 @@
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.ColorRes;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
@@ -13,6 +16,7 @@
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
+import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,6 +26,10 @@
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.afollestad.materialdialogs.DialogAction;
+import com.afollestad.materialdialogs.GravityEnum;
+import com.afollestad.materialdialogs.MaterialDialog;
+
import net.iGap.Config;
import net.iGap.G;
import net.iGap.R;
@@ -50,8 +58,10 @@
import net.iGap.interfaces.OnRemoveFragment;
import net.iGap.interfaces.OnSelectMenu;
import net.iGap.interfaces.OnSetActionInRoom;
+import net.iGap.interfaces.OnVersionCallBack;
import net.iGap.module.AndroidUtils;
import net.iGap.module.AppUtils;
+import net.iGap.module.BotInit;
import net.iGap.module.CircleImageView;
import net.iGap.module.EmojiTextViewE;
import net.iGap.module.MaterialDesignTextView;
@@ -77,6 +87,7 @@
import net.iGap.request.RequestClientPinRoom;
import net.iGap.request.RequestGroupDelete;
import net.iGap.request.RequestGroupLeft;
+import net.iGap.request.RequestUserContactsUnblock;
import java.util.HashMap;
import java.util.List;
@@ -99,7 +110,7 @@
import static net.iGap.realm.RealmRoom.putChatToDatabase;
-public class FragmentMain extends BaseFragment implements OnComplete, OnSetActionInRoom, OnSelectMenu, OnRemoveFragment, OnDraftMessage, OnChatUpdateStatusResponse, OnChatDeleteInRoomList, OnGroupDeleteInRoomList, OnChannelDeleteInRoomList, OnChatSendMessageResponse, OnClearUnread, OnClientGetRoomResponseRoomList, OnMute, OnClearRoomHistory, OnDateChanged {
+public class FragmentMain extends BaseFragment implements OnVersionCallBack, OnComplete, OnSetActionInRoom, OnSelectMenu, OnRemoveFragment, OnDraftMessage, OnChatUpdateStatusResponse, OnChatDeleteInRoomList, OnGroupDeleteInRoomList, OnChannelDeleteInRoomList, OnChatSendMessageResponse, OnClearUnread, OnClientGetRoomResponseRoomList, OnMute, OnClearRoomHistory, OnDateChanged {
public static final String STR_MAIN_TYPE = "STR_MAIN_TYPE";
public static boolean isMenuButtonAddShown = false;
@@ -117,6 +128,11 @@ public class FragmentMain extends BaseFragment implements OnComplete, OnSetActio
private long tagId;
private Realm realmFragmentMain;
private RecyclerView.OnScrollListener onScrollListener;
+ private String tabId;
+ private View mView = null;
+ private String switcher;
+ private int channelSwitcher, allSwitcher, groupSwitcher, chatSwitcher, callSwitcher = 0;
+ private ProgressBar pbLoading;
public static FragmentMain newInstance(MainType mainType) {
Bundle bundle = new Bundle();
@@ -126,6 +142,40 @@ public static FragmentMain newInstance(MainType mainType) {
return fragment;
}
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+
+ if (isVisibleToUser) {
+ switcher = String.valueOf(this.toString().charAt(this.toString().lastIndexOf(":") + 1));
+ // if (HelperCalander.isPersianUnicode) {
+
+ if (switcher.equals("1") && channelSwitcher == 0) {
+ channelSwitcher = 1;
+ initRecycleView();
+ initListener();
+ } else if (switcher.equals("2") && groupSwitcher == 0) {
+ groupSwitcher = 1;
+ initRecycleView();
+ initListener();
+ } else if (switcher.equals("3") && chatSwitcher == 0) {
+ chatSwitcher = 1;
+ initRecycleView();
+ initListener();
+ } else if (switcher.equals("4") && allSwitcher == 0 && mView != null) {
+ allSwitcher = 1;
+ initRecycleView();
+ initListener();
+ } else if (switcher.equals("0") && allSwitcher == 0 && mView != null) {
+ allSwitcher = 1;
+ initRecycleView();
+ initListener();
+ }
+
+ }
+
+ }
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -136,7 +186,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+ G.onVersionCallBack = this;
realmFragmentMain = Realm.getDefaultInstance();
}
@@ -144,6 +194,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//G.chatUpdateStatusUtil.setOnChatUpdateStatusResponse(this);
+ this.mView = view;
mComplete = this;
tagId = System.currentTimeMillis();
@@ -153,57 +204,78 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
swipeRefreshLayout.setRefreshing(false);
swipeRefreshLayout.setEnabled(false);
viewById = view.findViewById(R.id.empty_icon);
+ pbLoading = view.findViewById(R.id.pbLoading);
+ // pbLoading.setVisibility(View.VISIBLE);
+
+ switcher = String.valueOf(this.toString().charAt(this.toString().lastIndexOf(":") + 1));
+ if (switcher.equals("4") && allSwitcher == 0 && mView != null) {
+ allSwitcher = 1;
+ initRecycleView();
+ initListener();
+ pbLoading.setVisibility(View.GONE);
+ } else if (switcher.equals("0") && allSwitcher == 0 && mView != null) {
+ allSwitcher = 1;
+ initRecycleView();
+ initListener();
+ pbLoading.setVisibility(View.GONE);
+ }
+
- initRecycleView(view);
- initListener();
}
- private void initRecycleView(View view) {
+ private void initRecycleView() {
- if (view != null) {
- mRecyclerView = (RecyclerView) view.findViewById(R.id.cl_recycler_view_contact);
+ if (mView != null) {
+ mRecyclerView = (RecyclerView) mView.findViewById(R.id.cl_recycler_view_contact);
// mRecyclerView.getRecycledViewPool().setMaxRecycledViews(0, 0); // for avoid from show avatar and cloud view together
mRecyclerView.setItemAnimator(null);
mRecyclerView.setItemViewCacheSize(1000);
mRecyclerView.setLayoutManager(new PreCachingLayoutManager(G.fragmentActivity, 3000));
}
-
RealmResults results = null;
String[] fieldNames = {RealmRoomFields.IS_PINNED, RealmRoomFields.PIN_ID, RealmRoomFields.UPDATED_TIME};
Sort[] sort = {Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING};
- switch (mainType) {
+ switch (mainType) {
case all:
results = getRealmFragmentMain().where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.IS_DELETED, false).findAll().sort(fieldNames, sort);
if (results.size() > 0) {
viewById.setVisibility(View.GONE);
+ pbLoading.setVisibility(View.GONE);
} else {
viewById.setVisibility(View.VISIBLE);
+ // pbLoading.setVisibility(View.VISIBLE);
}
break;
case chat:
results = getRealmFragmentMain().where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.IS_DELETED, false).equalTo(RealmRoomFields.TYPE, RoomType.CHAT.toString()).findAll().sort(fieldNames, sort);
if (results.size() > 0) {
viewById.setVisibility(View.GONE);
+ pbLoading.setVisibility(View.GONE);
} else {
viewById.setVisibility(View.VISIBLE);
+ // pbLoading.setVisibility(View.VISIBLE);
}
break;
case group:
results = getRealmFragmentMain().where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.IS_DELETED, false).equalTo(RealmRoomFields.TYPE, RoomType.GROUP.toString()).findAll().sort(fieldNames, sort);
if (results.size() > 0) {
viewById.setVisibility(View.GONE);
+ pbLoading.setVisibility(View.GONE);
} else {
viewById.setVisibility(View.VISIBLE);
+ // pbLoading.setVisibility(View.VISIBLE);
}
break;
case channel:
results = getRealmFragmentMain().where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.IS_DELETED, false).equalTo(RealmRoomFields.TYPE, RoomType.CHANNEL.toString()).findAll().sort(fieldNames, sort);
if (results.size() > 0) {
viewById.setVisibility(View.GONE);
+ pbLoading.setVisibility(View.GONE);
} else {
viewById.setVisibility(View.VISIBLE);
+ // pbLoading.setVisibility(View.VISIBLE);
}
break;
}
@@ -284,7 +356,7 @@ public void onItemRangeRemoved(int positionStart, int itemCount) {
getChatsList();
}
- if (view != null) {
+ if (mView != null) {
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
@@ -329,7 +401,6 @@ public void notifyTime() {
//***************************************************************************************************************************
private void initListener() {
-
switch (mainType) {
case all:
@@ -1034,6 +1105,45 @@ public void onResume() {
}
}
}
+// BotInit.checkDrIgap();
+ }
+
+ @Override
+ public void isDeprecated() {
+ new Handler(Looper.getMainLooper()).post(new Runnable() {
+ @Override
+ public void run() {
+ new MaterialDialog.Builder(getActivity())
+ .cancelable(false)
+ .title(R.string.new_version_alert).titleGravity(GravityEnum.CENTER)
+ .titleColor(Color.parseColor("#f44336"))
+ .content(R.string.deprecated)
+ .contentGravity(GravityEnum.CENTER)
+ .show();
+ }
+ });
+
+ }
+
+ @Override
+ public void isUpdateAvailable() {
+ new Handler(Looper.getMainLooper()).post(new Runnable() {
+ @Override
+ public void run() {
+ new MaterialDialog.Builder(G.fragmentActivity)
+ .title(R.string.igap_update).titleColor(Color.parseColor("#1DE9B6"))
+ .titleGravity(GravityEnum.CENTER)
+ .buttonsGravity(GravityEnum.CENTER)
+ .content(R.string.new_version_avilable).contentGravity(GravityEnum.CENTER)
+ .positiveText(R.string.ignore).onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ dialog.dismiss();
+ }
+ })
+ .show();
+ }
+ });
}
public enum MainType {
@@ -1147,7 +1257,15 @@ public void onBindViewHolder(final ViewHolder holder, final int i) {
if (mInfo.isPinned()) {
holder.rootChat.setBackgroundColor(Color.parseColor(G.backgroundTheme_2));
- holder.txtPinIcon.setVisibility(View.VISIBLE);
+
+ //if (mInfo.getChatRoom() != null && RealmRoom.isBot(mInfo.getChatRoom().getPeerId())) {
+
+ if (mInfo != null && RealmRoom.isPromote(mInfo.getId())) {
+ // holder.rootChat.setBackgroundColor(G.context.getResources().getColor(R.color.green_20));
+ holder.txtPinIcon.setVisibility(View.GONE);
+ } else {
+ holder.txtPinIcon.setVisibility(View.VISIBLE);
+ }
} else {
holder.rootChat.setBackgroundColor(Color.parseColor(G.backgroundTheme));
@@ -1192,6 +1310,20 @@ public void onBindViewHolder(final ViewHolder holder, final int i) {
}
}
+
+ /* private boolean isBot(long userId) {
+ RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(getRealmFragmentMain(), userId);
+ if (realmRegisteredInfo != null) {
+ if (realmRegisteredInfo.isBot()) {
+ return true;
+ } else
+ return false;
+ } else
+ return false;
+ }*/
+
+
+
private String subStringInternal(String text) {
if (text == null || text.length() == 0) {
return "";
@@ -1248,7 +1380,16 @@ private void setLastMessage(RealmRoom mInfo, ViewHolder holder, boolean isMyClou
if (mInfo.getLastMessage().isAuthorMe()) {
holder.txtTic.setVisibility(View.VISIBLE);
- AppUtils.rightMessageStatus(holder.txtTic, ProtoGlobal.RoomMessageStatus.valueOf(mInfo.getLastMessage().getStatus()), mInfo.getLastMessage().isAuthorMe());
+
+ ProtoGlobal.RoomMessageStatus status = ProtoGlobal.RoomMessageStatus.UNRECOGNIZED;
+ if (mInfo.getLastMessage().getStatus() != null) {
+ try {
+ status = ProtoGlobal.RoomMessageStatus.valueOf(mInfo.getLastMessage().getStatus());
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ AppUtils.rightMessageStatus(holder.txtTic, status, mInfo.getLastMessage().isAuthorMe());
}
if (mInfo.getType() == GROUP) {
@@ -1549,12 +1690,15 @@ public boolean onLongClick(View v) {
role = mInfo.getChannelRoom().getRole().toString();
}
- MyDialog.showDialogMenuItemRooms(G.fragmentActivity, mInfo.getTitle(), mInfo.getType(), mInfo.getMute(), role, new OnComplete() {
- @Override
- public void complete(boolean result, String messageOne, String MessageTow) {
- onSelectRoomMenu(messageOne, mInfo);
- }
- }, mInfo.isPinned());
+ if (!G.fragmentActivity.isFinishing()) {
+ long peerId = mInfo.getChatRoom() != null ? mInfo.getChatRoom().getPeerId() : 0;
+ MyDialog.showDialogMenuItemRooms(G.fragmentActivity, mInfo.getTitle(), mInfo.getType(), mInfo.getMute(), role, peerId,mInfo, new OnComplete() {
+ @Override
+ public void complete(boolean result, String messageOne, String MessageTow) {
+ onSelectRoomMenu(messageOne, mInfo);
+ }
+ }, mInfo.isPinned());
+ }
}
}
return true;
diff --git a/app/src/main/java/net/iGap/fragments/FragmentNotificationAndSound.java b/app/src/main/java/net/iGap/fragments/FragmentNotificationAndSound.java
index 5617d2d..6354fb1 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentNotificationAndSound.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentNotificationAndSound.java
@@ -21,6 +21,7 @@
import net.iGap.R;
import net.iGap.databinding.FragmentNotificationAndSoundBinding;
import net.iGap.helper.HelperFragment;
+import net.iGap.helper.HelperNotification;
import net.iGap.libs.rippleeffect.RippleView;
import net.iGap.module.SHP_SETTING;
import net.iGap.viewmodel.FragmentNotificationAndSoundViewModel;
@@ -97,10 +98,11 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
editor.putInt(SHP_SETTING.KEY_STNS_POPUP_NOTIFICATION_GROUP, 0);
editor.putInt(SHP_SETTING.KEY_STNS_SOUND_GROUP_POSITION, 0);
editor.putString(SHP_SETTING.KEY_STNS_SOUND_GROUP, G.fragmentActivity.getResources().getString(R.string.array_Default_Notification_tone));
- editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND, 0);
- editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE, 0);
- editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW, 0);
- editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND, 0);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND_NEW, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE_NEW, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW_NEW, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND_NEW, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_SEPARATE_NOTIFICATION, 1);
editor.putInt(SHP_SETTING.KEY_STNS_CONTACT_JOINED, 1);
editor.putInt(SHP_SETTING.KEY_STNS_PINNED_MESSAGE, 1);
editor.putInt(SHP_SETTING.KEY_STNS_KEEP_ALIVE_SERVICE, 1);
@@ -127,4 +129,10 @@ private void initDataBinding() {
}
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ HelperNotification.getInstance().updateSettingValue();
+ }
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentRegister.java b/app/src/main/java/net/iGap/fragments/FragmentRegister.java
index 67e1b2e..f915ba0 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentRegister.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentRegister.java
@@ -270,7 +270,9 @@ public void onStop() {
try {
if (smsPermission) {
- G.fragmentActivity.unregisterReceiver(smsReceiver);
+ if (G.fragmentActivity.isRestricted()) {
+ G.fragmentActivity.unregisterReceiver(smsReceiver);
+ }
}
} catch (Exception e) {
diff --git a/app/src/main/java/net/iGap/fragments/FragmentShearedMedia.java b/app/src/main/java/net/iGap/fragments/FragmentShearedMedia.java
index 032c707..35b9885 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentShearedMedia.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentShearedMedia.java
@@ -1000,7 +1000,7 @@ public void onChange(RealmResults element) {
* Simple Class to serialize object to byte arrays
*
* @author Nick Russler
- * http://www.whitebyte.info
+ * http://www.whitebyte.info
*/
public static class SerializationUtils {
@@ -1143,7 +1143,7 @@ public View setLayoutHeaderTime(View parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shared_media_sub_layout_time, null);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
- view.setBackgroundColor(Color.parseColor("#cccccc"));
+ view.setBackgroundColor(Color.parseColor(G.appBarColor));
return view;
}
@@ -1239,7 +1239,7 @@ public void run() {
}
});
- HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(),mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSize(), ProtoFileDownload.FileDownload.Selector.FILE, dirPath, 2, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(), mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSize(), ProtoFileDownload.FileDownload.Selector.FILE, dirPath, 2, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(String path, final int progress) {
@@ -1478,7 +1478,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
if (at.getSmallThumbnail() != null) {
if (at.getSmallThumbnail().getSize() > 0) {
- HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(),mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(), mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
@@ -1614,7 +1614,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
if (at.getSmallThumbnail() != null) {
if (at.getSmallThumbnail().getSize() > 0) {
- HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(),mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(), mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
@@ -1902,7 +1902,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
holder1.gifDrawable = (GifDrawable) holder1.gifView.getDrawable();
- holder1.messageProgress.withDrawable(R.drawable.photogif, true);
+ holder1.messageProgress.withDrawable(R.mipmap.photogif, true);
holder1.messageProgress.setVisibility(View.GONE);
holder1.messageProgress.setOnClickListener(new View.OnClickListener() {
@Override
@@ -1930,7 +1930,7 @@ public void onClick(View view) {
if (at.getSmallThumbnail() != null) {
if (at.getSmallThumbnail().getSize() > 0) {
- HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(),mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(mList.get(position).item.getMessageType(), mList.get(position).messageId + "", at.getToken(), at.getUrl(), at.getCacheId(), at.getName(), at.getSmallThumbnail().getSize(), ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL, "", 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
@@ -2089,7 +2089,12 @@ private void openFile(int position, RecyclerView.ViewHolder holder) {
Intent intent = HelperMimeType.appropriateProgram(vh.filePath);
if (intent != null) {
- context.startActivity(intent);
+ try {
+ context.startActivity(intent);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+
} else {
Toast.makeText(context, R.string.can_not_open_file, Toast.LENGTH_SHORT).show();
}
diff --git a/app/src/main/java/net/iGap/fragments/FragmentiGapMap.java b/app/src/main/java/net/iGap/fragments/FragmentiGapMap.java
index 372a9d2..ad4c6ed 100644
--- a/app/src/main/java/net/iGap/fragments/FragmentiGapMap.java
+++ b/app/src/main/java/net/iGap/fragments/FragmentiGapMap.java
@@ -30,22 +30,17 @@
import android.location.Location;
import android.location.LocationManager;
import android.media.ThumbnailUtils;
-import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
-import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateUtils;
-import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
@@ -53,7 +48,6 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
@@ -70,13 +64,11 @@
import net.iGap.G;
import net.iGap.R;
import net.iGap.activities.ActivityMain;
-import net.iGap.adapter.items.chat.ViewMaker;
import net.iGap.helper.HelperAvatar;
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperError;
import net.iGap.helper.HelperFragment;
import net.iGap.helper.HelperImageBackColor;
-import net.iGap.helper.HelperLog;
import net.iGap.interfaces.OnAvatarGet;
import net.iGap.interfaces.OnGeoCommentResponse;
import net.iGap.interfaces.OnGeoGetComment;
@@ -87,7 +79,6 @@
import net.iGap.interfaces.OnMapRegisterState;
import net.iGap.interfaces.OnMapUsersGet;
import net.iGap.libs.floatingAddButton.ArcMenu;
-import net.iGap.libs.floatingAddButton.MenuSideEnum;
import net.iGap.libs.floatingAddButton.StateChangeListener;
import net.iGap.libs.rippleeffect.RippleView;
import net.iGap.module.AndroidUtils;
@@ -1574,7 +1565,7 @@ public void run() {
if (G.userId != result.getUserId()) { // don't show mine
RealmRegisteredInfo.getRegistrationInfo(result.getUserId(), new OnInfo() {
@Override
- public void onInfo(RealmRegisteredInfo registeredInfo) {
+ public void onInfo(Long registeredId) {
drawMark(result.getLat(), result.getLon(), result.getHasComment(), result.getUserId());
}
});
diff --git a/app/src/main/java/net/iGap/fragments/RegisteredContactsFragment.java b/app/src/main/java/net/iGap/fragments/RegisteredContactsFragment.java
index 3e001b3..d90c183 100644
--- a/app/src/main/java/net/iGap/fragments/RegisteredContactsFragment.java
+++ b/app/src/main/java/net/iGap/fragments/RegisteredContactsFragment.java
@@ -45,7 +45,6 @@
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
-import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
@@ -83,9 +82,11 @@
import net.iGap.module.SHP_SETTING;
import net.iGap.module.structs.StructListOfContact;
import net.iGap.proto.ProtoGlobal;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmContacts;
import net.iGap.realm.RealmContactsFields;
import net.iGap.realm.RealmRegisteredInfo;
+import net.iGap.realm.RealmRoom;
import net.iGap.request.RequestUserContactsDelete;
import net.iGap.request.RequestUserContactsEdit;
import net.iGap.request.RequestUserContactsGetList;
@@ -883,9 +884,9 @@ public void onDismiss(DialogInterface dialog) {
});
- viewHolder.txtEdit.setOnClickListener(v->{
+ viewHolder.txtEdit.setOnClickListener(v -> {
- dialogEditContact(header,contact.getPhone(),contact.getId());
+ dialogEditContact(header, contact.getPhone(), contact.getId());
});
@@ -960,7 +961,6 @@ public boolean onLongClick(View v) {
});
-
swipeLayout.getSurfaceView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -969,14 +969,31 @@ public void onClick(View v) {
if (isCallAction) {
// G.fragmentActivity.getSupportFragmentManager().popBackStack();
- popBackStackFragment();
long userId = realmContacts.getId();
if (userId != 134 && G.userId != userId) {
- FragmentCall.call(userId, false);
- }
+ new MaterialDialog.Builder(G.fragmentActivity).items(R.array.calls).itemsCallback(new MaterialDialog.ListCallback() {
+ @Override
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+
+ switch (which) {
+ case 0:
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING);
+ popBackStackFragment();
+ break;
+ case 1:
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING);
+ popBackStackFragment();
+ break;
+ }
+
+ dialog.dismiss();
+ }
+ }).show();
+ }
+
} else {
showProgress();
@@ -1003,7 +1020,7 @@ public void error() {
}
}
- private void dialogEditContact(String header, long phone,final long userId) {
+ private void dialogEditContact(String header, long phone, final long userId) {
final LinearLayout layoutNickname = new LinearLayout(G.fragmentActivity);
layoutNickname.setOrientation(LinearLayout.VERTICAL);
@@ -1254,7 +1271,8 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_TEXT, "Hey Join iGap : https://www.igap.net/ I'm waiting for you!");
+ sendIntent.putExtra("address", phone);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, getResources().getString(R.string.invitation_message) + G.userId);
sendIntent.setType("text/plain");
sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.startActivity(sendIntent);
diff --git a/app/src/main/java/net/iGap/fragments/SearchFragment.java b/app/src/main/java/net/iGap/fragments/SearchFragment.java
index f8b289b..4797c01 100644
--- a/app/src/main/java/net/iGap/fragments/SearchFragment.java
+++ b/app/src/main/java/net/iGap/fragments/SearchFragment.java
@@ -1,12 +1,12 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.fragments;
@@ -14,6 +14,7 @@
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
+import android.support.v4.widget.ContentLoadingProgressBar;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -38,19 +39,26 @@
import net.iGap.adapter.items.SearchItem;
import net.iGap.adapter.items.SearchItemHeader;
import net.iGap.helper.GoToChatActivity;
+import net.iGap.helper.HelperError;
+import net.iGap.helper.HelperUrl;
+import net.iGap.interfaces.IClientSearchUserName;
import net.iGap.interfaces.OnChatGetRoom;
import net.iGap.libs.rippleeffect.RippleView;
import net.iGap.module.CircleImageView;
import net.iGap.module.MaterialDesignTextView;
+import net.iGap.proto.ProtoClientSearchUsername;
import net.iGap.proto.ProtoGlobal;
import net.iGap.realm.RealmAvatar;
import net.iGap.realm.RealmContacts;
import net.iGap.realm.RealmContactsFields;
+import net.iGap.realm.RealmRegisteredInfo;
+import net.iGap.realm.RealmRegisteredInfoFields;
import net.iGap.realm.RealmRoom;
import net.iGap.realm.RealmRoomFields;
import net.iGap.realm.RealmRoomMessage;
import net.iGap.realm.RealmRoomMessageFields;
import net.iGap.request.RequestChatGetRoom;
+import net.iGap.request.RequestClientSearchUsername;
import java.util.ArrayList;
import java.util.HashMap;
@@ -60,6 +68,8 @@
import io.realm.Realm;
import io.realm.RealmResults;
+import static net.iGap.fragments.FragmentChat.messageId;
+
public class SearchFragment extends BaseFragment {
public static HashMap hashMapAvatarSearchFragment = new HashMap<>();
@@ -73,6 +83,8 @@ public class SearchFragment extends BaseFragment {
private ImageView imvNothingFound;
private TextView txtEmptyListComment;
private long index = 500;
+ private String preventRepeatSearch = "";
+ private ContentLoadingProgressBar loadingProgressBar;
public static SearchFragment newInstance() {
return new SearchFragment();
@@ -97,6 +109,7 @@ private void initComponent(View view) {
index = 500;
view.findViewById(R.id.sfl_ll_toolbar).setBackgroundColor(Color.parseColor(G.appBarColor));
+ loadingProgressBar = (ContentLoadingProgressBar) view.findViewById(R.id.sfl_progress_loading);
imvNothingFound = (ImageView) view.findViewById(R.id.sfl_imv_nothing_found);
imvNothingFound.setImageResource(R.drawable.find1);
txtEmptyListComment = (TextView) view.findViewById(R.id.sfl_txt_empty_list_comment);
@@ -121,10 +134,15 @@ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
- fillList(charSequence.toString());
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable editable) {
+ fillList(editable.toString());
- if (charSequence.length() > 0) {
+ if (editable.length() > 0) {
btnClose.setTextColor(Color.WHITE);
((View) rippleDown).setEnabled(true);
@@ -134,11 +152,6 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
}
-
- @Override
- public void afterTextChanged(Editable editable) {
-
- }
});
edtSearch.requestFocus();
InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -182,7 +195,7 @@ public boolean onClick(View v, IAdapter adapter, IItem currentItem, int position
} else {
SearchItem si = (SearchItem) currentItem;
- goToRoom(si.item.id, si.item.type, si.item.messageId);
+ goToRoom(si.item.id, si.item.type, si.item.messageId, si.item.userName);
InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edtSearch.getWindowToken(), 0);
@@ -200,28 +213,204 @@ public boolean onClick(View v, IAdapter adapter, IItem currentItem, int position
private void fillList(String text) {
itemAdapter.clear();
+ fastAdapter.clearTypeInstance();
+
+ int strSize = text.length();
+
+
+ if (strSize < 3) {
- if (text.length() < 3) {
txtEmptyListComment.setVisibility(View.VISIBLE);
txtEmptyListComment.setText(R.string.empty_message3);
imvNothingFound.setVisibility(View.VISIBLE);
+ return;
+ }
+
+ if (text.startsWith("#")) {
+ fillListItemHashtag(text);
+ return;
+ } else if (Character.getDirectionality(text.charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC) {
+ fillListItemGlobal(text);
return;
}
- txtEmptyListComment.setVisibility(View.GONE);
- imvNothingFound.setVisibility(View.GONE);
+
+ if (strSize >= 5) {
+ if (G.userLogin) {
+ if ((!text.equals(preventRepeatSearch))) {
+ itemAdapter.clear();
+ if (text.startsWith("@")) {
+ new RequestClientSearchUsername().clientSearchUsername(text.substring(1));
+
+ } else {
+ new RequestClientSearchUsername().clientSearchUsername(text);
+ }
+ loadingProgressBar.setVisibility(View.VISIBLE);
+ preventRepeatSearch = text;
+ }
+ } else {
+ HelperError.showSnackMessage(G.context.getString(R.string.there_is_no_connection_to_server), false);
+ }
+ }else {
+ preventRepeatSearch = "";
+ }
+
+
+ G.onClientSearchUserName = new IClientSearchUserName() {
+ @Override
+ public void OnGetList(final ProtoClientSearchUsername.ClientSearchUsernameResponse.Builder builderList) {
+
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
+
+ loadingProgressBar.setVisibility(View.GONE);
+
+ Realm realm = Realm.getDefaultInstance();
+
+ for (final ProtoClientSearchUsername.ClientSearchUsernameResponse.Result item : builderList.getResultList()) {
+
+ if (item.getType() == ProtoClientSearchUsername.ClientSearchUsernameResponse.Result.Type.USER) {
+
+ realm.executeTransaction(new Realm.Transaction() {
+ @Override
+ public void execute(Realm realm) {
+ RealmRegisteredInfo.putOrUpdate(realm, item.getUser());
+ }
+ });
+
+ } else if (item.getType() == ProtoClientSearchUsername.ClientSearchUsernameResponse.Result.Type.ROOM) {
+
+ final RealmRoom[] realmRoom = {realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, item.getRoom().getId()).findFirst()};
+
+ if (realmRoom[0] == null) {
+ realm.executeTransaction(new Realm.Transaction() {
+ @Override
+ public void execute(Realm realm) {
+ realmRoom[0] = RealmRoom.putOrUpdate(item.getRoom(), realm);
+ realmRoom[0].setDeleted(true);
+ }
+ });
+ }
+ }
+ }
+ realm.close();
+
+ String text = edtSearch.getText().toString();
+ if (text.startsWith("@")) {
+ fillListItemAtsign(text.substring(1));
+
+ } else {
+ fillListItemGlobal(text);
+
+ }
+ }
+ });
+ }
+
+ @Override
+ public void OnErrore() {
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
+ loadingProgressBar.setVisibility(View.GONE);
+ }
+ });
+ }
+ };
+
+ }
+
+ private void fillListItemHashtag(String text) {
list.clear();
- addHeader(G.fragmentActivity.getResources().getString(R.string.chats));
- fillRoomList(text);
- addHeader(G.fragmentActivity.getResources().getString(R.string.contacts));
- fillContacts(text);
- addHeader(G.fragmentActivity.getResources().getString(R.string.messages));
+ fillHashtag(text);
+ updateAdapter();
+
+ }
+
+
+ private void fillListItemAtsign(String text) {
+
+ list.clear();
+ fillBot(text);
+ fillChat(text);
+ fillRoomListGroup(text);
+ fillRoomListChannel(text);
+ updateAdapter();
+
+ }
+
+
+ private void fillListItemGlobal(String text) {
+
+ list.clear();
+
+ fillBot(text);
+
+ fillChat(text);
+
+ fillRoomListGroup(text);
+
+ fillRoomListChannel(text);
+
fillMessages(text);
- List items = new ArrayList<>();
+ fillHashtag(text);
+
+ updateAdapter();
+
+ }
+
+ private void fillHashtag(String text) {
+
+ Realm realm = Realm.getDefaultInstance();
+
+ if (!text.startsWith("#")) {
+ text = "#" + text;
+ }
+ final RealmResults results = realm.where(RealmRoomMessage.class).equalTo(RealmRoomMessageFields.HAS_MESSAGE_LINK, true).contains(RealmRoomMessageFields.MESSAGE, text, Case.INSENSITIVE).equalTo(RealmRoomMessageFields.EDITED, false).isNotEmpty(RealmRoomMessageFields.MESSAGE).findAll();
+
+ if (results != null && results.size() > 0) {
+
+ addHeader(G.fragmentActivity.getResources().getString(R.string.hashtag));
+ for (RealmRoomMessage roomMessage : results) {
+
+
+ StructSearch item = new StructSearch();
+
+ item.time = roomMessage.getUpdateTime();
+ item.comment = roomMessage.getMessage();
+ item.id = roomMessage.getRoomId();
+ item.type = SearchType.message;
+ item.messageId = roomMessage.getMessageId();
+ RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, roomMessage.getRoomId()).findFirst();
+
+ if (realmRoom != null) { // room exist
+ item.name = realmRoom.getTitle();
+ item.initials = realmRoom.getInitials();
+ item.color = realmRoom.getColor();
+ item.roomType = realmRoom.getType();
+ item.avatar = realmRoom.getAvatar();
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.CHAT && realmRoom.getChatRoom() != null) {
+ item.idDetectAvatar = realmRoom.getChatRoom().getPeerId();
+ } else {
+ item.idDetectAvatar = realmRoom.getId();
+ }
+ list.add(item);
+ }
+ }
+ }
+
+ realm.close();
+
+ }
+
+
+ private void updateAdapter() {
+ List items = new ArrayList<>();
for (StructSearch item : list) {
if (item != null) {
if (item.type == SearchType.header) {
@@ -232,46 +421,195 @@ private void fillList(String text) {
}
}
- itemAdapter.add(items);
-
- if (list.size() == 0) {
-
+ if (items.size() > 0) {
+ txtEmptyListComment.setVisibility(View.GONE);
+ imvNothingFound.setVisibility(View.GONE);
+ } else {
txtEmptyListComment.setVisibility(View.VISIBLE);
txtEmptyListComment.setText(R.string.there_is_no_any_result);
imvNothingFound.setVisibility(View.VISIBLE);
}
+ itemAdapter.clear();
+ itemAdapter.add(items);
+ }
+
+ private void fillRoomListGroup(String text) {
+
+ Realm realm = Realm.getDefaultInstance();
+
+ final RealmResults results;
+
+ if (edtSearch.getText().toString().startsWith("@")) {
+ results = realm.where(RealmRoom.class).beginGroup().contains(RealmRoomFields.CHANNEL_ROOM.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRoomFields.GROUP_ROOM.USERNAME, text, Case.INSENSITIVE).endGroup().equalTo(RealmRoomFields.TYPE, "GROUP", Case.INSENSITIVE).findAll();
+
+ } else {
+ results = realm.where(RealmRoom.class).beginGroup().contains(RealmRoomFields.TITLE, text, Case.INSENSITIVE).or().contains(RealmRoomFields.CHANNEL_ROOM.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRoomFields.GROUP_ROOM.USERNAME, text, Case.INSENSITIVE).endGroup().equalTo(RealmRoomFields.TYPE, "GROUP", Case.INSENSITIVE).findAll();
+ }
+
+ if (results != null) {
+
+ if (results.size() > 0)
+ addHeader(G.fragmentActivity.getResources().getString(R.string.Groups));
+
+
+ for (RealmRoom realmRoom : results) {
+ StructSearch item = new StructSearch();
+
+ item.roomType = realmRoom.getType();
+ item.name = realmRoom.getTitle();
+ item.time = realmRoom.getUpdatedTime();
+ item.id = realmRoom.getId();
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.CHAT && realmRoom.getChatRoom() != null) {
+ item.idDetectAvatar = realmRoom.getChatRoom().getPeerId();
+ } else {
+
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.GROUP && realmRoom.getGroupRoom() != null) {
+ item.userName = realmRoom.getGroupRoom().getUsername();
+
+ } else if (realmRoom.getType() == ProtoGlobal.Room.Type.CHANNEL && realmRoom.getChannelRoom() != null) {
+ item.userName = realmRoom.getChannelRoom().getUsername();
+
+ }
+
+ item.idDetectAvatar = realmRoom.getId();
+ }
+ item.type = SearchType.room;
+ item.initials = realmRoom.getInitials();
+ item.color = realmRoom.getColor();
+ item.avatar = realmRoom.getAvatar();
+
+ list.add(item);
+ }
+ }
+
+ realm.close();
}
- private void fillRoomList(String text) {
+ private void fillRoomListChannel(String text) {
Realm realm = Realm.getDefaultInstance();
- int size = list.size();
+ final RealmResults results;
- for (RealmRoom realmRoom : realm.where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.IS_DELETED, false).contains(RealmRoomFields.TITLE, text, Case.INSENSITIVE).findAll()) {
+ if (edtSearch.getText().toString().startsWith("@")) {
+ results = realm.where(RealmRoom.class).beginGroup().contains(RealmRoomFields.CHANNEL_ROOM.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRoomFields.GROUP_ROOM.USERNAME, text, Case.INSENSITIVE).endGroup().equalTo(RealmRoomFields.TYPE, "CHANNEL", Case.INSENSITIVE).findAll();
- StructSearch item = new StructSearch();
+ } else {
+ results = realm.where(RealmRoom.class).beginGroup().contains(RealmRoomFields.TITLE, text, Case.INSENSITIVE).or().contains(RealmRoomFields.CHANNEL_ROOM.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRoomFields.GROUP_ROOM.USERNAME, text, Case.INSENSITIVE).endGroup().equalTo(RealmRoomFields.TYPE, "CHANNEL", Case.INSENSITIVE).findAll();
+ }
- item.roomType = realmRoom.getType();
- item.name = realmRoom.getTitle();
- item.time = realmRoom.getUpdatedTime();
- item.id = realmRoom.getId();
- if (realmRoom.getType() == ProtoGlobal.Room.Type.CHAT && realmRoom.getChatRoom() != null) {
- item.idDetectAvatar = realmRoom.getChatRoom().getPeerId();
- } else {
- item.idDetectAvatar = realmRoom.getId();
+ if (results != null && results.size() > 0) {
+
+ addHeader(G.fragmentActivity.getResources().getString(R.string.channel));
+
+ for (RealmRoom realmRoom : results) {
+
+ StructSearch item = new StructSearch();
+
+ item.roomType = realmRoom.getType();
+ item.name = realmRoom.getTitle();
+ item.time = realmRoom.getUpdatedTime();
+ item.id = realmRoom.getId();
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.CHAT && realmRoom.getChatRoom() != null) {
+ item.idDetectAvatar = realmRoom.getChatRoom().getPeerId();
+ } else {
+
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.GROUP && realmRoom.getGroupRoom() != null) {
+ item.userName = realmRoom.getGroupRoom().getUsername();
+
+ } else if (realmRoom.getType() == ProtoGlobal.Room.Type.CHANNEL && realmRoom.getChannelRoom() != null) {
+ item.userName = realmRoom.getChannelRoom().getUsername();
+
+ }
+
+ item.idDetectAvatar = realmRoom.getId();
+ }
+ item.type = SearchType.room;
+ item.initials = realmRoom.getInitials();
+ item.color = realmRoom.getColor();
+ item.avatar = realmRoom.getAvatar();
+
+ list.add(item);
+ }
+ }
+
+ realm.close();
+ }
+
+ private void fillBot(String text) {
+
+ Realm realm = Realm.getDefaultInstance();
+ final RealmResults results;
+
+ if (edtSearch.getText().toString().startsWith("@")) {
+ results = realm.where(RealmRegisteredInfo.class).contains(RealmRegisteredInfoFields.USERNAME, text, Case.INSENSITIVE).equalTo(RealmRegisteredInfoFields.IS_BOT, true).findAll();
+
+ } else {
+ results = realm.where(RealmRegisteredInfo.class).beginGroup().contains(RealmRegisteredInfoFields.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRegisteredInfoFields.DISPLAY_NAME, text).endGroup().equalTo(RealmRegisteredInfoFields.IS_BOT, true).findAll();
+ }
+
+ if (results != null && results.size() > 0) {
+
+ addHeader(G.fragmentActivity.getResources().getString(R.string.bot));
+
+ for (RealmRegisteredInfo contact : results) {
+
+
+ StructSearch item = new StructSearch();
+
+ item.name = contact.getDisplayName();
+ item.time = contact.getLastSeen();
+ item.userName = contact.getUsername();
+ item.comment = "";
+ item.id = contact.getId();
+ item.idDetectAvatar = contact.getId();
+ item.type = SearchType.contact;
+ item.initials = contact.getInitials();
+ item.color = contact.getColor();
+ item.avatar = contact.getLastAvatar();
+ list.add(item);
}
- item.type = SearchType.room;
- item.initials = realmRoom.getInitials();
- item.color = realmRoom.getColor();
- item.avatar = realmRoom.getAvatar();
+ }
- list.add(item);
+ realm.close();
+ }
+
+ private void fillChat(String text) {
+
+ Realm realm = Realm.getDefaultInstance();
+ final RealmResults results;
+
+ if (edtSearch.getText().toString().startsWith("@")) {
+ results = realm.where(RealmRegisteredInfo.class).contains(RealmRegisteredInfoFields.USERNAME, text, Case.INSENSITIVE).equalTo(RealmRegisteredInfoFields.IS_BOT, false).findAll();
+
+ } else {
+ results = realm.where(RealmRegisteredInfo.class).equalTo(RealmRegisteredInfoFields.IS_BOT, false).beginGroup().contains(RealmRegisteredInfoFields.USERNAME, text, Case.INSENSITIVE).or().contains(RealmRegisteredInfoFields.DISPLAY_NAME, text).endGroup().findAll();
}
- if (size == list.size()) list.remove(size - 1);
+ if (results != null && results.size() > 0) {
+
+ addHeader(G.fragmentActivity.getResources().getString(R.string.member));
+
+ for (RealmRegisteredInfo contact : results) {
+
+
+ StructSearch item = new StructSearch();
+
+ item.name = contact.getDisplayName();
+ item.time = contact.getLastSeen();
+ item.userName = contact.getUsername();
+ item.comment = "";
+ item.id = contact.getId();
+ item.idDetectAvatar = contact.getId();
+ item.type = SearchType.contact;
+ item.initials = contact.getInitials();
+ item.color = contact.getColor();
+ item.avatar = contact.getLastAvatar();
+ list.add(item);
+ }
+ }
realm.close();
}
@@ -280,7 +618,15 @@ private void fillContacts(String text) {
int size = list.size();
Realm realm = Realm.getDefaultInstance();
- final RealmResults results = realm.where(RealmContacts.class).contains(RealmContactsFields.DISPLAY_NAME, text, Case.INSENSITIVE).findAll();
+ final RealmResults results;
+
+ if (edtSearch.getText().toString().startsWith("@")) {
+ results = realm.where(RealmContacts.class).contains(RealmContactsFields.USERNAME, text, Case.INSENSITIVE).findAll();
+
+ } else {
+ results = realm.where(RealmContacts.class).beginGroup().contains(RealmContactsFields.USERNAME, text, Case.INSENSITIVE).or().contains(RealmContactsFields.DISPLAY_NAME, text).endGroup().findAll();
+ }
+
if (results != null) {
for (RealmContacts contact : results) {
@@ -295,6 +641,7 @@ private void fillContacts(String text) {
item.name = contact.getDisplay_name();
item.time = contact.getLast_seen();
item.comment = str;
+ item.userName = contact.getUsername();
item.id = contact.getId();
item.idDetectAvatar = contact.getId();
item.type = SearchType.contact;
@@ -305,7 +652,7 @@ private void fillContacts(String text) {
}
}
- if (size == list.size()) list.remove(size - 1);
+// if (size == list.size()) list.remove(size - 1);
realm.close();
}
@@ -321,8 +668,10 @@ private void fillMessages(String text) {
int size = list.size();
Realm realm = Realm.getDefaultInstance();
- for (RealmRoomMessage roomMessage : realm.where(RealmRoomMessage.class).contains(RealmRoomMessageFields.MESSAGE, text, Case.INSENSITIVE).equalTo(RealmRoomMessageFields.EDITED, false).isNotEmpty(RealmRoomMessageFields.MESSAGE).findAll()) {
- if (roomMessage != null) {
+ final RealmResults results = realm.where(RealmRoomMessage.class).contains(RealmRoomMessageFields.MESSAGE, text, Case.INSENSITIVE).equalTo(RealmRoomMessageFields.EDITED, false).isNotEmpty(RealmRoomMessageFields.MESSAGE).findAll();
+ if (results != null && results.size() > 0) {
+ addHeader(G.fragmentActivity.getResources().getString(R.string.messages));
+ for (RealmRoomMessage roomMessage : results) {
StructSearch item = new StructSearch();
@@ -343,6 +692,15 @@ private void fillMessages(String text) {
if (realmRoom.getType() == ProtoGlobal.Room.Type.CHAT && realmRoom.getChatRoom() != null) {
item.idDetectAvatar = realmRoom.getChatRoom().getPeerId();
} else {
+
+ if (realmRoom.getType() == ProtoGlobal.Room.Type.GROUP && realmRoom.getGroupRoom() != null) {
+ item.userName = realmRoom.getGroupRoom().getUsername();
+
+ } else if (realmRoom.getType() == ProtoGlobal.Room.Type.CHANNEL && realmRoom.getChannelRoom() != null) {
+ item.userName = realmRoom.getChannelRoom().getUsername();
+
+ }
+
item.idDetectAvatar = realmRoom.getId();
}
list.add(item);
@@ -350,23 +708,36 @@ private void fillMessages(String text) {
}
}
- if (size == list.size()) {
- list.remove(size - 1);
- }
+// if (size == list.size()) {
+// list.remove(size - 1);
+// }
realm.close();
}
- private void goToRoom(final long id, SearchType type, long messageId) {
+ private void goToRoom(final long id, SearchType type, long messageId, String userName) {
final Realm realm = Realm.getDefaultInstance();
RealmRoom realmRoom = null;
- if (type == SearchType.room || type == SearchType.message) {
+ if (type == SearchType.message) {
realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, id).findFirst();
+ goToRoomWithRealm(realmRoom, type, id);
} else if (type == SearchType.contact) {
realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.CHAT_ROOM.PEER_ID, id).findFirst();
+ goToRoomWithRealm(realmRoom, type, id);
+ } else if (type == SearchType.room) {
+
+ HelperUrl.checkUsernameAndGoToRoom(userName, HelperUrl.ChatEntry.profile);
+ popBackStackFragment();
+
}
+ realm.close();
+
+ }
+
+
+ public void goToRoomWithRealm(RealmRoom realmRoom, SearchType type, long id) {
if (realmRoom != null) {
removeFromBaseFragment(SearchFragment.this);
@@ -380,6 +751,7 @@ private void goToRoom(final long id, SearchType type, long messageId) {
G.onChatGetRoom = new OnChatGetRoom() {
@Override
public void onChatGetRoom(final ProtoGlobal.Room room) {
+ RealmRoom.putOrUpdate(room);
G.handler.post(new Runnable() {
@Override
public void run() {
@@ -405,18 +777,21 @@ public void onChatGetRoomError(int majorCode, int minorCode) {
new RequestChatGetRoom().chatGetRoom(id);
}
- realm.close();
+
+
}
+
//*********************************************************************************************
public enum SearchType {
- header, room, contact, message;
+ header, room, contact, message, CHANNEL, GROUP
}
public class StructSearch {
public String name = "";
public String comment = "";
+ public String userName = "";
public String initials;
public String color;
public long time = 0;
diff --git a/app/src/main/java/net/iGap/fragments/filterImage/FiltersListFragment.java b/app/src/main/java/net/iGap/fragments/filterImage/FiltersListFragment.java
index 3156ad6..abb9a15 100644
--- a/app/src/main/java/net/iGap/fragments/filterImage/FiltersListFragment.java
+++ b/app/src/main/java/net/iGap/fragments/filterImage/FiltersListFragment.java
@@ -10,6 +10,7 @@
package net.iGap.fragments.filterImage;
+import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.Nullable;
@@ -103,10 +104,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
public void prepareThumbnail(final Bitmap bitmap) {
Runnable r = new Runnable() {
public void run() {
+
+ Activity activity = getActivity();
+ if (activity == null) {
+ return;
+ }
+
Bitmap thumbImage;
if (bitmap == null) {
- thumbImage = getBitmapFile(getActivity(), path, 100, 100);
+ thumbImage = getBitmapFile(activity, path, 100, 100);
} else {
thumbImage = Bitmap.createScaledBitmap(bitmap, 100, 100, false);
}
@@ -123,7 +130,7 @@ public void run() {
thumbnailItem.filterName = getString(R.string.about);
ThumbnailsManager.addThumb(thumbnailItem);
- List filters = FilterPack.getFilterPack(getActivity());
+ List filters = FilterPack.getFilterPack(activity);
for (Filter filter : filters) {
ThumbnailItem tI = new ThumbnailItem();
@@ -133,9 +140,9 @@ public void run() {
ThumbnailsManager.addThumb(tI);
}
- thumbnailItemList.addAll(ThumbnailsManager.processThumbs(getActivity()));
+ thumbnailItemList.addAll(ThumbnailsManager.processThumbs(activity));
- getActivity().runOnUiThread(new Runnable() {
+ activity.runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
diff --git a/app/src/main/java/net/iGap/fragments/filterImage/FragmentFilterImage.java b/app/src/main/java/net/iGap/fragments/filterImage/FragmentFilterImage.java
index bf74a36..691ad5b 100644
--- a/app/src/main/java/net/iGap/fragments/filterImage/FragmentFilterImage.java
+++ b/app/src/main/java/net/iGap/fragments/filterImage/FragmentFilterImage.java
@@ -137,7 +137,9 @@ public void onClick(View v) {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
final String path = BitmapUtils.insertImage(getActivity().getContentResolver(), finalImage, System.currentTimeMillis() + "_profile.jpg", null);
- FragmentEditImage.updateImage.result(AttachFile.getFilePathFromUri(Uri.parse(path)));
+ if (FragmentEditImage.updateImage != null && path != null) {
+ FragmentEditImage.updateImage.result(AttachFile.getFilePathFromUri(Uri.parse(path)));
+ }
popBackStackFragment();
}
}).onNegative(new MaterialDialog.SingleButtonCallback() {
@@ -159,7 +161,10 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
@Override
public void onClick(View v) {
final String path = BitmapUtils.insertImage(getActivity().getContentResolver(), finalImage, System.currentTimeMillis() + "_profile.jpg", null);
- FragmentEditImage.updateImage.result(AttachFile.getFilePathFromUri(Uri.parse(path)));
+ if (FragmentEditImage.updateImage != null && path != null) {
+ FragmentEditImage.updateImage.result(AttachFile.getFilePathFromUri(Uri.parse(path)));
+ }
+
popBackStackFragment();
}
});
diff --git a/app/src/main/java/net/iGap/helper/GoToChatActivity.java b/app/src/main/java/net/iGap/helper/GoToChatActivity.java
index 5170544..cc8811e 100644
--- a/app/src/main/java/net/iGap/helper/GoToChatActivity.java
+++ b/app/src/main/java/net/iGap/helper/GoToChatActivity.java
@@ -90,7 +90,7 @@ public void startActivity() {
String message = G.context.getString(R.string.send_message_to) + " " + roomName;
- MaterialDialog.Builder mDialog = new MaterialDialog.Builder(G.fragmentActivity).title(message).positiveText(R.string.ok).negativeText(R.string.cancel).onPositive(new MaterialDialog.SingleButtonCallback() {
+ MaterialDialog.Builder mDialog = new MaterialDialog.Builder(G.fragmentActivity != null ? G.fragmentActivity : G.context).title(message).positiveText(R.string.ok).negativeText(R.string.cancel).onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
FragmentChat fragmentChat = new FragmentChat();
@@ -98,7 +98,7 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
new HelperFragment(fragmentChat).setReplace(false).load();
}
});
- if (!(G.fragmentActivity).isFinishing()) {
+ if (G.fragmentActivity != null && !(G.fragmentActivity).isFinishing()) {
mDialog.show();
}
} else if (FragmentChat.mForwardMessages != null) {
diff --git a/app/src/main/java/net/iGap/helper/HelperDownloadFile.java b/app/src/main/java/net/iGap/helper/HelperDownloadFile.java
index bec083a..d14e032 100644
--- a/app/src/main/java/net/iGap/helper/HelperDownloadFile.java
+++ b/app/src/main/java/net/iGap/helper/HelperDownloadFile.java
@@ -40,6 +40,7 @@
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import io.realm.Realm;
import io.realm.RealmResults;
@@ -64,7 +65,7 @@ public class StructListener {
private static HelperDownloadFile helperDownloadFile;
public ArrayList manuallyStoppedDownload = new ArrayList<>();
- private ArrayMap list = new ArrayMap<>();
+ private ConcurrentHashMap list = new ConcurrentHashMap<>();
private ArrayList mQueue = new ArrayList<>();
private Handler handler;
private final static int maxDownloadSize = 4;
diff --git a/app/src/main/java/net/iGap/helper/HelperFillLookUpClass.java b/app/src/main/java/net/iGap/helper/HelperFillLookUpClass.java
index 4ab2ccb..e80c877 100644
--- a/app/src/main/java/net/iGap/helper/HelperFillLookUpClass.java
+++ b/app/src/main/java/net/iGap/helper/HelperFillLookUpClass.java
@@ -100,6 +100,7 @@ private static void fillLookUpClassArray() {
lookupMap.put(30147, "ProtoUserProfileBio.UserProfileSetBioResponse");
lookupMap.put(30148, "ProtoUserProfileGetBio.UserProfileGetBioResponse");
lookupMap.put(30149, "ProtoUserReport.UserReportResponse");
+ lookupMap.put(30150, "ProtoUserSetBot.UserSetBotResponse");
// Chat 2xx , 302xx
lookupMap.put(30200, "ProtoChatGetRoom.ChatGetRoomResponse");
@@ -199,6 +200,7 @@ private static void fillLookUpClassArray() {
lookupMap.put(30615, "ProtoClientPinRoom.ClientPinRoomResponse");
lookupMap.put(30616, "ProtoClientRoomReport.ClientRoomReportResponse");
lookupMap.put(30617, "ProtoClientRegisterDevice.ClientRegisterDeviceResponse");
+ lookupMap.put(30618, "ProtoClientGetPromote.ClientGetPromoteResponse");
// FileUpload,Download 7xx , 307xx
lookupMap.put(30700, "ProtoFileUploadOption.FileUploadOptionResponse");
diff --git a/app/src/main/java/net/iGap/helper/HelperGetDataFromOtherApp.java b/app/src/main/java/net/iGap/helper/HelperGetDataFromOtherApp.java
index 9e5d1c7..f66dbe8 100644
--- a/app/src/main/java/net/iGap/helper/HelperGetDataFromOtherApp.java
+++ b/app/src/main/java/net/iGap/helper/HelperGetDataFromOtherApp.java
@@ -38,13 +38,15 @@
public class HelperGetDataFromOtherApp {
public static boolean hasSharedData = false;
- // after use intent set this to false
- public static FileType messageType = null;
- public static String message = "";
- public static ArrayList messageFileAddress;
- public static ArrayList fileTypeArray = new ArrayList();
+ public static ArrayList sharedList = new ArrayList();
private Intent intent;
+ public class SharedData {
+ public String message = "";
+ public String address = "";
+ public FileType fileType;
+ }
+
public HelperGetDataFromOtherApp(Intent intent) {
this.intent = intent;
@@ -92,8 +94,7 @@ public static FileType getMimeType(Uri uri) {
*/
private void checkData(Intent intent) {
- messageType = null;
- fileTypeArray.clear();
+ sharedList.clear();
String action = intent.getAction();
String type = intent.getType();
@@ -103,7 +104,7 @@ private void checkData(Intent intent) {
if (type.equals("text/plain")) {
- if ((Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM)!=null)
+ if ((Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM) != null)
SetOutPutSingleFile(FileType.file);
else
handleSendText(intent);
@@ -153,13 +154,12 @@ private void SetOutPutSingleFile(FileType type) {
Uri fileAddressUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); // get file attachment
//String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); get text
if (fileAddressUri != null) {
- messageType = type;
String extension = HelperString.dotSplit(fileAddressUri.getPath());
/**
* check mp4 because telegram sometimes send mp4 format with image type!!!
*/
if (extension != null && extension.equals("mp4")) {
- messageType = FileType.video;
+ type = FileType.video;
}
String _path = null;
@@ -167,20 +167,30 @@ private void SetOutPutSingleFile(FileType type) {
if (fileAddressUri.getScheme() != null && fileAddressUri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
if (_path == null) {
- _path = getPathN(fileAddressUri, messageType);
+ _path = getPathN(fileAddressUri, type);
} else {
try {
FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", new File(_path));
} catch (IllegalArgumentException e) {
- _path = getPathN(fileAddressUri, messageType);
+ _path = getPathN(fileAddressUri, type);
}
}
}
if (_path != null) {
hasSharedData = true;
- messageFileAddress = new ArrayList();
- messageFileAddress.add(_path);
+
+ SharedData _SharedData = new SharedData();
+ _SharedData.address = _path;
+ _SharedData.fileType = type;
+
+ String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (sharedText != null) {
+ _SharedData.message = sharedText;
+ }
+
+ sharedList.add(_SharedData);
+
}
}
@@ -193,9 +203,6 @@ private void SetOutPutMultipleFile(FileType type) {
ArrayList fileAddressUri = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (fileAddressUri != null) {
- messageType = type;
- messageFileAddress = new ArrayList<>();
-
for (int i = 0; i < fileAddressUri.size(); i++) {
Uri _Uri = fileAddressUri.get(i);
String _path = null;
@@ -204,12 +211,12 @@ private void SetOutPutMultipleFile(FileType type) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && _Uri.getScheme() != null && _Uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
if (_path == null) {
- _path = getPathN(_Uri, messageType);
+ _path = getPathN(_Uri, type);
} else {
try {
FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", new File(_path));
} catch (IllegalArgumentException e) {
- _path = getPathN(_Uri, messageType);
+ _path = getPathN(_Uri, type);
}
}
}
@@ -217,13 +224,19 @@ private void SetOutPutMultipleFile(FileType type) {
if (_path != null) {
FileType fileType = getMimeType(fileAddressUri.get(i));
if (fileType != null) {
- messageFileAddress.add(_path);
- fileTypeArray.add(fileType);
+ SharedData _SharedData = new SharedData();
+ _SharedData.address = _path;
+ _SharedData.fileType = fileType;
+ String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (sharedText != null) {
+ _SharedData.message = sharedText;
+ }
+ sharedList.add(_SharedData);
}
}
}
- if (messageFileAddress.size() > 0) {
+ if (sharedList.size() > 0) {
hasSharedData = true;
}
}
@@ -235,8 +248,10 @@ private void handleSendText(Intent intent) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
hasSharedData = true;
- messageType = FileType.message;
- message = sharedText;
+ SharedData _SharedData = new SharedData();
+ _SharedData.fileType = FileType.message;
+ _SharedData.message = sharedText;
+ sharedList.add(_SharedData);
} else {
SetOutPutSingleFile(FileType.file);
}
@@ -265,6 +280,6 @@ private void getAllDAtaInIntent(Intent intent) {
//*****************************************************************************************************
public enum FileType {
- message, video, file, audio, image
+ message, video, file, audio, image,gif
}
}
diff --git a/app/src/main/java/net/iGap/helper/HelperLogout.java b/app/src/main/java/net/iGap/helper/HelperLogout.java
index 861499e..f544c4b 100644
--- a/app/src/main/java/net/iGap/helper/HelperLogout.java
+++ b/app/src/main/java/net/iGap/helper/HelperLogout.java
@@ -18,6 +18,7 @@
import net.iGap.G;
import net.iGap.Theme;
import net.iGap.activities.ActivityRegisteration;
+import net.iGap.module.AppUtils;
import net.iGap.module.LoginActions;
import net.iGap.module.SHP_SETTING;
@@ -35,11 +36,11 @@ public static void logout() {
@Override
public void run() {
HelperRealm.realmTruncate();
- HelperNotificationAndBadge.cleanBadge();
SharedPreferences sharedPreferences = G.context.getSharedPreferences(SHP_SETTING.FILE_NAME, Context.MODE_PRIVATE);
sharedPreferences.edit().clear().apply();
resetStaticField();
+ AppUtils.cleanBadge();
Intent intent = new Intent(G.context, ActivityRegisteration.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
new LoginActions();
diff --git a/app/src/main/java/net/iGap/helper/HelperMessageResponse.java b/app/src/main/java/net/iGap/helper/HelperMessageResponse.java
index e4ae8fe..b77416a 100644
--- a/app/src/main/java/net/iGap/helper/HelperMessageResponse.java
+++ b/app/src/main/java/net/iGap/helper/HelperMessageResponse.java
@@ -89,31 +89,7 @@ public void execute(Realm realm) {
if (!roomMessage.getAuthor().getHash().equals(authorHash) && (room.getLastMessage() == null || (room.getLastMessage() != null && room.getLastMessage().getMessageId() < roomMessage.getMessageId()))) {
room.setUnreadCount(room.getUnreadCount() + 1);
- if (!room.getMute()) {
-// if (G.isAppInFg || AttachFile.isInAttach) {
-// // HelperNotificationAndBadge.updateBadgeOnly(realm,-1);
-// } else {
-
- if (roomType != ProtoGlobal.Room.Type.CHANNEL) {
- G.handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- G.helperNotificationAndBadge.checkAlert(true, roomType, roomId);
- }
- }, 200);
- } else {
- G.handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- new HelperNotificationChannel().initSetting(roomId);
- }
- }, 200);
- }
-
-// }
- }
-
-
+ HelperNotification.getInstance().addMessage(roomId, roomMessage, roomType, room, realm);
}
/**
diff --git a/app/src/main/java/net/iGap/helper/HelperMimeType.java b/app/src/main/java/net/iGap/helper/HelperMimeType.java
index 57ad792..1a27fd4 100644
--- a/app/src/main/java/net/iGap/helper/HelperMimeType.java
+++ b/app/src/main/java/net/iGap/helper/HelperMimeType.java
@@ -32,7 +32,7 @@
public class HelperMimeType {
public static boolean isFileImage(String path) {
- return path.endsWith(".jpg") || path.endsWith(".bmp") || path.endsWith(".png") || path.endsWith(".gif") || path.endsWith(".jpeg") || path.endsWith(".tiff") || path.endsWith(".tif");
+ return path.endsWith(".jpg") || path.endsWith(".bmp") || path.endsWith(".webp") || path.endsWith(".png") || path.endsWith(".gif") || path.endsWith(".jpeg") || path.endsWith(".tiff") || path.endsWith(".tif") || path.endsWith(".ai");
}
public static boolean isFileVideo(String path) {
@@ -57,11 +57,12 @@ private static boolean isFileAudio(String path) {
}
private static boolean isFileText(String path) {
- return path.endsWith(".txt") || path.endsWith(".csv") || path.endsWith(".xml") || path.endsWith(".html");
+ return path.endsWith(".txt") || path.endsWith(".csv") || path.endsWith(".xml") || path.endsWith(".html") || path.endsWith(".docx") || path.endsWith(".doc")
+ || path.endsWith(".docs");
}
private static boolean isFilePakage(String path) {
- return path.endsWith(".gz") || path.endsWith(".gz") || path.endsWith(".zip");
+ return path.endsWith(".gz") || path.endsWith(".gz") || path.endsWith(".zip") || path.endsWith(".rar");
}
/**
diff --git a/app/src/main/java/net/iGap/helper/HelperNotification.java b/app/src/main/java/net/iGap/helper/HelperNotification.java
new file mode 100644
index 0000000..d93dec5
--- /dev/null
+++ b/app/src/main/java/net/iGap/helper/HelperNotification.java
@@ -0,0 +1,890 @@
+package net.iGap.helper;
+
+
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.hardware.display.DisplayManager;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.RemoteInput;
+import android.view.Display;
+
+import net.iGap.G;
+import net.iGap.R;
+import net.iGap.activities.ActivityMain;
+import net.iGap.activities.ActivityPopUpNotification;
+import net.iGap.fragments.FragmentChat;
+import net.iGap.interfaces.OnActivityChatStart;
+import net.iGap.module.AppUtils;
+import net.iGap.module.AttachFile;
+import net.iGap.module.ChatSendMessageUtil;
+import net.iGap.module.SHP_SETTING;
+import net.iGap.module.TimeUtils;
+import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmAvatar;
+import net.iGap.realm.RealmAvatarFields;
+import net.iGap.realm.RealmNotificationSetting;
+import net.iGap.realm.RealmRoom;
+import net.iGap.realm.RealmRoomMessage;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import io.realm.Realm;
+
+import static net.iGap.G.context;
+import static net.iGap.proto.ProtoGlobal.RoomMessageLog.Type.PINNED_MESSAGE;
+
+
+public class HelperNotification {
+
+ static final String KEY_ROOM_ID = "KEY_ROOM_ID";
+ static final String KEY_NOTIFICATION_ID = "KEY_NOTIFICATION_ID";
+ static final String REPLY_ACTION = "REPLY_ACTION";
+ static final String UNREAD_ACTION = "UNREAD_ACTION";
+ static final String KEY_REPLY = "KEY_REPLY";
+ static final String KEY_CHAT_TYPE = "KEY_CHAT_TYPE";
+ static final String KEY_MESSAGE_ID = "KEY_MESSAGE_ID";
+
+ private static HelperNotification _HelperNotification;
+
+ public boolean isChatRoomNow = false;
+
+ private int listSize = 20;
+ private ArrayList messageList = new ArrayList<>(listSize + 1);
+ private SettingValue settingValue;
+ private ShowNotification showNotification;
+ private ShowPopUp showPopUp;
+
+ //**************************************************************
+
+ public class StructNotification {
+ public long roomId;
+ public long senderId;
+ public ProtoGlobal.RoomMessage roomMessage;
+ public ProtoGlobal.Room.Type roomType;
+ public String name = "";
+ public String message = "";
+ public String time = "";
+ public String initialize;
+ public String color;
+ }
+
+ private class SettingValue {
+
+ boolean m_alert;
+ boolean m_preview;
+ int m_ledColor;
+ int m_vibration;
+ int m_popUp;
+ int m_sound;
+
+ boolean g_alert;
+ boolean g_preview;
+ int g_ledColor;
+ int g_vibration;
+ int g_popUp;
+ int g_sound;
+
+ boolean separateNotification;
+
+ boolean inAppSound;
+ boolean inAppVibration;
+ boolean inAppPreview;
+ boolean soundInChat;
+
+
+ SettingValue() {
+
+ SharedPreferences sharedPreferences = G.context.getSharedPreferences(SHP_SETTING.FILE_NAME, Context.MODE_PRIVATE);
+
+ m_alert = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_ALERT_MESSAGE, 1));
+ m_preview = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_MESSAGE_PREVIEW_MESSAGE, 1));
+ m_ledColor = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_LED_COLOR_MESSAGE, -8257792);
+ m_vibration = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_VIBRATE_MESSAGE, 0);
+ m_popUp = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_POPUP_NOTIFICATION_MESSAGE, 0);
+ m_sound = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_SOUND_MESSAGE_POSITION, 0);
+
+ g_alert = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_ALERT_GROUP, 1));
+ g_preview = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_MESSAGE_PREVIEW_GROUP, 1));
+ g_ledColor = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_LED_COLOR_GROUP, -8257792);
+ g_vibration = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_VIBRATE_GROUP, 0);
+ g_popUp = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_POPUP_NOTIFICATION_GROUP, 0);
+ g_sound = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_SOUND_GROUP_POSITION, 0);
+
+ separateNotification = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_SEPARATE_NOTIFICATION, 1));
+
+ inAppSound = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_SOUND_NEW, 1));
+ inAppVibration = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_VIBRATE_NEW, 1));
+ inAppPreview = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_PREVIEW_NEW, 1));
+ soundInChat = getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_CHAT_SOUND_NEW, 1));
+ }
+
+ private boolean getBoolean(int num) {
+ return num != 0;
+ }
+
+ }
+
+ private class ShowNotification {
+
+ String CHANNEL_ID = "iGap_channel_01";
+
+ private NotificationManager notificationManager;
+ private Notification notification;
+ private int defaultNotificationId = 20;
+ private String mHeader = "";
+ private String mContent = "";
+ private Bitmap mBitmapIcon = null;
+ private int unreadMessageCount = 0;
+ private int countUniqueChat = 0;
+ private int delayAlarm = 5000;
+ private long currentAlarm;
+ private int notificationIconSrc;
+
+ class StructNotificationMap {
+ int notificationId;
+ Notification notification;
+ }
+
+ private HashMap notificationMap = new HashMap<>();
+
+ int vibrator;
+ int sound;
+ int led;
+ boolean messagePreview;
+ Realm realm;
+
+ ShowNotification() {
+ notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ CharSequence name = G.context.getString(R.string.channel_name_notification);// The user-visible name of the channel.
+ @SuppressLint("WrongConstant") NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(mChannel);
+ }
+ }
+
+ private void show(int vibrator, int sound, int led, boolean messagePreview, Realm realm) {
+ int[] result = AppUtils.updateBadgeOnly(realm, -1);
+ unreadMessageCount = result[0];
+ countUniqueChat = result[1];
+
+ this.vibrator = vibrator;
+ this.sound = sound;
+ this.led = led;
+ this.messagePreview = messagePreview;
+ this.realm = realm;
+
+ setNotification();
+ }
+
+ private void setNotification() {
+ StructNotificationMap np = null;
+ int notificationId = defaultNotificationId;
+ if (settingValue.separateNotification) {
+ if (notificationMap.containsKey(messageList.get(0).roomId)) {
+ notificationId = notificationMap.get(messageList.get(0).roomId).notificationId;
+ } else {
+ np = new StructNotificationMap();
+ np.notificationId = ++defaultNotificationId;
+ notificationMap.put(messageList.get(0).roomId, np);
+ notificationId = defaultNotificationId;
+ }
+ }
+
+ PendingIntent pi;
+ Intent intent = new Intent(context, ActivityMain.class);
+
+ if (countUniqueChat == 1 || settingValue.separateNotification) {
+ intent.putExtra(ActivityMain.openChat, messageList.get(0).roomId);
+ }
+
+ pi = PendingIntent.getActivity(context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ getNotificationSmallInfo();
+
+ String messageToShow = messageList.get(0).message;
+ if (messageToShow.length() > 40) {
+ messageToShow = messageToShow.substring(0, 40);
+ }
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
+ .setSmallIcon(getNotificationIcon())
+ .setLargeIcon(mBitmapIcon)
+ .setChannelId(CHANNEL_ID)
+ .setContentTitle(mHeader)
+ .setContentText(mContent)
+ .setCategory(NotificationCompat.CATEGORY_MESSAGE)
+ .setStyle(getBigStyle())
+ .setContentIntent(pi);
+
+ if (settingValue.separateNotification) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && messageList.get(0).roomType != ProtoGlobal.Room.Type.CHANNEL) {
+ builder.addAction(getReplayAction(notificationId));
+ }
+ builder.addAction(getUnreadAction(notificationId));
+ }
+
+ notification = builder.build();
+
+ if (currentAlarm + delayAlarm < System.currentTimeMillis()) {
+ alarmNotification(messageToShow);
+ }
+
+ if (np != null) {
+ np.notification = notification;
+ }
+
+ notificationManager.notify(notificationId, notification);
+ }
+
+ private NotificationCompat.Action getReplayAction(int notificationId) {
+ String label = G.context.getResources().getString(R.string.replay);
+ RemoteInput remoteInput = new RemoteInput.Builder(KEY_REPLY).setLabel(label).build();
+ Intent intent = new Intent(context, RemoteActionReceiver.class);
+ intent.putExtra(KEY_NOTIFICATION_ID, notificationId);
+ intent.putExtra(KEY_ROOM_ID, messageList.get(0).roomId);
+ intent.putExtra(KEY_CHAT_TYPE, messageList.get(0).roomType);
+ intent.setAction(REPLY_ACTION);
+ PendingIntent replyPendingIntent = PendingIntent.getBroadcast(G.context, notificationId + 5000, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ return new NotificationCompat.Action.Builder(notificationIconSrc, label, replyPendingIntent).addRemoteInput(remoteInput).build();
+ }
+
+ private NotificationCompat.Action getUnreadAction(int notificationId) {
+
+ Intent intent = new Intent(context, RemoteActionReceiver.class);
+ intent.putExtra(KEY_NOTIFICATION_ID, notificationId);
+ intent.putExtra(KEY_ROOM_ID, messageList.get(0).roomId);
+ intent.putExtra(KEY_MESSAGE_ID, messageList.get(0).roomMessage.getMessageId());
+ intent.putExtra(KEY_CHAT_TYPE, messageList.get(0).roomType);
+ intent.setAction(UNREAD_ACTION);
+ PendingIntent unreadIntent = PendingIntent.getBroadcast(G.context, notificationId + 10000, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ return new NotificationCompat.Action.Builder(notificationIconSrc, G.context.getString(R.string.mark_as_unread), unreadIntent).build();
+ }
+
+ private NotificationCompat.InboxStyle getBigStyle() {
+
+ if (settingValue.separateNotification) {
+ return null;
+ }
+
+ NotificationCompat.InboxStyle _style = new NotificationCompat.InboxStyle();
+
+ if (countUniqueChat == 1) {
+ _style.setBigContentTitle(messageList.get(0).name);
+
+ for (int i = 0; i < unreadMessageCount && i < 3; i++) {
+ _style.addLine(messageList.get(i).message);
+ }
+ } else {
+ for (int i = 0; i < unreadMessageCount && i < 3; i++) {
+ _style.addLine(messageList.get(i).name + " " + messageList.get(i).message);
+ }
+ }
+
+ if (unreadMessageCount > 3) {
+ _style.addLine("....");
+ }
+
+ String chatCount = "";
+
+ if (countUniqueChat == 1) {
+ chatCount = context.getString(R.string.from) + " " + countUniqueChat + " " + context.getString(R.string.chat);
+ } else if (countUniqueChat > 1) {
+ chatCount = context.getString(R.string.from) + " " + countUniqueChat + " " + context.getString(R.string.chats);
+ }
+
+ String newMessage = "";
+ if (unreadMessageCount == 1) {
+ newMessage = context.getString(R.string.new_message);
+ chatCount = "";
+ } else {
+ newMessage = context.getString(R.string.new_messages);
+ }
+
+ String _summary = unreadMessageCount + " " + newMessage + " " + chatCount;
+ _style.setSummaryText(_summary);
+
+ return _style;
+ }
+
+ private void getNotificationSmallInfo() {
+
+ String avatarPath = null;
+ if (unreadMessageCount == 1 || settingValue.separateNotification) {
+
+ mHeader = messageList.get(0).name;
+ mContent = messageList.get(0).message;
+ } else {
+ mHeader = context.getString(R.string.igap);
+ mContent = messageList.get(0).message;
+
+ String s = "";
+ if (countUniqueChat == 1) {
+ s = " " + context.getString(R.string.chat);
+ } else if (countUniqueChat > 1) {
+ s = " " + context.getString(R.string.chats);
+ }
+
+ mContent = String.format(" %d " + context.getString(R.string.new_messages_from) + " %d " + s, unreadMessageCount, countUniqueChat);
+ }
+
+ mBitmapIcon = BitmapFactory.decodeResource(null, R.mipmap.icon);
+
+ if (countUniqueChat == 1 || settingValue.separateNotification) {
+
+ RealmAvatar realmAvatarPath = realm.where(RealmAvatar.class).equalTo(RealmAvatarFields.OWNER_ID, messageList.get(0).senderId).findFirst();
+ if (realmAvatarPath != null) {
+ if (realmAvatarPath.getFile().isFileExistsOnLocal()) {
+ avatarPath = realmAvatarPath.getFile().getLocalFilePath();
+ } else if (realmAvatarPath.getFile().isThumbnailExistsOnLocal()) {
+ avatarPath = realmAvatarPath.getFile().getLocalThumbnailPath();
+ }
+ }
+ if (avatarPath != null) {
+ try {
+ BitmapFactory.Options option = new BitmapFactory.Options();
+ option.outHeight = 64;
+ option.outWidth = 64;
+
+ Bitmap bitmap = BitmapFactory.decodeFile(avatarPath, option);
+ if (bitmap != null) {
+ mBitmapIcon = bitmap;
+ }
+ } catch (OutOfMemoryError e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+ }
+
+ private int getNotificationIcon() {
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ notificationIconSrc = R.mipmap.white_icon;
+ } else {
+ notificationIconSrc = R.mipmap.iconsmal;
+ }
+
+ return notificationIconSrc;
+ }
+
+ private void alarmNotification(String messageToShow) {
+
+ notification.tickerText = "";
+ notification.vibrate = new long[]{0, 0, 0};
+ notification.sound = null;
+
+ if (G.isAppInFg) {
+ if (!isChatRoomNow) {
+
+ if (settingValue.inAppVibration) {
+ notification.vibrate = setVibrator(vibrator);
+ }
+ if (settingValue.inAppSound) {
+ notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + setSound(sound));
+ }
+ if (settingValue.inAppPreview) {
+ notification.tickerText = messageList.get(0).name + " " + messageToShow;
+ }
+ } else if (settingValue.soundInChat) {
+ notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + setSound(sound));
+ }
+ } else {
+ notification.vibrate = setVibrator(vibrator);
+ notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + setSound(sound));
+
+ if (messagePreview) {
+ notification.tickerText = messageList.get(0).name + " " + messageToShow;
+ }
+ }
+
+ notification.flags |= Notification.FLAG_SHOW_LIGHTS;
+ notification.ledARGB = led;
+ notification.ledOnMS = 1000;
+ notification.ledOffMS = 2000;
+
+ currentAlarm = System.currentTimeMillis();
+ }
+
+ private int setSound(int which) {
+ int sound = R.raw.igap;
+ switch (which) {
+ case 0:
+ sound = R.raw.igap;
+ break;
+ case 1:
+ sound = R.raw.aooow;
+ break;
+ case 2:
+ sound = R.raw.bbalert;
+ break;
+ case 3:
+ sound = R.raw.boom;
+ break;
+ case 4:
+ sound = R.raw.bounce;
+ break;
+ case 5:
+ sound = R.raw.doodoo;
+ break;
+ case 6:
+ sound = R.raw.jing;
+ break;
+ case 7:
+ sound = R.raw.lili;
+ break;
+ case 8:
+ sound = R.raw.msg;
+ break;
+ case 9:
+ sound = R.raw.newa;
+ break;
+ case 10:
+ sound = R.raw.none;
+ break;
+ case 11:
+ sound = R.raw.onelime;
+ break;
+ case 12:
+ sound = R.raw.tone;
+ break;
+ case 13:
+ sound = R.raw.woow;
+ break;
+ }
+ return sound;
+ }
+
+ private long[] setVibrator(int vb) {
+
+ long[] intVibrator = new long[]{};
+
+ AudioManager am2 = (AudioManager) G.context.getSystemService(Context.AUDIO_SERVICE);
+
+ if (am2 != null && am2.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
+ return new long[]{0, 0, 0};
+ }
+
+ switch (vb) {
+ case 0:
+ intVibrator = new long[]{0, 300, 0};
+ break;
+ case 1:
+ intVibrator = new long[]{0, 200, 0};
+ break;
+ case 2:
+ intVibrator = new long[]{0, 700, 0};
+ break;
+ case 3:
+
+ switch (am2.getRingerMode()) {
+ case AudioManager.RINGER_MODE_SILENT:
+ intVibrator = new long[]{0, 0, 0};
+ break;
+ case AudioManager.RINGER_MODE_VIBRATE:
+ intVibrator = new long[]{0, 300, 0};
+ break;
+ case AudioManager.RINGER_MODE_NORMAL:
+ intVibrator = new long[]{0, 0, 0};
+ break;
+ }
+ break;
+ case 4:
+ intVibrator = new long[]{0, 0, 0};
+ break;
+ }
+ return intVibrator;
+ }
+
+ public void updateNotification(long roomId) {
+ if (notificationManager != null) {
+ StructNotificationMap sp = notificationMap.get(roomId);
+ if (sp != null && sp.notification != null) {
+ notificationManager.notify(sp.notificationId, sp.notification);
+ }
+ }
+ }
+
+ }
+
+ private class ShowPopUp {
+
+
+ void checkPopUp(int popUpMod) {
+
+ boolean result = false;
+
+ switch (popUpMod) {
+
+ case 0:
+ // no popup
+ break;
+ case 1:
+ //only when screen on
+ if (isScreenOn(context)) {
+ result = true;
+ }
+ break;
+ case 2:
+ //only when screen off
+ if (!isScreenOn(context)) {
+ result = true;
+ }
+ break;
+ case 3:
+ //always
+ result = true;
+ break;
+ }
+
+
+ if (result) {
+ if (getForegroundApp() || ActivityPopUpNotification.isPopUpVisible) { //check that any other program is in background
+
+ if (ActivityPopUpNotification.isPopUpVisible) {
+ if (ActivityPopUpNotification.popUpListener != null) {
+ ActivityPopUpNotification.popUpListener.onMessageReceive();
+ }
+ } else {
+ Intent intent = new Intent(context, ActivityPopUpNotification.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ context.startActivity(intent);
+ }
+
+ }
+ }
+
+
+ }
+
+
+ private boolean isScreenOn(Context context) {
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
+ @SuppressLint("WrongConstant") DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
+ boolean screenOn = false;
+ for (Display display : dm.getDisplays()) {
+ if (display.getState() != Display.STATE_OFF) {
+ screenOn = true;
+ }
+ }
+ return screenOn;
+ } else {
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ return pm.isScreenOn();
+ }
+ }
+
+ private boolean getForegroundApp() {
+
+ ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
+ List taskInfo = am.getRunningTasks(1);
+
+ try {
+ if (taskInfo.get(0).topActivity.getClassName().toString().toLowerCase().contains("launcher"))
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return false;
+ }
+
+
+ }
+
+ //**************************************************************
+
+ public static HelperNotification getInstance() {
+ if (_HelperNotification == null) {
+ _HelperNotification = new HelperNotification();
+ _HelperNotification.updateSettingValue();
+ _HelperNotification.init();
+ }
+ return _HelperNotification;
+ }
+
+ public void updateSettingValue() {
+ settingValue = new SettingValue();
+ }
+
+ private void init() {
+ showNotification = new ShowNotification();
+ showPopUp = new ShowPopUp();
+ }
+
+ public void addMessage(long roomId, ProtoGlobal.RoomMessage roomMessage, ProtoGlobal.Room.Type roomType, RealmRoom room, Realm realm) {
+
+ if (roomId == FragmentChat.lastChatRoomId) {
+ return;
+ }
+
+ if (!room.getMute()) {
+
+ RealmNotificationSetting notificationSetting = null;
+ boolean defaultAlert = false;
+ int popUpMode = 0;
+ int vibrator = 0;
+ int sound = 0;
+ int led = 0;
+ boolean messagePreview = false;
+
+ switch (roomType) {
+ case CHAT:
+ if (room.getChatRoom() != null) {
+ notificationSetting = room.getChatRoom().getRealmNotificationSetting();
+ }
+ defaultAlert = settingValue.m_alert;
+ vibrator = settingValue.m_vibration;
+ sound = settingValue.m_sound;
+ led = settingValue.m_ledColor;
+ messagePreview = settingValue.m_preview;
+ popUpMode = settingValue.m_popUp;
+ break;
+ case GROUP:
+ if (room.getGroupRoom() != null) {
+ notificationSetting = room.getGroupRoom().getRealmNotificationSetting();
+ }
+ defaultAlert = settingValue.g_alert;
+ vibrator = settingValue.g_vibration;
+ sound = settingValue.g_sound;
+ led = settingValue.g_ledColor;
+ messagePreview = settingValue.g_preview;
+ popUpMode = settingValue.g_popUp;
+ break;
+ case CHANNEL:
+ if (room.getChannelRoom() != null) {
+ notificationSetting = room.getChannelRoom().getRealmNotificationSetting();
+ }
+ defaultAlert = settingValue.g_alert;
+ vibrator = settingValue.g_vibration;
+ sound = settingValue.g_sound;
+ led = settingValue.g_ledColor;
+ messagePreview = settingValue.g_preview;
+ popUpMode = settingValue.g_popUp;
+ break;
+ }
+
+ if (notificationSetting != null) {
+ if (notificationSetting.getNotification() == 2 || (notificationSetting.getNotification() == 0 && !defaultAlert)) { // notification in selected room is disable
+ return;
+ }
+
+ if (notificationSetting.getVibrate() != -1) {
+ vibrator = notificationSetting.getVibrate();
+ }
+ if (notificationSetting.getIdRadioButtonSound() != -1) {
+ sound = notificationSetting.getIdRadioButtonSound();
+ }
+ if (notificationSetting.getLedColor() != -1) {
+ led = notificationSetting.getLedColor();
+ }
+ } else if (!defaultAlert) {
+ return;
+ }
+
+
+ add(roomId, roomMessage, roomType, room);
+
+
+ if ((!G.isAppInFg && !AttachFile.isInAttach) || settingValue.inAppPreview || settingValue.inAppSound || settingValue.inAppVibration || settingValue.soundInChat) {
+ showNotification.show(vibrator, sound, led, messagePreview, realm);
+ }
+
+ if (!G.isAppInFg && !AttachFile.isInAttach) {
+ showPopUp.checkPopUp(popUpMode);
+ }
+
+
+ }
+
+
+ }
+
+ private void add(long roomId, ProtoGlobal.RoomMessage roomMessage, ProtoGlobal.Room.Type roomType, RealmRoom room) {
+
+ StructNotification sn = new StructNotification();
+ sn.roomId = roomId;
+ sn.roomMessage = roomMessage;
+ sn.roomType = roomType;
+ sn.time = TimeUtils.toLocal(roomMessage.getUpdateTime(), G.CHAT_MESSAGE_TIME);
+ sn.message = parseMessage(roomMessage);
+ sn.name = room.getTitle() + ":";
+ sn.senderId = room.getType() == ProtoGlobal.Room.Type.CHAT ? room.getChatRoom().getPeerId() : room.getId();
+ sn.initialize = room.getInitials();
+ sn.color = room.getColor();
+
+ messageList.add(0, sn);
+
+ if (messageList.size() > listSize) {
+ messageList.remove(listSize);
+ }
+
+ }
+
+ private String getTextOfMessageType(ProtoGlobal.RoomMessageType messageType) {
+
+ switch (messageType) {
+ case VOICE:
+ return G.context.getString(R.string.voice_message);
+ case VIDEO:
+ return G.context.getString(R.string.video_message);
+ case FILE:
+ return G.context.getString(R.string.file_message);
+ case AUDIO:
+ return G.context.getString(R.string.audio_message);
+ case IMAGE:
+ return G.context.getString(R.string.image_message);
+ case CONTACT:
+ return G.context.getString(R.string.contact_message);
+ case GIF:
+ return G.context.getString(R.string.gif_message);
+ case LOCATION:
+ return G.context.getString(R.string.location_message);
+ }
+
+ return "";
+ }
+
+ private String parseMessage(ProtoGlobal.RoomMessage roomMessage) {
+ String text = "";
+ try {
+ if (roomMessage.hasLog()) {
+ if (roomMessage.getLog().getType() == PINNED_MESSAGE) {
+ text = roomMessage.getReplyTo().getMessage();
+ } else if (roomMessage.getReplyTo() != null) {
+ text = AppUtils.conversionMessageType(roomMessage.getReplyTo().getMessageType());
+ }
+ } else {
+ text = roomMessage.hasForwardFrom() ? roomMessage.getForwardFrom().getMessage() : roomMessage.getMessage();
+ }
+
+ if (text.length() < 1) {
+ if (roomMessage.hasReplyTo())
+ text = roomMessage.getReplyTo().getMessage();
+ }
+
+ if (text.length() < 1) {
+ text = getTextOfMessageType(roomMessage.getMessageType());
+ }
+
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+
+ return text;
+ }
+
+ public ArrayList getMessageList() {
+ return messageList;
+ }
+
+ public void cancelNotification() {
+ showNotification.notificationManager.cancelAll();
+ }
+
+ public static class RemoteActionReceiver extends BroadcastReceiver {
+
+ public RemoteActionReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ if (intent == null || intent.getAction() == null) {
+ return;
+ }
+
+ String message = "";
+ int notificationId = intent.getIntExtra(KEY_NOTIFICATION_ID, 0);
+ long roomId = intent.getLongExtra(KEY_ROOM_ID, 0);
+ ProtoGlobal.Room.Type chatType = (ProtoGlobal.Room.Type) intent.getSerializableExtra(KEY_CHAT_TYPE);
+
+ switch (intent.getAction()) {
+ case REPLY_ACTION:
+
+ Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
+ if (remoteInput != null) {
+ message = (String) remoteInput.getCharSequence(KEY_REPLY);
+ }
+
+ if (notificationId > 0) {
+ HelperNotification.getInstance().showNotification.updateNotification(roomId);
+ }
+
+ if (message != null && message.length() > 0 && roomId > 0) {
+ String identity = Long.toString(System.currentTimeMillis());
+ RealmRoomMessage.makeTextMessage(roomId, Long.parseLong(identity), message);
+ new ChatSendMessageUtil().newBuilder(chatType, ProtoGlobal.RoomMessageType.TEXT, roomId).message(message).sendMessage(identity);
+ }
+
+ break;
+
+ case UNREAD_ACTION:
+ long messageId = intent.getLongExtra(KEY_MESSAGE_ID, 0);
+
+ if (notificationId > 0) {
+ HelperNotification.getInstance().showNotification.notificationManager.cancel(notificationId);
+ }
+
+ if (roomId > 0 && messageId > 0) {
+
+ G.handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Realm realm = Realm.getDefaultInstance();
+ if (chatType == ProtoGlobal.Room.Type.CHAT || chatType == ProtoGlobal.Room.Type.GROUP) {
+ RealmRoomMessage.fetchMessages(realm, roomId, new OnActivityChatStart() {
+ @Override
+ public void sendSeenStatus(RealmRoomMessage message) {
+ G.chatUpdateStatusUtil.sendUpdateStatus(chatType, roomId, message.getMessageId(), ProtoGlobal.RoomMessageStatus.SEEN);
+ }
+
+ @Override
+ public void resendMessage(RealmRoomMessage message) {
+
+ }
+
+ @Override
+ public void resendMessageNeedsUpload(RealmRoomMessage message, long messageId) {
+
+ }
+ });
+ }
+
+ RealmRoom.setCount(roomId, 0);
+
+ G.handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ AppUtils.updateBadgeOnly(realm, roomId);
+ realm.close();
+ }
+ }, 250);
+ }
+ }, 5);
+ }
+ break;
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/iGap/helper/HelperPublicMethod.java b/app/src/main/java/net/iGap/helper/HelperPublicMethod.java
index 46f1f5d..c662f61 100644
--- a/app/src/main/java/net/iGap/helper/HelperPublicMethod.java
+++ b/app/src/main/java/net/iGap/helper/HelperPublicMethod.java
@@ -15,6 +15,7 @@
import android.os.Looper;
import net.iGap.G;
+import net.iGap.R;
import net.iGap.activities.ActivityMain;
import net.iGap.interfaces.OnChatGetRoom;
import net.iGap.interfaces.OnUserInfoResponse;
@@ -50,7 +51,7 @@ public void onChatGetRoom(final ProtoGlobal.Room room) {
if (onError != null) {
onError.error();
}
-
+ RealmRoom.putOrUpdate(room);
getUserInfo(peerId, room.getId(), onComplete, onError);
G.onChatGetRoom = null;
@@ -76,12 +77,10 @@ public void onChatGetRoomError(int majorCode, int minorCode) {
if (G.userLogin) {
new RequestChatGetRoom().chatGetRoom(peerId);
} else {
- G.handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- goToChatRoom(peerId, onComplete, onError);
- }
- }, 1000);
+ HelperError.showSnackMessage(G.context.getString(R.string.there_is_no_connection_to_server), false);
+ if (onError != null) {
+ onError.error();
+ }
}
}
realm.close();
diff --git a/app/src/main/java/net/iGap/helper/HelperUrl.java b/app/src/main/java/net/iGap/helper/HelperUrl.java
index e1a90bc..b3e3b9d 100644
--- a/app/src/main/java/net/iGap/helper/HelperUrl.java
+++ b/app/src/main/java/net/iGap/helper/HelperUrl.java
@@ -12,11 +12,14 @@
import android.app.Activity;
import android.content.ActivityNotFoundException;
+import android.content.ClipData;
+import android.content.ClipboardManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
+import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
@@ -28,22 +31,27 @@
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.TextView;
+import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import net.iGap.G;
import net.iGap.R;
+import net.iGap.fragments.FragmentAddContact;
import net.iGap.fragments.FragmentChat;
import net.iGap.fragments.FragmentContactsProfile;
import net.iGap.interfaces.OnAvatarGet;
+import net.iGap.interfaces.OnChatGetRoom;
import net.iGap.interfaces.OnClientCheckInviteLink;
import net.iGap.interfaces.OnClientGetRoomMessage;
import net.iGap.interfaces.OnClientJoinByInviteLink;
import net.iGap.interfaces.OnClientResolveUsername;
import net.iGap.module.AndroidUtils;
import net.iGap.module.CircleImageView;
+import net.iGap.module.DialogAnimation;
import net.iGap.module.SHP_SETTING;
import net.iGap.proto.ProtoClientResolveUsername;
import net.iGap.proto.ProtoGlobal;
@@ -52,6 +60,7 @@
import net.iGap.realm.RealmRoomFields;
import net.iGap.realm.RealmRoomMessage;
import net.iGap.realm.RealmRoomMessageFields;
+import net.iGap.request.RequestChatGetRoom;
import net.iGap.request.RequestClientCheckInviteLink;
import net.iGap.request.RequestClientGetRoomMessage;
import net.iGap.request.RequestClientJoinByInviteLink;
@@ -59,6 +68,12 @@
import org.chromium.customtabsclient.CustomTabsActivityHelper;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -68,6 +83,8 @@
import io.realm.Realm;
import me.zhanghai.android.customtabshelper.CustomTabsHelperFragment;
+import static android.content.Context.CLIPBOARD_SERVICE;
+import static net.iGap.G.context;
import static net.iGap.proto.ProtoGlobal.Room.Type.GROUP;
public class HelperUrl {
@@ -159,27 +176,50 @@ private static void insertLinkSpan(final SpannableStringBuilder strBuilder, fina
ClickableSpan clickable = new ClickableSpan() {
public void onClick(View view) {
+
+ new CountDownTimer(300, 100) {
+
+ public void onTick(long millisUntilFinished) {
+ view.setEnabled(false);
+ }
+
+ public void onFinish() {
+ view.setEnabled(true);
+ }
+ }.start();
+
if (withclickable) {
G.isLinkClicked = true;
boolean openLocalWebPage;
SharedPreferences sharedPreferences = G.context.getSharedPreferences(SHP_SETTING.FILE_NAME, G.context.MODE_PRIVATE);
- int checkedInappBrowser = sharedPreferences.getInt(SHP_SETTING.KEY_IN_APP_BROWSER, 0);
+ int checkedInappBrowser = sharedPreferences.getInt(SHP_SETTING.KEY_IN_APP_BROWSER, 1);
- if (checkedInappBrowser == 1) {
- openLocalWebPage = true;
- } else {
- openLocalWebPage = false;
- }
+ String mUrl = strBuilder.toString().substring(start, end).trim();
- String url = strBuilder.toString().substring(start, end).trim();
- url = url.replaceAll("[^\\x00-\\x7F]", "");
+ if (!mUrl.startsWith("https://") && !mUrl.startsWith("http://")) {
+ mUrl = "http://" + mUrl;
+ }
- if (!url.startsWith("https://") && !url.startsWith("http://")) {
- url = "http://" + url;
+ URL url = null;
+ try {
+ url = new URL(mUrl);
+ URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
+ url = new URL(uri.toASCIIString());
+ mUrl = url.toString();
+ mUrl = mUrl.replaceAll("[^\\x00-\\x7F]", "");
+ if (checkedInappBrowser == 1 && !isNeedOpenWithoutBrowser(mUrl)) {
+ openBrowser(mUrl);
+ } else {
+ openWithoutBrowser(mUrl);
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
}
- openBrowser(url);
+
}
}
@@ -200,8 +240,40 @@ public void updateDrawState(TextPaint ds) {
strBuilder.setSpan(clickable, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
- public static void openBrowser(String url) {
+ private static boolean isNeedOpenWithoutBrowser(String url) {
+ ArrayList listApps = new ArrayList<>();
+ listApps.add("facebook.com");
+ listApps.add("twitter.com");
+ listApps.add("instagram.com");
+ listApps.add("pinterest.com");
+ listApps.add("tumblr.com");
+ listApps.add("telegram.org");
+ listApps.add("flickr.com");
+ listApps.add("500px.com");
+ listApps.add("behance.net");
+ listApps.add("t.me");
+
+ for (String string : listApps) {
+ if(url.contains(string)){
+ return true;
+ }
+ }
+ return false;
+ }
+ private static void openWithoutBrowser(String url) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse(url));
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ if (intent.resolveActivity(G.fragmentActivity.getPackageManager()) != null) {
+ G.fragmentActivity.startActivity(intent);
+ } else {
+// Toast.makeText(G.fragmentActivity, "", Toast.LENGTH_SHORT).show();
+ HelperError.showSnackMessage(G.context.getResources().getString(R.string.error),false);
+ }
+ }
+
+ public static void openBrowser(String url) {
final CustomTabsHelperFragment mCustomTabsHelperFragment = CustomTabsHelperFragment.attachTo((FragmentActivity) G.currentActivity);
int mColorPrimary = Color.parseColor(G.appBarColor);
@@ -270,6 +342,29 @@ public void updateDrawState(TextPaint ds) {
strBuilder.setSpan(clickable, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
+ private static void insertIgapBot(final SpannableStringBuilder strBuilder, final int start, final int end) {
+
+ ClickableSpan clickable = new ClickableSpan() {
+ public void onClick(View view) {
+ G.isLinkClicked = true;
+ String botCommandText = strBuilder.toString().substring(start, end);
+
+ if (G.onBotClick != null) {
+ G.onBotClick.onBotCommandText(botCommandText);
+ }
+ }
+
+ @Override
+ public void updateDrawState(TextPaint ds) {
+ ds.linkColor = Color.parseColor(G.linkColor);
+ super.updateDrawState(ds);
+ ds.setUnderlineText(false);
+ }
+ };
+
+ strBuilder.setSpan(clickable, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+
private static void insertIgapResolveLink(final SpannableStringBuilder strBuilder, final int start, final int end) {
ClickableSpan clickable = new ClickableSpan() {
@@ -307,6 +402,26 @@ public void updateDrawState(TextPaint ds) {
strBuilder.setSpan(clickable, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
+ private static void insertDigitLink(final SpannableStringBuilder strBuilder, final int start, final int end) {
+
+ ClickableSpan clickable = new ClickableSpan() {
+ public void onClick(View view) {
+ G.isLinkClicked = true;
+ String digitLink = strBuilder.toString().substring(start, end);
+ openDialogDigitClick(digitLink);
+ }
+
+ @Override
+ public void updateDrawState(TextPaint ds) {
+ ds.linkColor = Color.parseColor(G.linkColor);
+ super.updateDrawState(ds);
+ ds.setUnderlineText(false);
+ }
+ };
+
+ strBuilder.setSpan(clickable, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+
private static SpannableStringBuilder analaysHash(SpannableStringBuilder builder, String messageID) {
if (builder == null) return builder;
@@ -358,7 +473,6 @@ private static void insertHashLink(final String text, SpannableStringBuilder bui
@Override
public void onClick(View view) {
G.isLinkClicked = true;
- ;
if (FragmentChat.hashListener != null) {
FragmentChat.hashListener.complete(true, "#" + text, messageID);
}
@@ -480,18 +594,29 @@ public static SpannableStringBuilder getLinkText(String text, String linkInfo, S
int end = Integer.parseInt(info[1]);
String type = info[2];
-
try {
- if (type.equals("hash")) {
- insertHashLink(text.substring(start + 1, end), strBuilder, start, messageID);
- } else if (type.equals("atSighn")) {
- insertAtSignLink(text.substring(start + 1, end), strBuilder, start);
- } else if (type.equals("igapLink")) {
- insertIgapLink(strBuilder, start, end);
- } else if (type.equals("igapResolve")) {
- insertIgapResolveLink(strBuilder, start, end);
- } else if (type.equals("webLink")) {
- insertLinkSpan(strBuilder, start, end, true);
+ switch (type) {
+ case "hash":
+ insertHashLink(text.substring(start + 1, end), strBuilder, start, messageID);
+ break;
+ case "atSighn":
+ insertAtSignLink(text.substring(start + 1, end), strBuilder, start);
+ break;
+ case "igapLink":
+ insertIgapLink(strBuilder, start, end);
+ break;
+ case "igapResolve":
+ insertIgapResolveLink(strBuilder, start, end);
+ break;
+ case "bot":
+ insertIgapBot(strBuilder, start, end);
+ break;
+ case "webLink":
+ insertLinkSpan(strBuilder, start, end, true);
+ break;
+ case "digitLink":
+ insertDigitLink(strBuilder, start, end);
+ break;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
@@ -533,8 +658,12 @@ public static String getLinkInfo(String text) {
linkInfo += count + "_" + (count + str.length()) + "_" + linkType.igapLink.toString() + "@";
} else if (str.contains(igapResolve)) {
linkInfo += count + "_" + (count + str.length()) + "_" + linkType.igapResolve.toString() + "@";
+ } else if (isBotLink(str)) {
+ linkInfo += count + "_" + (count + str.length()) + "_" + linkType.bot.toString() + "@";
} else if (isTextLink(str)) {
linkInfo += count + "_" + (count + str.length()) + "_" + linkType.webLink.toString() + "@";
+ } else if (isDigitLink(str)) {
+ linkInfo += count + "_" + (count + str.length()) + "_" + linkType.digitLink.toString() + "@";
}
count += str.length() + 1;
}
@@ -542,6 +671,14 @@ public static String getLinkInfo(String text) {
return linkInfo;
}
+ private static boolean isDigitLink(String text) {
+ return text.matches("\\d{5,}");
+ }
+
+ private static boolean isBotLink(String text) {
+ return text.matches("^\\/\\w+");
+ }
+
private static String analysisAtSignLinkInfo(String text) {
String result = "";
if (text == null || text.length() < 1) {
@@ -785,9 +922,9 @@ public static void checkUsernameAndGoToRoomWithMessageId(final String username,
@Override
public void onClientResolveUsername(ProtoClientResolveUsername.ClientResolveUsernameResponse.Type type, ProtoGlobal.RegisteredUser user, ProtoGlobal.Room room) {
if (messageId == 0 || type == ProtoClientResolveUsername.ClientResolveUsernameResponse.Type.USER) {
- openChat(username, type, user, room, chatEntry, messageId);
+ openChat(username, type, user, room, user.getBot() ? ChatEntry.chat : chatEntry, messageId);
} else {
- resolveMessageAndOpenChat(messageId, username, chatEntry, type, user, room);
+ resolveMessageAndOpenChat(messageId, username, user.getBot() ? ChatEntry.chat : chatEntry, type, user, room);
}
}
@@ -824,10 +961,10 @@ private static void resolveMessageAndOpenChat(final long messageId, final String
new RequestClientGetRoomMessage().clientGetRoomMessage(room.getId(), messageId);
G.onClientGetRoomMessage = new OnClientGetRoomMessage() {
@Override
- public void onClientGetRoomMessageResponse(final long messageId) {
- RealmRoomMessage.setGap(messageId);
+ public void onClientGetRoomMessageResponse(ProtoGlobal.RoomMessage message) {
+ RealmRoomMessage.setGap(message.getMessageId());
G.onClientGetRoomMessage = null;
- openChat(username, type, user, room, chatEntry, messageId);
+ openChat(username, type, user, room, chatEntry, message.getMessageId());
}
};
}
@@ -865,9 +1002,39 @@ private static void goToActivity(final long roomId, final long peerId, ChatEntry
switch (chatEntry) {
case chat:
-
if (roomId != FragmentChat.lastChatRoomId) {
- new GoToChatActivity(roomId).setMessageID(messageId).setPeerID(peerId).startActivity();
+ final Realm realm = Realm.getDefaultInstance();
+ final RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.CHAT_ROOM.PEER_ID, peerId).findFirst();
+
+ if (realmRoom != null) {
+ new GoToChatActivity(realmRoom.getId()).setMessageID(messageId).startActivity();
+ } else {
+ G.onChatGetRoom = new OnChatGetRoom() {
+ @Override
+ public void onChatGetRoom(final ProtoGlobal.Room room) {
+ RealmRoom.putOrUpdate(room);
+ G.handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ new GoToChatActivity(room.getId()).setPeerID(peerId).startActivity();
+ G.onChatGetRoom = null;
+ }
+ },500);
+ }
+ @Override
+ public void onChatGetRoomTimeOut() {
+
+ }
+
+ @Override
+ public void onChatGetRoomError(int majorCode, int minorCode) {
+
+ }
+ };
+
+ new RequestChatGetRoom().chatGetRoom(peerId);
+ }
+ realm.close();
}
break;
@@ -898,12 +1065,12 @@ private static void goToChat(final ProtoGlobal.RegisteredUser user, final ChatEn
if (realmRoom != null) {
closeDialogWaiting();
- goToActivity(realmRoom.getId(), id, chatEntery, messageId);
+ goToActivity(realmRoom.getId(), id, user.getBot() ? ChatEntry.chat : chatEntery, messageId);
realm.close();
} else {
if (G.userLogin) {
- addChatToDatabaseAndGoToChat(user, 0, chatEntery);
+ addChatToDatabaseAndGoToChat(user, -1, user.getBot() ? ChatEntry.chat : chatEntery);
} else {
closeDialogWaiting();
HelperError.showSnackMessage(G.context.getString(R.string.there_is_no_connection_to_server), false);
@@ -951,7 +1118,7 @@ public void execute(Realm realm) {
@Override
public void onSuccess() {
- goToActivity(roomId, user.getId(), chatEntery, 0);
+ goToActivity(roomId, user.getId(), user.getBot() ? ChatEntry.chat : chatEntery, 0);
realm.close();
}
@@ -1061,6 +1228,110 @@ public void run() {
}
}
+ private static void openDialogDigitClick(String text) {
+
+ try {
+ if (G.fragmentActivity != null) {
+ G.fragmentActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
+ View v = dialog.getCustomView();
+ if (v == null) {
+ return;
+ }
+
+ DialogAnimation.animationDown(dialog);
+ dialog.show();
+ ViewGroup rootCopy = (ViewGroup) v.findViewById(R.id.dialog_root_item1_notification);
+ TextView iconCopy = (TextView) v.findViewById(R.id.dialog_icon_item1_notification);
+ iconCopy.setText(G.fragmentActivity.getResources().getString(R.string.md_copy));
+ TextView txtItemCopy = (TextView) v.findViewById(R.id.dialog_text_item1_notification);
+ txtItemCopy.setText(R.string.copy_item_dialog);
+
+ rootCopy.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ ClipboardManager clipboard = (ClipboardManager) G.fragmentActivity.getSystemService(CLIPBOARD_SERVICE);
+ ClipData clip = ClipData.newPlainText("Copied Text", text);
+ clipboard.setPrimaryClip(clip);
+ Toast.makeText(context, R.string.text_copied, Toast.LENGTH_SHORT).show();
+ }
+ });
+
+
+ ViewGroup rootCall = (ViewGroup) v.findViewById(R.id.dialog_root_item2_notification);
+ rootCall.setVisibility(View.VISIBLE);
+ TextView iconCall = (TextView) v.findViewById(R.id.dialog_icon_item2_notification);
+ iconCall.setText(G.fragmentActivity.getResources().getString(R.string.md_call_made));
+ TextView txtCall = (TextView) v.findViewById(R.id.dialog_text_item2_notification);
+ txtCall.setText(R.string.verify_register_call);
+
+ rootCall.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ String uri = "tel:" + text;
+ Intent intent = new Intent(Intent.ACTION_DIAL);
+ intent.setData(Uri.parse(uri));
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ G.context.startActivity(intent);
+ }
+ });
+
+ ViewGroup rootAddToContact = (ViewGroup) v.findViewById(R.id.dialog_root_item3_notification);
+ rootAddToContact.setVisibility(View.VISIBLE);
+ TextView iconAddToContact = (TextView) v.findViewById(R.id.dialog_icon_item3_notification);
+ iconAddToContact.setText(G.fragmentActivity.getResources().getString(R.string.md_igap_contacts));
+ TextView txtAddToContact = (TextView) v.findViewById(R.id.dialog_text_item3_notification);
+ txtAddToContact.setText(R.string.add_to_contact);
+
+ rootAddToContact.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+
+ FragmentAddContact fragment = FragmentAddContact.newInstance();
+ Bundle bundle = new Bundle();
+ bundle.putString("TITLE", G.context.getString(R.string.fac_Add_Contact));
+ bundle.putString("PHONE", text);
+ fragment.setArguments(bundle);
+ new HelperFragment(fragment).setReplace(false).load();
+ }
+ });
+
+ ViewGroup rootSendSms = (ViewGroup) v.findViewById(R.id.dialog_root_item4_notification);
+ rootSendSms.setVisibility(View.VISIBLE);
+ TextView iconSendSms = (TextView) v.findViewById(R.id.dialog_icon_item4_notification);
+ iconSendSms.setText(G.fragmentActivity.getResources().getString(R.string.md_email));
+ TextView txtSendSms = (TextView) v.findViewById(R.id.dialog_text_item4_notification);
+ txtSendSms.setText(R.string.verify_register_sms);
+
+ rootSendSms.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ String uri = "smsto:" + text;
+ Intent intent = new Intent(Intent.ACTION_SENDTO);
+ intent.setData(Uri.parse(uri));
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ G.context.startActivity(intent);
+ }
+ });
+
+ }
+ });
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+
+ }
+
+
//************************************ go to room by urlLink *********************************************************************
private static void getToRoom(Uri path) {
@@ -1097,7 +1368,7 @@ private static void getToRoom(Uri path) {
}
enum linkType {
- hash, atSighn, igapLink, igapResolve, webLink
+ hash, atSighn, igapLink, igapResolve, webLink, bot, digitLink
}
diff --git a/app/src/main/java/net/iGap/interfaces/IPopUpListener.java b/app/src/main/java/net/iGap/interfaces/IPopUpListener.java
index 2837b1f..e3296ac 100644
--- a/app/src/main/java/net/iGap/interfaces/IPopUpListener.java
+++ b/app/src/main/java/net/iGap/interfaces/IPopUpListener.java
@@ -10,11 +10,8 @@
package net.iGap.interfaces;
-import net.iGap.module.enums.StructPopUp;
-
-import java.util.ArrayList;
public interface IPopUpListener {
- void onMessageRecive(ArrayList list);
+ void onMessageReceive();
}
diff --git a/app/src/main/java/net/iGap/interfaces/Ipromote.java b/app/src/main/java/net/iGap/interfaces/Ipromote.java
new file mode 100644
index 0000000..fef3a20
--- /dev/null
+++ b/app/src/main/java/net/iGap/interfaces/Ipromote.java
@@ -0,0 +1,9 @@
+package net.iGap.interfaces;
+
+import net.iGap.proto.ProtoClientCheckInviteLink;
+import net.iGap.proto.ProtoClientGetPromote;
+
+public interface Ipromote {
+ public void onGetPromoteResponse(ProtoClientGetPromote.ClientGetPromoteResponse.Builder builder);
+
+}
diff --git a/app/src/main/java/net/iGap/interfaces/OnBotClick.java b/app/src/main/java/net/iGap/interfaces/OnBotClick.java
new file mode 100644
index 0000000..3235735
--- /dev/null
+++ b/app/src/main/java/net/iGap/interfaces/OnBotClick.java
@@ -0,0 +1,15 @@
+/*
+* This is the source code of iGap for Android
+* It is licensed under GNU AGPL v3.0
+* You should have received a copy of the license in this archive (see LICENSE).
+* Copyright © 2017 , iGap - www.iGap.net
+* iGap Messenger | Free, Fast and Secure instant messaging application
+* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+* All rights reserved.
+*/
+
+package net.iGap.interfaces;
+
+public interface OnBotClick {
+ void onBotCommandText(String text);
+}
diff --git a/app/src/main/java/net/iGap/interfaces/OnClientGetRoomMessage.java b/app/src/main/java/net/iGap/interfaces/OnClientGetRoomMessage.java
index b581848..635a97b 100644
--- a/app/src/main/java/net/iGap/interfaces/OnClientGetRoomMessage.java
+++ b/app/src/main/java/net/iGap/interfaces/OnClientGetRoomMessage.java
@@ -10,6 +10,8 @@
package net.iGap.interfaces;
+import net.iGap.proto.ProtoGlobal;
+
public interface OnClientGetRoomMessage {
- void onClientGetRoomMessageResponse(long messageId);
+ void onClientGetRoomMessageResponse(ProtoGlobal.RoomMessage message);
}
diff --git a/app/src/main/java/net/iGap/interfaces/OnInfo.java b/app/src/main/java/net/iGap/interfaces/OnInfo.java
index ffb1216..486242b 100644
--- a/app/src/main/java/net/iGap/interfaces/OnInfo.java
+++ b/app/src/main/java/net/iGap/interfaces/OnInfo.java
@@ -10,11 +10,9 @@
package net.iGap.interfaces;
-import net.iGap.realm.RealmRegisteredInfo;
-
/**
* a callback for getting registered info from server
*/
public interface OnInfo {
- void onInfo(RealmRegisteredInfo registeredInfo);
+ void onInfo(Long registeredId);
}
diff --git a/app/src/main/java/net/iGap/interfaces/OnUserRegistration.java b/app/src/main/java/net/iGap/interfaces/OnUserRegistration.java
index 6ca430e..ab538d0 100644
--- a/app/src/main/java/net/iGap/interfaces/OnUserRegistration.java
+++ b/app/src/main/java/net/iGap/interfaces/OnUserRegistration.java
@@ -16,7 +16,7 @@
public interface OnUserRegistration {
- void onRegister(String userName, long userId, ProtoUserRegister.UserRegisterResponse.Method methodValue, List smsNumbers, String regex, int verifyCodeDigitCount, String authorHash);
+ void onRegister(String userName, long userId, ProtoUserRegister.UserRegisterResponse.Method methodValue, List smsNumbers, String regex, int verifyCodeDigitCount, String authorHash, boolean callMethodSupported);
void onRegisterError(int majorCode, int minorCode, int getWait);
}
diff --git a/app/src/main/java/net/iGap/interfaces/OnVersionCallBack.java b/app/src/main/java/net/iGap/interfaces/OnVersionCallBack.java
new file mode 100644
index 0000000..a8656cd
--- /dev/null
+++ b/app/src/main/java/net/iGap/interfaces/OnVersionCallBack.java
@@ -0,0 +1,8 @@
+package net.iGap.interfaces;
+
+public interface OnVersionCallBack {
+
+ void isDeprecated();
+ void isUpdateAvailable();
+
+}
diff --git a/app/src/main/java/net/iGap/interfaces/OnVideoCallFrame.java b/app/src/main/java/net/iGap/interfaces/OnVideoCallFrame.java
new file mode 100644
index 0000000..aeee34c
--- /dev/null
+++ b/app/src/main/java/net/iGap/interfaces/OnVideoCallFrame.java
@@ -0,0 +1,20 @@
+/*
+* This is the source code of iGap for Android
+* It is licensed under GNU AGPL v3.0
+* You should have received a copy of the license in this archive (see LICENSE).
+* Copyright © 2017 , iGap - www.iGap.net
+* iGap Messenger | Free, Fast and Secure instant messaging application
+* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+* All rights reserved.
+*/
+
+package net.iGap.interfaces;
+
+import org.webrtc.VideoFrame;
+
+
+public interface OnVideoCallFrame {
+ void onRemoteFrame(VideoFrame videoFrame);
+
+ void onPeerFrame(VideoFrame videoFrame);
+}
diff --git a/app/src/main/java/net/iGap/libs/notification/NotificationService.java b/app/src/main/java/net/iGap/libs/notification/NotificationService.java
index 09debc9..96bc45e 100644
--- a/app/src/main/java/net/iGap/libs/notification/NotificationService.java
+++ b/app/src/main/java/net/iGap/libs/notification/NotificationService.java
@@ -1,74 +1,69 @@
package net.iGap.libs.notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.support.v4.app.NotificationCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
-import net.iGap.R;
-import net.iGap.activities.ActivityMain;
+import net.iGap.G;
+import net.iGap.helper.HelperNotification;
+import net.iGap.interfaces.OnClientGetRoomMessage;
+import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmRoom;
+import net.iGap.realm.RealmRoomFields;
+import net.iGap.request.RequestClientGetRoomMessage;
+
+import java.util.Map;
+
+import io.realm.Realm;
public class NotificationService extends FirebaseMessagingService {
private final static String ROOM_ID = "roomId";
private final static String MESSAGE_ID = "messageId";
- private final static String MESSAGE_TYPE = "type";
- private final static String PAYLOAD = "payload";
- public static int NOTIFICATION_ID = 1000;
+ private final static String MESSAGE_TYPE = "loc_key";
+ private static boolean isFirstMessage = true;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
-// if (remoteMessage.getData().size() > 0) {
-// Map date = remoteMessage.getData();
-// if (date.containsKey(MESSAGE_TYPE)) {
-// switch (date.get(MESSAGE_TYPE)){
-// case "ROOM_SEND_MESSAGE":
-// if (date.containsKey(PAYLOAD)) {
-// try {
-// JSONObject payload = new JSONObject(date.get(PAYLOAD));
-// String roomId = payload.getString(ROOM_ID);
-// String messageId = payload.getString(MESSAGE_ID);
-// Log.e("ddd","romid : "+roomId+" messageId : "+messageId);
-// } catch (JSONException e) {
-// e.printStackTrace();
-// }
-// generateNotification("ROOM_SEND_MESSAGE");
-// }
-// break;
-// case "SIGNALING_OFFER":
-// Log.e("ddd"," push SIGNALING_OFFER ");
-// break;
-// }
-// }
-// }
- }
+ if (isFirstMessage) {
+ if (remoteMessage.getData().size() > 0) {
+ Map date = remoteMessage.getData();
+ if (date.containsKey(ROOM_ID) && date.containsKey(MESSAGE_ID)) {
+ // type of dataMap is messageId roomId type loc_key loc_args
+ Long roomId = Long.parseLong(date.get(ROOM_ID));
+ Long messageId = Long.parseLong(date.get(MESSAGE_ID));
+ G.handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ new RequestClientGetRoomMessage().clientGetRoomMessage(roomId, messageId);
+ }
+ }, 2000);
- private void generateNotification(String messageBody) {
+ G.onClientGetRoomMessage = new OnClientGetRoomMessage() {
+ @Override
+ public void onClientGetRoomMessageResponse(ProtoGlobal.RoomMessage message) {
+ G.onClientGetRoomMessage = null;
+ if (date.containsKey(MESSAGE_TYPE)) {
+ final Realm realm = Realm.getDefaultInstance();
+ RealmRoom room = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, roomId).findFirst();
+ if (room != null) {
+ HelperNotification.getInstance().addMessage(roomId, message, room.getType(), room, realm);
+ }
+ realm.close();
+ }
+ }
+ };
+ }
+ }
+
+ isFirstMessage = false;
+ }
- Intent intent = new Intent(this, ActivityMain.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
- Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
- NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.mipmap.icon)
- .setContentTitle("IGap")
- .setContentText(messageBody)
- .setAutoCancel(true)
- .setSound(defaultSoundUri)
- .setContentIntent(pendingIntent);
- NotificationManager notificationManager =
- (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.notify(NOTIFICATION_ID, mNotifyBuilder.build());
}
+
}
\ No newline at end of file
diff --git a/app/src/main/java/net/iGap/module/AppUtils.java b/app/src/main/java/net/iGap/module/AppUtils.java
index fe1147a..530e1d4 100644
--- a/app/src/main/java/net/iGap/module/AppUtils.java
+++ b/app/src/main/java/net/iGap/module/AppUtils.java
@@ -47,6 +47,8 @@
import net.iGap.proto.ProtoGlobal;
import net.iGap.proto.ProtoUserUpdateStatus;
import net.iGap.realm.RealmAttachment;
+import net.iGap.realm.RealmRoom;
+import net.iGap.realm.RealmRoomFields;
import net.iGap.realm.RealmRoomMessage;
import net.iGap.realm.RealmRoomMessageFields;
@@ -60,6 +62,7 @@
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
+import me.leolin.shortcutbadger.ShortcutBadger;
import static net.iGap.G.context;
@@ -721,4 +724,39 @@ public static long makeRandomId() {
// return Math.abs(UUID.randomUUID().getLeastSignificantBits());
}
+ public static int[] updateBadgeOnly(Realm realm, long roomId) {
+ int unreadMessageCount = 0;
+ int chatCount = 0;
+ int[] result = new int[2];
+
+ RealmResults realmRooms = realm.where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).
+ equalTo(RealmRoomFields.MUTE, false).equalTo(RealmRoomFields.IS_DELETED, false).notEqualTo(RealmRoomFields.ID, roomId).findAll();
+
+ for (RealmRoom realmRoom1 : realmRooms) {
+ if (realmRoom1.getUnreadCount() > 0) {
+ unreadMessageCount += realmRoom1.getUnreadCount();
+ ++chatCount;
+ }
+ }
+
+ try {
+ ShortcutBadger.applyCount(G.context, unreadMessageCount);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ result[0] = unreadMessageCount;
+ result[1] = chatCount;
+ return result;
+ }
+
+ public static void cleanBadge() {
+ try {
+ ShortcutBadger.applyCount(G.context, 0);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
}
diff --git a/app/src/main/java/net/iGap/module/BotInit.java b/app/src/main/java/net/iGap/module/BotInit.java
new file mode 100644
index 0000000..b79e2ea
--- /dev/null
+++ b/app/src/main/java/net/iGap/module/BotInit.java
@@ -0,0 +1,364 @@
+package net.iGap.module;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import net.iGap.Config;
+import net.iGap.G;
+import net.iGap.R;
+import net.iGap.activities.ActivityPopUpNotification;
+import net.iGap.interfaces.Ipromote;
+import net.iGap.interfaces.OnChatGetRoom;
+import net.iGap.proto.ProtoClientGetPromote;
+import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmRoom;
+import net.iGap.realm.RealmRoomFields;
+import net.iGap.request.RequestChatGetRoom;
+import net.iGap.request.RequestClientGetPromote;
+import net.iGap.request.RequestClientGetRoom;
+import net.iGap.request.RequestClientPinRoom;
+
+import java.util.ArrayList;
+
+import io.realm.Realm;
+import io.realm.RealmResults;
+
+import static net.iGap.Config.drIgapPeerId;
+
+public class BotInit {
+
+ private ArrayList botActionList;
+ private View layoutBot;
+ private View rootView;
+
+ public BotInit(View rootView, boolean showCommandList) {
+ this.rootView = rootView;
+ init(rootView);
+
+ }
+
+ public void updateCommandList(boolean showCommandList, String message, Activity activity, boolean backToMenu) {
+
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ fillList(message, backToMenu);
+
+ if (botActionList.size() == 0) {
+ return;
+ }
+
+ if (showCommandList) {
+ makeTxtList(rootView);
+ } else {
+ makeButtonList(rootView);
+ }
+
+ setLayoutBot(false, false);
+ }
+ });
+
+ }
+
+
+ private void init(View rootView) {
+
+ MaterialDesignTextView btnShowBot = (MaterialDesignTextView) rootView.findViewById(R.id.chl_btn_show_bot_action);
+ btnShowBot.setVisibility(View.VISIBLE);
+
+ layoutBot = rootView.findViewById(R.id.layout_bot);
+
+ btnShowBot.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setLayoutBot(layoutBot.getVisibility() == View.VISIBLE, true);
+ }
+ });
+
+ }
+
+ private void setLayoutBot(boolean gone, boolean changeKeyboard) {
+
+ if (botActionList.size() == 0) {
+ return;
+ }
+
+ MaterialDesignTextView btnShowBot = (MaterialDesignTextView) rootView.findViewById(R.id.chl_btn_show_bot_action);
+
+ if (gone) {
+ layoutBot.setVisibility(View.GONE);
+ btnShowBot.setText(R.string.md_bot);
+
+ if (changeKeyboard) {
+ try {
+ InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ if (imm != null) {
+ imm.showSoftInput(rootView.findViewById(R.id.chl_edt_chat), InputMethodManager.SHOW_IMPLICIT);
+ }
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+ }
+
+ } else {
+ layoutBot.setVisibility(View.VISIBLE);
+ btnShowBot.setText(R.string.md_black_keyboard_with_white_keys);
+
+ if (changeKeyboard) {
+ try {
+ InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(rootView.findViewById(R.id.chl_edt_chat).getWindowToken(), 0);
+ } catch (IllegalStateException e) {
+ e.getStackTrace();
+ }
+ }
+
+ }
+
+ }
+
+ private void fillList(String message, boolean backToMenu) {
+ botActionList = new ArrayList<>();
+
+ if (message.equals("")) {
+ return;
+ }
+
+ String spiltList[] = message.split("\n");
+
+ for (String line : spiltList) {
+ if (line.startsWith("/")) {
+ String lineSplit[] = line.split("-");
+ if (lineSplit.length == 2) {
+ StructRowBotAction _row = new StructRowBotAction();
+ _row.action = lineSplit[0];
+ _row.name = lineSplit[1];
+ botActionList.add(_row);
+ }
+ }
+ }
+
+ if (botActionList.size() == 0 || backToMenu) {
+ StructRowBotAction _row = new StructRowBotAction();
+ _row.action = "/back";
+ _row.name = G.context.getString(R.string.back_to_menu);
+ botActionList.add(_row);
+ }
+
+ }
+
+ private void makeButtonList(View rootView) {
+
+ LinearLayout layoutBot = rootView.findViewById(R.id.bal_layout_bot_layout);
+ layoutBot.removeAllViews();
+
+ LinearLayout layout = null;
+
+
+ for (int i = 0; i < botActionList.size(); i += 2) {
+
+ layout = new LinearLayout(G.context);
+ layout.setOrientation(LinearLayout.HORIZONTAL);
+
+ StructRowBotAction sb0 = botActionList.get(i);
+ if (sb0.name.length() > 0) {
+ addButton(layout, sb0.name, sb0.action);
+ }
+
+ if (i + 1 < botActionList.size()) {
+ StructRowBotAction sb1 = botActionList.get(i + 1);
+ if (sb1.name.length() > 0) {
+ addButton(layout, sb1.name, sb1.action);
+ }
+ }
+
+ layoutBot.addView(layout);
+ }
+
+ }
+
+ private void addButton(LinearLayout layout, String name, String action) {
+
+ LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
+ param.setMargins(2, 2, 2, 2);
+
+ Button btn = new Button(G.context);
+ btn.setLayoutParams(param);
+ btn.setTextColor(Color.WHITE);
+ btn.setBackgroundColor(ContextCompat.getColor(G.context, R.color.backgroundColorCall2));
+ btn.setText(name);
+ btn.setAllCaps(false);
+ btn.setTypeface(G.typeface_IRANSansMobile);
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (G.onBotClick != null) {
+ G.onBotClick.onBotCommandText(action);
+ }
+ setLayoutBot(true, false);
+ }
+ });
+ layout.addView(btn);
+ }
+
+ class StructRowBotAction {
+ String action = "";
+ String name = "";
+ }
+
+ private void makeTxtList(View rootView) {
+
+ LinearLayout layoutBot = rootView.findViewById(R.id.bal_layout_bot_layout);
+ layoutBot.removeAllViews();
+
+ for (int i = 0; i < botActionList.size(); i++) {
+
+ StructRowBotAction sb0 = botActionList.get(i);
+ if (sb0.name.length() > 0) {
+ addTxt(layoutBot, sb0.name, sb0.action);
+ }
+
+ layoutBot.addView(layoutBot);
+ }
+
+ }
+
+ private void addTxt(LinearLayout layout, String name, String action) {
+
+ ViewGroup.LayoutParams param = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
+
+ TextView txt = new TextView(G.context);
+ txt.setLayoutParams(param);
+ txt.setPadding(15, 6, 15, 6);
+ txt.setText(action);
+ txt.setTypeface(G.typeface_IRANSansMobile);
+ txt.setTextColor(Color.BLACK);
+ txt.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (G.onBotClick != null) {
+ G.onBotClick.onBotCommandText(action);
+ }
+ setLayoutBot(true, false);
+ }
+ });
+ layout.addView(txt);
+
+ }
+
+
+ public void close() {
+ setLayoutBot(true, false);
+ }
+
+
+ public static void checkDrIgap() {
+
+ new RequestClientGetPromote().getPromote();
+ G.ipromote = new Ipromote() {
+ @Override
+ public void onGetPromoteResponse(ProtoClientGetPromote.ClientGetPromoteResponse.Builder builder) {
+ final Realm realm = Realm.getDefaultInstance();
+ ArrayList promoteIds = new ArrayList<>();
+
+ for (int i = 0; i < builder.getPromoteList().size(); i++)
+ promoteIds.add(builder.getPromoteList().get(i).getId());
+
+
+ realm.executeTransactionAsync(new Realm.Transaction() {
+ @Override
+ public void execute(Realm realm) {
+ RealmResults roomList = realm.where(RealmRoom.class).equalTo(RealmRoomFields.IS_FROM_PROMOTE, true).findAll();
+ for (RealmRoom room : roomList) {
+ if (!promoteIds.contains(room.getPromoteId())) {
+ // Log.i("#peymanPromoteId", room.getPromoteId() + "");
+ room.setFromPromote(false);
+ new RequestClientPinRoom().pinRoom(room.getId(), false);
+ }
+
+ }
+ }
+ });
+
+ for (int i = builder.getPromoteList().size() - 1; i >= 0; i--) {
+
+ ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type TYPE = builder.getPromoteList().get(i).getType();
+ RealmRoom realmRoom;
+
+ if (TYPE == ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type.USER) {
+ realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.CHAT_ROOM.PEER_ID, builder.getPromoteList().get(i).getId()).equalTo(RealmRoomFields.IS_FROM_PROMOTE, true).findFirst();
+ } else {
+ realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, builder.getPromoteList().get(i).getId()).equalTo(RealmRoomFields.IS_FROM_PROMOTE, true).findFirst();
+ }
+
+ if (realmRoom == null) {
+ if (TYPE == ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type.USER) {
+ // RealmRoom.setPromote(builder.getPromoteList().get(i).getId(), TYPE);
+ G.onChatGetRoom = new OnChatGetRoom() {
+ @Override
+ public void onChatGetRoom(final ProtoGlobal.Room room) {
+ G.onChatGetRoom = null;
+ Realm realm1 = Realm.getDefaultInstance();
+ realm1.executeTransaction(new Realm.Transaction() {
+ @Override
+ public void execute(Realm mRealm) {
+ RealmRoom realmRoom1 = RealmRoom.putOrUpdate(room, mRealm);
+ realmRoom1.setFromPromote(true);
+ realmRoom1.setPromoteId(realmRoom1.getChatRoom().getPeerId());
+ }
+ });
+
+ new RequestClientPinRoom().pinRoom(room.getId(), true);
+
+
+ // RealmRoom.setPromote(2297310L, ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type.USER);
+ ActivityPopUpNotification.sendMessage("/start", room.getId(), ProtoGlobal.Room.Type.CHAT);
+
+ realm1.close();
+ }
+
+
+ @Override
+ public void onChatGetRoomTimeOut() {
+
+ }
+
+ @Override
+ public void onChatGetRoomError(int majorCode, int minorCode) {
+
+ }
+ };
+ new RequestChatGetRoom().chatGetRoom(builder.getPromoteList().get(i).getId());
+
+ } else {
+
+ new RequestClientGetRoom().clientGetRoom(builder.getPromoteList().get(i).getId(), RequestClientGetRoom.CreateRoomMode.getPromote);
+
+ }
+
+
+ } else {
+
+ new RequestClientPinRoom().pinRoom(realmRoom.getId(), true);
+ Log.i("#peymanSize", builder.getPromoteList().size() + "");
+
+ }
+ }
+
+ }
+
+ };
+
+ }
+
+}
diff --git a/app/src/main/java/net/iGap/module/Contacts.java b/app/src/main/java/net/iGap/module/Contacts.java
index d95e834..b49b848 100644
--- a/app/src/main/java/net/iGap/module/Contacts.java
+++ b/app/src/main/java/net/iGap/module/Contacts.java
@@ -105,10 +105,12 @@ public static void showLimitDialog() {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
- new MaterialDialog.Builder(G.currentActivity)
- .title(R.string.title_import_contact_limit)
- .content(R.string.content_import_contact_limit)
- .positiveText(G.context.getResources().getString(R.string.B_ok)).show();
+ if (!G.currentActivity.isFinishing()) {
+ new MaterialDialog.Builder(G.currentActivity)
+ .title(R.string.title_import_contact_limit)
+ .content(R.string.content_import_contact_limit)
+ .positiveText(G.context.getResources().getString(R.string.B_ok)).show();
+ }
}
});
}
diff --git a/app/src/main/java/net/iGap/module/MusicPlayer.java b/app/src/main/java/net/iGap/module/MusicPlayer.java
index 6980c68..de5921d 100644
--- a/app/src/main/java/net/iGap/module/MusicPlayer.java
+++ b/app/src/main/java/net/iGap/module/MusicPlayer.java
@@ -10,7 +10,9 @@
package net.iGap.module;
+import android.annotation.SuppressLint;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -143,6 +145,7 @@ public class MusicPlayer extends Service implements AudioManager.OnAudioFocusCha
private static ComponentName remoteComponentName;
private static Realm mRealm;
private static boolean isRegisterSensor = false;
+ public static final String musicChannelId = "music_channel";
private static Realm getRealm() {
if (mRealm == null || mRealm.isClosed()) {
@@ -156,8 +159,6 @@ public static void setMusicPlayer(LinearLayout layoutTripMusic) {
if (remoteViews == null)
remoteViews = new RemoteViews(context.getPackageName(), R.layout.music_layout_notification);
- if (notificationManager == null)
- notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (layoutTripMusic != null) {
layoutTripMusic.setVisibility(View.GONE);
@@ -170,6 +171,15 @@ public static void setMusicPlayer(LinearLayout layoutTripMusic) {
//getOrginallWallpaper();
}
+ private static NotificationManager getNotificationManager() {
+
+ if (notificationManager == null) {
+ notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
+
+ return notificationManager;
+ }
+
public static void repeatClick() {
String str = "";
@@ -317,7 +327,7 @@ public static void pauseSound() {
if (!isVoice) {
try {
remoteViews.setImageViewResource(R.id.mln_btn_play_music, R.mipmap.play_button);
- notificationManager.notify(notificationId, notification);
+ getNotificationManager().notify(notificationId, notification);
} catch (RuntimeException e) {
e.printStackTrace();
}
@@ -379,7 +389,7 @@ public static void playSound() {
if (!isVoice) {
try {
remoteViews.setImageViewResource(R.id.mln_btn_play_music, R.mipmap.pause_button);
- notificationManager.notify(notificationId, notification);
+ getNotificationManager().notify(notificationId, notification);
} catch (RuntimeException e) {
e.printStackTrace();
}
@@ -431,9 +441,9 @@ public static void stopSound() {
if (!isVoice) {
try {
- if (remoteViews != null && mp !=null) {
+ if (remoteViews != null && mp != null) {
remoteViews.setImageViewResource(R.id.mln_btn_play_music, R.mipmap.play_button);
- notificationManager.notify(notificationId, notification);
+ getNotificationManager().notify(notificationId, notification);
}
} catch (RuntimeException e) {
e.printStackTrace();
@@ -624,11 +634,10 @@ public static void closeLayoutMediaPlayer() {
context.startService(intent);
} catch (RuntimeException e) {
- if (notificationManager == null)
- notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ try {
+ getNotificationManager().cancel(notificationId);
+ } catch (NullPointerException e1) {
- if (notificationManager != null) {
- notificationManager.cancel(notificationId);
}
}
@@ -940,7 +949,7 @@ private static void updateNotification() {
PendingIntent pendingIntentClose = PendingIntent.getBroadcast(context, 4, intentClose, 0);
remoteViews.setOnClickPendingIntent(R.id.mln_btn_close, pendingIntentClose);
- notification = new NotificationCompat.Builder(context.getApplicationContext()).setTicker("music").setSmallIcon(R.mipmap.j_mp3).setContentTitle(musicName)
+ notification = new NotificationCompat.Builder(context.getApplicationContext()).setTicker("music").setSmallIcon(R.mipmap.j_mp3).setContentTitle(musicName).setChannelId(musicChannelId)
// .setContentText(place)
.setContent(remoteViews).setContentIntent(pi).setDeleteIntent(pendingIntentClose).setAutoCancel(false).setOngoing(true).build();
}
@@ -1220,7 +1229,7 @@ private static boolean startDownload(RealmRoomMessage rm) {
result = true;
- HelperDownloadFile.getInstance().startDownload(rm.getMessageType(),rm.getMessageId() + "", _token, _url, _cacheId, _name, _size, selector, _path, 0, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), rm.getMessageId() + "", _token, _url, _cacheId, _name, _size, selector, _path, 0, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(String path, int progress) {
if (progress == 100) {
@@ -1485,7 +1494,20 @@ public int onStartCommand(Intent intent, int flags, int startId) {
if (action.equals(STARTFOREGROUND_ACTION)) {
if (notification != null) {
- startForeground(notificationId, notification);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ CharSequence name = G.context.getString(R.string.channel_name_notification);// The user-visible name of the channel.
+ @SuppressLint("WrongConstant") NotificationChannel mChannel = new NotificationChannel(musicChannelId, name, NotificationManager.IMPORTANCE_HIGH);
+ getNotificationManager().createNotificationChannel(mChannel);
+ }
+
+ try {
+ startForeground(notificationId, notification);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
if (latestAudioFocusState != AudioManager.AUDIOFOCUS_GAIN) { // if do double "AUDIOFOCUS_GAIN", "AUDIOFOCUS_LOSS" will be called
latestAudioFocusState = AudioManager.AUDIOFOCUS_GAIN;
registerAudioFocus(AudioManager.AUDIOFOCUS_GAIN);
@@ -1508,10 +1530,9 @@ public int onStartCommand(Intent intent, int flags, int startId) {
@Override
public void onDestroy() {
super.onDestroy();
- if (notificationManager == null)
- notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-
- if (notificationManager != null) {
+ try {
+ getNotificationManager().cancel(notificationId);
+ } catch (NullPointerException e) {
notificationManager.cancel(notificationId);
}
}
diff --git a/app/src/main/java/net/iGap/module/MyDialog.java b/app/src/main/java/net/iGap/module/MyDialog.java
index bd6a76a..bc67190 100644
--- a/app/src/main/java/net/iGap/module/MyDialog.java
+++ b/app/src/main/java/net/iGap/module/MyDialog.java
@@ -1,12 +1,12 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.module;
@@ -18,10 +18,12 @@
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
+import net.iGap.Config;
import net.iGap.G;
import net.iGap.R;
import net.iGap.interfaces.OnComplete;
import net.iGap.proto.ProtoGlobal;
+import net.iGap.realm.RealmRegisteredInfo;
import net.iGap.realm.RealmRoom;
import net.iGap.realm.RealmRoomFields;
@@ -34,7 +36,7 @@ public class MyDialog {
/**
* create custom dialog for main page
*/
- public static void showDialogMenuItemRooms(final Context context, final String itemName, final ProtoGlobal.Room.Type mType, boolean isMute, final String role, final OnComplete complete, boolean isPinned) {
+ public static void showDialogMenuItemRooms(final Context context, final String itemName, final ProtoGlobal.Room.Type mType, boolean isMute, final String role, long peerId, RealmRoom mInfo, final OnComplete complete, boolean isPinned) {
final MaterialDialog dialog = new MaterialDialog.Builder(context).customView(R.layout.chat_popup_dialog, true).build();
View v = dialog.getCustomView();
@@ -47,6 +49,11 @@ public static void showDialogMenuItemRooms(final Context context, final String i
int pinCount = realmRoom.size();
realm.close();
+ if (mInfo != null && RealmRoom.isPromote(mInfo.getId())) {
+ v.findViewById(R.id.cm_layout_delete_chat).setVisibility(View.GONE);
+ v.findViewById(R.id.cm_layout_mute_pinToTop).setVisibility(View.GONE);
+ }
+
txtMuteNotification = (TextView) v.findViewById(R.id.cm_txt_mute_notification);
MaterialDesignTextView iconMuteNotification = (MaterialDesignTextView) v.findViewById(R.id.cm_icon_mute_notification);
// iconMuteNotification.setTypeface();
@@ -184,6 +191,7 @@ public void onClick(View view) {
//});
}
+
public static void showDialogNotification(Context context, String title, String Message, final OnComplete complete, final String result) {
new MaterialDialog.Builder(context).title(title)
diff --git a/app/src/main/java/net/iGap/module/MyInfoWindow.java b/app/src/main/java/net/iGap/module/MyInfoWindow.java
index 15a5913..e077f5a 100644
--- a/app/src/main/java/net/iGap/module/MyInfoWindow.java
+++ b/app/src/main/java/net/iGap/module/MyInfoWindow.java
@@ -18,6 +18,7 @@
import net.iGap.interfaces.OnAvatarGet;
import net.iGap.interfaces.OnGeoGetComment;
import net.iGap.interfaces.OnInfo;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmRegisteredInfo;
import net.iGap.request.RequestGeoGetComment;
@@ -38,6 +39,8 @@ public class MyInfoWindow extends InfoWindow {
private FragmentiGapMap fragmentiGapMap;
private String comment;
private Marker marker;
+ private boolean isCallEnable = false;
+ private boolean isVideoCallEnable = false;
public MyInfoWindow(MapView mapView, Marker marker, long userId, boolean hasComment, FragmentiGapMap fragmentiGapMap, FragmentActivity mActivity) {
super(R.layout.empty_info_map, mapView);
@@ -79,13 +82,19 @@ public void onOpen(final Object arg) {
if (realmRegisteredInfo == null) {
RealmRegisteredInfo.getRegistrationInfo(userId, new OnInfo() {
@Override
- public void onInfo(RealmRegisteredInfo registeredInfo) {
+ public void onInfo(Long registeredId) {
onOpen(arg);
}
});
return;
}
+ /* RealmCallConfig callConfig = realm.where(RealmCallConfig.class).findFirst();
+ if (callConfig != null) {
+ isCallEnable = callConfig.isVoice_calling();
+ isVideoCallEnable = callConfig.isVideo_calling();
+ }*/
+
final MaterialDialog dialog = new MaterialDialog.Builder(mActivity).customView(R.layout.map_user_info, true).build();
View view = dialog.getCustomView();
if (view == null) {
@@ -100,6 +109,9 @@ public void onInfo(RealmRegisteredInfo registeredInfo) {
final TextView txtOpenComment = (TextView) view.findViewById(R.id.txt_open_comment_map);
final TextView txtChat = (TextView) view.findViewById(R.id.txt_chat_map);
final TextView txtCall = (TextView) view.findViewById(R.id.txt_call_map);
+ txtCall.setVisibility(isCallEnable ? View.VISIBLE : View.GONE);
+ final TextView txtVideoCall = (TextView) view.findViewById(R.id.txt_video_call_map);
+ txtVideoCall.setVisibility(isVideoCallEnable ? View.VISIBLE : View.GONE);
TextView txtName = (TextView) view.findViewById(R.id.txt_name_info_map);
final TextView txtComment = (TextView) view.findViewById(R.id.txt_info_comment);
@@ -125,7 +137,14 @@ public void onClick(View view) {
txtBack.setVisibility(View.GONE);
txtClose.setVisibility(View.VISIBLE);
txtChat.setVisibility(View.VISIBLE);
- txtCall.setVisibility(View.VISIBLE);
+ if (isCallEnable) {
+ txtCall.setVisibility(View.VISIBLE);
+ }
+
+ if (isVideoCallEnable) {
+ txtVideoCall.setVisibility(View.VISIBLE);
+ }
+
txtOpenComment.setVisibility(View.VISIBLE);
txtComment.setMaxLines(1);
txtComment.setEllipsize(TextUtils.TruncateAt.END);
@@ -148,10 +167,19 @@ public void complete() {
txtCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- FragmentCall.call(userId, false);
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING);
+ }
+ });
+
+
+ txtVideoCall.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING);
}
});
+
txtComment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -159,6 +187,7 @@ public void onClick(View view) {
txtClose.setVisibility(View.GONE);
txtChat.setVisibility(View.GONE);
txtCall.setVisibility(View.GONE);
+ txtVideoCall.setVisibility(View.GONE);
txtOpenComment.setVisibility(View.GONE);
txtBack.setVisibility(View.VISIBLE);
txtComment.setMaxLines(Integer.MAX_VALUE);
diff --git a/app/src/main/java/net/iGap/module/SHP_SETTING.java b/app/src/main/java/net/iGap/module/SHP_SETTING.java
index 64b5cbe..9baf028 100644
--- a/app/src/main/java/net/iGap/module/SHP_SETTING.java
+++ b/app/src/main/java/net/iGap/module/SHP_SETTING.java
@@ -68,6 +68,7 @@ public class SHP_SETTING {
public static final String KEY_AD_ROAMING_MUSIC = "ROAMING_MUSIC";
public static final String KEY_AD_ROAMING_GIF = "ROAMING_GIF";
+
// ========================================================================================== notification and sound
public static final String KEY_STNS_ALERT_MESSAGE = "STNS_ALERT_MESSAGE";
@@ -75,10 +76,11 @@ public class SHP_SETTING {
public static final String KEY_STNS_ALERT_GROUP = "STNS_ALERT_GROUP";
public static final String KEY_STNS_MESSAGE_PREVIEW_GROUP = "STNS_MESSAGE_PREVIEW_GROUP";
- public static final String KEY_STNS_APP_SOUND = "STNS_APP_SOUND";
- public static final String KEY_STNS_APP_VIBRATE = "STNS_APP_VIBRATE";
- public static final String KEY_STNS_APP_PREVIEW = "STNS_APP_PREVIEW";
- public static final String KEY_STNS_CHAT_SOUND = "STNS_CHAT_SOUND";
+ public static final String KEY_STNS_APP_SOUND_NEW = "KEY_STNS_APP_SOUND_NEW";
+ public static final String KEY_STNS_APP_VIBRATE_NEW = "KEY_STNS_APP_VIBRATE_NEW";
+ public static final String KEY_STNS_APP_PREVIEW_NEW = "KEY_STNS_APP_PREVIEW_NEW";
+ public static final String KEY_STNS_CHAT_SOUND_NEW = "KEY_STNS_CHAT_SOUND_NEW";
+ public static final String KEY_STNS_SEPARATE_NOTIFICATION = "KEY_STNS_SEPARATE_NOTIFICATION";
public static final String KEY_STNS_CONTACT_JOINED = "STNS_CONTACT_JOINED";
public static final String KEY_STNS_PINNED_MESSAGE = "STNS_PINNED_MESSAGE";
diff --git a/app/src/main/java/net/iGap/module/StartupActions.java b/app/src/main/java/net/iGap/module/StartupActions.java
index a488185..13fc507 100644
--- a/app/src/main/java/net/iGap/module/StartupActions.java
+++ b/app/src/main/java/net/iGap/module/StartupActions.java
@@ -10,7 +10,6 @@
import android.os.Environment;
import android.util.Base64;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.view.WindowManager;
import com.downloader.PRDownloader;
@@ -29,7 +28,6 @@
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperDataUsage;
import net.iGap.helper.HelperFillLookUpClass;
-import net.iGap.helper.HelperNotificationAndBadge;
import net.iGap.helper.HelperPermission;
import net.iGap.helper.HelperUploadFile;
import net.iGap.realm.RealmDataUsage;
@@ -72,7 +70,6 @@
import static net.iGap.G.context;
import static net.iGap.G.displayName;
import static net.iGap.G.headerTextColor;
-import static net.iGap.G.helperNotificationAndBadge;
import static net.iGap.G.imageFile;
import static net.iGap.G.imageLoader;
import static net.iGap.G.isSaveToGallery;
@@ -113,8 +110,8 @@ public StartupActions() {
private void checkDataUsage() {
Realm realm = Realm.getDefaultInstance();
- RealmResults realmDataUsage=realm.where(RealmDataUsage.class).findAll();
- if (realmDataUsage.size()==0)
+ RealmResults realmDataUsage = realm.where(RealmDataUsage.class).findAll();
+ if (realmDataUsage.size() == 0)
HelperDataUsage.initializeRealmDataUsage();
}
@@ -504,7 +501,6 @@ public void run() {
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(false).build();
ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(context).defaultDisplayImageOptions(defaultOptions).build());
imageLoader = ImageLoader.getInstance();
- helperNotificationAndBadge = new HelperNotificationAndBadge();
HelperFillLookUpClass.fillArrays();
}
@@ -589,6 +585,11 @@ private void realmConfiguration() {
}
}
+ public Realm getPlainInstance() {
+ RealmConfiguration configuration = new RealmConfiguration.Builder().name(context.getResources().getString(R.string.planDB)).schemaVersion(REALM_SCHEMA_VERSION).migration(new RealmMigration()).build();
+ return Realm.getInstance(configuration);
+ }
+
public Realm getInstance() {
SharedPreferences sharedPreferences = G.context.getSharedPreferences("AES-256", Context.MODE_PRIVATE);
@@ -604,7 +605,7 @@ public Realm getInstance() {
byte[] mKey = Base64.decode(sharedPreferences.getString("myByteArray", null), Base64.DEFAULT);
RealmConfiguration newConfig = new RealmConfiguration.Builder()
- .name("iGapLocalDatabaseEncrypted.realm")
+ .name(context.getResources().getString(R.string.encriptedDB))
.encryptionKey(mKey)
.schemaVersion(REALM_SCHEMA_VERSION)
.migration(new RealmMigration())
@@ -614,13 +615,25 @@ public Realm getInstance() {
if (newRealmFile.exists()) {
return Realm.getInstance(newConfig);
} else {
- configuration = new RealmConfiguration.Builder().name("iGapLocalDatabase.realm")
- .schemaVersion(REALM_SCHEMA_VERSION).migration(new RealmMigration()).build();
- Realm realm = Realm.getInstance(configuration);
- realm.writeEncryptedCopyTo(newRealmFile, mKey);
- realm.close();
- Realm.deleteRealm(configuration);
- return Realm.getInstance(newConfig);
+ Realm realm = null;
+ try {
+ configuration = new RealmConfiguration.Builder().name(context.getResources().getString(R.string.planDB))
+ .schemaVersion(REALM_SCHEMA_VERSION)
+ .compactOnLaunch()
+ .migration(new RealmMigration()).build();
+ realm = Realm.getInstance(configuration);
+ realm.writeEncryptedCopyTo(newRealmFile, mKey);
+ realm.close();
+ Realm.deleteRealm(configuration);
+ return Realm.getInstance(newConfig);
+ } catch (OutOfMemoryError oom) {
+ realm.close();
+ return getPlainInstance();
+ } catch (Exception e) {
+ realm.close();
+ return getPlainInstance();
+
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/net/iGap/module/webserviceDrBot/ApiControl.java b/app/src/main/java/net/iGap/module/webserviceDrBot/ApiControl.java
new file mode 100644
index 0000000..b515c52
--- /dev/null
+++ b/app/src/main/java/net/iGap/module/webserviceDrBot/ApiControl.java
@@ -0,0 +1,39 @@
+package net.iGap.module.webserviceDrBot;
+
+import android.util.Base64;
+
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.RSAPublicKeySpec;
+
+import javax.crypto.Cipher;
+
+public class ApiControl {
+
+ public static String apiKey = "unknown_webservice_key";
+ public static String encryption(String text) {
+ String encryptedMsg = null;
+ try {
+ byte[] expBytes = Base64.decode("AQAB".getBytes(), Base64.DEFAULT);
+ byte[] modBytes = Base64.decode("oqWFs4s4Xvt3wQYT5f4M4JoEgjXALjHjAEqJgUYFkF71NI0DKZSAF8Zp8Ydz0HFsQqqnCf56GL9nAfZuDxF9xDsteHxGmkDLMbnymhJmXBSc0BlRgbLtWcX7c5AlryK35tj1ureAisbRYCc77bBsDoGTW8vSQ+il1EQMtUBxrFM=".getBytes(), Base64.DEFAULT);
+ BigInteger modulus = new BigInteger(1, modBytes);
+ BigInteger pubExp = new BigInteger(1, expBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(modulus, pubExp);
+ PublicKey key = keyFactory.generatePublic(pubKeySpec);
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, key);
+ if (text!=null) {
+ byte[] cipherData = cipher.doFinal(text.getBytes("UTF-8"));
+ encryptedMsg = new String(Base64.encode(cipherData, Base64.DEFAULT));
+ } else {
+ encryptedMsg = null;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return encryptedMsg;
+ }
+}
diff --git a/app/src/main/java/net/iGap/module/webserviceDrBot/Favorite.java b/app/src/main/java/net/iGap/module/webserviceDrBot/Favorite.java
new file mode 100644
index 0000000..5bdcea1
--- /dev/null
+++ b/app/src/main/java/net/iGap/module/webserviceDrBot/Favorite.java
@@ -0,0 +1,85 @@
+package net.iGap.module.webserviceDrBot;
+
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+public class Favorite {
+ @SerializedName("favoriteImage")
+ @Expose
+ private String favoriteImage;
+ @SerializedName("favoriteEnable")
+ @Expose
+ private Boolean favoriteEnable;
+ @SerializedName("favoriteValue")
+ @Expose
+ private String favoriteValue;
+ @SerializedName("favoriteName")
+ @Expose
+ private String favoriteName;
+ @SerializedName("favoriteOrderId")
+ @Expose
+ private Integer favoriteOrderId;
+ @SerializedName("favoriteColor")
+ @Expose
+ private String favoriteColor;
+
+ @SerializedName("favoriteBgColor")
+ @Expose
+ private String favoriteBgColor;
+
+ public String getFavoriteImage() {
+ return favoriteImage;
+ }
+
+ public void setFavoriteImage(String favoriteImage) {
+ this.favoriteImage = favoriteImage;
+ }
+
+ public Boolean getFavoriteEnable() {
+ return favoriteEnable;
+ }
+
+ public void setFavoriteEnable(Boolean favoriteEnable) {
+ this.favoriteEnable = favoriteEnable;
+ }
+
+ public String getFavoriteValue() {
+ return favoriteValue;
+ }
+
+ public void setFavoriteValue(String favoriteValue) {
+ this.favoriteValue = favoriteValue;
+ }
+
+ public String getFavoriteName() {
+ return favoriteName;
+ }
+
+ public void setFavoriteName(String favoriteName) {
+ this.favoriteName = favoriteName;
+ }
+
+ public Integer getFavoriteOrderId() {
+ return favoriteOrderId;
+ }
+
+ public void setFavoriteOrderId(Integer favoriteOrderId) {
+ this.favoriteOrderId = favoriteOrderId;
+ }
+
+ public String getFavoriteColor() {
+ return favoriteColor;
+ }
+
+ public void setFavoriteColor(String favoriteColor) {
+ this.favoriteColor = favoriteColor;
+ }
+
+ public String getFavoriteBgColor() {
+ return favoriteBgColor;
+ }
+
+ public void setFavoriteBgColor(String favoriteBgColor) {
+ this.favoriteBgColor = favoriteBgColor;
+ }
+}
diff --git a/app/src/main/java/net/iGap/module/webserviceDrBot/StructBot.java b/app/src/main/java/net/iGap/module/webserviceDrBot/StructBot.java
new file mode 100644
index 0000000..5316cc9
--- /dev/null
+++ b/app/src/main/java/net/iGap/module/webserviceDrBot/StructBot.java
@@ -0,0 +1,43 @@
+package net.iGap.module.webserviceDrBot;
+
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class StructBot {
+
+ @SerializedName("result")
+ @Expose
+ private Integer result;
+ @SerializedName("detail")
+ @Expose
+ private String detail;
+ @SerializedName("favorite")
+ @Expose
+ private List favorite = null;
+
+ public Integer getResult() {
+ return result;
+ }
+
+ public void setResult(Integer result) {
+ this.result = result;
+ }
+
+ public String getDetail() {
+ return detail;
+ }
+
+ public void setDetail(String detail) {
+ this.detail = detail;
+ }
+
+ public List getFavorite() {
+ return favorite;
+ }
+
+ public void setFavorite(List favorite) {
+ this.favorite = favorite;
+ }
+}
diff --git a/app/src/main/java/net/iGap/module/webserviceDrBot/WebService.java b/app/src/main/java/net/iGap/module/webserviceDrBot/WebService.java
new file mode 100644
index 0000000..8b69846
--- /dev/null
+++ b/app/src/main/java/net/iGap/module/webserviceDrBot/WebService.java
@@ -0,0 +1,112 @@
+package net.iGap.module.webserviceDrBot;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.os.AsyncTask;
+import android.util.Log;
+
+import com.downloader.httpclient.DefaultHttpClient;
+import com.downloader.httpclient.HttpClient;
+
+import net.iGap.R;
+import net.iGap.helper.HelperCheckInternetConnection;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.List;
+
+
+public class WebService {
+
+ static String url = "http://botapi.igapnet:8080/rest/";
+
+ private static String callWebService(String method, List nameValuePairs) {
+ try {
+ HttpParams my_httpParams = new BasicHttpParams();
+ HttpConnectionParams.setConnectionTimeout(my_httpParams, 10000);
+ HttpConnectionParams.setSoTimeout(my_httpParams, 5000);
+ org.apache.http.client.HttpClient client = new org.apache.http.impl.client.DefaultHttpClient(my_httpParams);
+ HttpPost post = new HttpPost(url+method);
+ String apikey = ApiControl.encryption(ApiControl.apiKey);
+ nameValuePairs.add(new BasicNameValuePair("key", apikey));
+ post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
+ HttpResponse response = client.execute(post);
+ int resCode = response.getStatusLine().getStatusCode();
+
+ BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+ String line;
+ String ret = null;
+
+ if (resCode == 200) {
+ ret = "";
+ while ((line = rd.readLine()) != null) {
+ ret = ret+line;
+ }
+ return ret;
+ } else {
+ return null;
+ }
+
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static interface AsyncTaskCompleteListener {
+ public void onTaskComplete(String result);
+ }
+
+ public static class AsyncCaller extends AsyncTask {
+
+ private AsyncTaskCompleteListener callback;
+ List localNameValuePairs;
+ Context context;
+
+ public AsyncCaller (Context appContext, List nameValuePairs, AsyncTaskCompleteListener cb, boolean showProgress) {
+ super();
+ this.context = appContext;
+ this.localNameValuePairs = nameValuePairs;
+ this.callback = cb;
+
+ }
+
+ @Override
+ protected void onPreExecute() {
+
+ }
+
+ @Override
+ protected String doInBackground(String ... url) {
+
+ if (HelperCheckInternetConnection.hasNetwork()) {
+ if (url.length >= 1) {
+ return callWebService(url[0], localNameValuePairs);
+ } else {
+ return null;
+ }
+ } else {
+ String ret = "{\"result\":2, \"detail\":\"";
+ ret+= context.getString(R.string.check_internet_connection);
+ ret += "\"}";
+ return ret;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(String webRet) {
+
+ callback.onTaskComplete(webRet);
+ }
+ }
+
+
+
+}
diff --git a/app/src/main/java/net/iGap/realm/RealmContacts.java b/app/src/main/java/net/iGap/realm/RealmContacts.java
index 672aceb..df671b9 100644
--- a/app/src/main/java/net/iGap/realm/RealmContacts.java
+++ b/app/src/main/java/net/iGap/realm/RealmContacts.java
@@ -89,7 +89,7 @@ public void execute(Realm realm) {
public static void updateBlock(final long userId, final boolean block) {
Realm realm = Realm.getDefaultInstance();
- final RealmContacts realmContacts = realm.where(RealmContacts.class).equalTo(RealmContactsFields.ID, userId).findFirst();
+ RealmContacts realmContacts = realm.where(RealmContacts.class).equalTo(RealmContactsFields.ID, userId).findFirst();
if (realmContacts != null) {
realm.executeTransaction(new Realm.Transaction() {
@Override
@@ -101,6 +101,8 @@ public void execute(Realm realm) {
realm.close();
}
+
+
public long getId() {
return id;
}
diff --git a/app/src/main/java/net/iGap/realm/RealmMigration.java b/app/src/main/java/net/iGap/realm/RealmMigration.java
index 7dc20ac..84be065 100644
--- a/app/src/main/java/net/iGap/realm/RealmMigration.java
+++ b/app/src/main/java/net/iGap/realm/RealmMigration.java
@@ -319,7 +319,7 @@ public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
oldVersion++;
}
- if (oldVersion == REALM_LATEST_MIGRATION_VERSION) { // REALM_LATEST_MIGRATION_VERSION = 22
+ if (oldVersion == 22) {
RealmObjectSchema realmUserInfo = schema.get(RealmUserInfo.class.getSimpleName());
if (realmUserInfo != null) {
@@ -328,5 +328,41 @@ public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
oldVersion++;
}
+
+ if (oldVersion == 23) {
+
+ RealmObjectSchema realmRegisteredInfo = schema.get(RealmRegisteredInfo.class.getSimpleName());
+ if (realmRegisteredInfo != null) {
+ realmRegisteredInfo.addField("isBot", boolean.class, FieldAttribute.REQUIRED);
+ }
+
+ oldVersion++;
+ }
+
+ if (oldVersion == 24) {
+
+ RealmObjectSchema realmRoom = schema.get(RealmRoom.class.getSimpleName());
+ if (realmRoom != null) {
+ realmRoom.addField("priority", int.class, FieldAttribute.REQUIRED);
+ }
+
+ oldVersion++;
+ }
+
+ if (oldVersion == REALM_LATEST_MIGRATION_VERSION) { // REALM_LATEST_MIGRATION_VERSION = 25
+
+ RealmObjectSchema realmRoom = schema.get(RealmRoom.class.getSimpleName());
+ if (realmRoom != null) {
+ realmRoom.addField("isFromPromote", boolean.class, FieldAttribute.REQUIRED);
+ realmRoom.addField("promoteId", long.class, FieldAttribute.REQUIRED);
+ }
+
+ RealmObjectSchema realmPrivacy = schema.get(RealmPrivacy.class.getSimpleName());
+ if (realmPrivacy != null) {
+ realmPrivacy.addField("whoCanVideoCallToMe", String.class);
+ }
+
+ oldVersion++;
+ }
}
}
diff --git a/app/src/main/java/net/iGap/realm/RealmPrivacy.java b/app/src/main/java/net/iGap/realm/RealmPrivacy.java
index 38c8c48..ab14eb1 100644
--- a/app/src/main/java/net/iGap/realm/RealmPrivacy.java
+++ b/app/src/main/java/net/iGap/realm/RealmPrivacy.java
@@ -24,8 +24,9 @@ public class RealmPrivacy extends RealmObject {
private String whoCanInviteMeToGroup;
private String whoCanSeeMyLastSeen;
private String whoCanVoiceCallToMe;
+ private String whoCanVideoCallToMe;
- public static void updatePrivacy(final String avatar, final String channel, final String Group, final String lastSeen, final String voiceCall) {
+ public static void updatePrivacy(final String avatar, final String channel, final String Group, final String lastSeen, final String voiceCall, final String videoCall) {
Realm realm = Realm.getDefaultInstance();
final RealmPrivacy realmPrivacy = realm.where(RealmPrivacy.class).findFirst();
@@ -41,6 +42,7 @@ public void execute(Realm realm) {
if (Group.length() > 0) realmPrivacy.setWhoCanInviteMeToGroup(Group);
if (lastSeen.length() > 0) realmPrivacy.setWhoCanSeeMyLastSeen(lastSeen);
if (voiceCall.length() > 0) realmPrivacy.setWhoCanVoiceCallToMe(voiceCall);
+ if (videoCall.length() > 0) realmPrivacy.setWhoCanVideoCallToMe(videoCall);
}
});
} else {
@@ -55,7 +57,8 @@ public void execute(Realm realm) {
if (channel.length() > 0) realmPrivacy1.setWhoCanInviteMeToChannel(channel);
if (Group.length() > 0) realmPrivacy1.setWhoCanInviteMeToGroup(Group);
if (lastSeen.length() > 0) realmPrivacy1.setWhoCanSeeMyLastSeen(lastSeen);
- if (voiceCall.length() > 0) realmPrivacy.setWhoCanVoiceCallToMe(voiceCall);
+ if (voiceCall.length() > 0) realmPrivacy1.setWhoCanVoiceCallToMe(voiceCall);
+ if (videoCall.length() > 0) realmPrivacy1.setWhoCanVideoCallToMe(videoCall);
}
});
}
@@ -75,6 +78,7 @@ public static void getUpdatePrivacyFromServer() {
new RequestUserPrivacyGetRule().userPrivacyGetRule(ProtoGlobal.PrivacyType.GROUP_INVITE);
new RequestUserPrivacyGetRule().userPrivacyGetRule(ProtoGlobal.PrivacyType.USER_STATUS);
new RequestUserPrivacyGetRule().userPrivacyGetRule(ProtoGlobal.PrivacyType.VOICE_CALLING);
+ new RequestUserPrivacyGetRule().userPrivacyGetRule(ProtoGlobal.PrivacyType.VIDEO_CALLING);
}
public static void updateRealmPrivacy(ProtoGlobal.PrivacyType privacyType, ProtoGlobal.PrivacyLevel privacyLevel) {
@@ -82,19 +86,22 @@ public static void updateRealmPrivacy(ProtoGlobal.PrivacyType privacyType, Proto
switch (privacyType) {
case AVATAR:
- RealmPrivacy.updatePrivacy(privacyLevel.toString(), "", "", "", "");
+ RealmPrivacy.updatePrivacy(privacyLevel.toString(), "", "", "", "", "");
break;
case CHANNEL_INVITE:
- RealmPrivacy.updatePrivacy("", privacyLevel.toString(), "", "", "");
+ RealmPrivacy.updatePrivacy("", privacyLevel.toString(), "", "", "", "");
break;
case GROUP_INVITE:
- RealmPrivacy.updatePrivacy("", "", privacyLevel.toString(), "", "");
+ RealmPrivacy.updatePrivacy("", "", privacyLevel.toString(), "", "", "");
break;
case USER_STATUS:
- RealmPrivacy.updatePrivacy("", "", "", privacyLevel.toString(), "");
+ RealmPrivacy.updatePrivacy("", "", "", privacyLevel.toString(), "", "");
break;
case VOICE_CALLING:
- RealmPrivacy.updatePrivacy("", "", "", "", privacyLevel.toString());
+ RealmPrivacy.updatePrivacy("", "", "", "", privacyLevel.toString(), "");
+ break;
+ case VIDEO_CALLING:
+ RealmPrivacy.updatePrivacy("", "", "", "", "", privacyLevel.toString());
break;
}
@@ -141,4 +148,12 @@ public String getWhoCanVoiceCallToMe() {
public void setWhoCanVoiceCallToMe(String whoCanVoiceCallToMe) {
this.whoCanVoiceCallToMe = whoCanVoiceCallToMe;
}
+
+ public String getWhoCanVideoCallToMe() {
+ return whoCanVideoCallToMe;
+ }
+
+ public void setWhoCanVideoCallToMe(String whoCanVideoCallToMe) {
+ this.whoCanVideoCallToMe = whoCanVideoCallToMe;
+ }
}
diff --git a/app/src/main/java/net/iGap/realm/RealmRegisteredInfo.java b/app/src/main/java/net/iGap/realm/RealmRegisteredInfo.java
index acadbcb..81f7530 100644
--- a/app/src/main/java/net/iGap/realm/RealmRegisteredInfo.java
+++ b/app/src/main/java/net/iGap/realm/RealmRegisteredInfo.java
@@ -44,6 +44,7 @@ public class RealmRegisteredInfo extends RealmObject {
private int avatarCount;
private String bio;
private boolean verified;
+ private boolean isBot;
private boolean mutual;
private boolean blockUser = false;
private boolean DoNotshowSpamBar = false;
@@ -70,6 +71,7 @@ public static RealmRegisteredInfo putOrUpdate(Realm realm, ProtoGlobal.Registere
registeredInfo.setUsername(input.getUsername());
registeredInfo.setBio(input.getBio());
registeredInfo.setVerified(input.getVerified());
+ registeredInfo.setBot(input.getBot());
return registeredInfo;
}
@@ -105,11 +107,11 @@ public static boolean needUpdateUser(long userId, String cacheId) {
*
* @param onRegistrationInfo RealmRegisteredInfo will be returned with this interface
*/
- public static void getRegistrationInfo(long userId, @Nullable String cacheId, final OnInfo onRegistrationInfo) {
- Realm realm = Realm.getDefaultInstance();
- final RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, userId);
+ public static void getRegistrationInfo(long userId, @Nullable String cacheId, Realm realm, final OnInfo onRegistrationInfo) {
+
+ RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, userId);
if (realmRegisteredInfo != null && (cacheId == null || realmRegisteredInfo.getCacheId().equals(cacheId))) {
- onRegistrationInfo.onInfo(realmRegisteredInfo);
+ onRegistrationInfo.onInfo(realmRegisteredInfo.getId());
} else {
RequestUserInfo.infoHashMap.put(userId, onRegistrationInfo);
G.onRegistrationInfo = new OnRegistrationInfo() {
@@ -120,7 +122,7 @@ public void onInfo(ProtoGlobal.RegisteredUser registeredInfo) {
if (InfoListener != null) {
RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm1, registeredInfo.getId());
if (realmRegisteredInfo != null) {
- InfoListener.onInfo(realmRegisteredInfo);
+ InfoListener.onInfo(realmRegisteredInfo.getId());
}
}
RequestUserInfo.infoHashMap.remove(registeredInfo.getId());
@@ -129,11 +131,13 @@ public void onInfo(ProtoGlobal.RegisteredUser registeredInfo) {
};
new RequestUserInfo().userInfo(userId, RequestUserInfo.InfoType.JUST_INFO.toString());
}
- realm.close();
+
}
public static void getRegistrationInfo(long userId, final OnInfo onRegistrationInfo) {
- getRegistrationInfo(userId, null, onRegistrationInfo);
+ Realm realm = Realm.getDefaultInstance();
+ getRegistrationInfo(userId, null, realm, onRegistrationInfo);
+ realm.close();
}
public static RealmRegisteredInfo getRegistrationInfo(Realm realm, long userId) {
@@ -182,6 +186,12 @@ public void execute(Realm realm) {
public static void updateBlock(final long userId, final boolean block) {
Realm realm = Realm.getDefaultInstance();
+ updateBlock(userId, block, realm);
+ realm.close();
+ }
+
+ public static void updateBlock(final long userId, final boolean block, Realm realm) {
+
final RealmRegisteredInfo registeredInfo = getRegistrationInfo(realm, userId);
if (registeredInfo != null) {
realm.executeTransaction(new Realm.Transaction() {
@@ -191,7 +201,7 @@ public void execute(Realm realm) {
}
});
}
- realm.close();
+
}
public static void updateMutual(final String phone, final boolean mutual) {
@@ -358,6 +368,14 @@ public void setVerified(boolean verified) {
this.verified = verified;
}
+ public boolean isBot() {
+ return isBot;
+ }
+
+ public void setBot(boolean bot) {
+ isBot = bot;
+ }
+
public boolean isMutual() {
return mutual;
}
diff --git a/app/src/main/java/net/iGap/realm/RealmRoom.java b/app/src/main/java/net/iGap/realm/RealmRoom.java
index 66b0c58..857ad2e 100644
--- a/app/src/main/java/net/iGap/realm/RealmRoom.java
+++ b/app/src/main/java/net/iGap/realm/RealmRoom.java
@@ -10,7 +10,6 @@
package net.iGap.realm;
-import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.text.format.DateUtils;
@@ -20,10 +19,13 @@
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperString;
import net.iGap.interfaces.OnClientGetRoomMessage;
+import net.iGap.module.BotInit;
+import net.iGap.module.TimeUtils;
import net.iGap.module.enums.ChannelChatRole;
import net.iGap.module.enums.GroupChatRole;
import net.iGap.module.enums.RoomType;
import net.iGap.module.structs.StructMessageOption;
+import net.iGap.proto.ProtoClientGetPromote;
import net.iGap.proto.ProtoGlobal;
import net.iGap.request.RequestClientGetRoom;
import net.iGap.request.RequestClientGetRoomMessage;
@@ -71,6 +73,25 @@ public class RealmRoom extends RealmObject {
private long pinId;
private long pinMessageId;
private long pinMessageIdDeleted;
+ private int priority;
+ private boolean isFromPromote;
+ private long promoteId;
+
+ public long getPromoteId() {
+ return promoteId;
+ }
+
+ public void setPromoteId(long promoteId) {
+ this.promoteId = promoteId;
+ }
+
+ public boolean isFromPromote() {
+ return isFromPromote;
+ }
+
+ public void setFromPromote(boolean fromPromote) {
+ isFromPromote = fromPromote;
+ }
/**
* client need keepRoom info for show in forward message that forward
@@ -120,6 +141,7 @@ public static RealmRoom putOrUpdate(ProtoGlobal.Room room, Realm realm) {
realmRoom = realm.createObject(RealmRoom.class, room.getId());
}
+
realmRoom.isDeleted = false;
realmRoom.keepRoom = false;
@@ -130,13 +152,16 @@ public static RealmRoom putOrUpdate(ProtoGlobal.Room room, Realm realm) {
realmRoom.setUnreadCount(room.getUnreadCount());
realmRoom.setReadOnly(room.getReadOnly());
realmRoom.setMute(room.getRoomMute());
+ realmRoom.setPriority(room.getPriority());
realmRoom.setPinId(room.getPinId());
+
if (room.getPinId() > 0) {
realmRoom.setPinned(true);
} else {
realmRoom.setPinned(false);
}
+
if (room.getPinnedMessage() != null) {
realmRoom.setPinMessageId(room.getPinnedMessage().getMessageId());
}
@@ -243,6 +268,8 @@ public void execute(Realm realm) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setDeleted(true);
}
+
+ BotInit.checkDrIgap();
}
for (ProtoGlobal.Room room : rooms) {
@@ -883,6 +910,12 @@ public void execute(Realm realm) {
RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, roomId).findFirst();
if (realmRoom != null) {
realmRoom.setDraft(RealmRoomDraft.put(realm, message, replyToMessageId));
+
+ if (realmRoom.getLastMessage().getUpdateTime() == 0) {
+ realmRoom.setUpdatedTime(TimeUtils.currentLocalTime());
+ } else {
+ realmRoom.setUpdatedTime(TimeUtils.currentLocalTime());
+ }
}
}
});
@@ -923,6 +956,12 @@ public void execute(Realm realm) {
if (realmRoom != null) {
realmRoom.setDraft(null);
realmRoom.setDraftFile(null);
+
+ if (realmRoom.getLastMessage().getUpdateTime() == 0) {
+ realmRoom.setUpdatedTime(realmRoom.getLastMessage().getCreateTime());
+ } else {
+ realmRoom.setUpdatedTime(realmRoom.getLastMessage().getUpdateTime());
+ }
}
}
}, new Realm.Transaction.OnSuccess() {
@@ -1335,6 +1374,14 @@ public void setPinMessageIdDeleted(long pinMessageIdDeleted) {
this.pinMessageIdDeleted = pinMessageIdDeleted;
}
+ public int getPriority() {
+ return priority;
+ }
+
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+
public static boolean isPinedMessage(long roomId, long messageId) {
boolean result = false;
Realm realm = Realm.getDefaultInstance();
@@ -1397,7 +1444,7 @@ public static long hasPinedMessage(long roomId) {
if (roomMessage == null) {
G.onClientGetRoomMessage = new OnClientGetRoomMessage() {
@Override
- public void onClientGetRoomMessageResponse(long messageId) {
+ public void onClientGetRoomMessageResponse(ProtoGlobal.RoomMessage message) {
G.onClientGetRoomMessage = null;
G.handler.postDelayed(new Runnable() {
@Override
@@ -1516,6 +1563,27 @@ public long getOwnerId() {
}
}
+ public static boolean isBot(long userId) {
+ Realm realm = null;
+ try {
+ realm = Realm.getDefaultInstance();
+ RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(realm, userId);
+ if (realmRegisteredInfo != null) {
+ if (realmRegisteredInfo.isBot()) {
+ return true;
+ } else
+ return false;
+ } else
+ return false;
+ } catch (Exception e) {
+ } finally {
+ realm.close();
+ }
+
+ realm.close();
+ return false;
+ }
+
public static String[] getUnreadCountPages() {
Realm realm = Realm.getDefaultInstance();
RealmResults results = realm.where(RealmRoom.class).equalTo(RealmRoomFields.KEEP_ROOM, false).equalTo(RealmRoomFields.MUTE, false).equalTo(RealmRoomFields.IS_DELETED, false).findAll();
@@ -1544,4 +1612,49 @@ public static String[] getUnreadCountPages() {
return ar;
}
+ public static void setPromote(Long id, ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type type) {
+
+ if (type == ProtoClientGetPromote.ClientGetPromoteResponse.Promote.Type.USER) {
+ Realm realm = Realm.getDefaultInstance();
+ realm.executeTransactionAsync(new Realm.Transaction() {
+ @Override
+ public void execute(Realm realm) {
+ RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.CHAT_ROOM.PEER_ID, id).findFirst();
+
+ if (realmRoom != null) {
+ realmRoom.setFromPromote(true);
+ }
+ }
+
+ });
+ realm.close();
+ } else {
+ Realm realm = Realm.getDefaultInstance();
+ realm.executeTransaction(new Realm.Transaction() {
+ @Override
+ public void execute(Realm realm) {
+ RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, id).findFirst();
+ if (realmRoom != null) {
+ realmRoom.setFromPromote(true);
+ } else {
+ realmRoom.setFromPromote(false);
+ }
+
+ }
+ });
+ realm.close();
+ }
+
+
+ }
+
+ public static boolean isPromote(Long id) {
+ Realm realm = Realm.getDefaultInstance();
+ RealmRoom realmRoom = realm.where(RealmRoom.class).equalTo(RealmRoomFields.ID, id).findFirst();
+ if (realmRoom != null) {
+ return realmRoom.isFromPromote();
+ }
+ realm.close();
+ return false;
+ }
}
diff --git a/app/src/main/java/net/iGap/realm/RealmRoomMessage.java b/app/src/main/java/net/iGap/realm/RealmRoomMessage.java
index 65400b2..e307c13 100644
--- a/app/src/main/java/net/iGap/realm/RealmRoomMessage.java
+++ b/app/src/main/java/net/iGap/realm/RealmRoomMessage.java
@@ -823,6 +823,25 @@ public void execute(Realm realm) {
roomMessage.setEdited(true);
RealmRoomMessage.addTimeIfNeed(roomMessage, realm);
RealmRoomMessage.isEmojiInText(roomMessage, message);
+
+ switch (roomMessage.getMessageType()) {
+ case IMAGE:
+ roomMessage.setMessageType(ProtoGlobal.RoomMessageType.IMAGE_TEXT);
+ break;
+ case VIDEO:
+ roomMessage.setMessageType(ProtoGlobal.RoomMessageType.VIDEO_TEXT);
+ break;
+ case AUDIO:
+ roomMessage.setMessageType(ProtoGlobal.RoomMessageType.AUDIO_TEXT);
+ break;
+ case GIF:
+ roomMessage.setMessageType(ProtoGlobal.RoomMessageType.GIF_TEXT);
+ break;
+ case FILE:
+ roomMessage.setMessageType(ProtoGlobal.RoomMessageType.FILE_TEXT);
+ break;
+ }
+
}
}
});
@@ -1157,7 +1176,16 @@ public void setStatusVersion(long statusVersion) {
}
public ProtoGlobal.RoomMessageType getMessageType() {
- return ProtoGlobal.RoomMessageType.valueOf(messageType);
+
+ if (messageType == null) {
+ return ProtoGlobal.RoomMessageType.UNRECOGNIZED;
+ }
+ try {
+ return ProtoGlobal.RoomMessageType.valueOf(messageType);
+ } catch (RuntimeException e) {
+ return ProtoGlobal.RoomMessageType.UNRECOGNIZED;
+ }
+
}
public void setMessageType(ProtoGlobal.RoomMessageType messageType) {
diff --git a/app/src/main/java/net/iGap/request/RequestClientGetPromote.java b/app/src/main/java/net/iGap/request/RequestClientGetPromote.java
new file mode 100644
index 0000000..baf689a
--- /dev/null
+++ b/app/src/main/java/net/iGap/request/RequestClientGetPromote.java
@@ -0,0 +1,27 @@
+/*
+* This is the source code of iGap for Android
+* It is licensed under GNU AGPL v3.0
+* You should have received a copy of the license in this archive (see LICENSE).
+* Copyright © 2017 , iGap - www.iGap.net
+* iGap Messenger | Free, Fast and Secure instant messaging application
+* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+* All rights reserved.
+*/
+
+package net.iGap.request;
+
+import net.iGap.proto.ProtoClientGetPromote;
+
+public class RequestClientGetPromote {
+
+ public void getPromote() {
+ ProtoClientGetPromote.ClientGetPromote.Builder builder = ProtoClientGetPromote.ClientGetPromote.newBuilder();
+
+ RequestWrapper requestWrapper = new RequestWrapper(618, builder);
+ try {
+ RequestQueue.sendRequest(requestWrapper);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/app/src/main/java/net/iGap/request/RequestClientGetRoom.java b/app/src/main/java/net/iGap/request/RequestClientGetRoom.java
index f0ba522..b716957 100644
--- a/app/src/main/java/net/iGap/request/RequestClientGetRoom.java
+++ b/app/src/main/java/net/iGap/request/RequestClientGetRoom.java
@@ -27,7 +27,7 @@ public void clientGetRoom(long roomId, CreateRoomMode mode) {
}
public enum CreateRoomMode {
- requestFromServer, requestFromOwner, justInfo
+ requestFromServer, requestFromOwner, justInfo, getPromote
}
public static class IdentityClientGetRoom {
diff --git a/app/src/main/java/net/iGap/request/RequestClientJoinByUsername.java b/app/src/main/java/net/iGap/request/RequestClientJoinByUsername.java
index a47cb81..0fa96a0 100644
--- a/app/src/main/java/net/iGap/request/RequestClientJoinByUsername.java
+++ b/app/src/main/java/net/iGap/request/RequestClientJoinByUsername.java
@@ -26,4 +26,17 @@ public void clientJoinByUsername(String username) {
e.printStackTrace();
}
}
+
+ public void clientJoinByUsername(String username, long roomId) {
+
+ ProtoClientJoinByUsername.ClientJoinByUsername.Builder builder = ProtoClientJoinByUsername.ClientJoinByUsername.newBuilder();
+ builder.setUsername(username);
+
+ RequestWrapper requestWrapper = new RequestWrapper(609, builder, roomId+"");
+ try {
+ RequestQueue.sendRequest(requestWrapper);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/app/src/main/java/net/iGap/request/RequestUserSetBot.java b/app/src/main/java/net/iGap/request/RequestUserSetBot.java
new file mode 100644
index 0000000..f828485
--- /dev/null
+++ b/app/src/main/java/net/iGap/request/RequestUserSetBot.java
@@ -0,0 +1,28 @@
+/*
+* This is the source code of iGap for Android
+* It is licensed under GNU AGPL v3.0
+* You should have received a copy of the license in this archive (see LICENSE).
+* Copyright © 2017 , iGap - www.iGap.net
+* iGap Messenger | Free, Fast and Secure instant messaging application
+* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+* All rights reserved.
+*/
+
+package net.iGap.request;
+
+import net.iGap.proto.ProtoUserSetBot;
+
+public class RequestUserSetBot {
+
+ public void userSetBot(boolean botStatus) {
+ ProtoUserSetBot.UserSetBot.Builder builder = ProtoUserSetBot.UserSetBot.newBuilder();
+ builder.setStatus(botStatus);
+
+ RequestWrapper requestWrapper = new RequestWrapper(150, builder);
+ try {
+ RequestQueue.sendRequest(requestWrapper);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/app/src/main/java/net/iGap/response/ChatGetRoomResponse.java b/app/src/main/java/net/iGap/response/ChatGetRoomResponse.java
index 19bc8bc..e2f5686 100644
--- a/app/src/main/java/net/iGap/response/ChatGetRoomResponse.java
+++ b/app/src/main/java/net/iGap/response/ChatGetRoomResponse.java
@@ -12,6 +12,7 @@
import net.iGap.G;
import net.iGap.proto.ProtoChatGetRoom;
+import net.iGap.proto.ProtoClientGetPromote;
import net.iGap.proto.ProtoError;
import net.iGap.proto.ProtoGlobal;
import net.iGap.realm.RealmRoom;
@@ -46,6 +47,7 @@ public void handler() {
if ((chatGetRoomResponse.getRoom().getType() == ProtoGlobal.Room.Type.CHANNEL) || identity != null) {
RealmRoom.putOrUpdate(chatGetRoomResponse.getRoom());
+
} else {
if (G.onChatGetRoom != null) {
G.onChatGetRoom.onChatGetRoom(chatGetRoomResponse.getRoom());
diff --git a/app/src/main/java/net/iGap/response/ClientGetPromoteResponse.java b/app/src/main/java/net/iGap/response/ClientGetPromoteResponse.java
new file mode 100644
index 0000000..6127135
--- /dev/null
+++ b/app/src/main/java/net/iGap/response/ClientGetPromoteResponse.java
@@ -0,0 +1,54 @@
+/*
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
+
+package net.iGap.response;
+
+import net.iGap.G;
+import net.iGap.proto.ProtoClientGetPromote;
+
+public class ClientGetPromoteResponse extends MessageHandler {
+
+ public int actionId;
+ public Object message;
+ public String identity;
+
+ public ClientGetPromoteResponse(int actionId, Object protoClass, String identity) {
+ super(actionId, protoClass, identity);
+
+ this.message = protoClass;
+ this.actionId = actionId;
+ this.identity = identity;
+ }
+
+ @Override
+ public void handler() {
+ super.handler();
+
+ ProtoClientGetPromote.ClientGetPromoteResponse.Builder builder = (ProtoClientGetPromote.ClientGetPromoteResponse.Builder) message;
+ builder.getPromoteList().get(0).getType();
+ builder.getPromoteList().get(0).getId();
+
+
+ if (G.ipromote != null) {
+ G.ipromote.onGetPromoteResponse(builder);
+ }
+
+ }
+
+ @Override
+ public void timeOut() {
+ super.timeOut();
+ }
+
+ @Override
+ public void error() {
+ super.error();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/iGap/response/ClientGetRoomMessageResponse.java b/app/src/main/java/net/iGap/response/ClientGetRoomMessageResponse.java
index 74359c0..911cca0 100644
--- a/app/src/main/java/net/iGap/response/ClientGetRoomMessageResponse.java
+++ b/app/src/main/java/net/iGap/response/ClientGetRoomMessageResponse.java
@@ -46,7 +46,7 @@ public void execute(Realm realm) {
realm.close();
if (G.onClientGetRoomMessage != null) {
- G.onClientGetRoomMessage.onClientGetRoomMessageResponse(builder.getMessage().getMessageId());
+ G.onClientGetRoomMessage.onClientGetRoomMessageResponse(builder.getMessage());
}
}
diff --git a/app/src/main/java/net/iGap/response/ClientGetRoomResponse.java b/app/src/main/java/net/iGap/response/ClientGetRoomResponse.java
index d2e9242..a7b67fd 100644
--- a/app/src/main/java/net/iGap/response/ClientGetRoomResponse.java
+++ b/app/src/main/java/net/iGap/response/ClientGetRoomResponse.java
@@ -1,12 +1,12 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.response;
@@ -24,6 +24,7 @@
import net.iGap.proto.ProtoGlobal;
import net.iGap.realm.RealmRoom;
import net.iGap.request.RequestClientGetRoom;
+import net.iGap.request.RequestClientJoinByUsername;
import io.realm.Realm;
@@ -79,6 +80,25 @@ public void run() {
return;
}
+ if (roomMode != null && roomMode == RequestClientGetRoom.CreateRoomMode.getPromote) {
+ if (!RealmRoom.isMainRoom(clientGetRoom.getRoom().getId())) {
+ RealmRoom realmRoom = RealmRoom.putOrUpdate(clientGetRoom.getRoom(), realm);
+ realmRoom.setFromPromote(true);
+ realmRoom.setPromoteId(clientGetRoom.getRoom().getId());
+ realmRoom.setDeleted(true);
+ realmRoom.setKeepRoom(false);
+ if (clientGetRoom.getRoom().hasChannelRoomExtra()) {
+ new RequestClientJoinByUsername().clientJoinByUsername(clientGetRoom.getRoom().getChannelRoomExtra().getPublicExtra().getUsername(), clientGetRoom.getRoom().getId());
+ } else {
+ new RequestClientJoinByUsername().clientJoinByUsername(clientGetRoom.getRoom().getGroupRoomExtra().getPublicExtra().getUsername(), clientGetRoom.getRoom().getId());
+ }
+
+ //
+ }
+
+ return;
+ }
+
if (clientGetRoom.getRoom().getType() == ProtoGlobal.Room.Type.CHAT) {
new HelperGetUserInfo(new OnGetUserInfo() {
diff --git a/app/src/main/java/net/iGap/response/ClientJoinByUsernameResponse.java b/app/src/main/java/net/iGap/response/ClientJoinByUsernameResponse.java
index 7ea3641..2518ef1 100644
--- a/app/src/main/java/net/iGap/response/ClientJoinByUsernameResponse.java
+++ b/app/src/main/java/net/iGap/response/ClientJoinByUsernameResponse.java
@@ -12,6 +12,8 @@
import net.iGap.G;
import net.iGap.proto.ProtoError;
+import net.iGap.realm.RealmRoom;
+import net.iGap.request.RequestClientPinRoom;
public class ClientJoinByUsernameResponse extends MessageHandler {
@@ -31,6 +33,12 @@ public ClientJoinByUsernameResponse(int actionId, Object protoClass, String iden
public void handler() {
super.handler();
+ if (identity != null) {
+ long roomId = Long.parseLong(identity);
+ RealmRoom.joinRoom(roomId);
+ new RequestClientPinRoom().pinRoom(roomId, true);
+ }
+
if (G.onClientJoinByUsername != null) {
G.onClientJoinByUsername.onClientJoinByUsernameResponse();
}
diff --git a/app/src/main/java/net/iGap/response/GeoGetNearbyDistanceResponse.java b/app/src/main/java/net/iGap/response/GeoGetNearbyDistanceResponse.java
index 0859781..d08132c 100644
--- a/app/src/main/java/net/iGap/response/GeoGetNearbyDistanceResponse.java
+++ b/app/src/main/java/net/iGap/response/GeoGetNearbyDistanceResponse.java
@@ -42,7 +42,7 @@ public void handler() {
if (G.userId != result.getUserId()) { // don't show my account
RealmRegisteredInfo.getRegistrationInfo(result.getUserId(), new OnInfo() {
@Override
- public void onInfo(RealmRegisteredInfo registeredInfo) {
+ public void onInfo(Long registeredId) {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
diff --git a/app/src/main/java/net/iGap/response/MessageHandler.java b/app/src/main/java/net/iGap/response/MessageHandler.java
index 9798b48..3fd4241 100644
--- a/app/src/main/java/net/iGap/response/MessageHandler.java
+++ b/app/src/main/java/net/iGap/response/MessageHandler.java
@@ -70,6 +70,7 @@ public void error() {
HelperError.showSnackMessage(HelperError.getErrorFromCode(majorCode, minorCode), false);
if (!G.ignoreErrorCodes.contains(majorCode)) {
+ Log.i("#peymanERR",majorCode+"");
HelperLog.setErrorLog("majorCode : " + errorResponse.getMajorCode() + " * minorCode : " + errorResponse.getMinorCode() + " * " + G.lookupMap.get(actionId));
}
diff --git a/app/src/main/java/net/iGap/response/UserContactsGetBlockedListResponse.java b/app/src/main/java/net/iGap/response/UserContactsGetBlockedListResponse.java
index 61f2522..3b1968c 100644
--- a/app/src/main/java/net/iGap/response/UserContactsGetBlockedListResponse.java
+++ b/app/src/main/java/net/iGap/response/UserContactsGetBlockedListResponse.java
@@ -10,8 +10,6 @@
package net.iGap.response;
-import android.util.Log;
-
import net.iGap.interfaces.OnInfo;
import net.iGap.proto.ProtoUserContactsGetBlockedList;
import net.iGap.realm.RealmContacts;
@@ -42,59 +40,46 @@ public UserContactsGetBlockedListResponse(int actionId, Object protoClass, Strin
public void handler() {
super.handler();
+ ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.Builder builder = (ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.Builder) message;
+ List list = builder.getUserList();
+
+ Realm realm = Realm.getDefaultInstance();
+ /**
+ * reset blocked user in RealmRegisteredInfo and realm contact
+ */
- new Thread(new Runnable() {
+ realm.executeTransaction(new Realm.Transaction() {
@Override
- public void run() {
- ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.Builder builder = (ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.Builder) message;
- final List list = builder.getUserList();
-
- Realm realm = Realm.getDefaultInstance();
- /**
- * reset blocked user in RealmRegisteredInfo
- */
- final RealmResults results = realm.where(RealmRegisteredInfo.class).equalTo(RealmRegisteredInfoFields.BLOCK_USER, true).findAll();
- if (results != null) {
- realm.executeTransaction(new Realm.Transaction() {
- @Override
- public void execute(Realm realm) {
- for (final RealmRegisteredInfo item : results) {
- item.setBlockUser(false);
- }
- }
- });
+ public void execute(Realm realm) {
+ RealmResults results = realm.where(RealmRegisteredInfo.class).equalTo(RealmRegisteredInfoFields.BLOCK_USER, true).findAll();
+ for (RealmRegisteredInfo item : results) {
+ item.setBlockUser(false);
}
- /**
- * reset blocked user in RealmContacts
- */
- final RealmResults resultsContacts = realm.where(RealmContacts.class).equalTo(RealmRegisteredInfoFields.BLOCK_USER, true).findAll();
- if (resultsContacts != null) {
- realm.executeTransaction(new Realm.Transaction() {
- @Override
- public void execute(Realm realm) {
- for (final RealmContacts item : resultsContacts) {
- item.setBlockUser(false);
- }
- }
- });
- }
- realm.close();
-
- for (ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.User user : list) {
- RealmRegisteredInfo.getRegistrationInfo(user.getUserId(), user.getCacheId(), new OnInfo() {
- @Override
- public void onInfo(final RealmRegisteredInfo registeredInfo) {
- RealmRegisteredInfo.updateBlock(registeredInfo.getId(), true);
- RealmContacts.updateBlock(registeredInfo.getId(), true);
- }
- });
+ RealmResults resultsContacts = realm.where(RealmContacts.class).equalTo(RealmRegisteredInfoFields.BLOCK_USER, true).findAll();
+ for (RealmContacts item : resultsContacts) {
+ item.setBlockUser(false);
}
}
- }).start();
+ });
+
+
+ for (ProtoUserContactsGetBlockedList.UserContactsGetBlockedListResponse.User user : list) {
+ RealmRegisteredInfo.getRegistrationInfo(user.getUserId(), user.getCacheId(), realm, new OnInfo() {
+ @Override
+ public void onInfo(Long registeredId) {
+ RealmRegisteredInfo.updateBlock(registeredId, true);
+ RealmContacts.updateBlock(registeredId, true);
+ }
+ });
+ }
+
+ realm.close();
+
}
+
@Override
public void timeOut() {
super.timeOut();
diff --git a/app/src/main/java/net/iGap/response/UserLoginResponse.java b/app/src/main/java/net/iGap/response/UserLoginResponse.java
index 518c3ff..3fa8faa 100644
--- a/app/src/main/java/net/iGap/response/UserLoginResponse.java
+++ b/app/src/main/java/net/iGap/response/UserLoginResponse.java
@@ -1,15 +1,18 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.response;
+import android.os.Looper;
+import android.util.Log;
+
import net.iGap.G;
import net.iGap.WebSocketClient;
import net.iGap.helper.HelperConnectionState;
@@ -22,6 +25,8 @@
import net.iGap.request.RequestUserLogin;
import net.iGap.request.RequestWalletGetAccessToken;
+import java.util.logging.Handler;
+
import io.realm.Realm;
public class UserLoginResponse extends MessageHandler {
@@ -29,6 +34,8 @@ public class UserLoginResponse extends MessageHandler {
public int actionId;
public Object message;
public String identity;
+ private boolean isDeprecated = false;
+ private boolean isUpdateAvailable = false;
public UserLoginResponse(int actionId, Object protoClass, String identity) {
super(actionId, protoClass, identity);
@@ -38,6 +45,7 @@ public UserLoginResponse(int actionId, Object protoClass, String identity) {
this.actionId = actionId;
}
+
@Override
public void handler() {
super.handler();
@@ -46,6 +54,37 @@ public void handler() {
/*builder.getDeprecatedClient();
builder.getSecondaryNodeName();
builder.getUpdateAvailable();*/
+
+
+ if (builder.getUpdateAvailable() && !isUpdateAvailable) {
+ new android.os.Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (G.onVersionCallBack != null) {
+ G.onVersionCallBack.isUpdateAvailable();
+ isUpdateAvailable = true;
+ }
+ }
+ }, 1000);
+
+
+ }
+
+ if (builder.getDeprecatedClient() && !isDeprecated) {
+ new android.os.Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (G.onVersionCallBack != null) {
+ G.onVersionCallBack.isDeprecated();
+ isDeprecated = true;
+ }
+ }
+ }, 1000);
+
+ }
+
+
+
G.currentServerTime = builder.getResponse().getTimestamp();
G.bothChatDeleteTime = builder.getChatDeleteMessageForBothPeriod() * 1000;
G.userLogin = true;
@@ -76,6 +115,7 @@ public void handler() {
new RequestWalletGetAccessToken().walletGetAccessToken();
}
+
}
@Override
@@ -102,6 +142,8 @@ public void error() {
int minorCode = errorResponse.getMinorCode();
G.onUserLogin.onLoginError(majorCode, minorCode);
}
+
+
}
diff --git a/app/src/main/java/net/iGap/response/UserRegisterResponse.java b/app/src/main/java/net/iGap/response/UserRegisterResponse.java
index bc21b2c..cdbdcc1 100644
--- a/app/src/main/java/net/iGap/response/UserRegisterResponse.java
+++ b/app/src/main/java/net/iGap/response/UserRegisterResponse.java
@@ -1,16 +1,17 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.response;
import android.content.pm.PackageManager;
+import android.util.Log;
import com.crashlytics.android.Crashlytics;
@@ -35,7 +36,8 @@ public UserRegisterResponse(int actionId, Object protoClass, String identity) {
public void handler() {
super.handler();
ProtoUserRegister.UserRegisterResponse.Builder builder = (ProtoUserRegister.UserRegisterResponse.Builder) message;
- G.onUserRegistration.onRegister(builder.getUsername(), builder.getUserId(), builder.getMethod(), builder.getSmsNumberList(), builder.getVerifyCodeRegex(), builder.getVerifyCodeDigitCount(), builder.getAuthorHash());
+ if (G.onUserRegistration != null)
+ G.onUserRegistration.onRegister(builder.getUsername(), builder.getUserId(), builder.getMethod(), builder.getSmsNumberList(), builder.getVerifyCodeRegex(), builder.getVerifyCodeDigitCount(), builder.getAuthorHash(), builder.getCallMethodSupported());
G.userId = builder.getUserId();
G.authorHash = builder.getAuthorHash();
@@ -59,6 +61,7 @@ public void error() {
final int minorCode = errorResponse.getMinorCode();
final int getWait = errorResponse.getWait();
- G.onUserRegistration.onRegisterError(majorCode, minorCode, getWait);
+ if (G.onUserRegistration != null)
+ G.onUserRegistration.onRegisterError(majorCode, minorCode, getWait);
}
}
diff --git a/app/src/main/java/net/iGap/response/UserSetBotResponse.java b/app/src/main/java/net/iGap/response/UserSetBotResponse.java
new file mode 100644
index 0000000..d839b2b
--- /dev/null
+++ b/app/src/main/java/net/iGap/response/UserSetBotResponse.java
@@ -0,0 +1,45 @@
+/*
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
+
+package net.iGap.response;
+
+import net.iGap.proto.ProtoUserSetBot;
+
+public class UserSetBotResponse extends MessageHandler {
+
+ public int actionId;
+ public Object message;
+ public String identity;
+
+ public UserSetBotResponse(int actionId, Object protoClass, String identity) {
+ super(actionId, protoClass, identity);
+
+ this.message = protoClass;
+ this.actionId = actionId;
+ this.identity = identity;
+ }
+
+ @Override
+ public void handler() {
+ super.handler();
+ ProtoUserSetBot.UserSetBotResponse.Builder builder = (ProtoUserSetBot.UserSetBotResponse.Builder) message;
+ builder.getStatus();
+ }
+
+ @Override
+ public void timeOut() {
+ super.timeOut();
+ }
+
+ @Override
+ public void error() {
+ super.error();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/iGap/viewmodel/ActivityCallViewModel.java b/app/src/main/java/net/iGap/viewmodel/ActivityCallViewModel.java
index 801ac8b..58c016f 100644
--- a/app/src/main/java/net/iGap/viewmodel/ActivityCallViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/ActivityCallViewModel.java
@@ -33,9 +33,11 @@
import net.iGap.databinding.ActivityCallBinding;
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperDownloadFile;
+import net.iGap.helper.HelperLog;
import net.iGap.helper.HelperPublicMethod;
import net.iGap.interfaces.ISignalingCallBack;
import net.iGap.module.AndroidUtils;
+import net.iGap.module.AttachFile;
import net.iGap.module.MusicPlayer;
import net.iGap.module.enums.CallState;
import net.iGap.proto.ProtoFileDownload;
@@ -107,10 +109,10 @@ public void onClickBtnMic(View v) {
if (cllBackBtnMic.get().toString().equals(G.fragmentActivity.getResources().getString(R.string.md_mic))) {
cllBackBtnMic.set(G.fragmentActivity.getResources().getString(R.string.md_mic_off));
- WebRTC.muteSound();
+ WebRTC.getInstance().muteSound();
} else {
cllBackBtnMic.set(G.fragmentActivity.getResources().getString(R.string.md_mic));
- WebRTC.unMuteSound();
+ WebRTC.getInstance().unMuteSound();
}
}
@@ -126,6 +128,10 @@ public void onClickBtnSpeaker(View v) {
}
}
+ public void onClickBtnSwitchCamera(View v) {
+ WebRTC.getInstance().switchCamera();
+ }
+
private void getInfo() {
initComponent();
@@ -329,7 +335,7 @@ public void endCall() {
G.isInCall = false;
- new WebRTC().leaveCall();
+ WebRTC.getInstance().leaveCall();
isSendLeave = true;
@@ -479,7 +485,7 @@ private void loadOrDownloadPicture(RealmRegisteredInfo registeredInfo) {
ProtoFileDownload.FileDownload.Selector se = ProtoFileDownload.FileDownload.Selector.FILE;
String dirPath = AndroidUtils.getFilePathWithCashId(av.getCacheId(), av.getName(), G.DIR_IMAGE_USER, false);
- HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE,System.currentTimeMillis() + "", av.getToken(), av.getUrl(), av.getCacheId(), av.getName(), av.getSize(), se, dirPath, 4, new HelperDownloadFile.UpdateListener() {
+ HelperDownloadFile.getInstance().startDownload(ProtoGlobal.RoomMessageType.IMAGE, System.currentTimeMillis() + "", av.getToken(), av.getUrl(), av.getCacheId(), av.getName(), av.getSize(), se, dirPath, 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
if (progress == 100) {
@@ -567,8 +573,15 @@ public void playRingtone() {
try {
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ String path = AttachFile.getFilePathFromUri(alert);
+
ringtonePlayer = new MediaPlayer();
- ringtonePlayer.setDataSource(G.context, alert);
+
+ if (path == null) {
+ ringtonePlayer.setDataSource(context, Uri.parse("android.resource://" + G.context.getPackageName() + "/" + R.raw.tone));
+ } else {
+ ringtonePlayer.setDataSource(G.context, alert);
+ }
if (am.isWiredHeadsetOn()) {
ringtonePlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
@@ -580,6 +593,7 @@ public void playRingtone() {
ringtonePlayer.prepare();
ringtonePlayer.start();
} catch (Exception e) {
+ HelperLog.setErrorLog("activity call view model set ringtone uri " + e);
}
}
@@ -756,7 +770,7 @@ public void onDestroy() {
unMuteMusic();
new RequestSignalingGetLog().signalingGetLog(0, 1);
if (!isSendLeave) {
- new WebRTC().leaveCall();
+ WebRTC.getInstance().leaveCall();
}
}
diff --git a/app/src/main/java/net/iGap/viewmodel/ActivityEnterPassCodeViewModel.java b/app/src/main/java/net/iGap/viewmodel/ActivityEnterPassCodeViewModel.java
index 57e15b4..b931f84 100644
--- a/app/src/main/java/net/iGap/viewmodel/ActivityEnterPassCodeViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/ActivityEnterPassCodeViewModel.java
@@ -73,7 +73,7 @@ public class ActivityEnterPassCodeViewModel {
public ObservableField rippleOkVisibility = new ObservableField<>(View.VISIBLE);
public ObservableField vsRootIsPassCode = new ObservableField<>(View.VISIBLE);
public ObservableField vsRootIsEditText = new ObservableField<>(View.VISIBLE);
- public ObservableField vsRootIsPattern = new ObservableField<>(View.GONE);
+ public ObservableField vsRootIsPattern = new ObservableField<>(View.VISIBLE);
public ObservableField edtSetPasswordInput = new ObservableField<>(TYPE_TEXT_VARIATION_PASSWORD);
public ObservableField onTextChangedMaxLine = new ObservableField<>(4);
private Realm realm;
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentContactsProfileViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentContactsProfileViewModel.java
index 76dfc83..182a89b 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentContactsProfileViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentContactsProfileViewModel.java
@@ -21,6 +21,7 @@
import net.iGap.module.AppUtils;
import net.iGap.module.LastSeenTimeUtil;
import net.iGap.proto.ProtoGlobal;
+import net.iGap.proto.ProtoSignalingOffer;
import net.iGap.realm.RealmAvatar;
import net.iGap.realm.RealmAvatarFields;
import net.iGap.realm.RealmCallConfig;
@@ -48,7 +49,9 @@ public class FragmentContactsProfileViewModel implements OnUserContactEdit, OnUs
public boolean isBlockUser = false;
public boolean disableDeleteContact = false;
public boolean isVerified = false;
+ public ObservableInt videoCallVisibility = new ObservableInt(View.GONE);
public ObservableInt callVisibility = new ObservableInt(View.GONE);
+ public ObservableInt menuVisibility = new ObservableInt(View.VISIBLE);
public ObservableInt toolbarVisibility = new ObservableInt(View.GONE);
public ObservableInt bioVisibility = new ObservableInt(View.VISIBLE);
public ObservableBoolean showNumber = new ObservableBoolean(true);
@@ -73,6 +76,7 @@ public class FragmentContactsProfileViewModel implements OnUserContactEdit, OnUs
private String color;
private String userStatus;
private String avatarPath;
+ private boolean isBot = false;
public FragmentContactsProfileViewModel(FragmentContactsProfileBinding fragmentContactsProfileBinding, long roomId, long userId, String enterFrom) {
this.fragmentContactsProfileBinding = fragmentContactsProfileBinding;
@@ -101,6 +105,14 @@ private void mainStart() {
registeredInfo = RealmRegisteredInfo.getRegistrationInfo(getRealm(), userId);
if (registeredInfo != null) {
+
+ isBot = registeredInfo.isBot();
+ if (isBot) {
+ callVisibility.set(View.GONE);
+ menuVisibility.set(View.GONE);
+ videoCallVisibility.set(View.GONE);
+ }
+
isBlockUser = registeredInfo.isBlockUser();
registeredInfo.addChangeListener(new RealmChangeListener() {
@Override
@@ -108,20 +120,14 @@ public void onChange(RealmModel element) {
isBlockUser = registeredInfo.isBlockUser();
}
});
- }
-
- if (registeredInfo != null) {
if (registeredInfo.getLastAvatar() != null) {
-
String mainFilePath = registeredInfo.getLastAvatar().getFile().getLocalFilePath();
-
if (mainFilePath != null && new File(mainFilePath).exists()) { // if main image is exist showing that
avatarPath = mainFilePath;
} else {
avatarPath = registeredInfo.getLastAvatar().getFile().getLocalThumbnailPath();
}
-
avatarList = registeredInfo.getAvatars();
}
}
@@ -182,11 +188,22 @@ public void onChange(RealmModel element) {
if (userId != 134 && G.userId != userId) {
RealmCallConfig callConfig = getRealm().where(RealmCallConfig.class).findFirst();
if (callConfig != null) {
- if (callConfig.isVoice_calling()) {
- callVisibility.set(View.VISIBLE);
- } else {
+
+ if (isBot) {
callVisibility.set(View.GONE);
+ videoCallVisibility.set(View.GONE);
+ } else {
+
+ if (callConfig.isVoice_calling()) {
+ callVisibility.set(View.VISIBLE);
+ }
+
+ if (callConfig.isVideo_calling()) {
+ videoCallVisibility.set(View.VISIBLE);
+ }
}
+
+
} else {
new RequestSignalingGetConfiguration().signalingGetConfiguration();
}
@@ -217,7 +234,11 @@ private void startInitCallbacks() {
//===============================================================================
public void onCallClick(View view) {
- FragmentCall.call(userId, false);
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING);
+ }
+
+ public void onVideoCallClick(View view) {
+ FragmentCall.call(userId, false, ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING);
}
public void onImageClick(View view) {
@@ -305,9 +326,15 @@ private void setUserStatus(String userStatus, long time) {
this.userStatus = userStatus;
this.lastSeenValue = time;
+ if (isBot) {
+ lastSeen.set(G.context.getResources().getString(R.string.bot));
+ return;
+ }
+
if (userStatus != null) {
if (userStatus.equals(ProtoGlobal.RegisteredUser.Status.EXACTLY.toString())) {
String status = LastSeenTimeUtil.computeTime(userId, time, false);
+
lastSeen.set(status);
} else {
lastSeen.set(userStatus);
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentNotificationAndSoundViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentNotificationAndSoundViewModel.java
index 3cd940f..91aae97 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentNotificationAndSoundViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentNotificationAndSoundViewModel.java
@@ -53,6 +53,7 @@ public class FragmentNotificationAndSoundViewModel {
public ObservableField isInAppVibration = new ObservableField<>();
public ObservableField isInAppPreView = new ObservableField<>();
public ObservableField isSoundInChat = new ObservableField<>();
+ public ObservableField isSeparateNotification = new ObservableField<>();
public ObservableField isKeepService = new ObservableField<>();
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
@@ -250,10 +251,10 @@ private void setAppSound(Boolean isChecked) {
isAppSound.set(isChecked);
if (isChecked) {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND_NEW, 1);
editor.apply();
} else {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND, 0);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_SOUND_NEW, 0);
editor.apply();
}
@@ -263,10 +264,10 @@ private void setInAppVibrate(Boolean isChecked) {
isInAppVibration.set(isChecked);
if (isChecked) {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE_NEW, 1);
editor.apply();
} else {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE, 0);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_VIBRATE_NEW, 0);
editor.apply();
}
@@ -277,10 +278,10 @@ private void setInAppPreView(Boolean isChecked) {
isInAppPreView.set(isChecked);
if (isChecked) {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW_NEW, 1);
editor.apply();
} else {
- editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW, 0);
+ editor.putInt(SHP_SETTING.KEY_STNS_APP_PREVIEW_NEW, 0);
editor.apply();
}
@@ -290,15 +291,26 @@ private void setInSoundChat(Boolean isChecked) {
isSoundInChat.set(isChecked);
if (isChecked) {
- editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND, 1);
+ editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND_NEW, 1);
editor.apply();
} else {
- editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND, 0);
+ editor.putInt(SHP_SETTING.KEY_STNS_CHAT_SOUND_NEW, 0);
editor.apply();
}
}
+ public void setSeparateNotification(Boolean isChecked) {
+ isSeparateNotification.set(isChecked);
+ if (isChecked) {
+ editor.putInt(SHP_SETTING.KEY_STNS_SEPARATE_NOTIFICATION, 1);
+ editor.apply();
+ } else {
+ editor.putInt(SHP_SETTING.KEY_STNS_SEPARATE_NOTIFICATION, 0);
+ editor.apply();
+ }
+ }
+
private void setKeepService(Boolean isChecked) {
isKeepService.set(isChecked);
@@ -638,6 +650,10 @@ public void onClickSoundInChat(View view) {
isSoundInChat.set(!isSoundInChat.get());
}
+ public void onClickSeparateNotification(View view) {
+ isSeparateNotification.set(!isSeparateNotification.get());
+ }
+
public void onCheckedChangedSoundInChat(boolean isChecked) {
setInSoundChat(isChecked);
}
@@ -684,11 +700,12 @@ private void getInfo() {
poRbDialogSoundMessageGroup = sharedPreferences.getInt(SHP_SETTING.KEY_STNS_SOUND_GROUP_POSITION, 0);
soundMessageGroup = sharedPreferences.getString(SHP_SETTING.KEY_STNS_SOUND_GROUP, G.fragmentActivity.getResources().getString(R.string.array_Default_Notification_tone));
- isAppSound.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_SOUND, 0)));
- isInAppVibration.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_VIBRATE, 0)));
- isInAppPreView.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_PREVIEW, 0)));
+ isAppSound.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_SOUND_NEW, 1)));
+ isInAppVibration.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_VIBRATE_NEW, 1)));
+ isInAppPreView.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_APP_PREVIEW_NEW, 1)));
- isSoundInChat.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_CHAT_SOUND, 0)));
+ isSoundInChat.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_CHAT_SOUND_NEW, 1)));
+ isSeparateNotification.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_SEPARATE_NOTIFICATION, 1)));
isKeepService.set(getBoolean(sharedPreferences.getInt(SHP_SETTING.KEY_STNS_KEEP_ALIVE_SERVICE, 1)));
}
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentPassCodeViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentPassCodeViewModel.java
index ba20d12..3bed701 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentPassCodeViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentPassCodeViewModel.java
@@ -64,7 +64,7 @@ public class FragmentPassCodeViewModel {
public ObservableField txtModePassCode = new ObservableField<>(G.context.getResources().getString(R.string.PIN));
public ObservableField isTogglePassCode = new ObservableField<>(false);
public ObservableField isTogglePatternPassCode = new ObservableField<>(false);
- public ObservableField isToggleTactileFeedback = new ObservableField<>(false);
+ public ObservableField isToggleTactileFeedback = new ObservableField<>(true);
public ObservableField isFingerPrint = new ObservableField<>(false);
public ObservableField isAllowScreenCapture = new ObservableField<>(false);
public ObservableField edtSetPasswordInput = new ObservableField<>(InputType.TYPE_TEXT_VARIATION_PASSWORD);
@@ -74,7 +74,7 @@ public class FragmentPassCodeViewModel {
public ObservableField visibilityPatternSetting = new ObservableField<>(View.GONE);
public ObservableField visibilityTactileFeedback = new ObservableField<>(View.GONE);
public ObservableField vgTogglePassCodeVisibility = new ObservableField<>(View.VISIBLE);
- public ObservableField visibilityPatternLock = new ObservableField<>(View.GONE);
+ public ObservableField visibilityPatternLock = new ObservableField<>(View.VISIBLE);
public ObservableField visibilityDescription = new ObservableField<>(View.VISIBLE);
public ObservableField visibilityPassCode = new ObservableField<>(View.VISIBLE);
public ObservableField visibilityCreateNewPattern = new ObservableField<>(View.VISIBLE);
@@ -169,6 +169,7 @@ private void goToSettingPattern() {
rootPatternPassword.set(View.GONE);
visibilityPassCode.set(View.GONE);
isTogglePatternPassCode.set(true);
+ isToggleTactileFeedback.set(true);
}
@@ -226,7 +227,7 @@ private void disablePassCode() {
isTogglePassCode.set(false);
vgTogglePassCodeVisibility.set(View.VISIBLE);
visibilityDescription.set(View.VISIBLE);
- visibilityPatternLock.set(View.GONE);
+ visibilityPatternLock.set(View.VISIBLE);
visibilityChangePass.set(View.GONE);
rootEnterPassword.set(View.GONE);
rootSettingPassword.set(View.GONE);
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentPrivacyAndSecurityViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentPrivacyAndSecurityViewModel.java
index 3bc1f23..2a64934 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentPrivacyAndSecurityViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentPrivacyAndSecurityViewModel.java
@@ -45,10 +45,12 @@ public class FragmentPrivacyAndSecurityViewModel {
private final int INVITE_GROUP = 2;
private final int LAST_SEEN = 3;
private final int VOICE_CALL = 4;
+ private final int VIDEO_CALL = 5;
public ObservableField callbackSeeMyAvatar = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
public ObservableField callbackInviteChannel = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
public ObservableField callbackInviteGroup = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
public ObservableField callbackVoiceCall = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
+ public ObservableField callbackVideoCall = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
public ObservableField callbackSeeLastSeen = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
public ObservableField callbackSelfDestruction = new ObservableField<>(G.fragmentActivity.getResources().getString(R.string.everybody));
int poSelfRemove;
@@ -63,6 +65,7 @@ public class FragmentPrivacyAndSecurityViewModel {
private int poInviteGroup;
private int poSeeLastSeen;
private int poVoiceCall;
+ private int poVideoCall;
private SharedPreferences sharedPreferences;
private int poRbDialogSelfDestruction = 0;
private int selfRemove;
@@ -95,6 +98,10 @@ public void onClickVoiceCall(View view) {
openDialogWhoCan(ProtoGlobal.PrivacyType.VOICE_CALLING, poVoiceCall, R.string.title_who_is_allowed_to_call, VOICE_CALL);
}
+ public void onClickVideoCall(View view) {
+ openDialogWhoCan(ProtoGlobal.PrivacyType.VIDEO_CALLING, poVideoCall, R.string.title_who_is_allowed_to_call, VIDEO_CALL);
+ }
+
public void onClickSeeLastSeen(View view) {
openDialogWhoCan(ProtoGlobal.PrivacyType.USER_STATUS, poSeeLastSeen, R.string.title_Last_Seen, LAST_SEEN);
}
@@ -215,6 +222,9 @@ private void positionDialog(int type, int poWhoCan) {
case 4:
poVoiceCall = poWhoCan;
break;
+ case 5:
+ poVideoCall = poWhoCan;
+ break;
}
}
@@ -226,6 +236,7 @@ private void updatePrivacyUI(RealmPrivacy realmPrivacy) {
callbackInviteGroup.set(getStringFromEnumString(realmPrivacy.getWhoCanInviteMeToGroup(), INVITE_GROUP));
callbackSeeLastSeen.set(getStringFromEnumString(realmPrivacy.getWhoCanSeeMyLastSeen(), LAST_SEEN));
callbackVoiceCall.set(getStringFromEnumString(realmPrivacy.getWhoCanVoiceCallToMe(), VOICE_CALL));
+ callbackVideoCall.set(getStringFromEnumString(realmPrivacy.getWhoCanVideoCallToMe(), VIDEO_CALL));
}
}
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentRegisterViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentRegisterViewModel.java
index ec1d856..cbfc40f 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentRegisterViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentRegisterViewModel.java
@@ -18,7 +18,6 @@
import android.databinding.ObservableField;
import android.databinding.ObservableInt;
import android.graphics.Color;
-import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -27,6 +26,7 @@
import android.support.v7.widget.SearchView;
import android.text.Html;
import android.text.format.DateUtils;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
@@ -91,7 +91,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.concurrent.TimeUnit;
import io.realm.Realm;
@@ -114,6 +113,8 @@ public class FragmentRegisterViewModel implements OnSecurityCheckPassword, OnRec
//Array List for Store List of StructCountry Object
public String regex;
public boolean isVerify = false;
+ private boolean isCallMethodSupported;
+ ProtoUserRegister.UserRegisterResponse.Method methodForReceiveCode = ProtoUserRegister.UserRegisterResponse.Method.VERIFY_CODE_SMS;
public ObservableField callbackTxtAgreement = new ObservableField<>(G.context.getResources().getString(R.string.rg_agreement_text_register));
public ObservableField callbackBtnChoseCountry = new ObservableField<>("Iran");
public ObservableField callbackEdtCodeNumber = new ObservableField<>("+98");
@@ -190,8 +191,11 @@ public class FragmentRegisterViewModel implements OnSecurityCheckPassword, OnRec
private FragmentRegister fragmentRegister;
private View view;
private int sendRequestRegister = 0;
-
-
+ private EditText edtEnterCodeVerify;
+ private TextView btnEnterManuallyCode;
+ private TextView txtTimer;
+ private TextView btnResondCode = null;
+ private TextView txtShowReason;
public FragmentRegisterViewModel(FragmentRegister fragmentRegister, View root, FragmentActivity mActivity) {
this.fragmentRegister = fragmentRegister;
view = root;
@@ -210,9 +214,26 @@ public void run() {
callBackEdtPhoneNumber.set("");
}
}, 30);
-
}
+ }
+ private void shareQr() {
+ if (_resultQrCode == null) {
+ return;
+ }
+ try {
+ File file = new File(_resultQrCode);
+ if (file.exists()) {
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("image/*");
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
+ G.fragmentActivity.startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
}
public void onClickQrCode(View v) {
@@ -220,20 +241,7 @@ public void onClickQrCode(View v) {
dialogQrCode = new MaterialDialog.Builder(G.fragmentActivity).title(G.fragmentActivity.getResources().getString(R.string.Login_with_QrCode)).customView(R.layout.dialog_qrcode, true).positiveText(R.string.share_item_dialog).onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
- if (_resultQrCode == null) {
- return;
- }
- File file = new File(_resultQrCode);
- if (file.exists()) {
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.setType("image/*");
- try {
- intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
- } catch (Exception e) {
- e.printStackTrace();
- }
- G.fragmentActivity.startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
- }
+ shareQr();
}
}).negativeText(R.string.save).onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
@@ -702,38 +710,8 @@ public void run() {
G.handler.post(new Runnable() {
@Override
public void run() {
- userRegister();
btnStartEnable.set(false);
- long time = 0;
- if (BuildConfig.DEBUG) {
- time = 2 * DateUtils.SECOND_IN_MILLIS;
- } else if (FragmentRegister.smsPermission) {
- time = Config.COUNTER_TIMER;
- } else {
- time = 5 * DateUtils.SECOND_IN_MILLIS;
- }
-
- countDownTimer = new CountDownTimer(time, Config.COUNTER_TIMER_DELAY) { // wait for verify sms
- public void onTick(long millisUntilFinished) {
-
- int seconds = (int) ((millisUntilFinished) / 1000);
- int minutes = seconds / 60;
- seconds = seconds % 60;
-
- txtVerifyTimerVisibility.set(View.VISIBLE);
- callBackTxtVerifyTimer.set("" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds));
-
- }
-
- public void onFinish() {
-
- if (callBackTxtVerifyTimer != null) {
- callBackTxtVerifyTimer.set("00:00");
- txtVerifyTimerVisibility.set(View.INVISIBLE);
- }
- errorVerifySms(FragmentRegister.Reason.TIME_OUT); // open rg_dialog for enter sms code
- }
- };
+ userRegister();
}
});
} else { // connection error
@@ -762,6 +740,7 @@ private void errorVerifySms(FragmentRegister.Reason reason) { //when don't recei
return;
}
+ boolean isNeedTimer = true;
prgVerifySmsVisibility.set(View.GONE);
//imgVerifySmsColor.set(R.mipmap.alert);
imgVerifySmsVisibility.set(View.VISIBLE);
@@ -769,33 +748,29 @@ private void errorVerifySms(FragmentRegister.Reason reason) { //when don't recei
callBackTxtVerifySms.set(G.context.getResources().getString(R.string.errore_verification_sms));
txtVerifySmsColor.set(G.context.getResources().getColor(R.color.rg_error_red));
- dialog = new Dialog(G.fragmentActivity);
- dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
- dialog.setContentView(R.layout.rg_dialog_verify_code);
- dialog.setCanceledOnTouchOutside(false);
-
- final EditText edtEnterCodeVerify = (EditText) dialog.findViewById(R.id.rg_edt_dialog_verifyCode); //EditText For Enter sms cod
-
- TextView txtShowReason = (TextView) dialog.findViewById(R.id.txt_show_reason);
-
- if (reason == FragmentRegister.Reason.SOCKET) {
- txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_socket_message));
- } else if (reason == FragmentRegister.Reason.TIME_OUT) {
- txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_time_out_message));
- } else if (reason == FragmentRegister.Reason.INVALID_CODE) {
- txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_invalid_code_message));
+ if (dialog ==null){
+ dialog = new Dialog(G.fragmentActivity);
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialog.setContentView(R.layout.rg_dialog_verify_code);
+ dialog.setCanceledOnTouchOutside(false);
+ dialog.setCancelable(false);
+ edtEnterCodeVerify = (EditText) dialog.findViewById(R.id.rg_edt_dialog_verifyCode); //EditText For Enter sms cod
+ txtShowReason = (TextView) dialog.findViewById(R.id.txt_show_reason);
+ btnEnterManuallyCode = (TextView) dialog.findViewById(R.id.rg_btn_cancelVerifyCode);
+ txtTimer = (TextView) dialog.findViewById(R.id.remindTime);
+ btnResondCode = (TextView) dialog.findViewById(R.id.rg_btn_dialog_okVerifyCode);// resend code
}
- TextView btnCancel = (TextView) dialog.findViewById(R.id.rg_btn_cancelVerifyCode);
- btnCancel.setOnClickListener(new View.OnClickListener() {
+ edtEnterCodeVerify.setText("");
+
+ btnEnterManuallyCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
txtVerifyTimerVisibility.set(View.INVISIBLE);
-
- if (!edtEnterCodeVerify.getText().toString().equals("")) {
- verifyCode = edtEnterCodeVerify.getText().toString();
+ verifyCode = edtEnterCodeVerify.getText().toString();
+ if (verifyCode.length() > 0) {
userVerify(userName, verifyCode);
dialog.dismiss();
} else {
@@ -807,42 +782,115 @@ public void onClick(View v) {
}
});
- TextView btnOk = (TextView) dialog.findViewById(R.id.rg_btn_dialog_okVerifyCode);
- btnOk.setOnClickListener(new View.OnClickListener() {
+
+ btnResondCode.setEnabled(false);
+ btnResondCode.setTextColor(G.context.getResources().getColor(R.color.gray_9d));
+ btnResondCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
+
+ methodForReceiveCode = ProtoUserRegister.UserRegisterResponse.Method.VERIFY_CODE_SMS;
+ btnResondCode.setTextColor(G.context.getResources().getColor(R.color.gray_9d));
+ btnResondCode.setEnabled(false);
+ txtTimer.setVisibility(View.VISIBLE);
userRegister();
- dialog.dismiss();
- InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
- if (imm != null) {
- imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
- }
+ counterTimer(txtTimer, btnResondCode);
+// startRegister(v);
}
+
+
});
- dialog.setCancelable(false);
- dialog.setCanceledOnTouchOutside(false);
+
+ if (reason == FragmentRegister.Reason.SOCKET) {
+ txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_socket_message));
+ isNeedTimer = false;
+ btnResondCode.setVisibility(View.GONE);
+ } else if (reason == FragmentRegister.Reason.TIME_OUT) {
+ txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_time_out_message));
+ isNeedTimer = true;
+ btnResondCode.setEnabled(false);
+ btnResondCode.setTextColor(G.context.getResources().getColor(R.color.gray_9d));
+ } else if (reason == FragmentRegister.Reason.INVALID_CODE) {
+ txtShowReason.setText(G.fragmentActivity.getResources().getString(R.string.verify_invalid_code_message));
+ isNeedTimer = false;
+ btnResondCode.setEnabled(true);
+ btnResondCode.setTextColor(G.context.getResources().getColor(R.color.green));
+ }
+
+
+ if (isNeedTimer) {
+ txtTimer.setVisibility(View.VISIBLE);
+ counterTimer(txtTimer, btnResondCode);
+
+ } else {
+ txtTimer.setVisibility(View.INVISIBLE);
+ }
try {
if (!(G.fragmentActivity).isFinishing()) {
dialog.show();
- if (dialog.isShowing()) {
- countDownTimer.cancel();
- }
+// if (dialog.isShowing()) {
+// countDownTimer.cancel();
+// }
}
} catch (WindowManager.BadTokenException e) {
e.printStackTrace();
}
}
+ private void counterTimer(TextView txtTimer, TextView btnResondCode) {
+
+ long time = 0;
+ if (BuildConfig.DEBUG) {
+ time = 2 * DateUtils.SECOND_IN_MILLIS;
+ } else if (FragmentRegister.smsPermission) {
+ time = Config.COUNTER_TIMER;
+ } else {
+ time = 5 * DateUtils.SECOND_IN_MILLIS;
+ }
+
+ CountDownTimer countDownTimer = new CountDownTimer(time, Config.COUNTER_TIMER_DELAY) { // wait for verify sms
+ public void onTick(long millisUntilFinished) {
+
+ int seconds = (int) ((millisUntilFinished) / 1000);
+ int minutes = seconds / 60;
+ seconds = seconds % 60;
+
+ txtTimer.setText("" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds));
+
+ }
+
+ public void onFinish() {
+
+ txtTimer.setVisibility(View.INVISIBLE);
+ btnResondCode.setEnabled(true);
+ btnResondCode.setTextColor(G.context.getResources().getColor(R.color.green));
+
+ }
+ };
+
+ countDownTimer.start();
+ }
+
+ private void startRegister(View v) {
+ userRegister();
+ dialog.dismiss();
+ InputMethodManager imm = (InputMethodManager) G.context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ if (imm != null) {
+ imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+ }
+ }
+
private void userRegister() {
G.onUserRegistration = new OnUserRegistration() {
@Override
- public void onRegister(final String userNameR, final long userIdR, final ProtoUserRegister.UserRegisterResponse.Method methodValue, final List smsNumbersR, String regex, int verifyCodeDigitCount, final String authorHashR) {
+ public void onRegister(final String userNameR, final long userIdR, final ProtoUserRegister.UserRegisterResponse.Method methodValue, final List smsNumbersR, String regex, int verifyCodeDigitCount, final String authorHashR, boolean callMethodSupported) {
G.onUserRegistration = null;
+ isCallMethodSupported = callMethodSupported;
digitCount = verifyCodeDigitCount;
- countDownTimer.start();
+// countDownTimer.start();
regexFetchCodeVerification = regex;
G.handler.post(new Runnable() {
@Override
@@ -857,9 +905,10 @@ public void run() {
if (methodValue == ProtoUserRegister.UserRegisterResponse.Method.VERIFY_CODE_SOCKET) {
errorVerifySms(FragmentRegister.Reason.SOCKET);
- countDownTimer.cancel();
+// countDownTimer.cancel();
+ } else {
+ errorVerifySms(FragmentRegister.Reason.TIME_OUT); // open rg_dialog for enter sms code
}
-
prgVerifyConnectVisibility.set(View.GONE);
txtIconVerifyConnectVisibility.set(View.VISIBLE);
imgVerifySmsVisibility.set(View.GONE);
@@ -944,7 +993,9 @@ public void run() {
private void dialogWaitTime(int title, long time, int majorCode) {
- if (!G.fragmentActivity.hasWindowFocus() || G.fragmentActivity.isFinishing()) {
+ if (dialog != null && dialog.isShowing()) dialog.dismiss();
+
+ if (G.fragmentActivity.isFinishing()) {
return;
}
@@ -974,11 +1025,11 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
CountDownTimer countWaitTimer = new CountDownTimer(time * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
- long seconds = millisUntilFinished/1000 % 60;
- long minutes = millisUntilFinished/(60*1000) % 60;
- long hour = millisUntilFinished/(3600*1000);
+ long seconds = millisUntilFinished / 1000 % 60;
+ long minutes = millisUntilFinished / (60 * 1000) % 60;
+ long hour = millisUntilFinished / (3600 * 1000);
- remindTime.setText(String.format("%02d:%02d:%02d",hour, minutes, seconds));
+ remindTime.setText(String.format("%02d:%02d:%02d", hour, minutes, seconds));
dialogWait.getActionButton(DialogAction.POSITIVE).setEnabled(false);
}
@@ -998,6 +1049,7 @@ private void requestRegister() {
ProtoUserRegister.UserRegister.Builder builder = ProtoUserRegister.UserRegister.newBuilder();
builder.setCountryCode(isoCode);
builder.setPhoneNumber(Long.parseLong(phoneNumber));
+ builder.setPreferenceMethodValue(methodForReceiveCode.getNumber());
builder.setRequest(ProtoRequest.Request.newBuilder().setId(HelperString.generateKey()));
RequestWrapper requestWrapper = new RequestWrapper(100, builder);
@@ -1358,19 +1410,31 @@ public void run() {
public void receiveVerifySms(String message) {
- if (dialog != null && dialog.isShowing()) {
- dialog.dismiss();
- }
- String verificationCode = HelperString.regexExtractValue(message, regexFetchCodeVerification);
- verifyCode = verificationCode;
- countDownTimer.cancel(); //cancel method CountDown and continue process verify
+ G.handler.post(new Runnable() {
+ @Override
+ public void run() {
- prgVerifySmsVisibility.set(View.GONE);
- imgVerifySmsVisibility.set(View.VISIBLE);
- txtVerifySmsColor.set(G.context.getResources().getColor(R.color.rg_text_verify));
- userVerify(userName, verificationCode);
+ verifyCode = HelperString.regexExtractValue(message, regexFetchCodeVerification);
+// countDownTimer.cancel(); //cancel method CountDown and continue process verify
+
+ prgVerifySmsVisibility.set(View.GONE);
+ imgVerifySmsVisibility.set(View.VISIBLE);
+ txtVerifySmsColor.set(G.context.getResources().getColor(R.color.rg_text_verify));
+
+ if (dialog != null && dialog.isShowing()) {
+ if (edtEnterCodeVerify != null) {
+ edtEnterCodeVerify.setText(verifyCode);
+ }
+ if (btnEnterManuallyCode != null) {
+ btnEnterManuallyCode.performClick();
+ }
+ dialog.dismiss();
+ }
+// userVerify(userName, verificationCode);
+ }
+ });
}
private void closeKeyboard(final View v) {
diff --git a/app/src/main/java/net/iGap/viewmodel/FragmentSettingViewModel.java b/app/src/main/java/net/iGap/viewmodel/FragmentSettingViewModel.java
index 980c74d..e4b6e0f 100644
--- a/app/src/main/java/net/iGap/viewmodel/FragmentSettingViewModel.java
+++ b/app/src/main/java/net/iGap/viewmodel/FragmentSettingViewModel.java
@@ -145,6 +145,7 @@ public class FragmentSettingViewModel {
public ObservableField isShowVote = new ObservableField<>();
public ObservableField isSenderNameGroup = new ObservableField<>();
public ObservableField isSendEnter = new ObservableField<>();
+ public ObservableField isInAppBrowser = new ObservableField<>();
public ObservableField isThemeDark = new ObservableField<>();
public ObservableField isSaveGallery = new ObservableField<>();
public ObservableField isAutoGif = new ObservableField<>();
@@ -1097,17 +1098,38 @@ public void onClickSendEnter(View view) {
isSendEnter.set(!isSendEnter.get());
}
+
+
public void onCheckedChangedSendEnter(boolean isChecked) {
SharedPreferences.Editor editor = sharedPreferences.edit();
isSendEnter.set(isChecked);
if (isChecked) {
editor.putInt(SHP_SETTING.KEY_SEND_BT_ENTER, 1);
- editor.apply();
} else {
editor.putInt(SHP_SETTING.KEY_SEND_BT_ENTER, 0);
- editor.apply();
}
+ editor.apply();
+ }
+
+ public void onClickAppBrowser(View view) {
+
+ isInAppBrowser.set(!isInAppBrowser.get());
+ }
+
+
+ public void onCheckedAppBrowser(boolean isChecked) {
+
+
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ isInAppBrowser.set(isChecked);
+ if (isChecked) {
+ editor.putInt(SHP_SETTING.KEY_IN_APP_BROWSER, 1);
+ } else {
+ editor.putInt(SHP_SETTING.KEY_IN_APP_BROWSER, 0);
+ }
+ editor.apply();
+
}
@@ -1443,7 +1465,7 @@ private void getInfo() {
if (realmPrivacy == null) {
- RealmPrivacy.updatePrivacy("", "", "", "", "");
+ RealmPrivacy.updatePrivacy("", "", "", "", "", "");
}
sharedPreferences = G.fragmentActivity.getSharedPreferences(SHP_SETTING.FILE_NAME, MODE_PRIVATE);
@@ -1505,6 +1527,9 @@ public void dataName(String type) {
int checkedSendByEnter = sharedPreferences.getInt(SHP_SETTING.KEY_SEND_BT_ENTER, 0);
isSendEnter.set(getBoolean(checkedSendByEnter));
+ int checkedInAppBrowser = sharedPreferences.getInt(SHP_SETTING.KEY_IN_APP_BROWSER, 1);
+ isInAppBrowser.set(getBoolean(checkedInAppBrowser));
+
boolean checkedThemeDark = sharedPreferences.getBoolean(SHP_SETTING.KEY_THEME_DARK, false);
isThemeDark.set(checkedThemeDark);
diff --git a/app/src/main/java/net/iGap/webrtc/CallObserver.java b/app/src/main/java/net/iGap/webrtc/CallObserver.java
index b093ee9..7bc1436 100644
--- a/app/src/main/java/net/iGap/webrtc/CallObserver.java
+++ b/app/src/main/java/net/iGap/webrtc/CallObserver.java
@@ -56,39 +56,40 @@ public CallObserver() {
@Override
public void onOffer(final long called_userId, ProtoSignalingOffer.SignalingOffer.Type type, final String callerSdp) {
- if (type != ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING) {
+ if (type == ProtoSignalingOffer.SignalingOffer.Type.SECRET_CHAT || type == ProtoSignalingOffer.SignalingOffer.Type.SCREEN_SHARING) {
return;
}
-
+ WebRTC.getInstance().setCallType(type);
new RequestSignalingRinging().signalingRinging();
G.handler.post(new Runnable() {
@Override
public void run() {
- if (new WebRTC().peerConnectionInstance() != null) {
- new WebRTC().peerConnectionInstance().setRemoteDescription(new SdpObserver() {
- @Override
- public void onCreateSuccess(SessionDescription sessionDescription) {
-
- }
-
- @Override
- public void onSetSuccess() {
- FragmentCall.call(called_userId, true);
- }
-
- @Override
- public void onCreateFailure(String s) {
- Log.i("WWW", "onOffer onCreateFailure : " + s);
- }
-
- @Override
- public void onSetFailure(String s) {
- Log.i("WWW", "onOffer onSetFailure : " + s);
- }
- }, new SessionDescription(OFFER, callerSdp));
- }
+
+
+ WebRTC.getInstance().peerConnectionInstance().setRemoteDescription(new SdpObserver() {
+ @Override
+ public void onCreateSuccess(SessionDescription sessionDescription) {
+
+ }
+
+ @Override
+ public void onSetSuccess() {
+ FragmentCall.call(called_userId, true, type);
+ }
+
+ @Override
+ public void onCreateFailure(String s) {
+ Log.i("WWW", "onOffer onCreateFailure : " + s);
+ }
+
+ @Override
+ public void onSetFailure(String s) {
+ Log.i("WWW", "onOffer onSetFailure : " + s);
+ }
+ }, new SessionDescription(OFFER, callerSdp));
}
+
});
}
@@ -97,9 +98,9 @@ public void onAccept(final String called_sdp) {
G.handler.post(new Runnable() {
@Override
public void run() {
- new WebRTC().setOfferLocalDescription();
+ WebRTC.getInstance().setOfferLocalDescription();
- new WebRTC().peerConnectionInstance().setRemoteDescription(new SdpObserver() {
+ WebRTC.getInstance().peerConnectionInstance().setRemoteDescription(new SdpObserver() {
@Override
public void onCreateSuccess(SessionDescription sessionDescription) {
@@ -130,7 +131,7 @@ public void onCandidate(final String peerSdpMId, final int peerSdpMLineIndex, fi
@Override
public void run() {
Log.i("WWW_Candidate", "onCandidate server : " + peerCandidate);
- new WebRTC().peerConnectionInstance().addIceCandidate(new IceCandidate(peerSdpMId, peerSdpMLineIndex, peerCandidate));
+ WebRTC.getInstance().peerConnectionInstance().addIceCandidate(new IceCandidate(peerSdpMId, peerSdpMLineIndex, peerCandidate));
}
});
}
@@ -138,12 +139,12 @@ public void run() {
@Override
public void onLeave(final ProtoSignalingLeave.SignalingLeaveResponse.Type type) {
- new WebRTC().close();
- new WebRTC().dispose();
+ WebRTC.getInstance().close();
+ WebRTC.getInstance().dispose();
/**
* set peer connection null for try again
*/
- new WebRTC().clearConnection();
+ WebRTC.getInstance().clearConnection();
if (G.iSignalingCallBack != null) {
diff --git a/app/src/main/java/net/iGap/webrtc/PeerConnectionObserver.java b/app/src/main/java/net/iGap/webrtc/PeerConnectionObserver.java
index dcab916..a6b3eca 100644
--- a/app/src/main/java/net/iGap/webrtc/PeerConnectionObserver.java
+++ b/app/src/main/java/net/iGap/webrtc/PeerConnectionObserver.java
@@ -1,5 +1,5 @@
/*
- * This is the source code of iGap for Android
+ * Thf is the source code of iGap for Android
* It is licensed under GNU AGPL v3.0
* You should have received a copy of the license in this archive (see LICENSE).
* Copyright © 2017 , iGap - www.iGap.net
@@ -31,6 +31,9 @@
import org.webrtc.MediaStream;
import org.webrtc.PeerConnection;
import org.webrtc.RtpReceiver;
+import org.webrtc.VideoFrame;
+import org.webrtc.VideoSink;
+import org.webrtc.VideoTrack;
import static org.webrtc.PeerConnection.IceConnectionState.CHECKING;
import static org.webrtc.PeerConnection.IceConnectionState.CLOSED;
@@ -91,11 +94,23 @@ public void onAddStream(MediaStream stream) {
audioTrack.setEnabled(true);
}
- /*if (stream.videoTracks != null && stream.videoTracks.size() == 1) {
+ if (stream.videoTracks != null && stream.videoTracks.size() == 1) {
VideoTrack videoTrack = stream.videoTracks.get(0);
videoTrack.setEnabled(true);
- videoTrack.addRenderer(new VideoRenderer(this));
- }*/
+
+ videoTrack.addSink(new VideoSink() {
+ @Override
+ public void onFrame(VideoFrame videoFrame) {
+
+ if (G.onVideoCallFrame != null) {
+ G.onVideoCallFrame.onRemoteFrame(videoFrame);
+ }
+ }
+ });
+
+ }
+
+
}
@Override
diff --git a/app/src/main/java/net/iGap/webrtc/WebRTC.java b/app/src/main/java/net/iGap/webrtc/WebRTC.java
index a1b4ac8..b3aa52b 100644
--- a/app/src/main/java/net/iGap/webrtc/WebRTC.java
+++ b/app/src/main/java/net/iGap/webrtc/WebRTC.java
@@ -1,16 +1,17 @@
/*
-* This is the source code of iGap for Android
-* It is licensed under GNU AGPL v3.0
-* You should have received a copy of the license in this archive (see LICENSE).
-* Copyright © 2017 , iGap - www.iGap.net
-* iGap Messenger | Free, Fast and Secure instant messaging application
-* The idea of the RooyeKhat Media Company - www.RooyeKhat.co
-* All rights reserved.
-*/
+ * This is the source code of iGap for Android
+ * It is licensed under GNU AGPL v3.0
+ * You should have received a copy of the license in this archive (see LICENSE).
+ * Copyright © 2017 , iGap - www.iGap.net
+ * iGap Messenger | Free, Fast and Secure instant messaging application
+ * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
+ * All rights reserved.
+ */
package net.iGap.webrtc;
+import android.hardware.Camera;
import android.os.Build;
import android.util.Log;
@@ -24,40 +25,59 @@
import org.webrtc.AudioSource;
import org.webrtc.AudioTrack;
-
+import org.webrtc.Camera1Enumerator;
+import org.webrtc.CameraEnumerator;
+import org.webrtc.CameraVideoCapturer;
import org.webrtc.MediaConstraints;
import org.webrtc.MediaStream;
import org.webrtc.PeerConnection;
import org.webrtc.PeerConnectionFactory;
import org.webrtc.SdpObserver;
import org.webrtc.SessionDescription;
+import org.webrtc.VideoCapturer;
+import org.webrtc.VideoFrame;
+import org.webrtc.VideoSink;
+import org.webrtc.VideoSource;
+import org.webrtc.VideoTrack;
import org.webrtc.voiceengine.WebRtcAudioManager;
import org.webrtc.voiceengine.WebRtcAudioUtils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
-import java.util.NoSuchElementException;
import java.util.Set;
import io.realm.Realm;
public class WebRTC {
- private static PeerConnection peerConnection;
- private static PeerConnectionFactory peerConnectionFactory;
- private static MediaStream mediaStream;
- private static String offerSdp;
+
+ private static final String VIDEO_TRACK_ID = "ARDAMSv0";
+ private static final int VIDEO_RESOLUTION_WIDTH = 720;
+ private static final int VIDEO_RESOLUTION_HEIGHT = 480;
+ private static final int FPS = 30;
+
+ private PeerConnection peerConnection;
+ private PeerConnectionFactory peerConnectionFactory;
+ private MediaStream mediaStream;
+ private String offerSdp;
private MediaConstraints mediaConstraints;
private MediaConstraints audioConstraints;
- private AudioTrack audioTrack;
- private AudioSource audioSource;
+ private VideoCapturer videoCapturer;
+ private VideoTrack videoTrackFromCamera;
+ VideoSource videoSource;
+ private ProtoSignalingOffer.SignalingOffer.Type callTYpe;
+
+ private static WebRTC webRTCInstance;
- public WebRTC() {
- peerConnectionInstance();
+ public static WebRTC getInstance() {
+ if (webRTCInstance == null) {
+ webRTCInstance = new WebRTC();
+ }
+ return webRTCInstance;
}
- public static void muteSound() {
+ public void muteSound() {
if (mediaStream == null) {
return;
@@ -68,7 +88,16 @@ public static void muteSound() {
}
}
- public static void unMuteSound() {
+
+ public void switchCamera() {
+ if (Camera.getNumberOfCameras() > 1) {
+ if (videoCapturer instanceof CameraVideoCapturer) {
+ ((CameraVideoCapturer) videoCapturer).switchCamera(null);
+ }
+ }
+ }
+
+ public void unMuteSound() {
if (mediaStream == null) {
return;
@@ -80,20 +109,96 @@ public static void unMuteSound() {
}
private void addAudioTrack(MediaStream mediaStream) {
- audioSource = peerConnectionFactoryInstance().createAudioSource(audioConstraintsGetInstance());
- audioTrack = peerConnectionFactoryInstance().createAudioTrack("ARDAMSa0", audioSource);
+ AudioSource audioSource = peerConnectionFactoryInstance().createAudioSource(audioConstraintsGetInstance());
+ AudioTrack audioTrack = peerConnectionFactoryInstance().createAudioTrack("ARDAMSa0", audioSource);
audioTrack.setEnabled(true);
mediaStream.addTrack(audioTrack);
}
+
+ public void setCallType(ProtoSignalingOffer.SignalingOffer.Type callTYpe) {
+ this.callTYpe = callTYpe;
+ }
+
+
+ private void addVideoTrack(MediaStream mediaStream) {
+
+ if (callTYpe == ProtoSignalingOffer.SignalingOffer.Type.VIDEO_CALLING) {
+ videoCapturer = createCameraCapturer(new Camera1Enumerator(false));
+ videoSource = peerConnectionFactoryInstance().createVideoSource(videoCapturer);
+ videoCapturer.startCapture(VIDEO_RESOLUTION_WIDTH, VIDEO_RESOLUTION_HEIGHT, FPS);
+ videoTrackFromCamera = peerConnectionFactoryInstance().createVideoTrack(VIDEO_TRACK_ID, videoSource);
+ videoTrackFromCamera.setEnabled(true);
+
+ videoTrackFromCamera.addSink(new VideoSink() {
+ @Override
+ public void onFrame(VideoFrame videoFrame) {
+ if (G.onVideoCallFrame != null) {
+ G.onVideoCallFrame.onPeerFrame(videoFrame);
+ }
+ }
+ });
+
+ mediaStream.addTrack(videoTrackFromCamera);
+ }
+ }
+
+
+ private VideoCapturer createCameraCapturer(CameraEnumerator enumerator) {
+ final String[] deviceNames = enumerator.getDeviceNames();
+
+ // First, try to find front facing camera
+ for (String deviceName : deviceNames) {
+ if (enumerator.isFrontFacing(deviceName)) {
+ VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
+
+ if (videoCapturer != null) {
+ return videoCapturer;
+ }
+ }
+ }
+
+ // Front facing camera not found, try something else
+ for (String deviceName : deviceNames) {
+ if (!enumerator.isFrontFacing(deviceName)) {
+ VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
+
+ if (videoCapturer != null) {
+ return videoCapturer;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public void pauseVideoCapture() {
+ if (videoCapturer != null) {
+ try {
+ videoCapturer.stopCapture();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void startVideoCapture() {
+ if (videoCapturer != null) {
+ try {
+ videoCapturer.startCapture(VIDEO_RESOLUTION_WIDTH, VIDEO_RESOLUTION_HEIGHT, FPS);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
/**
* First, we initiate the PeerConnectionFactory with our application context and some options.
*/
private PeerConnectionFactory peerConnectionFactoryInstance() {
if (peerConnectionFactory == null) {
-
-
Set HARDWARE_AEC_WHITELIST = new HashSet() {{
add("D5803");
add("FP1");
@@ -118,15 +223,10 @@ private PeerConnectionFactory peerConnectionFactoryInstance() {
}
}
- //Initialize PeerConnectionFactory globals.
- //Params are context, initAudio,initVideo and videoCodecHwAcceleration
- //PeerConnectionFactory.initializeAndroidGlobals(this, true, true, true);
- PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(G.context).createInitializationOptions());
+ PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(G.context).createInitializationOptions());
+ peerConnectionFactory = PeerConnectionFactory.builder().createPeerConnectionFactory();
- //Create a new PeerConnectionFactory instance.
- //PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
- peerConnectionFactory = PeerConnectionFactory.builder().createPeerConnectionFactory();
}
return peerConnectionFactory;
}
@@ -145,10 +245,15 @@ PeerConnection peerConnectionInstance() {
configuration.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE;
configuration.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE;
configuration.iceTransportsType = PeerConnection.IceTransportsType.RELAY;
- peerConnection = peerConnectionFactoryInstance().createPeerConnection(iceServers, mediaConstraintsGetInstance(), new PeerConnectionObserver());
+
+ PeerConnection.Observer observer = new PeerConnectionObserver();
+ MediaConstraints mediaConstraints = mediaConstraintsGetInstance();
+
+ peerConnection = peerConnectionFactoryInstance().createPeerConnection(iceServers, mediaConstraints, observer);
mediaStream = peerConnectionFactoryInstance().createLocalMediaStream("ARDAMS");
addAudioTrack(mediaStream);
+ addVideoTrack(mediaStream);
peerConnection.addStream(mediaStream);
}
@@ -160,7 +265,7 @@ public void createOffer(final long userIdCallee) {
@Override
public void onCreateSuccess(SessionDescription sessionDescription) {
offerSdp = sessionDescription.description;
- new RequestSignalingOffer().signalingOffer(userIdCallee, ProtoSignalingOffer.SignalingOffer.Type.VOICE_CALLING, sessionDescription.description);
+ new RequestSignalingOffer().signalingOffer(userIdCallee, callTYpe, sessionDescription.description);
}
@Override
@@ -267,18 +372,36 @@ public void leaveCall() {
}
public void close() {
- peerConnectionInstance().close();
+ if (peerConnection != null) {
+ peerConnection.close();
+ }
}
void dispose() {
try {
- peerConnectionInstance().dispose();
- } catch (NoSuchElementException e) {
+ if (peerConnection != null) {
+ peerConnection.dispose();
+ }
+
+ if (peerConnectionFactory != null) {
+ peerConnectionFactory.dispose();
+ }
+
+ if (videoCapturer != null) {
+ videoCapturer.stopCapture();
+ videoCapturer = null;
+ }
+
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ } catch (InterruptedException e) {
e.printStackTrace();
}
}
void clearConnection() {
+ peerConnectionFactory = null;
peerConnection = null;
+ webRTCInstance = null;
}
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-mdpi/photogif.png b/app/src/main/res/drawable-mdpi/photogif.png
new file mode 100644
index 0000000..9c9ffda
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/photogif.png differ
diff --git a/app/src/main/res/drawable/border_dr_bot.xml b/app/src/main/res/drawable/border_dr_bot.xml
new file mode 100644
index 0000000..485dfc0
--- /dev/null
+++ b/app/src/main/res/drawable/border_dr_bot.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/st_switch_button.xml b/app/src/main/res/drawable/st_switch_button.xml
index bb41560..c458449 100644
--- a/app/src/main/res/drawable/st_switch_button.xml
+++ b/app/src/main/res/drawable/st_switch_button.xml
@@ -3,10 +3,10 @@
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/theme.xml b/app/src/main/res/drawable/theme.xml
index a2f8c84..95834d4 100644
--- a/app/src/main/res/drawable/theme.xml
+++ b/app/src/main/res/drawable/theme.xml
@@ -7,7 +7,7 @@
-
+ android:src="@mipmap/logo" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml
index d7636d9..5ffec4e 100644
--- a/app/src/main/res/layout/activity_call.xml
+++ b/app/src/main/res/layout/activity_call.xml
@@ -40,6 +40,20 @@
android:scaleType="centerCrop" />
+
+
+
+
-
-
-
-
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:onClick="@{activityCallViewModel::onClickBtnChat}"
+ android:text="@string/md_chat"
+ android:textAppearance="@style/TextIconAppearance.all"
+ android:textColor="@color/white"
+ android:textSize="@dimen/dp28" />
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
index f254eb5..98e7b69 100644
--- a/app/src/main/res/layout/activity_chat.xml
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -176,6 +176,28 @@
+
+
+
+
+
+
-
+
+
+
+
+
-->
+
+
+
+
-
-
-
-
-
-
+
+
+ android:layout_height="wrap_content">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_alignParentStart="true"
+ android:layout_alignParentTop="true"
+ android:background="@color/toolbar_background"
+ android:elevation="@dimen/dp4"
+ android:layoutDirection="ltr"
+ android:padding="0dp"
+ app:contentInsetLeft="0dp"
+ app:contentInsetStart="0dp"
+ app:layout_collapseMode="pin">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_enter_pass_code.xml b/app/src/main/res/layout/activity_enter_pass_code.xml
index dda32ee..8a2d9a3 100644
--- a/app/src/main/res/layout/activity_enter_pass_code.xml
+++ b/app/src/main/res/layout/activity_enter_pass_code.xml
@@ -24,13 +24,14 @@
android:orientation="vertical"
tools:ignore="MissingPrefix">
-
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main_rooms.xml b/app/src/main/res/layout/activity_main_rooms.xml
index cde7437..be520cc 100644
--- a/app/src/main/res/layout/activity_main_rooms.xml
+++ b/app/src/main/res/layout/activity_main_rooms.xml
@@ -1,44 +1,55 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ style="?backgroundColorSettingTheme"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clickable="true"
+ tools:ignore="MissingPrefix">
-
+
+
+
+
+
+
-
+
-
+
-
+
+ android:layout_marginTop="160dp"
+ android:layout_gravity="center_horizontal"
+ android:padding="@dimen/dp4"
+ android:visibility="visible" />
diff --git a/app/src/main/res/layout/adapter_rcv_dr_bot.xml b/app/src/main/res/layout/adapter_rcv_dr_bot.xml
new file mode 100644
index 0000000..4540906
--- /dev/null
+++ b/app/src/main/res/layout/adapter_rcv_dr_bot.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bot_action_layout.xml b/app/src/main/res/layout/bot_action_layout.xml
new file mode 100644
index 0000000..fd87fb0
--- /dev/null
+++ b/app/src/main/res/layout/bot_action_layout.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/contact_item.xml b/app/src/main/res/layout/contact_item.xml
index cd5f214..347ca0e 100644
--- a/app/src/main/res/layout/contact_item.xml
+++ b/app/src/main/res/layout/contact_item.xml
@@ -29,21 +29,21 @@
android:weightSum="1">
+ android:background="@color/green"
+ android:textSize="@dimen/dp20" />f
diff --git a/app/src/main/res/layout/empty_layout.xml b/app/src/main/res/layout/empty_layout.xml
index 71f51a5..74822ba 100644
--- a/app/src/main/res/layout/empty_layout.xml
+++ b/app/src/main/res/layout/empty_layout.xml
@@ -9,12 +9,14 @@
+ android:layout_height="wrap_content"
+ >
+ android:orientation="vertical"
+ android:visibility="invisible">
+
+
+
+
@@ -156,9 +156,9 @@
+ android:layout_height="1dp" />
@@ -200,9 +200,9 @@
+ android:layout_height="1dp" />
@@ -240,9 +240,9 @@
+ android:layout_height="1dp" />
+ android:layout_height="1dp" />
+ android:layout_height="1dp" />
@@ -361,9 +361,9 @@
@@ -419,9 +419,9 @@
+ android:layout_height="1dp" />
@@ -460,9 +460,9 @@
+ android:layout_height="1dp" />
@@ -499,9 +499,9 @@
+ android:layout_height="1dp" />
+ android:layout_height="1dp" />
+ android:layout_height="1dp" />
@@ -683,9 +683,9 @@
+ android:layout_height="1dp" />
@@ -729,9 +729,9 @@
+ android:layout_height="1dp" />
@@ -775,9 +775,9 @@
+ android:layout_height="1dp" />
@@ -821,9 +821,9 @@
@@ -877,9 +877,9 @@
+ android:layout_height="1dp" />
@@ -924,9 +924,9 @@
+
+
+
+
+
+
+
@@ -974,13 +1008,13 @@
@@ -999,9 +1033,9 @@
@@ -1035,16 +1069,17 @@
@@ -1061,9 +1095,9 @@
@@ -1095,6 +1129,7 @@
@@ -1110,9 +1144,9 @@
@@ -1127,25 +1161,25 @@
android:visibility="gone">
@@ -1153,9 +1187,9 @@
diff --git a/app/src/main/res/layout/fragment_pass_code.xml b/app/src/main/res/layout/fragment_pass_code.xml
index bf488a5..8320521 100644
--- a/app/src/main/res/layout/fragment_pass_code.xml
+++ b/app/src/main/res/layout/fragment_pass_code.xml
@@ -225,6 +225,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
+ android:gravity="center"
android:visibility="@{safeUnbox(fragmentPassCodeViewModel.rootPatternPassword) , default = gone}">
@@ -325,7 +327,7 @@
android:paddingLeft="@dimen/dp16"
android:paddingRight="@dimen/dp16"
android:paddingStart="@dimen/dp16"
- android:visibility="@{safeUnbox(fragmentPassCodeViewModel.visibilityPatternLock) ,default= gone}">
+ android:visibility="@{safeUnbox(fragmentPassCodeViewModel.visibilityPatternLock) ,default= visible}">
+ android:visibility="@{safeUnbox(fragmentPassCodeViewModel.visibilityPatternLock) ,default= visible}" />
@@ -402,6 +402,44 @@
/>
+
+
+
+
+
+
+
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/rootSetPasswordSecurity"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ style="?backgroundColorSettingTheme"
+ android:clickable="true"
+ android:layoutDirection="ltr"
+ android:orientation="vertical"
+ tools:context="net.iGap.fragments.FragmentSetSecurityPassword"
+
+ >
-
+ android:layout_height="wrap_content">
+
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ android:id="@+id/setPassword_rippleOk"
+ rv_centered="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:rv_alpha="200"
+ app:rv_centered="true"
+ app:rv_rippleDuration="0"
+ app:rv_ripplePadding="5dp">
+ android:layout_width="@dimen/dp52"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:gravity="center"
+ android:text="@string/md_check_symbol"
+ android:textAppearance="@style/TextIconAppearance_toolbar"
+ android:textColor="@color/whit_background" />
-
-
-
-
-
+
+
+
+
+
+ android:id="@+id/setPassword_toolbar"
+ fontPath="fonts/IRANSansMobile_Bold.ttf"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_toRightOf="@+id/setPassword_ripple_back"
+ android:gravity="center"
+ android:text="@string/your_password"
+ android:textColor="@color/whit_background"
+ android:textSize="@dimen/dp18"
+ android:visibility="visible" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ style="?textSubColorSettingTheme">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="?textSubColorSettingTheme"
+ android:orientation="vertical">
+ android:id="@+id/rootEnterPassword"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?backgroundColorSettingTheme"
+ android:visibility="visible">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:text="@string/enter_a_password"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/setPassword_edtSetPassword"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="@dimen/dp32"
+ android:gravity="center"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:hint="@string/password"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/rootReEnterPassword"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?backgroundColorSettingTheme"
+ android:visibility="gone">
+ />
+ android:id="@+id/setPassword_edtSetRePassword"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="@dimen/dp32"
+ android:gravity="center"
+ android:inputType="textPassword"
+ android:hint="@string/password"
+ android:maxLines="1"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/rootHintPassword"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?backgroundColorSettingTheme"
+ android:visibility="gone">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:text="@string/please_create_hint_for_your_password"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/edtSetHintPassword"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="@dimen/dp32"
+ android:gravity="center"
+ android:hint="@string/password_hint"
+ android:maxLines="1"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/rootQuestionPassword"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?backgroundColorSettingTheme"
+ android:visibility="gone">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp24"
+ android:gravity="center"
+ android:text="@string/password_Question_title_one"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/edtSetQuestionPassOne"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:gravity="center"
+ android:hint="@string/password_Question_one"
+ android:maxLines="1"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/edtSetAnswerPassOne"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:gravity="center"
+ android:hint="@string/password_answer"
+ android:maxLines="1"
+ style="?hintColorSettingTheme"
+ android:singleLine="true"
+ android:textSize="@dimen/dp13" />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp24"
+ android:gravity="center"
+ android:text="@string/password_Question_title_two"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/edtSetQuestionPassTwo"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:gravity="center"
+ style="?hintColorSettingTheme"
+ android:hint="@string/password_Question_two"
+ android:maxLines="1"
+ android:singleLine="true"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/edtSetAnswerPassTwo"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:gravity="center"
+ android:hint="@string/password_answer"
+ android:maxLines="1"
+ style="?hintColorSettingTheme"
+ android:singleLine="true"
+ android:textSize="@dimen/dp13" />
+ android:id="@+id/rootEmail"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?backgroundColorSettingTheme"
+ android:visibility="gone">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:text="@string/your_email"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/edtSetEmail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp32"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:maxLines="1"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp32"
+ android:layout_marginTop="@dimen/dp18"
+ android:gravity="left|start"
+ android:text="@string/your_email_desc"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp14" />
+ android:id="@+id/txtSkipSetEmail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp24"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp24"
+ android:gravity="left|start"
+ android:padding="@dimen/dp16"
+ android:text="@string/your_confirm_email_skip"
+ android:textColor="@color/green"
+ android:textSize="@dimen/dp14" />
+ android:id="@+id/rootConfirmEmail"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ style="?hintColorSettingTheme"
+ android:visibility="gone">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:text="@string/confirm_email_title"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp16" />
+ android:id="@+id/edtSetConfirmEmail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp32"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp32"
+ android:layout_marginTop="@dimen/dp32"
+ android:gravity="center"
+ android:maxLines="1"
+ android:singleLine="true"
+ style="?hintColorSettingTheme"
+ android:textSize="@dimen/dp13" />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp24"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp24"
+ android:layout_marginTop="@dimen/dp8"
+ android:gravity="center"
+ android:text="@string/confirm_email_text"
+ style="?textTitleColorSettingTheme"
+ android:textSize="@dimen/dp14"
+
+ />
+ android:id="@+id/txtResendConfirmEmail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp24"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp24"
+ android:layout_marginTop="@dimen/dp26"
+ android:gravity="left|start"
+ android:padding="@dimen/dp8"
+ android:text="@string/your_resend_email_skip"
+ android:textColor="@color/green"
+ android:textSize="@dimen/dp14"
+ android:visibility="visible" />
+ android:id="@+id/txtSkipConfirmEmail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/dp32"
+ android:layout_marginLeft="@dimen/dp24"
+ android:layout_marginRight="@dimen/dp32"
+ android:layout_marginStart="@dimen/dp24"
+ android:gravity="left|start"
+ android:padding="@dimen/dp8"
+ android:text="@string/your_confirm_email_skip"
+ android:textColor="@color/green"
+ android:textSize="@dimen/dp14" />
diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml
index a20333b..3429f98 100644
--- a/app/src/main/res/layout/fragment_setting.xml
+++ b/app/src/main/res/layout/fragment_setting.xml
@@ -1020,7 +1020,7 @@
style="?lineColorSettingTheme"
android:layout_width="match_parent"
android:layout_height="1dp"
- android:visibility="gone" />
+ android:visibility="visible" />
+ android:visibility="visible">
diff --git a/app/src/main/res/layout/layout_attach_file.xml b/app/src/main/res/layout/layout_attach_file.xml
index f257071..c4e9241 100644
--- a/app/src/main/res/layout/layout_attach_file.xml
+++ b/app/src/main/res/layout/layout_attach_file.xml
@@ -61,6 +61,17 @@
android:textSize="@dimen/dp16"
app:emojiSize="@dimen/dp22" />
+
+
diff --git a/app/src/main/res/layout/map_user_info.xml b/app/src/main/res/layout/map_user_info.xml
index 24100b0..8114f01 100644
--- a/app/src/main/res/layout/map_user_info.xml
+++ b/app/src/main/res/layout/map_user_info.xml
@@ -74,6 +74,15 @@
android:textAppearance="@style/TextIconAppearance_toolbar"
android:textColor="@color/iGapColor" />
+
+
+ style="?backgroundColorSettingTheme_2"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:clickable="true"
+ android:orientation="vertical">
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_fragment_sub_layout.xml b/app/src/main/res/layout/search_fragment_sub_layout.xml
index 3b0ff32..8b09eaa 100644
--- a/app/src/main/res/layout/search_fragment_sub_layout.xml
+++ b/app/src/main/res/layout/search_fragment_sub_layout.xml
@@ -13,6 +13,8 @@
android:layout_width="@dimen/dp48"
android:layout_height="@dimen/dp48"
android:layout_marginLeft="@dimen/dp8"
+ android:layout_marginRight="@dimen/dp8"
+ android:layout_marginEnd="@dimen/dp8"
android:layout_marginStart="@dimen/dp8" />
@@ -39,8 +42,8 @@
diff --git a/app/src/main/res/layout/share_media_sub_layout_link.xml b/app/src/main/res/layout/share_media_sub_layout_link.xml
index 0cdbe13..d29b1c7 100644
--- a/app/src/main/res/layout/share_media_sub_layout_link.xml
+++ b/app/src/main/res/layout/share_media_sub_layout_link.xml
@@ -12,6 +12,7 @@
android:layout_height="match_parent">
-
+
- "كب"
+ "كب"
- "آي"
+ "آي"
- "علاقات دون حدود"
+ "علاقات دون حدود"
- "إصنع عالمك بواسطة آي كب ."
+ "إصنع عالمك بواسطة آي كب ."
- " إنضمامك إلى مجموعة مستخدمي "آي كب" لايستغرق إلّا بضع دقائق ."
+ " إنضمامك إلى مجموعة مستخدمي "آي كب" لايستغرق إلّا بضع دقائق ."
-
+
- "الأمان في آي كب"
+ "الأمان في آي كب"
- "تطبيق آي كب يوفّر لك اتصالا آمناً و موثوقاً به بينك و بين أصدقائك و أسرتك. و كذلك يوفّر تطبيق آي كب الحدّ الأقصى للأمان في الحفاظ على خصوصيتك بواسطة استخدام خوارزمية تشفير متميزة في نقل البيانات."
+ "تطبيق آي كب يوفّر لك اتصالا آمناً و موثوقاً به بينك و بين أصدقائك و أسرتك. و كذلك يوفّر تطبيق آي كب الحدّ الأقصى للأمان في الحفاظ على خصوصيتك بواسطة استخدام خوارزمية تشفير متميزة في نقل البيانات."
-
+
- "المحادثة في آي كب"
+ "المحادثة في آي كب"
- "يمكنك المحادثة في آي كب بين شخصين أو بين مجموعة من الأشخاص و كُن مرتاح البال أنّ محادثاتك متوفّرة لديك دائماً، إضافة إلى ذلك يمكنك انشاء القنوات و الانضمام إليها و اشتراك معلوماتك مع ملايين الأشخاص من المستخدمين الآخرين.."
+ "يمكنك المحادثة في آي كب بين شخصين أو بين مجموعة من الأشخاص و كُن مرتاح البال أنّ محادثاتك متوفّرة لديك دائماً، إضافة إلى ذلك يمكنك انشاء القنوات و الانضمام إليها و اشتراك معلوماتك مع ملايين الأشخاص من المستخدمين الآخرين.."
-
+
- "نقل الملفات في آي كب"
+ "نقل الملفات في آي كب"
- "يمكنك نقل الملفات المختلفة بالأنواع و الأحجام المتنوعة أو حفظها في الفضاء الاسفنجي. يمكنك اشتراك كلّما تحبّ مع الآخرين دون أية محدودية.."
+ "يمكنك نقل الملفات المختلفة بالأنواع و الأحجام المتنوعة أو حفظها في الفضاء الاسفنجي. يمكنك اشتراك كلّما تحبّ مع الآخرين دون أية محدودية.."
-
+
- "الاتصال الصوتي في آي كب"
+ "الاتصال الصوتي في آي كب"
- "يمكنك الاتصال الصوتي بشكل مجان و آمن تماماً بواسطة استخدام تطبيق آي كب و بالتالي التوفير في تكاليفك. إضافة إلى ذلك إنّ الاتصال الصوتي لطبيق آي كب هو من نوع p2p و لاتتدخّل حتى مزود خدمة الانترنت في هذه الاتصال"
+ "يمكنك الاتصال الصوتي بشكل مجان و آمن تماماً بواسطة استخدام تطبيق آي كب و بالتالي التوفير في تكاليفك. إضافة إلى ذلك إنّ الاتصال الصوتي لطبيق آي كب هو من نوع p2p و لاتتدخّل حتى مزود خدمة الانترنت في هذه الاتصال"
-
+
- "إبدأ الآن "
+ "إبدأ الآن "
- "كلّ شيء مجان في آي كب!"
+ "كلّ شيء مجان في آي كب!"
- "آي كب كان ولايزال مجانا. فتعالوا لانتمهّل أكثر من هذا. فاصنع عالمك بواسطة آي كب الآن."
+ "آي كب كان ولايزال مجانا. فتعالوا لانتمهّل أكثر من هذا. فاصنع عالمك بواسطة آي كب الآن."
-
+
- "قم بتکمیل ملفک الشخصی فی آی کب"
+ "قم بتکمیل ملفک الشخصی فی آی کب"
- "قم بادخال اسمك و اختيار الصورة لملفّك الشخصي"
+ "قم بادخال اسمك و اختيار الصورة لملفّك الشخصي"
- "صورة الملف الشخصي"
+ "صورة الملف الشخصي"
- "الإسم"
+ "الإسم"
- "الاستمرار"
+ "الاستمرار"
-
+
- "التسجيل"
+ "التسجيل"
- "من فضلك قم بتأييد اسم بلدك و رمز بلدك و قم بادخال رقم هاتفك إلّا صفر بداية الرقم."
+ "من فضلك قم بتأييد اسم بلدك و رمز بلدك و قم بادخال رقم هاتفك إلّا صفر بداية الرقم."
- "هيّا نذهب"
+ "هيّا نذهب"
- "إختر بلدك"
+ "إختر بلدك"
- "التأييد النهائي لرقم هاتفك، نحن نريد ارسال رقم التشغيل إلى هذا الرقم."
+ "التأييد النهائي لرقم هاتفك، نحن نريد ارسال رقم التشغيل إلى هذا الرقم."
- "جاري الاتصال"
+ "جاري الاتصال"
- "بانتظار استلام رمز التأكيد"
+ "بانتظار استلام رمز التأكيد"
- "جاري انتاج رمز الأمان"
+ "جاري انتاج رمز الأمان"
- "التأييد النهائي للتسجيل"
+ "التأييد النهائي للتسجيل"
- "قمتُ بالإدخال يدوياً"
+ "قمتُ بالإدخال يدوياً"
- "إعادة ارسال رمز التأكيد"
+ "إعادة ارسال رمز التأكيد"
- "قد قُمت بإدخال الرقم التالي:
+ "قد قُمت بإدخال الرقم التالي:
- "في حال صحة رقم الهاتف قم بتأييده و إلّا قُم بتغييره بسهولة"
+ "في حال صحة رقم الهاتف قم بتأييده و إلّا قُم بتغييره بسهولة"
- "من فضلك أدخل رمز التأكيد يدوياً"
+ "من فضلك أدخل رمز التأكيد يدوياً"
- قد دخلت حسابك بواسطة جهاز آخر، قد أرسل آي كب رمز التفعيل بواسطة نظام الاعلان إلى حسابك، من فضلك تحقّق في الجهاز الآخر و ادخل الرمز يدوياً..
-
- "تطبيق آي كب يعرف رسالة التأكيد و يقوم بادخالها تلقائياَ و إلّا يتمّ استلامه بواسطتكم و يمكنكم ادخاله يدوياً. في حال عدم استلام رمز التأكيد قم باختيار اعادة الارسال. ."
+ قد دخلت حسابك بواسطة جهاز آخر، قد أرسل آي كب رمز التفعيل بواسطة نظام الاعلان إلى حسابك، من فضلك تحقّق في الجهاز الآخر و ادخل الرمز يدوياً..
+
+ "تطبيق آي كب يعرف رسالة التأكيد و يقوم بادخالها تلقائياَ و إلّا يتمّ استلامه بواسطتكم و يمكنكم ادخاله يدوياً. في حال عدم استلام رمز التأكيد قم باختيار اعادة الارسال. ."
- مع الأسف إنّ رمز التأكيد غير صالح، من فضلك أدخل رمز التأكيد الصالح .
+ مع الأسف إنّ رمز التأكيد غير صالح، من فضلك أدخل رمز التأكيد الصالح .
- "إعادة ارسال رمز التشغيل"
+ "إعادة ارسال رمز التشغيل"
- "رقم الهاتف "
+ "رقم الهاتف "
- "تأكيد رقم الهاتف"
+ "تأكيد رقم الهاتف"
-
+
- "في انتظار الاتصال و تحديد الموقع"
+ "في انتظار الاتصال و تحديد الموقع"
- "لايوجد موقعك"
+ "لايوجد موقعك"
- "ليست الحاجة إلى وضع 0 في بداية الرقم"
+ "ليست الحاجة إلى وضع 0 في بداية الرقم"
- عدد الأحرف أقل من الحد
+ عدد الأحرف أقل من الحد
- "من فضلك أدخل رقم الهاتف دون صفر البداية"
+ "من فضلك أدخل رقم الهاتف دون صفر البداية"
- "من فضلك أدخل رمز التأكيد"
+ "من فضلك أدخل رمز التأكيد"
- "تمّ حظر الرقم الّذي قُمت بادخاله"
+ "تمّ حظر الرقم الّذي قُمت بادخاله"
- "الإسم غير صالح، قُم بتغيير الإسم "
+ "الإسم غير صالح، قُم بتغيير الإسم "
- "من فضلك أدخل اسمك "
+ "من فضلك أدخل اسمك "
-
+
- هل أنت متأكد من إزالة حسابك؟
+ هل أنت متأكد من إزالة حسابك؟
- (في حال الغاء حسابك سيتمّ حذف جميع الملفات الّتي استملتَها من حسابك بشكل دائم )
+ (في حال الغاء حسابك سيتمّ حذف جميع الملفات الّتي استملتَها من حسابك بشكل دائم )
- التدمير
+ التدمير
- أنت الآن في حال تدمير حسابك، رقم هاتفك هو :
+ أنت الآن في حال تدمير حسابك، رقم هاتفك هو :
- آي كب يعرف الرمز بشكل آلي ويقوم بملء الفراغ، في حال عدم ملء الفراغ قُم بملئها يدوياً.
+ آي كب يعرف الرمز بشكل آلي ويقوم بملء الفراغ، في حال عدم ملء الفراغ قُم بملئها يدوياً.
-
+
- الرسالة المرئية
+ الرسالة المرئية
- رسالة الملف
+ رسالة الملف
- الرسالة الصوتية
+ الرسالة الصوتية
- الرسالة الصورية
+ الرسالة الصورية
- رسالة جهة الاتصال
+ رسالة جهة الاتصال
- الرسالة المتحركة
+ الرسالة المتحركة
- الرسالة الصوتية
+ الرسالة الصوتية
- جاري الكتابة…
+ جاري الكتابة…
- جاري ارسال الصورة…
+ جاري ارسال الصورة…
- جاري استلام الصورة…
+ جاري استلام الصورة…
- جاري ارسال الفيديو…
+ جاري ارسال الفيديو…
- جاري تسجيل الفيديو …
+ جاري تسجيل الفيديو …
- جاري ارسال الصوت …
+ جاري ارسال الصوت …
- جاري تسجيل الصوت …
+ جاري تسجيل الصوت …
- جاري ارسال الصوت …
+ جاري ارسال الصوت …
- جاري ارسال الوثيقة …
+ جاري ارسال الوثيقة …
- جاري ارسال الصورة المتحركة …
+ جاري ارسال الصورة المتحركة …
- جاري ارسال الملف …
+ جاري ارسال الملف …
- جاري ارسال الملف …
+ جاري ارسال الملف …
- جاري اختيار جهة الاتصال …
+ جاري اختيار جهة الاتصال …
- جاري رسم الصورة…
+ جاري رسم الصورة…
-
+
- الخروج
+ الخروج
- إلغاء حساب المستخدم
+ إلغاء حساب المستخدم
- الصامت
+ الصامت
- الصوت
+ الصوت
- "إشعار الصامت"
+ "إشعار الصامت"
- البين إلى الأعلى
+ البين إلى الأعلى
- إلغاء البين
+ إلغاء البين
- "الإشعار بالصوت"
+ "الإشعار بالصوت"
- "مسح الذاكرة"
+ "مسح الذاكرة"
- "مسح المحادثة "
+ "مسح المحادثة "
- مغادرة المجموعة
+ مغادرة المجموعة
- حذف المجموعة
+ حذف المجموعة
-
+
- "آي كب"
+ "آي كب"
- الاتصال الصوتي لتطبيق آي كب
+ الاتصال الصوتي لتطبيق آي كب
- "المحادثة "
+ "المحادثة "
- "المجموعة "
+ "المجموعة "
- "القناة"
+ "القناة"
- "آي كب"
+ "آي كب"
- "آي كب"
+ "آي كب"
- "البحث "
+ "البحث "
- "%d من %d"
+ "%d من %d"
- "الإضافة إلى جهات الاتصال "
+ "الإضافة إلى جهات الاتصال "
- "الإلغاء "
+ "الإلغاء "
- "الإلغاء "
+ "الإلغاء "
- "التخطي "
+ "التخطي "
- "الانتهاء"
+ "الانتهاء"
- "حسناً"
+ "حسناً"
- "حسناً"
+ "حسناً"
- "حسناً"
+ "حسناً"
- "الكاميرا"
+ "الكاميرا"
- "الموسيقى "
+ "الموسيقى "
- "الرسم "
+ "الرسم "
- "الصورة "
+ "الصورة "
- "الوثيقة "
+ "الوثيقة "
- "الموقع "
+ "الموقع "
- "الفيديو "
+ "الفيديو "
- "الملف "
+ "الملف "
- "جهة الاتصال "
+ "جهة الاتصال "
- "هل أنت متأكد من مسح الذاكرة؟"
+ "هل أنت متأكد من مسح الذاكرة؟"
- "هل أنت متأكد من مسح المحادثة؟"
+ "هل أنت متأكد من مسح المحادثة؟"
- "حذف جهة الاتصال"
+ "حذف جهة الاتصال"
- "هل أنت متأكد من إزالة جهة الاتصال؟"
+ "هل أنت متأكد من إزالة جهة الاتصال؟"
- "من فضلك انتظر"
+ "من فضلك انتظر"
- "لايتوفّر الكاميرا في هذا الجهاز"
+ "لايتوفّر الكاميرا في هذا الجهاز"
- "نظام تحديد الواقع العالمي (GPS) مغلق، هل تريد تشغليه؟"
+ "نظام تحديد الواقع العالمي (GPS) مغلق، هل تريد تشغليه؟"
- "تمّ حفظ الصورة "
+ "تمّ حفظ الصورة "
- "إختيار الصورة "
+ "إختيار الصورة "
- "لايمكن تحميل البيانات "
+ "لايمكن تحميل البيانات "
- "هل تريد الخروج؟"
+ "هل تريد الخروج؟"
- "إسحب للإلغاء"
+ "إسحب للإلغاء"
- "%s (%s)"
+ "%s (%s)"
-
+
- "معلومات الحساب"
+ "معلومات الحساب"
- "اللغة "
+ "اللغة "
- "الإعدادات"
+ "الإعدادات"
- الإعدادات العامة
+ الإعدادات العامة
- "إسم المستخدم"
+ "إسم المستخدم"
- "الإسم"
+ "الإسم"
- "إسم جهة الاتصال"
+ "إسم جهة الاتصال"
- "رقم الهاتف "
+ "رقم الهاتف "
- "المعلومات"
+ "المعلومات"
- "الإشعارات و الأصوات"
+ "الإشعارات و الأصوات"
- "مسح الذاكرة الخفية"
+ "مسح الذاكرة الخفية"
- "الأمان و الخصوصية"
+ "الأمان و الخصوصية"
- "غرفة الرسالة "
+ "غرفة الرسالة "
- "مقاس الرسالة النصية"
+ "مقاس الرسالة النصية"
- "الملصقات و الصور "
+ "الملصقات و الصور "
- "خلفية صفحة المحادثة "
+ "خلفية صفحة المحادثة "
- "تشغيل الرسوم المتحركة"
+ "تشغيل الرسوم المتحركة"
- "متصفح داخل التطبيق"
+ "متصفح داخل التطبيق"
- "قطع الصورة و تحسين حجمها"
+ "قطع الصورة و تحسين حجمها"
- "أرسل بواسطة الضغط على زر اينتر"
+ "أرسل بواسطة الضغط على زر اينتر"
- "متعددة الوسائط"
+ "متعددة الوسائط"
- "التحميل التلقائي في حال الاتصال بانترنت الشريحة "
+ "التحميل التلقائي في حال الاتصال بانترنت الشريحة "
- التحميل التلقائي في حال الاتصال بانترنت الشريحة
+ التحميل التلقائي في حال الاتصال بانترنت الشريحة
- "التحميل التلقائي في حال الاتصال بانترنت واي فاي"
+ "التحميل التلقائي في حال الاتصال بانترنت واي فاي"
- التحميل التلقائي في حال الاتصال بانترنت واي فاي
+ التحميل التلقائي في حال الاتصال بانترنت واي فاي
- "التحميل التلقائي في حال الاتصال بتجوال البيانات "
+ "التحميل التلقائي في حال الاتصال بتجوال البيانات "
- التحميل التلقائي في حال الاتصال بتجوال البيانات
+ التحميل التلقائي في حال الاتصال بتجوال البيانات
- "التشغيل التلقائي للصور المتحركة "
+ "التشغيل التلقائي للصور المتحركة "
- "الحفظ في ألبوم الصور "
+ "الحفظ في ألبوم الصور "
- "دعم البرنامج"
+ "دعم البرنامج"
- "إسأل سؤالاً"
+ "إسأل سؤالاً"
- "حول آي كب"
+ "حول آي كب"
- "سياسات الخصوصية "
+ "سياسات الخصوصية "
- "حفظ الملفات المتعددة الوسائط "
+ "حفظ الملفات المتعددة الوسائط "
- "يتمّ حذف الصور، و الفيديوهات و الملفات الأخرى المحفوظة في الفضاء الاسفنجي من أجل ايجاد فضاء فارغ. تمّ حفظ جميع الوسائط في الفضاء الاسفنجي و في حال الحاجة إليها يمكن تحميلها من جديد "
+ "يتمّ حذف الصور، و الفيديوهات و الملفات الأخرى المحفوظة في الفضاء الاسفنجي من أجل ايجاد فضاء فارغ. تمّ حفظ جميع الوسائط في الفضاء الاسفنجي و في حال الحاجة إليها يمكن تحميلها من جديد "
- "الإشعارات و الأصوات"
+ "الإشعارات و الأصوات"
- "إشعارات الرسالة"
+ "إشعارات الرسالة"
- "الإنذار"
+ "الإنذار"
- "الإظهار المسبق للرسالة"
+ "الإظهار المسبق للرسالة"
- "لون ضوء ال اي دي"
+ "لون ضوء ال اي دي"
- "الإهتزاز"
+ "الإهتزاز"
- "منفذ اشعار الرسالة"
+ "منفذ اشعار الرسالة"
- "الصوت"
+ "الصوت"
- "إشعارات المجموعة "
+ "إشعارات المجموعة "
- "الإشعارات داخل التطبيق"
+ "الإشعارات داخل التطبيق"
- "الأصوات داخل التطبيق"
+ "الأصوات داخل التطبيق"
- "الإهتزاز داخل التطبيق "
+ "الإهتزاز داخل التطبيق "
- "الاظهار المسبق داخل التطبيق"
+ "الاظهار المسبق داخل التطبيق"
- "الأصوات داخل المحادثة "
+ "الأصوات داخل المحادثة "
- "الأحداث"
+ "الأحداث"
- "قد انضمّت جهة اتصال إلى آي كب في الآونة الأخيرة"
+ "قد انضمّت جهة اتصال إلى آي كب في الآونة الأخيرة"
- "الرسائل الملصقة"
+ "الرسائل الملصقة"
- "الحالات الأخرى "
+ "الحالات الأخرى "
- "في حال اخراج التطبيق من وضع التشغيل بواسطة المستخدم أو النظام يجب التشغيل من جديد للوثوق من مشاهدة جميع الاشعارات"
+ "في حال اخراج التطبيق من وضع التشغيل بواسطة المستخدم أو النظام يجب التشغيل من جديد للوثوق من مشاهدة جميع الاشعارات"
- "الخدمة قيد التنفيذ"
+ "الخدمة قيد التنفيذ"
- "اتصال الخلفية"
+ "اتصال الخلفية"
-
+
- "الرسائل الملصقة"
+ "الرسائل الملصقة"
- "الرسائل الملصقة"
+ "الرسائل الملصقة"
- "إعادة التعيين"
+ "إعادة التعيين"
- "إعادة تعيين جميع الاشعارات"
+ "إعادة تعيين جميع الاشعارات"
- "قُم بالغاء جميع الاشعارات المعتادة لجميع جهات اتصالك و مجموعاتك"
+ "قُم بالغاء جميع الاشعارات المعتادة لجميع جهات اتصالك و مجموعاتك"
- "هل ترغب في اعادة جميع اعدادات اشعارات التطبيق إلى الحالة الأولى؟"
+ "هل ترغب في اعادة جميع اعدادات اشعارات التطبيق إلى الحالة الأولى؟"
- "نعم "
+ "نعم "
- "لا"
+ "لا"
- "خلفية المحادثة "
+ "خلفية المحادثة "
- "الملصقات و الصورة"
+ "الملصقات و الصورة"
-
+
- "الخصوصية "
+ "الخصوصية "
- "لائحة الحظر "
+ "لائحة الحظر "
- "آخر ظهور "
+ "آخر ظهور "
- "المجموعات"
+ "المجموعات"
- "الأمان "
+ "الأمان "
- "كلمة المرور أثناء انغلاق التطبيق"
+ "كلمة المرور أثناء انغلاق التطبيق"
- "التأكيد بمرحلتين"
+ "التأكيد بمرحلتين"
- "الجلسات النشطة "
+ "الجلسات النشطة "
- "التدمير الذاتي للحساب"
+ "التدمير الذاتي للحساب"
-
+
- "الإشعارات و الأصوات"
+ "الإشعارات و الأصوات"
- "الإشعارات "
+ "الإشعارات "
- "الصوت "
+ "الصوت "
- "الإشعارات الذكية "
+ "الإشعارات الذكية "
-
+
- "الوسائط المشتركة "
+ "الوسائط المشتركة "
- "مسح ذاكرة المحادثة "
+ "مسح ذاكرة المحادثة "
- "حظر جهة الاتصال هذه"
+ "حظر جهة الاتصال هذه"
- "الإعدادات "
+ "الإعدادات "
- "الاتصال "
+ "الاتصال "
- "النسخ "
+ "النسخ "
- "الخطوة التالية"
+ "الخطوة التالية"
-
+
- "إنشاء جهة الاتصال "
+ "إنشاء جهة الاتصال "
- "معلومات جهة الاتصال "
+ "معلومات جهة الاتصال "
- "الإسم"
+ "الإسم"
- "الإسم العائلي"
+ "الإسم العائلي"
- "رقم الهاتف "
+ "رقم الهاتف "
- "البحث في صفحة "
+ "البحث في صفحة "
- "الفتح في متصفح كروم "
+ "الفتح في متصفح كروم "
- "المقوّى بواسطة تطبيق آي كب"
+ "المقوّى بواسطة تطبيق آي كب"
- "إنشاء جهة الاتصال "
+ "إنشاء جهة الاتصال "
- "الوسائط المشتركة"
+ "الوسائط المشتركة"
- "الملفات المشتركة"
+ "الملفات المشتركة"
- "الرابط المشترك "
+ "الرابط المشترك "
- "الموسيقى المشترك "
+ "الموسيقى المشترك "
- "الحفظ في قسم الموسيقى "
+ "الحفظ في قسم الموسيقى "
- "إظهار جميع الوسائط"
+ "إظهار جميع الوسائط"
- "الحفظ في ألبوم الصور"
+ "الحفظ في ألبوم الصور"
- "الحذف من ألبوم الصور "
+ "الحذف من ألبوم الصور "
- "إختيار المحادثة"
+ "إختيار المحادثة"
- "المعدّل "
+ "المعدّل "
- "اليوم "
+ "اليوم "
- "الأمس"
+ "الأمس"
-
+
- "الصورة "
+ "الصورة "
- "الرسالة الصوتية "
+ "الرسالة الصوتية "
- "الفيديو "
+ "الفيديو "
- "الملف "
+ "الملف "
- "الصوت "
+ "الصوت "
- "الصورة المتحركة "
+ "الصورة المتحركة "
- "الإضافة إلى قائمة جهات الاتصال"
+ "الإضافة إلى قائمة جهات الاتصال"
- "الاتصال "
+ "الاتصال "
- "النسخ"
+ "النسخ"
- "الإيقاف "
+ "الإيقاف "
- "دون منفذ الإعلان"
+ "دون منفذ الإعلان"
- "أثناء تشغيل الشاشة فقط
-
- "أثناء ايقاف الشاشة فقط"
+ "أثناء تشغيل الشاشة فقط
+
+ "أثناء ايقاف الشاشة فقط"
- "الإظهار الدائم لمنافذ اشعار الرسالات"
+ "الإظهار الدائم لمنافذ اشعار الرسالات"
- "المعطل"
+ "المعطل"
- "المشغّل"
+ "المشغّل"
- "الافتراضي"
+ "الافتراضي"
- "القصير"
+ "القصير"
- "الطويل"
+ "الطويل"
- "في وضع الصامت للجهاز "
+ "في وضع الصامت للجهاز "
- "ألبوم الصور "
+ "ألبوم الصور "
- "الكاميرا"
+ "الكاميرا"
- "حذف الصورة "
+ "حذف الصورة "
- "۵ دقائق "
+ "۵ دقائق "
- "۱۰ دقائق"
+ "۱۰ دقائق"
- "۳۰ دقيقة"
+ "۳۰ دقيقة"
- "۱ ساعة "
+ "۱ ساعة "
- "۲ ساعة"
+ "۲ ساعة"
- "۴ ساعات"
+ "۴ ساعات"
- "النغمة الافتراضية للاشعارات "
+ "النغمة الافتراضية للاشعارات "
- "الردّ"
+ "الردّ"
- "النسخ "
+ "النسخ "
- "الإشتراك"
+ "الإشتراك"
- "الإرسال"
+ "الإرسال"
- "الحذف "
+ "الحذف "
- "الحفظ في ملف التحميل"
+ "الحفظ في ملف التحميل"
- "التعديل"
+ "التعديل"
- "البحث "
+ "البحث "
- "الحذف و مغادرة المجموعة "
+ "الحذف و مغادرة المجموعة "
- "القناة الجديدة "
+ "القناة الجديدة "
- "المجموعة الجديدة"
+ "المجموعة الجديدة"
-
+
- "الإختبار"
+ "الإختبار"
- "من"
+ "من"
- "الحفظ بالنجاح في ملفّ الموسيقى "
+ "الحفظ بالنجاح في ملفّ الموسيقى "
- "لاتوجد أية تعليقات"
+ "لاتوجد أية تعليقات"
- "التعليق"
+ "التعليق"
- "اختيار الصورة من "
+ "اختيار الصورة من "
- "الإلغاء"
+ "الإلغاء"
- "الكاميرا"
+ "الكاميرا"
- "يُرجي التحقق من الكاميرا"
+ "يُرجي التحقق من الكاميرا"
- "حذف الصورة"
+ "حذف الصورة"
- "إسم المجموعة "
+ "إسم المجموعة "
- "الحفظ "
+ "الحفظ "
- "يُرجي إدخال اسم المجموعة"
+ "يُرجي إدخال اسم المجموعة"
- "شرح ملخص حول المجموعة"
+ "شرح ملخص حول المجموعة"
- "يُرجى ادخال شرح ملخص عن المجموعة"
+ "يُرجى ادخال شرح ملخص عن المجموعة"
- "هل أنت متأكد من مسح هذه المحادثة؟"
+ "هل أنت متأكد من مسح هذه المحادثة؟"
- "هل أنت متأكد من حرمان هذا العضو من دور الإدارة؟"
+ "هل أنت متأكد من حرمان هذا العضو من دور الإدارة؟"
- "هل أنت متأكد من إزالة هذا العضو؟"
+ "هل أنت متأكد من إزالة هذا العضو؟"
- "هل أنت متأكد من تولّي دور الإدارة في هذه المجموعة؟"
+ "هل أنت متأكد من تولّي دور الإدارة في هذه المجموعة؟"
- "في انتظار الاتصال بالانترنت"
+ "في انتظار الاتصال بالانترنت"
- "جاري الاتصال"
+ "جاري الاتصال"
- "جاري التحديث"
+ "جاري التحديث"
- "آخر ظهور أخيراً"
+ "آخر ظهور أخيراً"
- "الأعضاء"
+ "الأعضاء"
- العضو
+ العضو
- العضو
+ العضو
- "الخطأ:"
+ "الخطأ:"
- "من فضلك أدخل رقم الاتصال"
+ "من فضلك أدخل رقم الاتصال"
- "الرجاء إدخال رقم الهاتف الصحيح"
+ "الرجاء إدخال رقم الهاتف الصحيح"
- "من فضلك أدخل الاسم و الاسم العائلي."
+ "من فضلك أدخل الاسم و الاسم العائلي."
- رمز التأكيد
+ رمز التأكيد
- تمّ ارسال رمز التأكيد إلى بريدكم الالكتروني لأجل التحقق من البريد الالكتروني.
+ تمّ ارسال رمز التأكيد إلى بريدكم الالكتروني لأجل التحقق من البريد الالكتروني.
- "القناة الجديدة"
+ "القناة الجديدة"
- "عدم امكان حفظ الصورة، من فضلك حاول من جديد"
+ "عدم امكان حفظ الصورة، من فضلك حاول من جديد"
- "المحادثة"
+ "المحادثة"
- "جهات الاتصال"
+ "جهات الاتصال"
- "الرسائل"
+ "الرسائل"
- "الرسائل القابلة للاظهار"
+ "الرسائل القابلة للاظهار"
- "عدد الرسائل القابلة للاظهار"
+ "عدد الرسائل القابلة للاظهار"
- "رسالة جديدة من"
+ "رسالة جديدة من"
- "من"
+ "من"
- "رسالة جديدة"
+ "رسالة جديدة"
- "رسالة جديدة"
+ "رسالة جديدة"
- "تم استلام رسالة جديدة"
+ "تم استلام رسالة جديدة"
- "موقعي:"
+ "موقعي:"
- "العرض الجغرافي:"
+ "العرض الجغرافي:"
- "الطول الجغرافي:"
+ "الطول الجغرافي:"
- "الفنان غير المعروف"
+ "الفنان غير المعروف"
- "إضافة عضو/الأغضاء الجديدة"
+ "إضافة عضو/الأغضاء الجديدة"
- "تحديد المدير"
+ "تحديد المدير"
- "تحديد المشرف"
+ "تحديد المشرف"
- "الإزالة"
+ "الإزالة"
- "يمكن للإعضاء إضافة أعضاء جديدة"
+ "يمكن للإعضاء إضافة أعضاء جديدة"
- "الإشعارات و الصوت"
+ "الإشعارات و الصوت"
- "رابطكم"
+ "رابطكم"
- "القناة العامة "
+ "القناة العامة "
- "القناة الخاصة"
+ "القناة الخاصة"
- "لايمكن للمستخدمين الانضمام إلى هذه القناة إلّا بواسطة مدراء القناة"
+ "لايمكن للمستخدمين الانضمام إلى هذه القناة إلّا بواسطة مدراء القناة"
- "يمكن للمستخدمين الانضمام إلى هذه القناة بواسطة البحث عن اسم المستخدم أو بواسطة استلام رابط الدعوة"
+ "يمكن للمستخدمين الانضمام إلى هذه القناة بواسطة البحث عن اسم المستخدم أو بواسطة استلام رابط الدعوة"
- "%s"
+ "%s"
-
+
- "تمّ حظر هذه الجهة للاتصال و لايمكن تأييدها"
+ "تمّ حظر هذه الجهة للاتصال و لايمكن تأييدها"
- "رمز التدمير "
+ "رمز التدمير "
- الحاجة إلى الدخول إلى النظام
+ الحاجة إلى الدخول إلى النظام
- "خطأ من الزبون "
+ "خطأ من الزبون "
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل."
+ "لايجوز هذا العمل."
- "خطأ من الزبون: رمز الغرفة غير صحيح."
+ "خطأ من الزبون: رمز الغرفة غير صحيح."
- ""
+ ""
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل"
+ "لايجوز هذا العمل"
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: رمز العضو غير صحيح."
+ "خطأ من الزبون: رمز العضو غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل"
+ "لايجوز هذا العمل"
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: رمز العضو غير صحيح."
+ "خطأ من الزبون: رمز العضو غير صحيح."
- "خطأ من الزبون: رمز العضو غير صحيح"
+ "خطأ من الزبون: رمز العضو غير صحيح"
- "خطأ من الزبون: رمز العضو غير صحيح."
+ "خطأ من الزبون: رمز العضو غير صحيح."
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: رمز العضو غير صحيح."
+ "خطأ من الزبون: رمز العضو غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل."
+ "لايجوز هذا العمل."
- "لعضو غير صحيح"
+ "لعضو غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل."
+ "لايجوز هذا العمل."
- "خطأ من الزبون: رمز الغرفة غير صحيح."
+ "خطأ من الزبون: رمز الغرفة غير صحيح."
- "خطأ من الزبون: رمز المستخدم غير صحيح ."
+ "خطأ من الزبون: رمز المستخدم غير صحيح ."
- "خطأ من الزبون: رمز بداية الرسالة غير صحيح."
+ "خطأ من الزبون: رمز بداية الرسالة غير صحيح."
- "خطأ من الزبون: الرسم غير صحيح."
+ "خطأ من الزبون: الرسم غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "المستخدم شارك في هذه المحادثة سابقاً."
+ "المستخدم شارك في هذه المحادثة سابقاً."
- "لايجوز هذا العمل."
+ "لايجوز هذا العمل."
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: اسم المستخدم غير صحيح"
+ "خطأ من الزبون: اسم المستخدم غير صحيح"
- "خطأ من الزبون: التفاصيل غير صحيحة."
+ "خطأ من الزبون: التفاصيل غير صحيحة."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- الرمز غير صالح
+ الرمز غير صالح
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- تمّ حظر وصولك إلى هنا.
+ تمّ حظر وصولك إلى هنا.
- "خطأ من الزبون: الإسم المستعار غير صحيح"
+ "خطأ من الزبون: الإسم المستعار غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "خطأ من الزبون: رمز المستخدم الآخر غير صحيح."
+ "خطأ من الزبون: رمز المستخدم الآخر غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايوجد أي مستخدم فيد النشاط لرمز العضو المقدّم. "
+ "لايوجد أي مستخدم فيد النشاط لرمز العضو المقدّم. "
- "خطأ من الزبون: رقم الهاتف غير صحيح"
+ "خطأ من الزبون: رقم الهاتف غير صحيح"
- "خطأ من الزبون: الاسم غير صحيح."
+ "خطأ من الزبون: الاسم غير صحيح."
- "خطأ من الزبون: الإسم العائلي غير صحيح."
+ "خطأ من الزبون: الإسم العائلي غير صحيح."
- "خطأ من الزبون: الإسم أو الإسم العائلي غير صحيح."
+ "خطأ من الزبون: الإسم أو الإسم العائلي غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "خطأ من الزبون: رقم الهاتف غير صحيح"
+ "خطأ من الزبون: رقم الهاتف غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لايجوز هذا العمل."
+ "لايجوز هذا العمل."
- Bad payload: Invalid description
+ Bad payload: Invalid description
- "خطأ من الزبون: التفاصيل غير صحيحة"
+ "خطأ من الزبون: التفاصيل غير صحيحة"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- توقيع تحديث القناة ممنوع
+ توقيع تحديث القناة ممنوع
- "خطأ من الزبون"
+ "خطأ من الزبون"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "خطأ من الزبون"
+ "خطأ من الزبون"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لم يتمّ العثور على محادثة كهذه."
+ "لم يتمّ العثور على محادثة كهذه."
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: رمز بداية الرسالة غير صحيح"
+ "خطأ من الزبون: رمز بداية الرسالة غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لاتوجد رسالة للمشاهدة بعد."
+ "لاتوجد رسالة للمشاهدة بعد."
- "لم يتمّ العثور على اسم المستخدم ."
+ "لم يتمّ العثور على اسم المستخدم ."
- "خطأ من الزبون: الرسم غير صحيح "
+ "خطأ من الزبون: الرسم غير صحيح "
- "خطأ من الزبون: البديل غير صحيح."
+ "خطأ من الزبون: البديل غير صحيح."
- "خطأ من الزبون: سقف القيود الأعلى غير صحيح"
+ "خطأ من الزبون: سقف القيود الأعلى غير صحيح"
- "خطأ من الزبون: المنتخٍب غير صحيح"
+ "خطأ من الزبون: المنتخٍب غير صحيح"
- "خطأ من الزبون: البديل غير صحيح."
+ "خطأ من الزبون: البديل غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "لم يتمّ العثور على فايل كهذا."
+ "لم يتمّ العثور على فايل كهذا."
- قد تم ارسال الابلاغ سابقاً.
+ قد تم ارسال الابلاغ سابقاً.
- لايجوز لك ارسال الابلاغ في الوقت الحالي .
+ لايجوز لك ارسال الابلاغ في الوقت الحالي .
- غير قادر على الحصول على معرف
- التواصل مع الخادم غير ممكن
- التواصل مع الخادم غير ممكن
- فشل الاتصال مع المستلم
- التواصل مع الخادم غير ممكن
- لم يتم تسجيل المستلم
- التسجيل ممنوع عليك
+ غير قادر على الحصول على معرف
+ التواصل مع الخادم غير ممكن
+ التواصل مع الخادم غير ممكن
+ فشل الاتصال مع المستلم
+ التواصل مع الخادم غير ممكن
+ لم يتم تسجيل المستلم
+ التسجيل ممنوع عليك
- Bad payload: User report
+ Bad payload: User report
- ServerError: User report internal
+ ServerError: User report internal
- لقد أرسلت ابلاغ اساءة استخدام هذا المستخدم سابقاً
+ لقد أرسلت ابلاغ اساءة استخدام هذا المستخدم سابقاً
- لايجوز لك ارسال ابلاغ اساءة استخدام هذا المستخدم.
+ لايجوز لك ارسال ابلاغ اساءة استخدام هذا المستخدم.
- "خطأ من الزبون: رمز الغرفة غير صحيح"
+ "خطأ من الزبون: رمز الغرفة غير صحيح"
- "خطأ من الزبون: رمز الرسالة غير صحيح"
+ "خطأ من الزبون: رمز الرسالة غير صحيح"
- "خطأ من الزبون: الرسالة غير صحيحة"
+ "خطأ من الزبون: الرسالة غير صحيحة"
- "لم يتم العثور على هذا الملف للطلب."
+ "لم يتم العثور على هذا الملف للطلب."
- "هذا العمل لايجوز"
+ "هذا العمل لايجوز"
- "خطأ من الزبون: التفاصيل غير صحيحة."
+ "خطأ من الزبون: التفاصيل غير صحيحة."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "هذا العمل لايجوز."
+ "هذا العمل لايجوز."
- الرمز غير صالح: استلام الرمز
+ الرمز غير صالح: استلام الرمز
- تمّ حظرك بواسطة هذا المستخدم.
+ تمّ حظرك بواسطة هذا المستخدم.
- الرمز غير صالح: استلام السبب
+ الرمز غير صالح: استلام السبب
- تدمير الحساب: خطأ من مزود الانترنت
+ تدمير الحساب: خطأ من مزود الانترنت
- تدمير الحساب: الرمز خطأ
+ تدمير الحساب: الرمز خطأ
- تدمير الحساب: الرمز غير صالح
+ تدمير الحساب: الرمز غير صالح
- تدمير الحساب: المحاولة الكثيرة جداً
+ تدمير الحساب: المحاولة الكثيرة جداً
- عدم امكان الاتصال بمزود خدمة الانترنت
+ عدم امكان الاتصال بمزود خدمة الانترنت
- "إعادة ارسال %d الرسالة
-
- "ارسال دوباإعادة ارسال الرسالة
-
- "بعد "
+ "إعادة ارسال %d الرسالة
+
+ "ارسال دوباإعادة ارسال الرسالة
+
+ "بعد "
- "الجنس:"
+ "الجنس:"
- "البريد الالكتروني:"
+ "البريد الالكتروني:"
- " 1 شهر"
+ " 1 شهر"
- "3 شهور"
+ "3 شهور"
- "6 شهور "
+ "6 شهور "
- "عام واحد"
+ "عام واحد"
- "خطأ من الزبون: البريد الالكتروني غير صحيح"
+ "خطأ من الزبون: البريد الالكتروني غير صحيح"
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- "خطأ من الزبون: نوع الجنس غير صحيح."
+ "خطأ من الزبون: نوع الجنس غير صحيح."
- "خطأ من مزود خدمة الانترنت"
+ "خطأ من مزود خدمة الانترنت"
- قائمةالمدراء
+ قائمةالمدراء
- قائمة المشرفين
+ قائمة المشرفين
- التفاصيل
+ التفاصيل
- الاختبار
+ الاختبار
- لم تستلم الرسالة النصية؟
+ لم تستلم الرسالة النصية؟
- إنتظر .
+ إنتظر .
- محادثة جديدة
+ محادثة جديدة
- دعوة الأصدقاء
+ دعوة الأصدقاء
- الأسئلة الشائعة لآي كب
-
- الوثاشق
+ الأسئلة الشائعة لآي كب
+
+ الوثاشق
- إزالة المدير
+ إزالة المدير
- إزالة الاشراف
+ إزالة الاشراف
- الذكر
+ الذكر
- الأنثى
+ الأنثى
- من البداية
+ من البداية
- من الآن
+ من الآن
- آخر 50 رسالة
+ آخر 50 رسالة
- حسب الطلب
+ حسب الطلب
- الصورة المختارة
+ الصورة المختارة
- الفيديو المختار
+ الفيديو المختار
- الفيديو المختار
+ الفيديو المختار
- الصوت المختار
+ الصوت المختار
- الملف المختار
+ الملف المختار
- الرسم المختار
+ الرسم المختار
- رقم الهاتف المختار
+ رقم الهاتف المختار
- الصورة المختارة
+ الصورة المختارة
- رسالة الموقع
+ رسالة الموقع
- معاملة المحفظة
+ معاملة المحفظة
- نقل المحادثة إلى المجموعة
+ نقل المحادثة إلى المجموعة
- آخر ظهور في
+ آخر ظهور في
- منذ فترة طويلة
+ منذ فترة طويلة
- الشهر الماضي
+ الشهر الماضي
- الاسبوع الماضي
+ الاسبوع الماضي
- متصل
+ متصل
- بالضبط
+ بالضبط
- أخيراً
+ أخيراً
- الدعم
+ الدعم
- خدمة اشعارات التطبيق
+ خدمة اشعارات التطبيق
- التعديل
+ التعديل
- المغادرة
+ المغادرة
- قناة جديدة
+ قناة جديدة
- السهم
+ السهم
- نغمة الرنين
+ نغمة الرنين
- النبذ
+ النبذ
- غير معروف
+ غير معروف
- الإضافة إلى جهات الاتصال
+ الإضافة إلى جهات الاتصال
- هل تريد اضافة هذا الرقم إلى جهات الاتصال؟
+ هل تريد اضافة هذا الرقم إلى جهات الاتصال؟
- هل أنت متأكد من إزالة هذا الحساب؟
+ هل أنت متأكد من إزالة هذا الحساب؟
- هل أنت متأكد من إزالة المدير؟
+ هل أنت متأكد من إزالة المدير؟
- هل أنت متأكد من إزالة هذا المشرف؟
+ هل أنت متأكد من إزالة هذا المشرف؟
- مع الأسف لايمكنك ارسال الرسالة خلال المحادثة.
+ مع الأسف لايمكنك ارسال الرسالة خلال المحادثة.
- مسح المحادثة
+ مسح المحادثة
- الآخر
+ الآخر
- الآخر
+ الآخر
- الآخر
+ الآخر
- الآخر
+ الآخر
- التقاط الصورة
+ التقاط الصورة
- تصوير الفيديو
+ تصوير الفيديو
- تنظیم و تعديل الجنس
+ تنظیم و تعديل الجنس
- تنظیم و تعديل البريد الالكتروني
+ تنظیم و تعديل البريد الالكتروني
- إزالة جهة الاتصال
+ إزالة جهة الاتصال
- عنوان البريد الالكتروني غير صالح
+ عنوان البريد الالكتروني غير صالح
- هل أنت واثق من إزالة المكوّن المختار؟
+ هل أنت واثق من إزالة المكوّن المختار؟
- هل أنت واثق من إزالة هذه القناة؟
+ هل أنت واثق من إزالة هذه القناة؟
- هل أنت واثق من مغادرة هذه القناة؟
+ هل أنت واثق من مغادرة هذه القناة؟
- هل أنت واثق من مسح ذاكرة المكون المختار؟
+ هل أنت واثق من مسح ذاكرة المكون المختار؟
- الإلغاء و اغلاق الجلسة
+ الإلغاء و اغلاق الجلسة
- الإلغاء و اغلاق الجلسات
+ الإلغاء و اغلاق الجلسات
- هل أنت واثق من الغاء تفعيل هذه الجلسة النشطة؟
+ هل أنت واثق من الغاء تفعيل هذه الجلسة النشطة؟
- هل أنت واثق من الغاء جميع الجلسات النسطة؟
+ هل أنت واثق من الغاء جميع الجلسات النسطة؟
- لم يسجّل أي مستخدم باسم المستخدم المعروض.
+ لم يسجّل أي مستخدم باسم المستخدم المعروض.
- تم حظر رمز التأكيد بسبب الادخال لعدة مرات.
+ تم حظر رمز التأكيد بسبب الادخال لعدة مرات.
- تم ارسال رمز التأكيد لعدة مرات .
+ تم ارسال رمز التأكيد لعدة مرات .
- رمز التأكيد قد انتهى.
+ رمز التأكيد قد انتهى.
- تم حظر المستخدم حسب طلبه.
+ تم حظر المستخدم حسب طلبه.
- هل تريد نقل هذه المحادثة إلى المجموعة؟
+ هل تريد نقل هذه المحادثة إلى المجموعة؟
- نقل المحادثة إلى المجموعة
+ نقل المحادثة إلى المجموعة
- قبل دقائق
+ قبل دقائق
- الجهاز :
+ الجهاز :
- البلد:
+ البلد:
- تم الإنشاء في :
+ تم الإنشاء في :
- الرمز
+ الرمز
- الجلسة الحالية
+ الجلسة الحالية
- الجلسة النشطة
+ الجلسة النشطة
- إلغاء التفعيل
+ إلغاء التفعيل
- إلغاء جميع الجلسات النشطة
+ إلغاء جميع الجلسات النشطة
- تم الإرسال من
+ تم الإرسال من
- المزيد
+ المزيد
- هل تريد إزالة هذه المحادثة؟
+ هل تريد إزالة هذه المحادثة؟
- الصوت العالي
+ الصوت العالي
- العدد
+ العدد
- الصورة
+ الصورة
- عنوان الموسيقى
+ عنوان الموسيقى
- الأزمنة
+ الأزمنة
- المعلومات
+ المعلومات
- التفاصيل
+ التفاصيل
- كتابة الرسالة
+ كتابة الرسالة
- المكان
+ المكان
- الدقائق
+ الدقائق
- رابط القناة
+ رابط القناة
- ملف المجموعة
+ ملف المجموعة
- إيران
+ إيران
- مجلة نيجر
+ مجلة نيجر
- الجميع
+ الجميع
- زمان الموسيقى
+ زمان الموسيقى
- المجموعة الجديدة
+ المجموعة الجديدة
- الإزالة من الذاكرة المختبئة
+ الإزالة من الذاكرة المختبئة
- مغادرةالقناة
+ مغادرةالقناة
- إبلاغ اساءة الاستخدام
+ إبلاغ اساءة الاستخدام
- الرد
+ الرد
- الأعضاء
+ الأعضاء
- التخطي
+ التخطي
- الإعدادات
+ الإعدادات
- إعدادات حساب آی کب
+ إعدادات حساب آی کب
- من فضلك اكتب الرسالة
+ من فضلك اكتب الرسالة
- اشتراك الملف الصوتي
+ اشتراك الملف الصوتي
- اشتراك الصورة
+ اشتراك الصورة
- اشتراك الصورة
- اشتراك ملف الفيديو
+ اشتراك الصورة
+ اشتراك ملف الفيديو
- اشتراك ملف الفيديو
+ اشتراك ملف الفيديو
- اشتراك الملف
+ اشتراك الملف
- النص المنسوخ
+ النص المنسوخ
- الرسالة
+ الرسالة
- سيتم تقديم هذه الميزة في المستقبل
+ سيتم تقديم هذه الميزة في المستقبل
- لايوجد هذا الاسم
+ لايوجد هذا الاسم
- الإسم
+ الإسم
- الإسم العائلي
+ الإسم العائلي
- هل تريد حظر هذه الجهة للاتصال؟
+ هل تريد حظر هذه الجهة للاتصال؟
- الحظر
+ الحظر
- هل أنت واثق من ازالة ذاكرة هذه المحادثة؟
+ هل أنت واثق من ازالة ذاكرة هذه المحادثة؟
- التنظيف
+ التنظيف
- عدم امكان حفظ الصورة
+ عدم امكان حفظ الصورة
- لا يمكن الازالة إلّا بواسطة مالك المجموعة.
+ لا يمكن الازالة إلّا بواسطة مالك المجموعة.
- اشتراك الملف الصوتي
+ اشتراك الملف الصوتي
- آخر ظهور
+ آخر ظهور
- الإزالة
+ الإزالة
- من فضلك تحقق في ظروف تواصلك
+ من فضلك تحقق في ظروف تواصلك
- رسالة الخطأ في التأكيد
+ رسالة الخطأ في التأكيد
- الذكر
+ الذكر
- الأنثى
+ الأنثى
- الاشتراك عبر
+ الاشتراك عبر
- خطأ
+ خطأ
- من فضلك أدخل الرمز لأجل التأكيد
+ من فضلك أدخل الرمز لأجل التأكيد
- لم يتم استلام الرد من مزود خدمة الانترنت.
+ لم يتم استلام الرد من مزود خدمة الانترنت.
- اشتراك الصورة من آي كب
+ اشتراك الصورة من آي كب
- الإلغاء
+ الإلغاء
- إصدار أندرويد آي كب
+ إصدار أندرويد آي كب
- هل أنت واثق من مغادرة المكون المختار؟
+ هل أنت واثق من مغادرة المكون المختار؟
- هل أنت واثق من معادرة هذه المجموعة
+ هل أنت واثق من معادرة هذه المجموعة
- في انتظار الاتصال بمزود خدمة الانترنت
+ في انتظار الاتصال بمزود خدمة الانترنت
- "حفظ الصورة في ألبوم الصور "
+ "حفظ الصورة في ألبوم الصور "
- موقعي
+ موقعي
- الصورة المشتركة
+ الصورة المشتركة
- الفيديو المشترك
+ الفيديو المشترك
- الملف الصوتي المشترك
+ الملف الصوتي المشترك
- الملف الصوتي المشترك
+ الملف الصوتي المشترك
- الصورة المتحركة المشتركة
+ الصورة المتحركة المشتركة
- الملف المشترك
+ الملف المشترك
- دفع كيو آر
+ دفع كيو آر
- مستوى الشحن
+ مستوى الشحن
- النسبة الاجمالية
+ النسبة الاجمالية
- ریال
+ ریال
- لم يُحدّد /
+ لم يُحدّد /
- إرسال الوثائق و المستندات
+ إرسال الوثائق و المستندات
- الشحن
+ الشحن
- ذاكرة المعاملات
+ ذاكرة المعاملات
- نقل النقود
+ نقل النقود
- إنشاء رمز كيو آر
+ إنشاء رمز كيو آر
- الدفع عبر رمز كيو آر
+ الدفع عبر رمز كيو آر
- التشحين
+ التشحين
- التجارةالالكترونية
+ التجارةالالكترونية
- الإتفاق
+ الإتفاق
- رسالة التشحين
+ رسالة التشحين
- التوضيح (اختياري)
+ التوضيح (اختياري)
- أدخل الرمز هنا.
+ أدخل الرمز هنا.
- انتقال به
+ انتقال به
- السعر
+ السعر
- النسبة
+ النسبة
- البريد الالكتروني (اختياري)
+ البريد الالكتروني (اختياري)
- الإنشاء
+ الإنشاء
- الصورة المتحركة المختارة للإرسال
+ الصورة المتحركة المختارة للإرسال
- التسجيل
+ التسجيل
- ريال ايراني (IRR)
+ ريال ايراني (IRR)
- "هل هذا رمز دخولك؟: "
+ "هل هذا رمز دخولك؟: "
- لم يتم اشتراك أية وسائط .
+ لم يتم اشتراك أية وسائط .
- قيد الانتظار
+ قيد الانتظار
- قد اكتمل
+ قد اكتمل
- التاريخ الشمسي
+ التاريخ الشمسي
- هل أنت متأكد من الخروج من الحساب؟
+ هل أنت متأكد من الخروج من الحساب؟
- قبل يوم واحد
+ قبل يوم واحد
- قبل يومين
+ قبل يومين
- قبل ثلاثة أيام
+ قبل ثلاثة أيام
- قبل أربعة أيام
+ قبل أربعة أيام
- قبل خمسة أيام
+ قبل خمسة أيام
- قبل ستة أيام
+ قبل ستة أيام
- في
+ في
- النسخ
+ النسخ
- إلغاء الرابط
+ إلغاء الرابط
- رابط المجموعة
+ رابط المجموعة
- can\'t do it please try later
+ can\'t do it please try later
- تفاصيل القناة
+ تفاصيل القناة
- إسم القناة
+ إسم القناة
- إزالة و مغادرة القناة
+ إزالة و مغادرة القناة
- إزالة القناة
+ إزالة القناة
- "من فضلك أدخل اسم القناة ."
+ "من فضلك أدخل اسم القناة ."
- "القناة الجديدة "
+ "القناة الجديدة "
- "مغادة القناة"
+ "مغادة القناة"
- "من فضلك أدخل شرحاً ملخصاً عن القناة ."
+ "من فضلك أدخل شرحاً ملخصاً عن القناة ."
- "أنت : "
+ "أنت : "
- "أنت "
+ "أنت "
- فروردین
+ فروردین
- اردیبهشت
+ اردیبهشت
- خرداد
+ خرداد
- تیر
+ تیر
- مرداد
+ مرداد
- شهریور
+ شهریور
- مهر
+ مهر
- آبان
+ آبان
- آذر
+ آذر
- دی
+ دی
- بهمن
+ بهمن
- اسفند
+ اسفند
- الإنضمام
+ الإنضمام
- "هل ترغب في هذا؟ "
+ "هل ترغب في هذا؟ "
- المسودة :
+ المسودة :
- التوقيع
+ التوقيع
- Spam
+ Spam
- "الأحد "
+ "الأحد "
- الاثنين
+ الاثنين
- "الثلاثاء"
+ "الثلاثاء"
- "الأربعاء "
+ "الأربعاء "
- "الخميس "
+ "الخميس "
- "الجمعة "
+ "الجمعة "
- "السبت "
+ "السبت "
- حظر جهة الاتصال
+ حظر جهة الاتصال
- "إزالة حظر جهة الاتصال"
+ "إزالة حظر جهة الاتصال"
- "بواسطة"
+ "بواسطة"
- "إنضمّ إلى آي كب "
+ "إنضمّ إلى آي كب "
- " غادر آي كب "
+ " غادر آي كب "
- "تم الإنشاء "
+ "تم الإنشاء "
- "تمت الإضافة "
+ "تمت الإضافة "
- "تمّت الإزالة "
+ "تمّت الإزالة "
- "غادر "
+ "غادر "
- "تحوّل من الخاص إلى العام"
+ "تحوّل من الخاص إلى العام"
- "تحوّل من العام إلى الخاص "
+ "تحوّل من العام إلى الخاص "
- "بالدعوة إلى "
+ "بالدعوة إلى "
- "تم الحذف "
+ "تم الحذف "
- الإبطال
+ الإبطال
- الصفحة
+ الصفحة
- "مكالمة فائتة "
+ "مكالمة فائتة "
- "مكالمة صوتية فائتة "
+ "مكالمة صوتية فائتة "
- "مكالمة فيديو فائتة"
+ "مكالمة فيديو فائتة"
- إرسال الموقع
+ إرسال الموقع
- الرسالة المحذوفة
+ الرسالة المحذوفة
- الرسالة غير المقروءة
+ الرسالة غير المقروءة
- أنت بحاجة إلى السماح
+ أنت بحاجة إلى السماح
- اذن الكاميرا
+ اذن الكاميرا
- اذن قائمة السجلات
+ اذن قائمة السجلات
- اذن التقويم
+ اذن التقويم
- اذن تحديد الموقع
+ اذن تحديد الموقع
- اذن مسجل الصوت
+ اذن مسجل الصوت
- اذن الهاتف
+ اذن الهاتف
- اذن الرسائل
+ اذن الرسائل
- المدونة الرسمية لآي كب
+ المدونة الرسمية لآي كب
- طلب الدعم
+ طلب الدعم
- الصفحة الرسمية لآي كب
+ الصفحة الرسمية لآي كب
- الرابط العام للقناة
+ الرابط العام للقناة
- رابط الدعوة
+ رابط الدعوة
- رابط الدعوة إلى القناة
+ رابط الدعوة إلى القناة
- التدمير الذاتي
+ التدمير الذاتي
- تم الحفظ
+ تم الحفظ
- من فضلك انتظر حتى :
+ من فضلك انتظر حتى :
- إزالة الصورة
+ إزالة الصورة
- رابط دعوة المجموعة
+ رابط دعوة المجموعة
- التحويل إلى القناة الخاصة
+ التحويل إلى القناة الخاصة
- هل تريد تحويل هذه القناة إلى القناة الخاصة؟
+ هل تريد تحويل هذه القناة إلى القناة الخاصة؟
- التحويل إلى القناة العامة
+ التحويل إلى القناة العامة
- هل تريد تحويل هذه القناة إلى القناة العامة؟
+ هل تريد تحويل هذه القناة إلى القناة العامة؟
- تحديد الرابط العام للقناة
+ تحديد الرابط العام للقناة
- التحويل إلى المجموعة الخاصة
+ التحويل إلى المجموعة الخاصة
- هل تريد تحويل هذه المجموعة إلى المجموعة الخاصة؟
+ هل تريد تحويل هذه المجموعة إلى المجموعة الخاصة؟
- التحويل إلى المجموعة العامة
+ التحويل إلى المجموعة العامة
- هل تريد تحويل هذه المجموعة إلى المجموعة العامة؟
+ هل تريد تحويل هذه المجموعة إلى المجموعة العامة؟
- تحديد اسم المستخدم
+ تحديد اسم المستخدم
- اذن موقع الحفظ
+ اذن موقع الحفظ
- أنت بحاجة إلى رخصة الحفظ لأجل الاستمرار
+ أنت بحاجة إلى رخصة الحفظ لأجل الاستمرار
- التنظيف العام
+ التنظيف العام
- التنظيف
+ التنظيف
- هل أنت متأكد من إزالة جميع المحادثات من قاعدة البيانات الداخلية؟
+ هل أنت متأكد من إزالة جميع المحادثات من قاعدة البيانات الداخلية؟
- مساء
+ مساء
- صباحاً
+ صباحاً
- إرسال الرسالة
+ إرسال الرسالة
- تمّ اختيار الرسالة
+ تمّ اختيار الرسالة
- تمّ اختيار الرسالة
+ تمّ اختيار الرسالة
- لم يتمّ تحميل الملف بعد
+ لم يتمّ تحميل الملف بعد
- الإغلاق
+ الإغلاق
- فضائي الاسفنجي
+ فضائي الاسفنجي
- لم يتم الاتصال بمزود خدمة الانترنت .
+ لم يتم الاتصال بمزود خدمة الانترنت .
- الرسالة فارغة.
+ الرسالة فارغة.
- من فضلك حاول من جديد
+ من فضلك حاول من جديد
- لم يتمّ العثور على أية صفحة بهذا الرمز
+ لم يتمّ العثور على أية صفحة بهذا الرمز
- لون موضوع آي كب
+ لون موضوع آي كب
- لون الإشعارات في آي كب
- g>
- الألوان
+ لون الإشعارات في آي كب
+ g>
+ الألوان
-
+
-
+
- الشخص
+ الشخص
- لون أزرار التبديل
+ لون أزرار التبديل
- لون أزرار الارسال و الالحاق
+ لون أزرار الارسال و الالحاق
- لون عنوان الرسائل
+ لون عنوان الرسائل
- لون شريط التقدم
+ لون شريط التقدم
- من يرى أفتاراتي؟
+ من يرى أفتاراتي؟
- من يدعوني إلى القناة؟
+ من يدعوني إلى القناة؟
- من يدعوني إلى المجموعة؟
+ من يدعوني إلى المجموعة؟
- لا أحد
+ لا أحد
- جهات اتصالي
+ جهات اتصالي
- الإعدادات الخاصة
+ الإعدادات الخاصة
- إبحث
-
- إعادة الألوان إلى الإفتراضي
+ إبحث
+
+ إعادة الألوان إلى الإفتراضي
- من فضلك إدخل 5 حروف بداية اسم المستخدم
-
- أدخل 3 حروف على الحدّ الأدنى للقيام بالبحث
-
- لم يتمّ العثور على أية نتائج
+ من فضلك إدخل 5 حروف بداية اسم المستخدم
+
+ أدخل 3 حروف على الحدّ الأدنى للقيام بالبحث
+
+ لم يتمّ العثور على أية نتائج
- انقطع الاتصال مع مزود خدمة الانترنت
+ انقطع الاتصال مع مزود خدمة الانترنت
- لا توجد رسالة
+ لا توجد رسالة
- لم تقُم بالاتصال بعد
+ لم تقُم بالاتصال بعد
- إظهار الأعضاء
+ إظهار الأعضاء
- إظهار نسق تسجيل الرأي في القناة
+ إظهار نسق تسجيل الرأي في القناة
- الإغلاق
+ الإغلاق
- غير صالح
+ غير صالح
- المسجّل
+ المسجّل
- محدودية الاستلام
+ محدودية الاستلام
- قطع قسم من الفيديو
+ قطع قسم من الفيديو
- تضغيط الفيديو
+ تضغيط الفيديو
- التضغيط
+ التضغيط
- لا يمكن إظهار اللون المختار في جهازك
+ لا يمكن إظهار اللون المختار في جهازك
- دائماً
+ دائماً
- أسبوع واحد
+ أسبوع واحد
- "تمّ حفظ الملف في مجلد التحميل"
+ "تمّ حفظ الملف في مجلد التحميل"
- حمّل الملف بداية
+ حمّل الملف بداية
- تمّ حفظ الملف في ألبوم الصور
+ تمّ حفظ الملف في ألبوم الصور
- لا يمكن حفظ الملف في المجلد المختار.
+ لا يمكن حفظ الملف في المجلد المختار.
- تمّ حفظ الملف في مجلد الفيديو .
+ تمّ حفظ الملف في مجلد الفيديو .
- تمّ حفظ الملف في مجلد الصور .
+ تمّ حفظ الملف في مجلد الصور .
- المحدودية في المحادثة (الدردشة)
+ المحدودية في المحادثة (الدردشة)
- من فضلك انتظر حتى نهاية العدّ (لا يمكنك ارسال الرسالة إلى أكثر مستخدم غير معروف، بعد المستخدم العاشر يتوقّف هذا الأمر و عليك الانتظار حتّى نهاية العدّ العكسي.
+ من فضلك انتظر حتى نهاية العدّ (لا يمكنك ارسال الرسالة إلى أكثر مستخدم غير معروف، بعد المستخدم العاشر يتوقّف هذا الأمر و عليك الانتظار حتّى نهاية العدّ العكسي.
- المحدودية في انشاء غرف المحادثة أو نقل المعلومات
+ المحدودية في انشاء غرف المحادثة أو نقل المعلومات
- لايجوز لك انشاء أكثر من 25 مجموعة أو قناة
+ لايجوز لك انشاء أكثر من 25 مجموعة أو قناة
- إظهار اسم المرسل في المجموعة
+ إظهار اسم المرسل في المجموعة
- الاتصال الصوتي
+ قائمة المكالمات
+ مكالمة الصوتي
+ مكالمة فيديو
- الخريطة
+ الخريطة
- أصدقاء الجوار
+ أصدقاء الجوار
- الاتصال الصوتي لآي كب
+ الاتصال الصوتي لآي كب
- لا توجد رسالة حالياً
+ لا توجد رسالة حالياً
- مسح ذاكرة الاتصال الصوتي
+ مسح ذاكرة الاتصال الصوتي
- (الواجب )
+ (الواجب )
- الإختياري
+ الإختياري
- التفاصيل (اختياري)
+ التفاصيل (اختياري)
- تحديد رمز المرور
+ تحديد رمز المرور
- التفعيل بمرحلتين
+ التفعيل بمرحلتين
- يمكنك تحديد رمز المرور لحسابك و في حال الدخول إلى الحساب بواسطة جهاز آخر تحتاج إلى ادخال هذا الرمز. إضافة إلى ذلك هذا الرمز ستستلم رمزاً للتأكيد عبر الرسالة القصيرة أثناء الدخول إلى حسابك بواسطة جهاز آخر..
+ يمكنك تحديد رمز المرور لحسابك و في حال الدخول إلى الحساب بواسطة جهاز آخر تحتاج إلى ادخال هذا الرمز. إضافة إلى ذلك هذا الرمز ستستلم رمزاً للتأكيد عبر الرسالة القصيرة أثناء الدخول إلى حسابك بواسطة جهاز آخر..
- أدخل رمز المرور
+ أدخل رمز المرور
- من فضلك أدخل رمز المرور
+ من فضلك أدخل رمز المرور
- رمز المرور
+ رمز المرور
- من فضلك أدخل رمز المرور من جديد
+ من فضلك أدخل رمز المرور من جديد
- من فضلك قم باختيار علامة لرمز مرورك
+ من فضلك قم باختيار علامة لرمز مرورك
- علامة رمز المرور
+ علامة رمز المرور
- سؤال الأمان الرقم 1 (إلزامي)
+ سؤال الأمان الرقم 1 (إلزامي)
- علي سبيل المثال: من هو معلّمك المفضّل؟
+ علي سبيل المثال: من هو معلّمك المفضّل؟
- سؤال الأمان الرقم 2 (إلزامي)
+ سؤال الأمان الرقم 2 (إلزامي)
- أسئلة الأمان الجديدة
+ أسئلة الأمان الجديدة
- من فضلك أدخل الأسئلة و الأجوبة الجديدة من أجل استعادة رمز المرور
+ من فضلك أدخل الأسئلة و الأجوبة الجديدة من أجل استعادة رمز المرور
- على سبيل المثال: من هو أفضل أصدقائك؟
+ على سبيل المثال: من هو أفضل أصدقائك؟
- الإجابة
+ الإجابة
- سؤال رمز المرور
+ سؤال رمز المرور
- الإستعادة عبر البريد الالكتروني
+ الإستعادة عبر البريد الالكتروني
- البريد الالكتروني (اختياري)
+ البريد الالكتروني (اختياري)
- الإستعادة عبر سؤال الأمان
+ الإستعادة عبر سؤال الأمان
- التفعيل بمرحلتين
+ التفعيل بمرحلتين
- هل نسيت رمز المرور؟
+ هل نسيت رمز المرور؟
- الإستعادة عبر البريد الالكتروني
+ الإستعادة عبر البريد الالكتروني
- الرمز الجديد
+ الرمز الجديد
- أدخل الرمز
+ أدخل الرمز
- تغيير رمز المرور
+ تغيير رمز المرور
- تغيير علامة رمز المرور
+ تغيير علامة رمز المرور
- تعطيل طلب رمز المرور
+ تعطيل طلب رمز المرور
- هل ترغب في تعطيل رمز المرور؟
+ هل ترغب في تعطيل رمز المرور؟
- تحديد أو تغيير البريد الالكتروني
+ تحديد أو تغيير البريد الالكتروني
- تغيير أسئلة الأمان
+ تغيير أسئلة الأمان
- تأييد البريد الالكتروني
+ تأييد البريد الالكتروني
- الإستعادة عبر :
+ الإستعادة عبر :
- الإستعادة عبر سؤال الأمان
+ الإستعادة عبر سؤال الأمان
- رمز تأييد البريد الالكتروني
+ رمز تأييد البريد الالكتروني
- الإستعادة عبر البريد الالكتروني
+ الإستعادة عبر البريد الالكتروني
- الإستعادة عبر سؤال الأمانبر سؤال الأمان
+ الإستعادة عبر سؤال الأمانبر سؤال الأمان
- الإستعادة عبر سؤال الأمان
+ الإستعادة عبر سؤال الأمان
- الإستعادة عبر الب
+ الإستعادة عبر الب
- إستعادة رمز المرور
+ إستعادة رمز المرور
- من فضلك أدخل بريداً الكترونياً صالحاً. تمّ نسيان هذا الخيار لاستعادة رمز المرور.
+ من فضلك أدخل بريداً الكترونياً صالحاً. تمّ نسيان هذا الخيار لاستعادة رمز المرور.
- اختيار جهةالاتصال
+ اختيار جهةالاتصال
- من فضلك أدخل الرمز
+ من فضلك أدخل الرمز
- من فضلك أدخل جميع المكونات
+ من فضلك أدخل جميع المكونات
- العلامة المختارة لرمز المرور يجب أن لا تشبة رمز المرور
+ العلامة المختارة لرمز المرور يجب أن لا تشبة رمز المرور
- من فضلك كمّل جميع المكونات
+ من فضلك كمّل جميع المكونات
- عدم تطابق رمز المرور المدخل
+ عدم تطابق رمز المرور المدخل
- يجب أن يكون رمز المرور أكثر من 2 حرف
+ يجب أن يكون رمز المرور أكثر من 2 حرف
- "من فضلك كمّل جميع المكونات
+ "من فضلك كمّل جميع المكونات
- "العلامة المختارة لرمز المرور يجب أن لا تشبة رمز المرور
+ "العلامة المختارة لرمز المرور يجب أن لا تشبة رمز المرور
- "من فضلك أدخل علامة رمز المرور
+ "من فضلك أدخل علامة رمز المرور
- "من فضلك أدخل البريد الالكتروني
+ "من فضلك أدخل البريد الالكتروني
- لا يجوز الاتصال
+ لا يجوز الاتصال
- تمّ حظر المستخدم
+ تمّ حظر المستخدم
- الرقم المتصل به غير نشط
+ الرقم المتصل به غير نشط
- أنت قيد المكالمة بجهازك الآخر
+ أنت قيد المكالمة بجهازك الآخر
- المستخدم قيد المكالمة
+ المستخدم قيد المكالمة
- العودة إلى صفحة الاتصال
+ العودة إلى صفحة الاتصال
- الأشخاص المسموحين للاتصال الصوتي
+ الأشخاص المسموحين للاتصال الصوتي
+ الأشخاص المسموحين للاتصال فيديو
+ الفائت
- الفائت
+ دون الرد
- دون الرد
+ لا يجوز لك الاتصال بهذه الجهة.
- لا يجوز لك الاتصال بهذه الجهة.
+ قد عالج آي كب الخطأ غير المتوقع !
- قد عالج آي كب الخطأ غير المتوقع !
+ إعادة البدء
- إعادة البدء
+ حدث خطأ غير متوقع أدى إلى تعطيل التطبيق، نحن نعرف الخطأ و في حال إزالته، الخطوة الوحيدة الّتي تجب عليك هو الضغط على زرّ "إعادة البدء" .
- حدث خطأ غير متوقع أدى إلى تعطيل التطبيق، نحن نعرف الخطأ و في حال إزالته، الخطوة الوحيدة الّتي تجب عليك هو الضغط على زرّ "إعادة البدء" .
+ لا بأس !
- لا بأس !
+ هل أنت متأكد من حذف جميع الاتصالات الواردة و الصادرة؟
- هل أنت متأكد من حذف جميع الاتصالات الواردة و الصادرة؟
+ من فضلك اكتب السبب
- من فضلك اكتب السبب
+ تمّ تعطيل رمز المرور بسبب المحاولات المتتالية
- تمّ تعطيل رمز المرور بسبب المحاولات المتتالية
+ من فضلك أدخل رمز تأكيد البريد الالكتروني
- من فضلك أدخل رمز تأكيد البريد الالكتروني
+ التخطّي
- التخطّي
+ إعادة ارسال رمز التأكيد
- إعادة ارسال رمز التأكيد
+ رمز التأكيد غير صالح
- رمز التأكيد غير صالح
+ تمّ ارسال رمز التأكيد إلى بريدك الالكتروني من جديد
- تمّ ارسال رمز التأكيد إلى بريدك الالكتروني من جديد
+ من فضلك أدخل رمز التأكيد
- من فضلك أدخل رمز التأكيد
+ رمز المرور غير صالح
- رمز المرور غير صالح
+ تنظيم رمز المرور
- تنظيم رمز المرور
+ تنظيم التذكير
- تنظيم التذكير
+ البريد الالكتروني غير الصالح
- البريد الالكتروني غير الصالح
+ "نعم "
- "نعم "
+ "لا"
- "لا"
+ لم يتم استلام أي ردّ
- لم يتم استلام أي ردّ
+ خارج الشبكة
- خارج الشبكة
+ طويل جدّاً
- طويل جدّاً
+ إرسال الإشارات
- إرسال الإشارات
+ المكالمة الواردة
- المكالمة الواردة
+ جاري الرنين
- جاري الرنين
+ جاري الاتصال
- جاري الاتصال
+ قد اتصل
- قد اتصل
+ قد انقطع
- قد انقطع
+ الفشل
- الفشل
+ الرفض
- الرفض
+ المشغول
- المشغول
+ "رمز تأكيد البريد اللكتروني غير صحيح "
- "رمز تأكيد البريد اللكتروني غير صحيح "
+ "ردّكم غير صحيح"
- "ردّكم غير صحيح"
+ "الاتصال الصوتي الفائت"
- "الاتصال الصوتي الفائت"
+ "المسجّل بواسطة "
- "المسجّل بواسطة "
+ الدخول بواسطة كيو آر
- الدخول بواسطة كيو آر
+ الدخول الناجح إلى الجهاز
- الدخول الناجح إلى الجهاز
+ الماسح الضوئي للباركود
- الماسح الضوئي للباركود
+ جودة الاتصال
- جودة الاتصال
+ "في حال عدم استخدام الحساب بأي شكل من الأشكال طوال الفترات المحددة يتمّ التدمير التلقائي للحساب و يتمّ حذفه للأبد."
- "في حال عدم استخدام الحساب بأي شكل من الأشكال طوال الفترات المحددة يتمّ التدمير التلقائي للحساب و يتمّ حذفه للأبد."
+ هل ترغب في عودة ألوان جميع أقسام التطبيق إلى الحالة الافتراضية؟
- هل ترغب في عودة ألوان جميع أقسام التطبيق إلى الحالة الافتراضية؟
+ التدوير
- التدوير
+ القطع
- القطع
+ تدوير الصورة
- تدوير الصورة
+ التدوير الأفقي للصورة
- التدوير الأفقي للصورة
+ التدوير العمودي للصورة
- التدوير العمودي للصورة
+ رؤية أفتاراتي بواسطة
- رؤية أفتاراتي بواسطة
+ استلام رابط دعوة القناة من
- استلام رابط دعوة القناة من
+ استلام رابط دعوة المجموعة من
- استلام رابط دعوة المجموعة من
+ استلام الاتصال من
- استلام الاتصال من
+ رؤية ظهوري الأخير بواسطة
- رؤية ظهوري الأخير بواسطة
+ المكون
- المكون
+ بایت
- بایت
+ کیلوبایت
- کیلوبایت
+ ميجابايت
- ميجابايت
+ جيجابايت
- جيجابايت
+ تيرابايت
- تيرابايت
+ الملف الصوتي
- الملف الصوتي
+ إجمالي الحجم
- إجمالي الحجم
+ ضبط ذاكرة الجهاز
- ضبط ذاكرة الجهاز
+ قاعدة البيانات المحلية
- قاعدة البيانات المحلية
+ تخزين البيانات
- تخزين البيانات
+ حفظ الوسائط
- حفظ الوسائط
+ لم تنضمّ هذه الجهة إلى آي كب بعد. هل ترغب في دعوته؟
- لم تنضمّ هذه الجهة إلى آي كب بعد. هل ترغب في دعوته؟
+ تنظيف قاعدة البيانات يؤدي إلى حذف الرسائل النصية المحفوظة في الذاكرة المختبئة و تضغيط قاعدة البيانات من أجل توفير الفضاء الداخلي. و آي كب بحاجة إلى بعض المعلومات من أجل التنفيذ فبالتالي لا يتمّ تفريغ قاعدة البيانات بشكل كامل و لا يصل إلى مستوى الصفر. هذا الأمر يستغرق بضع دقائق.
- تنظيف قاعدة البيانات يؤدي إلى حذف الرسائل النصية المحفوظة في الذاكرة المختبئة و تضغيط قاعدة البيانات من أجل توفير الفضاء الداخلي. و آي كب بحاجة إلى بعض المعلومات من أجل التنفيذ فبالتالي لا يتمّ تفريغ قاعدة البيانات بشكل كامل و لا يصل إلى مستوى الصفر. هذا الأمر يستغرق بضع دقائق.
+ قائمة جهات اتصالك
- قائمة جهات اتصالك
+ المحدودية الزمنية لتغيير اسم المستخدم
- المحدودية الزمنية لتغيير اسم المستخدم
+ المعلومات المحفوظة في الذاكرة المختبئة تشمل على ملفات الصورة و الفيديو و الوثائق الّتي قمتَ بارسالها أو استلامها، فيجب تنظيف هذه الملفات بين أحياناً حتّى لا تسبّب بطء أو ايقاف برامج التطبيق. في حال رغبتك في الحصول على هذه المعلومات يمكنك تحميل الملفات من جديد و مشاهدتها..
- المعلومات المحفوظة في الذاكرة المختبئة تشمل على ملفات الصورة و الفيديو و الوثائق الّتي قمتَ بارسالها أو استلامها، فيجب تنظيف هذه الملفات بين أحياناً حتّى لا تسبّب بطء أو ايقاف برامج التطبيق. في حال رغبتك في الحصول على هذه المعلومات يمكنك تحميل الملفات من جديد و مشاهدتها..
+ الإسم
- الإسم
+ تحديد الموقع و الميزات الأخرى للخريطة غير نشطة، بالضغط على الزر التالي يمكنك استخدام هذه الميزات..
- تحديد الموقع و الميزات الأخرى للخريطة غير نشطة، بالضغط على الزر التالي يمكنك استخدام هذه الميزات..
+ ايقاف التشغيل
- ايقاف التشغيل
+ التشغيل
- التشغيل
+ تحديد الوضع
- تحديد الوضع
+ التحديث يدوياً
- التحديث يدوياً
+ الإظهار بشكل القائمة
- الإظهار بشكل القائمة
+ ايقاف تفعيل ميزة الأصدقاء المجاورة
- ايقاف تفعيل ميزة الأصدقاء المجاورة
+ جاري استلام المذكرة
- جاري استلام المذكرة
+ دون تعليق
- دون تعليق
+ الفاصل المتر
- الفاصل المتر
+ موقعك
- موقعك
+ التفعيل
- التفعيل
+ غیر فعال سازی
- غیر فعال سازی
+ تفعيل ميزة "أصدقاء حولي" يسبّب امكان المشاهدة المتبادلة بينك و بين الآخرين، هل ترغب في الاستمرار؟
- تفعيل ميزة "أصدقاء حولي" يسبّب امكان المشاهدة المتبادلة بينك و بين الآخرين، هل ترغب في الاستمرار؟
+ إلغاء تفعيل هذه الميزة يسبّب اختفاء موقعك للآخرين و كذلك لا تستطيع مشاهدة الأصدقاء حولك، هل ترغب في الاستمرار؟
- إلغاء تفعيل هذه الميزة يسبّب اختفاء موقعك للآخرين و كذلك لا تستطيع مشاهدة الأصدقاء حولك، هل ترغب في الاستمرار؟
+ الانذار! تفعيل الزر التالي يؤدّي إلى مشاهدة موقعك بواسطة الآخرين، من فضلك تأكّد من هذه الخطوة قبل القيام بها.
- الانذار! تفعيل الزر التالي يؤدّي إلى مشاهدة موقعك بواسطة الآخرين، من فضلك تأكّد من هذه الخطوة قبل القيام بها.
+ حذف الموقع
- حذف الموقع
+ أنت لم تحدّد موقعاً لنفسك، هل ترغب في الاستمرار دون تحديد الموقع؟
- أنت لم تحدّد موقعاً لنفسك، هل ترغب في الاستمرار دون تحديد الموقع؟
+ يجب أن لا يتجاوز عدد حروف تحديد الموقع 4 سطور.
- يجب أن لا يتجاوز عدد حروف تحديد الموقع 4 سطور.
+ يمكنك مشاهدة المستخدمين الّذين يبعدون عنك 5 كيلومترات فقط و قد قاموا بتفعيل ميزة تحديد الموقع
- يمكنك مشاهدة المستخدمين الّذين يبعدون عنك 5 كيلومترات فقط و قد قاموا بتفعيل ميزة تحديد الموقع
+ التدوير التلقائي للصفحة
- التدوير التلقائي للصفحة
+ قفل الدخول إلى البرنامج
- قفل الدخول إلى البرنامج
+ فتح القفل بواسطة البصمة
- فتح القفل بواسطة البصمة
+ تغيير الرمز
- تغيير الرمز
+ القفل التلقائي
- القفل التلقائي
+ ميزة تصوير الشاشة
- ميزة تصوير الشاشة
+ للاستمرار و الدخول إلى التطبيق نحن بحاجة إلى بصمتك
- للاستمرار و الدخول إلى التطبيق نحن بحاجة إلى بصمتك
+ بواسطة البصمة
- بواسطة البصمة
+ البصمة
- البصمة
+ لم يتمّ الاعتراف ببصمتك، من فضلك حاول من جديد
- لم يتمّ الاعتراف ببصمتك، من فضلك حاول من جديد
+ بعد اختيار احدى الأزمنة المختارة من القائمة، يتم اغلاق التطبيق و يجب ادخال رمز فتح القفل من أجل الدخول إلى التطبيق
- بعد اختيار احدى الأزمنة المختارة من القائمة، يتم اغلاق التطبيق و يجب ادخال رمز فتح القفل من أجل الدخول إلى التطبيق
+ في حال تفعيل هذا الخيار يمكنك تصوير الشاشة في كلّ قسم من التطبيق لكن لا تنس أن النظام يظهر محادثاتك في قسم البرامج المفتوحة في خلفية الاظهار رغم تفعيل قفل التطبيق. قد يجبرون على اغلاق التطبيق و فتحه من جديد من أجل تفعيل هذه الميزة..
- في حال تفعيل هذا الخيار يمكنك تصوير الشاشة في كلّ قسم من التطبيق لكن لا تنس أن النظام يظهر محادثاتك في قسم البرامج المفتوحة في خلفية الاظهار رغم تفعيل قفل التطبيق. قد يجبرون على اغلاق التطبيق و فتحه من جديد من أجل تفعيل هذه الميزة..
+ بعد تفعيل قفل الدخول إلى التطبيق تظهر علامة القفل أعلى الصفحة الرئيسية للمحادثة و يمكن اغلاق البرنامج أو فتحها بواسطتها. الانذار! يمكنك استخدام الحروف و الأعداد دون أية قيود من أجل تحديد الرمز. و في حال نسيان هذاالرمز يمكنك الخروج من البرنامج و الدخول إليه من جديد حتّى يصبح القفل غير نشطاً..
- بعد تفعيل قفل الدخول إلى التطبيق تظهر علامة القفل أعلى الصفحة الرئيسية للمحادثة و يمكن اغلاق البرنامج أو فتحها بواسطتها. الانذار! يمكنك استخدام الحروف و الأعداد دون أية قيود من أجل تحديد الرمز. و في حال نسيان هذاالرمز يمكنك الخروج من البرنامج و الدخول إليه من جديد حتّى يصبح القفل غير نشطاً..
+ في حال نسيان رمزك يمكنك الخروج من البرنامج و الدخول إليه من جيج
- في حال نسيان رمزك يمكنك الخروج من البرنامج و الدخول إليه من جيج
+ هل نسيت الرمز؟
- هل نسيت الرمز؟
+ أدخل رمز فتح القفل
- أدخل رمز فتح القفل
+ أدخل الرمز الجديد لفتح القفل
- أدخل الرمز الجديد لفتح القفل
+ أدخل الرمز الجديد لفتح القفل
- أدخل الرمز الجديد لفتح القفل
+ غير نشط
- غير نشط
+ دقيقة واحدة
- دقيقة واحدة
+ 5 دقائق
- 5 دقائق
+ ساعة واحدة
- ساعة واحدة
+ 5 ساعات
- 5 ساعات
+ أدخل رمز فتح القفل
- أدخل رمز فتح القفل
+ هل نسيت رمز الدخول؟
- هل نسيت رمز الدخول؟
+ يجب أن يتكوّن رمز فتح القفل من 4 حروف أو أعداد على الحدّ الأدنى
- يجب أن يتكوّن رمز فتح القفل من 4 حروف أو أعداد على الحدّ الأدنى
+ حظر جهة الاتصال
- حظر جهة الاتصال
+ هل أنت متأكد من حظر جهة الاتصال؟
- هل أنت متأكد من حظر جهة الاتصال؟
+ إزالة حظر جهة الاتصال
- إزالة حظر جهة الاتصال
+ هل أنت متأكد من إزالة حظر جهة الاتصال؟
- هل أنت متأكد من إزالة حظر جهة الاتصال؟
+ البين
- البين
+ الرمز
- الرمز
+ مع الأسف لم يقُم أي مستخدم بتفعيل ميزة الخريطة بالقرب منك
- مع الأسف لم يقُم أي مستخدم بتفعيل ميزة الخريطة بالقرب منك
+ إرسال الرسالة إلى
- إرسال الرسالة إلى
+ البيو
- البيو
+ يمكنك ذكر شرح ملخص لك في ملفك الشخصي. جدير بالذكر أنّ كل مستخدم يدخل إلى ملفك الشخصي يمكنه قراءة هذا الشرح.
- يمكنك ذكر شرح ملخص لك في ملفك الشخصي. جدير بالذكر أنّ كل مستخدم يدخل إلى ملفك الشخصي يمكنه قراءة هذا الشرح.
+ إبلاغ الإساءة
- إبلاغ الإساءة
+ رسالة مزعجة
- رسالة مزعجة
+ المحتوى العنيف
- المحتوى العنيف
+ المحتوى الإباحي
- المحتوى الإباحي
+ الموضوعات الأخرى
- الموضوعات الأخرى
+ المحتوى المسيء و المؤذي
- المحتوى المسيء و المؤذي
+ الحساب المزوّر
- الحساب المزوّر
+ المكوّنات المستخدمة أكثر من النسبة المسموحة. لا يمكن استخدام أكثر من 70 مكوّن في هذا القسم
- المكوّنات المستخدمة أكثر من النسبة المسموحة. لا يمكن استخدام أكثر من 70 مكوّن في هذا القسم
+ الحذف لــ
- الحذف لــ
+ هل أنت متأكد من حذف هذه %1$s الرسالة؟
- هل أنت متأكد من حذف هذه %1$s الرسالة؟
+ تمّ تسجيل ابلاغ اساءة الاستخدام بنجاح
- تمّ تسجيل ابلاغ اساءة الاستخدام بنجاح
+ لا يمكن تعيين الموضع
+ تاریخ
+ الميلادية
+ هجري الشامسي
+ القمري الهجري
+ تحميل
- لا يمكن تعيين الموضع
- تاریخ
- الميلادية
- هجري الشامسي
- القمري الهجري
- تحميل
-
- محرم
- صفر
- ربیعالاول
- ربیعالثانی
- جمادیالاول
- جمادیالثانی
- رجب
- شعبان
- رمضان
- شوال
- ذیقعده
- ذیحجه
-
- تبويب متعدد
- موضوع الظلام
- حصلت عليه
- اهتمام
- ملاحظة: تجدر الإشارة إلى أن الأفراد على الخريطة سيتم عرض مع وجود خطأ من 500 متر. لذلك لا تقلق
- كاميرا صغيرة في المرفقات
- فتح الفيديو باستخدام المشغل الافتراضي
- تفاعل القناة
- تم التحقق من القناة
- تم التحقق من المستخدم
- غرفة أخرى
- إرسال
- لا ترسل
- حفظ المعلومات على البطاقة الجانبية
- هل أنت متأكد؟
- تغيير موقع التخزين
- ملفات اخرى
- دخول قائمة الاتصال
- عذرًا ، عدد جهات الاتصال لديك كبير جدًا لا يمكننا التحقق من الخادم ، يرجى حفظ جهات الاتصال على مستوى معقول
-
- هل تخليت عن التغييرات؟
- سطوع
- تباين
- التشبع
- مرشح اللون
- تحرير
- لا يمكن فتح هذا الملف
- 24 ساعة
- "ترید %s هذه الرسالة?"
- غير دبوس
- دبوس
- دبوس
- جميع الأعضاء
- ههذه الصفحة
- معاق
- تخطيط:
- من:
- يصل الى:
- تلقائيا
- تم تنشيط الوضع الليلي من 19 إلى 8 عن طريق تحديد الوضع التلقائي
- إعدادات قذيفة الظلام
- اختر الوقت
- الخدمات المالية
- ثبّت التطبيق
- لاستخدام الخدمة: لتثبيت التطبيق للبطاقة ، وشراء تذكرة الحافلة ، وشراء تهمة ، ودفع الفواتير ، وشراء مجموعة وخدمات الدفع الأخرى.
- لاستخدام الخدمة: لتثبيت التطبيق للبطاقة ، وشراء تذكرة الحافلة ، وشراء تهمة ، ودفع الفواتير ، وشراء مجموعة وخدمات الدفع الأخرى.
- التخصيص
- تطبيق الألوان لتخصيصها
-
- دفع
- شراء رسوم المحمول
- ادفع الفواتير
- دفع فواتير مخالفات المرور
- قارئ الباركود
- معرف الفواتير
- أدخل
- رمز الدفع
- قدر
- يشترى
- انتخب
- همراه اول
- ایرانسل
- رایتل
- شحنة عادية
- تهمة مذهلة
- شحن وایمکس
- قم بشحن بطاقة بشكل دائم
-
- 10.000 ریالی
- 20.000 ریالی
- 50.000 ریالی
- 100.000 ریالی
- 200.000 ریالی
-
- 10.000 ریالی + 9% القيمة المضافة = 10.900 ریال
- 20.000 ریالی + 9% القيمة المضافة = 21.180 ریال
- 50.000 ریالی + 9% القيمة المضافة = 54.500 ریال
- 100.000 ریالی + 9% القيمة المضافة = 109.000 ریال
- 200.000 ریالی + 9% القيمة المضافة = 218.000 ریال
-
- معرف الفوترة غير صالح
- معرف الدفع غير صالح
- نوع التهمة
- عامل
- ترابرد
- مهلة خطأ
- لا يوجد خطأ اتصال
- خطأ في الخادم
- خطأ في الشبكة
- الحوار الملغى
- جذر الجهاز
- رقم الهاتف غير صالح
- يرجى اختيار المشغل
- محفظة
- تحميل اتفاقية المحفظة
- أنا أتفق مع الشروط
- اقبل الشروط
- اتفاقية المحفظة
- إرسال الأموال
- أدخل مبلغ الإيداع:
- المبلغ بالريال:
- دفع
- الانتقال إلى:
- نقود
- رمز التتبع
- مبشر:
- تم إلغاء الدفعة
- المحفظة غير متاحة
- فواتير استفسار همراه اول
- فواتير استفسار ثائق الهاتف
- فواتير التحقيق
- نوع الفاتورة
- ثائق الهاتف
- هاتف
- رمز المنطقة
- استعلام
- هذا الرقم ليس في مشغل همراه اول
- منتصف المدة
- الدفعة المتوسطة
- الفصل الأخير
- دفعة الاخيرة
- مسؤول عن جميع الخدمات المالية
- شركة پارسیان للتجارة الإلكترونية (تاپ)
- is
- مركز استجابة العملاء: 021-2318
- مثال : 09123456789
- مثال : 021
- مثال : 44567899
- اتصالات المزامنة
- عرض القمر الصناعي
- العرض الافتراضي
- إرسال الموقع المحدد
- متر بعيدا
- حساب ...
- الحصول على البيانات
-
- غير ناجح
- "كان الدفع غير ناجح"
- لا تعرف نتيجة الدفع فترة المحفظة للمراجع أو الاتصال بالدعم.
- تم الدفع بنجاح. تحقق أكثر في قسم محفوظات المحفظة.
-
- من عند:
- إلى:
- كمية:
- تتبع عدد:
- رقم الفاتورة:
- وقت الدفع:
- ---وصف---
- تومان
- رصيدك:
- ریال
- حدث خطأ في الاتصال بالخادم
-
-
- USER VERIFY MAX TRY
- USER GET DELETE TOKEN MAX TRY
- USER GET DELETE TOKEN MAX SEND
- USER DELETE MAX TRY
- USER PROFILE UPDATE USERNAME UPDATE
- GROUP UPDATE USERNAME UPDATE LOCK
- CHANNEL UPDATE USERNAME UPDATE
-
- You cannot invite this user to groups because of the protected privacy for the request
- GROUP_REVOKE_LINK_BAD_PAYLOAD
- GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
- GROUP_REVOKE_LINK_FORBIDDEN
- CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
- CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
- CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
- CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
- CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
- CHANNEL_UPDATE_USERNAME_FORBIDDEN
- You cannot invite this user to groups because of the protected privacy for the request
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
- USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
- Are you sure send forward for
- "Bazaar"
- iGap Notification
- 6 Month
- minutes ago
-
- نظرًا للإفراط في الاستخدام ، تم حظر عنوان IP الخاص بك لفترة.
- تصدير الدردشة
- غير قادر على استخراج الرسائل
-
-
- استخدام البيانات اللاسلكية
- استخدام بيانات بطاقة SIM
- نشر
- تلقى
- حجم الرسائل المرسلة
- حجم المتلقي
- مجموع
- مجموع حجم المرسلة
- مجموع حجم الواردة
- محو سجل استخدام البيانات
+ محرم
+ صفر
+ ربیعالاول
+ ربیعالثانی
+ جمادیالاول
+ جمادیالثانی
+ رجب
+ شعبان
+ رمضان
+ شوال
+ ذیقعده
+ ذیحجه
+
+ تبويب متعدد
+ موضوع الظلام
+ حصلت عليه
+ اهتمام
+ ملاحظة: تجدر الإشارة إلى أن الأفراد على الخريطة سيتم عرض مع وجود خطأ من 500 متر. لذلك لا تقلق
+ كاميرا صغيرة في المرفقات
+ فتح الفيديو باستخدام المشغل الافتراضي
+ تفاعل القناة
+ تم التحقق من القناة
+ تم التحقق من المستخدم
+ غرفة أخرى
+ إرسال
+ لا ترسل
+ حفظ المعلومات على البطاقة الجانبية
+ هل أنت متأكد؟
+ تغيير موقع التخزين
+ ملفات اخرى
+ دخول قائمة الاتصال
+ عذرًا ، عدد جهات الاتصال لديك كبير جدًا لا يمكننا التحقق من الخادم ، يرجى حفظ جهات الاتصال على مستوى معقول
+
+ هل تخليت عن التغييرات؟
+ سطوع
+ تباين
+ التشبع
+ مرشح اللون
+ تحرير
+ لا يمكن فتح هذا الملف
+ 24 ساعة
+ "ترید %s هذه الرسالة?"
+ غير دبوس
+ دبوس
+ دبوس
+ جميع الأعضاء
+ ههذه الصفحة
+ معاق
+ تخطيط:
+ من:
+ يصل الى:
+ تلقائيا
+ تم تنشيط الوضع الليلي من 19 إلى 8 عن طريق تحديد الوضع التلقائي
+ إعدادات قذيفة الظلام
+ اختر الوقت
+ الخدمات المالية
+ ثبّت التطبيق
+ لاستخدام الخدمة: لتثبيت التطبيق للبطاقة ، وشراء تذكرة الحافلة ، وشراء تهمة ، ودفع الفواتير ، وشراء مجموعة وخدمات الدفع الأخرى.
+ لاستخدام الخدمة: لتثبيت التطبيق للبطاقة ، وشراء تذكرة الحافلة ، وشراء تهمة ، ودفع الفواتير ، وشراء مجموعة وخدمات الدفع الأخرى.
+ التخصيص
+ تطبيق الألوان لتخصيصها
+
+ دفع
+ شراء رسوم المحمول
+ ادفع الفواتير
+ دفع فواتير مخالفات المرور
+ قارئ الباركود
+ معرف الفواتير
+ أدخل
+ رمز الدفع
+ قدر
+ يشترى
+ انتخب
+ همراه اول
+ ایرانسل
+ رایتل
+ شحنة عادية
+ تهمة مذهلة
+ شحن وایمکس
+ قم بشحن بطاقة بشكل دائم
+
+ 10.000 ریالی
+ 20.000 ریالی
+ 50.000 ریالی
+ 100.000 ریالی
+ 200.000 ریالی
+
+ 10.000 ریالی + 9% القيمة المضافة = 10.900 ریال
+ 20.000 ریالی + 9% القيمة المضافة = 21.180 ریال
+ 50.000 ریالی + 9% القيمة المضافة = 54.500 ریال
+ 100.000 ریالی + 9% القيمة المضافة = 109.000 ریال
+ 200.000 ریالی + 9% القيمة المضافة = 218.000 ریال
+
+ معرف الفوترة غير صالح
+ معرف الدفع غير صالح
+ نوع التهمة
+ عامل
+ ترابرد
+ مهلة خطأ
+ لا يوجد خطأ اتصال
+ خطأ في الخادم
+ خطأ في الشبكة
+ الحوار الملغى
+ جذر الجهاز
+ رقم الهاتف غير صالح
+ يرجى اختيار المشغل
+ محفظة
+ تحميل اتفاقية المحفظة
+ أنا أتفق مع الشروط
+ اقبل الشروط
+ اتفاقية المحفظة
+ إرسال الأموال
+ أدخل مبلغ الإيداع:
+ المبلغ بالريال:
+ دفع
+ الانتقال إلى:
+ نقود
+ رمز التتبع
+ مبشر:
+ تم إلغاء الدفعة
+ المحفظة غير متاحة
+ فواتير استفسار همراه اول
+ فواتير استفسار ثائق الهاتف
+ فواتير التحقيق
+ نوع الفاتورة
+ ثائق الهاتف
+ هاتف
+ رمز المنطقة
+ استعلام
+ هذا الرقم ليس في مشغل همراه اول
+ منتصف المدة
+ الدفعة المتوسطة
+ الفصل الأخير
+ دفعة الاخيرة
+ مسؤول عن جميع الخدمات المالية
+ شركة پارسیان للتجارة الإلكترونية (تاپ)
+ is
+ مركز استجابة العملاء: 021-2318
+ مثال : 09123456789
+ مثال : 021
+ مثال : 44567899
+ اتصالات المزامنة
+ عرض القمر الصناعي
+ العرض الافتراضي
+ إرسال الموقع المحدد
+ متر بعيدا
+ حساب ...
+ الحصول على البيانات
+
+ غير ناجح
+ "كان الدفع غير ناجح"
+ لا تعرف نتيجة الدفع فترة المحفظة للمراجع أو الاتصال بالدعم.
+ تم الدفع بنجاح. تحقق أكثر في قسم محفوظات المحفظة.
+
+ من عند:
+ إلى:
+ كمية:
+ تتبع عدد:
+ رقم الفاتورة:
+ وقت الدفع:
+ ---وصف---
+ تومان
+ رصيدك:
+ ریال
+ حدث خطأ في الاتصال بالخادم
+
+
+ USER VERIFY MAX TRY
+ USER GET DELETE TOKEN MAX TRY
+ USER GET DELETE TOKEN MAX SEND
+ USER DELETE MAX TRY
+ USER PROFILE UPDATE USERNAME UPDATE
+ GROUP UPDATE USERNAME UPDATE LOCK
+ CHANNEL UPDATE USERNAME UPDATE
+
+ You cannot invite this user to groups because of the protected privacy for the request
+ GROUP_REVOKE_LINK_BAD_PAYLOAD
+ GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
+ GROUP_REVOKE_LINK_FORBIDDEN
+ CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
+ CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+ CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
+ CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
+ CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
+ CHANNEL_UPDATE_USERNAME_FORBIDDEN
+ You cannot invite this user to groups because of the protected privacy for the request
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
+ USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+ Are you sure send forward for
+ "Bazaar"
+ iGap Notification
+ 6 Month
+ minutes ago
+
+ نظرًا للإفراط في الاستخدام ، تم حظر عنوان IP الخاص بك لفترة.
+ تصدير الدردشة
+ غير قادر على استخراج الرسائل
+ إعلامات منفصلة
+ مقروءة
+
+ استخدام البيانات اللاسلكية
+ استخدام بيانات بطاقة SIM
+ نشر
+ تلقى
+ حجم الرسائل المرسلة
+ حجم المتلقي
+ مجموع
+ مجموع حجم المرسلة
+ مجموع حجم الواردة
+ محو سجل استخدام البيانات
قم بإنشاء قالب جديد
كرر النمط
نمط رمز المرور
هل أنت متأكد من أنك تريد مسح استخدام البيانات?
+ ألوان الخلفیه
+ خلفيات
+
+ SMS
+ Call
+ Way to receive code:
+ Answer
+ \"iGapLocalDatabase.realm\"
+ iGapLocalDatabaseEncrypted.realm
+ بداية
+ بوت
+ العودة إلى القائمة الرئيسية
+ تحديث
+ مرحبا! آیکب مساعدك الذكي
+ تم إيقاف الإصدار الرجاء التحديث لاستخدامه
+ الإصدار الجديد متاح
+ محزر
+ تجاهل
+ الهاشتاج
+ يرجى تحديد و iGap النشط من القائمة لاستقبال الرسائل حتى عندما لا يكون التطبيق في الخلفية
+ لا تظهر مرة أخرى
+ مرحبا!
+ يمكنك تسجيل الدخول عبر الرابط أدناه
+ https://www.igap.net
+هناك معرف عضوية:
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 988f424..d225d0b 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -1,1356 +1,1388 @@
-
- "گپ"
- "آی"
- "ارتباطی بی حد و مرز"
- "هم اکنون دنیای خود را با آی گپ بسازید."
- "فقط چند دقیقه زمان میبرد تا شما هم به جمع آی گپی ها بپیوندید."
-
-
- "امنیت در آی گپ"
- "آی گپ یک ارتباط امن و مطمئن را بین شما، دوستان و خانوادتان برقرار میکند. پیام رسانِ آی گپ با استفاده از الگوریتم های رمزنگاری منحصربفرد در جابجایی همه داده های شما حداکثر امنیت را برای حفظ حریم خصوصی شما فراهم آورده است."
-
-
-
- "گفتگو در آی گپ"
- "شما میتوانید در آی گپ بصورت دونفره و یا گروهی به گفتگو بپردازید و خیالتان راحت باشد که همیشه به گفتگو های خود دسترسی دارید، همچنین میتوانید کانال بسازید و در آن عضو بگیرید و اطلاعات خود را بین میلیون ها کاربر دیگر نیز به اشتراک بگذارید."
-
-
- "انتقال فایل در آی گپ"
- "شما می توانید هر فایلی را با هر پسوند و حجمی انتقال دهید و یا در بستر ابری خود ذخیره کنید. هر آنچه دوست دارید را بدون محدودیت با هر کس که می خواهید به اشتراک بگذارید."
-
-
-
- "تماس صوتی در آی گپ"
- "شما میتوانید بر بستر آی گپ با سایر کاربرانِ آی گپ تماس صوتیِ کاملاً رایگان و امن برقرار کنید و در هزینه های خود صرفه جویی نمایید، همچنین تماس صوتی آی گپ P2P بوده و حتی سرور های آی گپ هم در جابجایی صدای شما دخالت ندارند."
-
-
- "همین حالا شروع کنید"
- "همه چیز رایگان در آی گپ!"
- "آی گپ همیشه رایگان بوده و هست. پس بیش از این منتظر نمی مانیم. همین حالا دنیای خود را در آی گپ بسازید."
-
-
-
- "پروفایل خود را تکمیل کنید"
- "نام خود را وارد کرده و برای خود عکس پروفایل انتخاب نمایید"
- "عکس پروفایل"
- "نام"
- "ادامه"
-
-
- "ثبت نام"
- "لطفاً نام و کد کشور خود را تأیید کرده سپس شماره تلفن همراه خود را بدون صفر ابتدای آن وارد نمایید."
- "بزن بریم"
- "کشور خود را انتخاب کنید"
- "تأیید نهایی شماره تلفن شما، ما قصد داریم کد فعال سازی را برای این شماره ارسال کنیم."
- "در حال اتصال"
- "منتظر دریافت کد تأیید"
- "در حال تولید کلید امنیتی"
- "نهایی سازی ثبت نام"
- "دستی وارد کردم"
- "ارسال مجدد کد تأیید"
- "شما شماره زیر را وارد کردید:
- "اگر شماره تلفن صحیح است تأیید کرده و در غیر اینصورت براحتی تغییرش دهید"
- "لطفاً کد تأیید را دستی وارد کنید"
- شما با دستگاه دیگری در حساب خود هستید ، آی گپ کد فعال سازی را توسط سیستم اطلاع رسانی خود به اکانت شما ارسال کرد، لطفاً دستگاه دیگر را چک کرده و کد را بصورت دستی وارد کنید.
-
- "آی گپ بصورت خودکار پیام تأیید را تشخیص داده و وارد می کند، در غیر اینصورت شما آن را دریافت کرده و می توانید به صورت دستی وارد نمایید، در صورت عدم دریافت کد تأیید، درخواست ارسال مجدد را انتخاب کنید."
- متأسفیم، کد تأیید شما نامعتبر است، لطفاً کد صحیح را مجدد وارد نمایید.
- "ارسال مجدد کد فعال سازی"
- "شماره تلفن"
- "تأیید شماره تلفن"
-
-
- "در انتظار اتصال و موقعیت یابی"
- "موقعیت شما یافت نشد"
- "در ابتدای شماره نیاز به 0 نیست"
- تعداد کاراکترها کمتر از حد مجاز است
- "لطفاً شماره تلفن خود را بدون صفر ابتدای آن وارد کنید"
- "لطفاً کد تأیید را وارد نمایید"
- "شماره وارد شده مسدود شده است"
- "نام نامعتبر است. لطفاً نام را تغییر دهید."
- "لطفاً نام خود را وارد کنید"
-
-
- آیا شما از حذف اکانت خود اطمینان دارید ؟
- (در صورتیکه اکانت خود را حذف کنید، همه فایل هایی که به صورت پیام دریافت کرده اید نیز به طور دائم حذف خواهند شد.)
- تخریب
- شما اکنون در حال تلاش برای تخریب اکانت خود هستید ، شماره تلفن شما برابر است با :
- آی گپ بصورت خودکار کد را تشخیص داده و جای خالی را پر میکند در صورتی که نتوانست به صورت دستی وارد کنید.
-
-
- پیام ویدئویی
- پیام فایلی
- پیغام صوتی
- پیام تصویری
- پیام مخاطب
- پیام متحرک
- پیغام صوتی
- درحال تایپ…
- درحال ارسال تصویر…
- درحال گرفتن تصویر…
- درحال ارسال ویدئو…
- درحال رکورد ویدئو…
- درحال ارسال صوت…
- درحال ضبط صدا…
- درحال ارسال صدا…
- درحال ارسال سند…
- درحال ارسال تصویرمتحرک…
- درحال ارسال فایل…
- درحال ارسال موقعیت…
- درحال انتخاب مخاطب…
- درحال نقاشی…
-
-
- خروج
- حذف حساب کاربری
- بی صدا
- با صدا
- "اطلاع رسانی بیصدا"
- پین به بالا
- برداشتن پین
- "اطلاع رسانی باصدا"
- "پاک کردن تاریخچه"
- "حذف گفتگو"
- ترک گروه
- حذف گروه
-
-
- "آی گپ"
- تماس صوتی آی گپ
- "گفتگو"
- "گروه"
- "کانال"
- "آی گپ"
- "آی گپ"
- "جستجو"
- "%d از %d"
- "افزودن به مخاطبین"
- "انصراف"
- "انصراف"
- "بیخیال"
- "پایان"
- "تأیید"
- "تأیید"
- "تأیید"
- "دوربین"
- "صوت"
- "نقاشی"
- "تصویر"
- "سند"
- "مکان"
- "ویدئو"
- "فایل"
- "مخاطب"
-
- "آیا از پاکسازی تاریخچه اطمینان دارید؟"
-
- "آیا از حذف کامل این گفتگو اطمینان دارید؟"
- "حذف مخاطب"
- "آیا از حذف این مخاطب اطمینان دارید؟"
-
-
- "لطفاً منتظر باشید."
- "این دستگاه دوربین ندارد."
- "سیستم مکانیاب جهانی (GPS) شما خاموش است، آیا مایلید آن را روشن کنید؟"
- "تصویر ذخیره شده است."
- "انتخاب تصویر"
- "عدم توانایی در بارگیری دادهها"
- "آیا میخواهید خارج شوید؟"
- "برای لغو بکشید"
- "%s (%s)"
-
-
-
- "اطلاعات اکانت"
- "زبان"
- "تنظیمات"
- تنظیمات عمومی
- "نام کاربری"
- "نام"
- "نام مخاطب"
- "شماره تلفن"
- "اطلاعات"
- "اعلانات و صداها"
- "پاک کردن حافظهٔ نهان"
- "امنیت و حریم خصوصی"
- "اتاق پیام"
- "اندازهٔ پیام متنی"
- "برچسبها و تصاویر"
- "پس زمينهٔ صفحه گفتگو"
- "فعال کردن انیمیشن"
- "مرورگر درون برنامهای"
- "بریدن و بهبود حجم تصویر"
- "با زدن کلید اینتر ارسال کن"
- "چند رسانه ای"
- "بارگیری خودکار در حالت اتصال به اینترنت سیم کارت"
- بارگیری خودکار در حالت اتصال به اینترنت سیم کارت
- "بارگیری خودکار در حالت اتصال به وای فای"
- بارگیری خودکار در حالت اتصال به وای فای
- "بارگیری خودکار در حالت اتصال به رومینگ داده"
- بارگیری خودکار در حالت اتصال به رومینگ داده
- "اجرای خودکار تصاویر متحرک"
- "ذخیره کردن در گالری"
- "پشتیبانی برنامه"
- "سؤالی بپرسید."
- "دربارهٔ آیگپ"
- "سیاست های حریم خصوصی"
- "نگهداری فایلهای چند رسانهای"
- "تصاویر، ویدئوها و دیگر فایلهای ذخیره شده در فضای ابری که شما به آنها دسترسی داشته اید، به منظور ایجاد فضای خالی از دستگاه پاک می شوند. همه ی رسانه ها در بخش ذخیره سازی فضای ابری نگه داری شده که در صورت نیاز می توانید مجدداً آنها را دانلود کنید.
+
+ "گپ"
+ "آی"
+ "ارتباطی بی حد و مرز"
+ "هم اکنون دنیای خود را با آی گپ بسازید."
+ "فقط چند دقیقه زمان میبرد تا شما هم به جمع آی گپی ها بپیوندید."
+
+
+ "امنیت در آی گپ"
+ "آی گپ یک ارتباط امن و مطمئن را بین شما، دوستان و خانوادتان برقرار میکند. پیام رسانِ آی گپ با استفاده از الگوریتم های رمزنگاری منحصربفرد در جابجایی همه داده های شما حداکثر امنیت را برای حفظ حریم خصوصی شما فراهم آورده است."
+
+
+
+ "گفتگو در آی گپ"
+ "شما میتوانید در آی گپ بصورت دونفره و یا گروهی به گفتگو بپردازید و خیالتان راحت باشد که همیشه به گفتگو های خود دسترسی دارید، همچنین میتوانید کانال بسازید و در آن عضو بگیرید و اطلاعات خود را بین میلیون ها کاربر دیگر نیز به اشتراک بگذارید."
+
+
+ "انتقال فایل در آی گپ"
+ "شما می توانید هر فایلی را با هر پسوند و حجمی انتقال دهید و یا در بستر ابری خود ذخیره کنید. هر آنچه دوست دارید را بدون محدودیت با هر کس که می خواهید به اشتراک بگذارید."
+
+
+
+ "تماس صوتی در آی گپ"
+ "شما میتوانید بر بستر آی گپ با سایر کاربرانِ آی گپ تماس صوتیِ کاملاً رایگان و امن برقرار کنید و در هزینه های خود صرفه جویی نمایید، همچنین تماس صوتی آی گپ P2P بوده و حتی سرور های آی گپ هم در جابجایی صدای شما دخالت ندارند."
+
+
+ "همین حالا شروع کنید"
+ "همه چیز رایگان در آی گپ!"
+ "آی گپ همیشه رایگان بوده و هست. پس بیش از این منتظر نمی مانیم. همین حالا دنیای خود را در آی گپ بسازید."
+
+
+
+ "پروفایل خود را تکمیل کنید"
+ "نام خود را وارد کرده و برای خود عکس پروفایل انتخاب نمایید"
+ "عکس پروفایل"
+ "نام"
+ "ادامه"
+
+
+ "ثبت نام"
+ "لطفاً نام و کد کشور خود را تأیید کرده سپس شماره تلفن همراه خود را بدون صفر ابتدای آن وارد نمایید."
+ "بزن بریم"
+ "کشور خود را انتخاب کنید"
+ "تأیید نهایی شماره تلفن شما، ما قصد داریم کد فعال سازی را برای این شماره ارسال کنیم."
+ "در حال اتصال"
+ "منتظر دریافت کد تأیید"
+ "در حال تولید کلید امنیتی"
+ "نهایی سازی ثبت نام"
+ "دستی وارد کردم"
+ "ارسال مجدد کد تأیید"
+ "شما شماره زیر را وارد کردید:
+ "اگر شماره تلفن صحیح است تأیید کرده و در غیر اینصورت براحتی تغییرش دهید"
+ "لطفاً کد تأیید را دستی وارد کنید"
+ شما با دستگاه دیگری در حساب خود هستید ، آی گپ کد فعال سازی را توسط سیستم اطلاع رسانی خود به اکانت شما ارسال کرد، لطفاً دستگاه دیگر را چک کرده و کد را بصورت دستی وارد کنید.
+
+ "آی گپ بصورت خودکار پیام تأیید را تشخیص داده و وارد می کند، در غیر اینصورت شما آن را دریافت کرده و می توانید به صورت دستی وارد نمایید، در صورت عدم دریافت کد تأیید، درخواست ارسال مجدد را انتخاب کنید."
+ متأسفیم، کد تأیید شما نامعتبر است، لطفاً کد صحیح را مجدد وارد نمایید.
+ "ارسال مجدد کد فعال سازی"
+ "شماره تلفن"
+ "تأیید شماره تلفن"
+
+
+ "در انتظار اتصال و موقعیت یابی"
+ "موقعیت شما یافت نشد"
+ "در ابتدای شماره نیاز به 0 نیست"
+ تعداد کاراکترها کمتر از حد مجاز است
+ "لطفاً شماره تلفن خود را بدون صفر ابتدای آن وارد کنید"
+ "لطفاً کد تأیید را وارد نمایید"
+ "شماره وارد شده مسدود شده است"
+ "نام نامعتبر است. لطفاً نام را تغییر دهید."
+ "لطفاً نام خود را وارد کنید"
+
+
+ آیا شما از حذف اکانت خود اطمینان دارید ؟
+ (در صورتیکه اکانت خود را حذف کنید، همه فایل هایی که به صورت پیام دریافت کرده اید نیز به طور دائم حذف خواهند شد.)
+ تخریب
+ شما اکنون در حال تلاش برای تخریب اکانت خود هستید ، شماره تلفن شما برابر است با :
+ آی گپ بصورت خودکار کد را تشخیص داده و جای خالی را پر میکند در صورتی که نتوانست به صورت دستی وارد کنید.
+
+
+ پیام ویدئویی
+ پیام فایلی
+ پیغام صوتی
+ پیام تصویری
+ پیام مخاطب
+ پیام متحرک
+ پیغام صوتی
+ درحال تایپ…
+ درحال ارسال تصویر…
+ درحال گرفتن تصویر…
+ درحال ارسال ویدئو…
+ درحال رکورد ویدئو…
+ درحال ارسال صوت…
+ درحال ضبط صدا…
+ درحال ارسال صدا…
+ درحال ارسال سند…
+ درحال ارسال تصویرمتحرک…
+ درحال ارسال فایل…
+ درحال ارسال موقعیت…
+ درحال انتخاب مخاطب…
+ درحال نقاشی…
+
+
+ خروج
+ حذف حساب کاربری
+ بی صدا
+ با صدا
+ "اطلاع رسانی بیصدا"
+ پین به بالا
+ برداشتن پین
+ "اطلاع رسانی باصدا"
+ "پاک کردن تاریخچه"
+ "حذف گفتگو"
+ ترک گروه
+ حذف گروه
+
+
+ "آی گپ"
+ تماس صوتی آی گپ
+ "گفتگو"
+ "گروه"
+ "کانال"
+ "آی گپ"
+ "آی گپ"
+ "جستجو"
+ "%d از %d"
+ "افزودن به مخاطبین"
+ "انصراف"
+ "انصراف"
+ "بیخیال"
+ "پایان"
+ "تأیید"
+ "تأیید"
+ "تأیید"
+ "دوربین"
+ "صوت"
+ "نقاشی"
+ "تصویر"
+ "سند"
+ "مکان"
+ "ویدئو"
+ "فایل"
+ "مخاطب"
+
+ "آیا از پاکسازی تاریخچه اطمینان دارید؟"
+
+ "آیا از حذف کامل این گفتگو اطمینان دارید؟"
+ "حذف مخاطب"
+ "آیا از حذف این مخاطب اطمینان دارید؟"
+
+
+ "لطفاً منتظر باشید."
+ "این دستگاه دوربین ندارد."
+ "سیستم مکانیاب جهانی (GPS) شما خاموش است، آیا مایلید آن را روشن کنید؟"
+ "تصویر ذخیره شده است."
+ "انتخاب تصویر"
+ "عدم توانایی در بارگیری دادهها"
+ "آیا میخواهید خارج شوید؟"
+ "برای لغو بکشید"
+ "%s (%s)"
+
+
+
+ "اطلاعات اکانت"
+ "زبان"
+ "تنظیمات"
+ تنظیمات عمومی
+ "نام کاربری"
+ "نام"
+ "نام مخاطب"
+ "شماره تلفن"
+ "اطلاعات"
+ "اعلانات و صداها"
+ "پاک کردن حافظهٔ نهان"
+ "امنیت و حریم خصوصی"
+ "اتاق پیام"
+ "اندازهٔ پیام متنی"
+ "برچسبها و تصاویر"
+ "پس زمينهٔ صفحه گفتگو"
+ "فعال کردن انیمیشن"
+ "مرورگر درون برنامهای"
+ "بریدن و بهبود حجم تصویر"
+ "با زدن کلید اینتر ارسال کن"
+ "چند رسانه ای"
+ "بارگیری خودکار در حالت اتصال به اینترنت سیم کارت"
+ بارگیری خودکار در حالت اتصال به اینترنت سیم کارت
+ "بارگیری خودکار در حالت اتصال به وای فای"
+ بارگیری خودکار در حالت اتصال به وای فای
+ "بارگیری خودکار در حالت اتصال به رومینگ داده"
+ بارگیری خودکار در حالت اتصال به رومینگ داده
+ "اجرای خودکار تصاویر متحرک"
+ "ذخیره کردن در گالری"
+ "پشتیبانی برنامه"
+ "سؤالی بپرسید."
+ "دربارهٔ آیگپ"
+ "سیاست های حریم خصوصی"
+ "نگهداری فایلهای چند رسانهای"
+ "تصاویر، ویدئوها و دیگر فایلهای ذخیره شده در فضای ابری که شما به آنها دسترسی داشته اید، به منظور ایجاد فضای خالی از دستگاه پاک می شوند. همه ی رسانه ها در بخش ذخیره سازی فضای ابری نگه داری شده که در صورت نیاز می توانید مجدداً آنها را دانلود کنید.
"
- "اعلانات و صداها"
- "اعلانات پیام"
- "هشدار"
- "پیش نمایش پیام"
- "رنگ چراغ اِل ای دی"
- "ویبره"
- "پنجره اعلان پیام"
- "صدا"
- "اعلانات گروهی"
- "اعلانات درون برنامهای"
- "صداهای درون برنامهای"
- "ویبرهٔ درون برنامهای"
- "پیش نمایش درون برنامهای"
- "صداهای درون گفتگو"
- "رویدادها"
- "مخاطبی اخیراً عضو آیگپ شده است."
- "پیامهای چسبیده شده"
- "سایر"
- "اگر اپلیکیشن توسط کاربر یا سیستم از حالت اجرا خارج شده بود، باید دوباره اجرا شود. این کار اطمینان میدهد که شما تمام اعلانات را خواهید دید."
- "سرویس همیشه در حال اجرا"
- "اتصال پس زمینه"
-
- "پیامهای چسبیده شده"
- "پیامهای چسبیده شده"
- "بازنشانی"
- "بازنشانی همهٔ اعلانات"
- "تمامی تنظیمات معمول اعلانات را برای همهٔ مخاطبین و گروه های خود خنثی کنید."
- "آیا مایلید تمامی تنظیمات اعلانات برنامه را به حالت اولیه بازگردانید؟"
- "بلی"
- "خیر"
- "پس زمينهٔ گفتگو"
- "برچسبها و تصویر"
-
-
- "حریم خصوصی"
- "لیست مسدود شده"
- "آخرین مشاهده"
- "گروهها"
- "امنیت"
- "رمز عبور به هنگام قفل بودن اپلیکیشن"
- "تأیید دو مرحلهای"
- "جلسات فعال"
- "خودتخریبی حساب کاربری"
-
-
- "اعلانات و صداها"
- "اعلانات"
- "صدا"
- "اعلانات هوشمند"
-
-
- "رسانههای به اشتراک گذاشته شده"
- "پاک کردن تاریخچهٔ گفتگو"
- "مسدود کردن این مخاطب"
- "تنظیمات"
- "تماس"
- "کپی"
- "گام بعدی"
-
-
- "افزودن مخاطب"
- "اطلاعات مخاطب"
- "نام"
- "نام خانوادگی"
- "شماره تلفن"
- "یافتن در صفحه"
- "باز کردن در مرورگر کروم"
- "قدرت گرفته توسط آیگپ"
- "افزودن مخاطب"
- "رسانههای به اشتراک گذاشته شده"
- "فایلهای به اشتراک گذاشته شده"
- "پیوند به اشتراک گذاشته شده"
- "موسیقی به اشتراک گذاشته شده"
- "ذخیره کردن در بخش موسیقی"
- "نمایش همهٔ رسانهها"
- "ذخیره کردن در گالری"
- "حذف از گالری"
- "انتخاب گفتگو"
- "ویرایش شده"
- "امروز"
- "دیروز"
-
-
- "عکس"
- "پیام صوتی"
- "ویدئو"
- "فایل"
- "صوت"
- "تصویر متحرک"
- "افزودن به فهرست مخاطبین"
- "تماس"
- "کپی"
- "خاموش"
- "بدون پنجرۀ اعلان"
- "تنها زمانی که صفحهٔ نمایشگر روشن است"
- "تنها زمانی که صفحهٔ نمایشگر خاموش است"
- "نمایش همیشگی پنجره های اعلان پیام"
- "غیرفعال"
- "فعال"
- "پیشفرض"
- "کوتاه"
- "بلند"
- "در حالت سکوت دستگاه"
- "گالری"
- "دوربین"
- "حذف عکس"
- "۵ دقیقه"
- "۱۰ دقیقه"
- "۳۰ دقیقه"
- "۱ ساعت"
- "۲ ساعت"
- "۴ ساعت"
- "آهنگ پیشفرض اعلانات "
- "پاسخ"
- "کپی"
- "اشتراک"
- "ارسال"
- "حذف"
- "ذخیره در پوشهٔ دانلودها"
- "ویرایش"
- "جستجو"
- "حذف و ترک گروه"
- "کانال جدید"
- "گروه جدید"
-
-
- "تست"
-
- "از"
- "با موفقیت ذخیره کردن در پوشهٔ موسیقی"
- "دیدگاهی وجود ندارد."
- "دیدگاه"
- "انتخاب تصویر از"
- "لغو"
- "دوربین"
- "لطفاً دوربین دستگاه خود را بررسی کنید."
- "حذف عکس"
- "نام گروه"
- "ذخیره"
- "لطفاً نام گروه را وارد کنید."
- "توضیح مختصر گروه"
- "لطفاً توضیح مختصری برای گروه وارد کنید."
- "آیا از حذف این گفتگو اطمینان دارید؟"
- "آیا از گرفتن نقش مدیر از این عضو اطمینان دارید؟"
- "آیا از بیرون انداختن این عضو اطمینان دارید؟"
- "آیا از گرفتن نقش ناظر از این عضو اطمینان دارید؟"
- "در انتظار اتصال به اینترنت"
- "در حال برقراری ارتباط"
- "در حال بهروزرسانی"
- "همین حالا"
- "اعضا"
- عضو
- عضو
- "خطا:"
- "لطفاً شماره تماس را وارد کنید."
- لطفا شماره تلفن صحیح وارد کنید
- "لطفاً نام یا نام خانوادگی را وارد کنید."
- کد تأیید
- به منظور تشخیص و تأیید پست الکترونیکی، کد تأییدی برای ایمیل شما ارسال شده است.
- "کانال جدید"
- "عدم توانایی در ذخیرهٔ تصویر، لطفاً دوباره تلاش کنید."
- "گفتگو"
- "مخاطبین"
- "پیامها"
- "پیامهای قابل نمایش"
- "تعداد پیامهای قابل نمایش"
- "پیامهای جدید از"
- "از"
- "پیام جدید"
- "پیام جدید"
- "پیام جدید دریافت شد."
- "موقعیت من:"
- "عرض جغرافیایی:"
- "طول جغرافیایی:"
- "هنرمند نامشخص"
- "افزودن عضو(های) جدید"
- "تعیین مدیر"
- "تعیین ناظر"
- "بیرون انداختن"
- "اعضا میتوانند عضوهای جدید اضافه کنند."
- "اعلانات و صدا"
- "پیوند شما"
- "کانال عمومی"
- "کانال خصوصی"
- "کاربران تنها زمانی می توانند به این کانال بپیوندند که توسط مدیر(ان) به عنوان اعضای کانال اضافه شوند."
- "کاربران می توانند با جستوجوی نام کاربری یا دریافت لینک دعوت به این کانال بپیوندند."
- "%s"
-
-
-
- "کاربر مسدود شده است و امکان تأیید وجود ندارد."
- "کد تخریب"
- نیاز به ورود به سیستم
- "خطایی از کلاینت"
- "خطای درونی سرور"
- "این کار مجاز نیست."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- ""
- "خطای درونی سرور"
- "این کار مجاز نیست."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
- "خطای درونی سرور"
- "این کار مجاز نیست."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
- "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
- "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
- "خطای درونی سرور"
- "این کار مجاز نیست."
- "خطایی از کلاینت"
- "خطای درونی سرور"
- "این کار مجاز نیست."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از کلاینت: شناسهٔ کاربر اشتباه است."
- "خطایی از کلاینت: شناسهٔ شروع پیام اشتباه است."
- "خطایی از سمت کلاینت: نقش اشتباه است."
- "خطای درونی سرور"
- "کاربر از پیش در این گفتگو حضور دارد."
- "این کار مجاز نیست."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از سمت کلاینت: نام کاربری اشتباه است."
- "خطایی از سمت کلاینت: توضیحات اشتباه است."
- "خطای درونی سرور"
- شناسه نامعتبر است.
- "خطای درونی سرور"
- دسترسی شما مسدود شده است.
- "خطایی از سمت کلاینت: نام مستعار اشتباه است."
- "خطای درونی سرور"
- "خطایی از سمت کلاینت: شناسهٔ عضو دیگر اشتباه است."
- "خطای درونی سرور"
- "هیچ کاربر فعالی با شناسهٔ عضو ارائه شده وجود ندارد. "
- "خطایی از سمت کلاینت: شماره تلفن اشتباه است"
- "خطایی از سمت کلاینت: نام اشتباه است."
- "خطایی از سمت کلاینت: نام خانوادگی اشتباه است."
- "خطایی از سمت کلاینت: نام یا نام خانوادگی اشتباه است."
- "خطای درونی سرور"
- "خطایی از سمت کلاینت: شماره تلفن اشتباه است"
- "خطای درونی سرور"
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطای درونی سرور"
- "این کار مجاز نیست."
- توضیح نامعتبر است
- "خطایی از سمت کلاینت: توضیحات اشتباه است."
- "خطای درونی سرور"
- شما نمی توانید این کاربر را به گروه دعوت کنید.
-
- تغییر وضعیت امضاء کانال ممنوع است
- شما نمی توانید این کاربر را به کانال دعوت کنید.
-
- "خطایی از سمت کلاینت"
- "خطای درونی سرور"
- "خطایی از سمت کلاینت"
- "خطای درونی سرور"
- "چنین گفتگویی یافت نشد."
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از سمت کلاینت: شناسهٔ پیام اول اشتباه است."
- "خطای درونی سرور"
- "دیگر پیامی برای مشاهده وجود ندارد."
- "نام کاربری پیدا نشد."
- "خطایی از سمت کلاینت: نشانه اشتباه است."
- "خطایی از سمت کلاینت: آفست اشتباه است."
- "خطایی از سمت کلاینت: سقف محدودیت بالااشتباه است."
- "خطایی از سمت کلاینت: انتخاب کننده اشتباه است."
- "خطایی از سمت کلاینت: آفست اشتباه است."
- "خطای درونی سرور"
- "چنین فایلی یافت نشد."
-
-
- گزارش تخلف قبلاً ارسال شده است.
- در حال حاضر مجاز به ارسال گزارش تخلف نیستید.
-
- دریافت شناسه امکان پذیر نیست
- ارتباط با سرور امکان پذیر نیست
- ارتباط با سرور امکان پذیر نیست
- ارتباط با دریافت کننده برقرار نشد
- ارتباط با سرور امکان پذیر نیست
- دریافت کننده ثبت نام نکرده است
- ثبت نام برای شما ممنوع است
-
- Bad payload: User report
- ServerError: User report internal
- شما گزارش تخلف این کاربر را قبلاً ارسال کرده اید.
- شما قادر به ارسال گزارش تخلف این کاربر نیستید.
-
- "خطایی از کلاینت: شناسهٔ روم اشتباه است."
- "خطایی از سمت کلاینت: شناسهٔ پیام اشتباه است."
- "خطایی از سمت کلاینت: پیام اشتباه است."
- "چنین فایلی برای درخواست یافت نشد."
- "این کار مجاز نیست."
- "خطایی از سمت کلاینت: توضیحات اشتباه است."
- "خطای درونی سرور"
- "این کار مجاز نیست."
- کد نامعتبر:گرفتن کد
- شما توسط این کاربر مسدود شده اید .
- کد نامعتبر:گرفتن دلیل
- تخریب اکانت : خطای داخلی سرور
- تخریب اکانت : کد اشتباه است
- تخریب اکانت : کد اعتبار ندارد
- تخریب اکانت : تلاش بیش از اندازه
- عدم امکان اتصال به سرور
- "ارسال دوبارهٔ %d پیام"
- "ارسال دوبارهٔ پیام"
- "پس از"
- "جنسیت:"
- "ایمیل:"
- " ۱ماه"
- "۳ ماه"
- "۶ ماه"
- "یک سال"
- "خطایی از سمت کلاینت: ایمیل اشتباه است."
- "خطای درونی سرور"
- "خطایی از سمت کلاینت: نوع جنسیت اشتباه است."
- "خطای درونی سرور"
- فهرست مدیران
- فهرست ناظران
- توضیحات
- تست
- آیا پیام متنی دریافت نکردید؟
- منتظر باشید.
- گفتگوی جدید
- دعوت کردن دوستان
- پرسشهای متداول آیگپ
- اسناد
- حذف مدیر
- حذف ناظر
- آقا
- خانم
- از ابتدا
- از حالا
- ۵۰ پیام آخر
- سفارشی
- تصویر انتخاب شده
- ویدئوی انتخاب شده
- ویدئوی انتخاب شده
- صوت انتخاب شده
- فایل انتخاب شده
- نقاشی انتخاب شده
- شماره تلفن انتخاب شده
- تصویر انتخاب شده
- پیام مکانی
- تراکنش کیف پول
- انتقال گفتگو به گروه
- آخرین بار دیده شده در
- خیلی وقت پیش
- ماه گذشته
- هفتهٔ گذشته
- آنلاین
- دقیقاْ
- اخیراً
- پشتیبانی
- سرویس اعلانات برنامه
- ویرایش
- ترک کردن
- کانال جدید
- پیکان
- آهنگ زنگ
- رد کردن
- ناشناس
- افزودن به مخاطبین
- آیا میخواهید این شماره تلفن را به مخاطبین خود بیفزایید؟
-
- آیا از حذف این حساب کاربری اطمینان دارید؟
- آیا از اخراج این مدیر اطمینان دارید؟؟
- آیا از اخراج این ناظر اطمینان دارید؟
- متأسفانه امکان ارسال پیام در گفتگو برای شما وجود ندارد.
- حذف گفتگو
- سایر
- سایر
- سایر
- سایر
- گرفتن تصویر
- گرفتن فیلم ویدئویی
- تنظیم و ویرایش جنسیت
- تنظیم و ویرایش ایمیل
- حذف مخاطب
- نشانی ایمیل نامعتبر
- آیا از حذف آیتم انتخاب شده اطمینان دارید؟
- آیا از حذف این کانال اطمینان دارید؟
- آیااز ترک این کانال اطمینان دارید؟
-
-
- آیا از پاک کردن تاریخچه آیتم انتخاب شده اطمینان دارید؟
- لغو و بستن جلسه
- لغو و بستن جلسات
- آیا از غیر فعال کردنِ این جلسۀ فعال اطمینان دارید؟
- آیا از لغو همهٔ جلسات فعال اطمینان دارید؟
- هیچ کاربری با نام کابری ارائه شده ثبت نام نکرده است.
- کد تأییدیه به دلیل چندین مرتبه وارد کردن برای مدتی مسدود میباشد.
- کد تأییدیه چندین مرتبه ارسال شده است.
- کد تأییدیه منقضی شده است.
- کاربر به دلیل درخواستش مسدود شده است.
- آیا میخواهید این گفتگو را به گروه انتقال دهید؟
- انتقال گفتگو به گروه
- دقیقه پیش
- دستگاه:
- کشور:
- ایجاد شده در:
- شناسه
- جلسهٔ فعلی
- جلسهٔ فعال
- غیرفعال کردن
- لغو تمامی جلسات فعال
- ارسال شده از
- بیشتر…
- آیا میخواهید این گفتگو را حذف کنید؟
- صدای بلند
- تعداد
- عکس
- عنوان موسیقی
- زمانها
- اطلاعات
- توضیحات
- تایپ کردن پیام
- مکان
- دقیقهها
- پیوند کانال
- پروفایل گروه
- ایران
- مجلهٔ نیچر
- همه
- زمان موسیقی
- گروه جدید
- حذف از حافظهٔ نهان
- ترک کردن کانال
- گزارش تخلف
- پاسخ دادن
- اعضا
- رد کردن
- تنظیمات
- تنظیمات حساب آی گپ
- لطفاْ پیام خود را بنویسید!
- به اشتراک گذاشتن فایل صوتی
- به اشتراک گذاشتن تصویر
- به اشتراک گذاشتن تصویر
- به اشتراک گذاشتن فایل ویدئویی
- به اشتراک گذاشتن فایل ویدئویی
- به اشتراک گذاشتن فایل
- متن کپی شده
-
- پیام
- این قابلیت در آینده ارائه خواهد شد.
- این نام وجود ندارد.
- نام
- نام خانوادگی
- ارتباط این مخاطب مسدود شود؟
- مسدود
- آیا از حذف تاریخچۀ این گفتگو اطمینان دارید؟
- پاک کردن
- عدم امکان ذخیرهٔ تصویر
- فقط مالک گروه میتواند حذف کند.
-
- به اشتراک گذاشتن فایل صوتی
- آخرین مشاهده
- حذف کردن
- لطفاْ شرایط ارتباطی خود را بررسی کنید.
- پیام خطای تأیید
- آقا
- خانم
- به اشتراک گذاشتن از طریق
- خطا
- لطفاْ به منظور تأیید کد را وارد کنید.
- سرور پاسخ نمیدهد.
- به اشتراک گذاشتن تصویر از آیگپ
- لغو
- آی گپ اندروید نسخه
- کافه بازار
- آیااز ترک ایتم انتخاب شده اطمینان دارید؟
-
- آیا از ترک این گروه اطمینان دارید؟
-
- در انتظار اتصال به سرور
- "ذخیرهٔ تصویر در گالری"
- موقعیت من
- تصویر اشتراک گذاشته شده
- ویدیو اشتراک گذاشته شده
- فایل صوتی اشتراک گذاشته شده
- پیام صوتی اشتراک گذاشته شده
- تصویر متحرک اشتراک گذاشته شده
- فایل به اشتراک گذاشته شده
- هزینهٔ کیو آر
- میزان شارژ
- میزان کل
- ریال
- تشخیص داده نشده/
- ارسال اسناد و مدراک
- شارژ
- تاریخچهٔ معاملات
- انتقال پول
- ایجاد کد کیو آر
- پرداخت از طریق کد کیو آر
- شارژ کردن
- تجارت الکترونیک
- توافق
- پیغام شارژ کردن
- توضیح (اختیاری)
- کد را اینجا وارد کنید.
- انتقال به
- قیمت
- مقدار
- ایمیل (اختیاری)
- ایجاد
- تصویر متحرک انتخاب شده برای ارسال
- ثبت پیام
- ریال ایران (IRR)
- "کد ورود شما هست: "
- هیچ رسانهای به اشتراک گذاشته نشده است.
- معلق
- کامل شده
- تاریخ پارسی
- آیا از خروج از حساب کاربری خود اطمینان دارید؟
- یک روز قبل
- دو روز قبل
- سه روز قبل
- چهار روز قبل
- پنج روز قبل
- شش روز قبل
- در
- کپی
- ابطال لینک
- لینک گروه
- can\'t do it please try later
- توضیح کانال
- نام کانال
- حذف و خارج شدن از کانال
- حذف کانال
- "لطفاً نام کانال وارد کنید."
- "کانال جدید"
- "ترک کانال"
- "لطفاً توضیح مختصری برای کانال وارد کنید."
- "شما: "
- "شما"
- فروردین
- اردیبهشت
- خرداد
- تیر
- مرداد
- شهریور
- مهر
- آبان
- آذر
- دی
- بهمن
- اسفند
- عضویت
- "آیا مایلید در این "
- پیش نویس:
- امضا
- Spam
-
- "یک شنبه"
- دوشنبه
- "سه شنبه"
- "چهارشنبه"
- "پنج شنبه"
- "جمعه"
- "شنبه"
-
- مسدود کردن ارتباط مخاطب
- "رفع مسدودیت ارتباط مخاطب"
-
-
- "توسط"
- "به آی گپ پیوست"
- " آی گپ را ترک کرد"
- "ایجاد شد"
- "اضافه شد"
- "حذف شد"
- "را ترک کرد"
- "از خصوصی به عمومی تبدیل شد"
- "از عمومی به خصوصی تبدیل شد"
- "با دعوت به"
- "حذف شد"
- ابطال
- صفحه
-
- "تماس از دست رفته"
- "تماس صوتی از دست رفته"
- "تماس تصویری از دست رفته"
-
-
- ارسال موقعیت
- پیام حذف شده
- پیام خوانده نشده
-
- باید اجازه استفاده از
- دوربین را بدهید
- لیست تماس ها را بدهید
- تقویم را بدهید
- موقعیت یاب گوشی را بدهید
- ضبط صدا را بدهید
- گوشی را بدهید
- پیامک ها را بدهید
- بلاگ رسمی آی گپ
- درخواست پشتیبانی
- صفحه رسمی آی گپ
-
-
- لینک عمومی کانال
- لینک دعوت
- لینک دعوت به کانال
- خود تخریبی
- ذخیره شد
-
- لطفاً منتظر بمانید تا :
- حذف عکس
- لینک دعوت گروه
- تبدیل به کانال خصوصی
- آیا می خواهید این کانال را به کانال خصوصی تبدیل کنید؟
- تبدیل به کانال عمومی
- آیا می خواهید این کانال را به کانال عمومی تبدیل کنید؟
- تخصیص لینک عمومی کانال
- تبدیل به گروه خصوصی
- آیا می خواهید این گروه را به گروه خصوصی تبدیل کنید؟
- تبدیل به گروه عمومی
- آیا می خواهید این گروه را به گروه عمومی تبدیل کنید؟
- تخصیص نام کاربری
- محل ذخیره سازی را بدهید
- برای ادامه کار نیاز به مجوز ذخیره سازی می باشد
- پاک سازی کلی
- پاک سازی
- آیا از حذف کلیۀ اطلاعات چت ها از پایگاه دادۀ داخلی اطمینان دارید؟
- ب ظ
- ق ظ
- ارسال پیام
- پیام انتخاب شده است
- پیام انتخاب شده است
- فایل هنوز دانلود نشده است
- بستن
- فضای ابری من
- اتصال با سرور برقرار نشد.
- پیام خالی است.
- لطفاً مجدداً تلاش نمایید
- صفحه ای با این شناسه یافت نشد
- رنگ پوسته آی گپ
- رنگ اعلانات در آی گپg>
- رنگ بندی
-
-
-
- نفر
- رنگ دکمه های ضامنی
- رنگ آیکن ارسال و پیوست ها
- رنگ تیتر نوشته ها
- رنگ پروگرس بار
- چه کسی آواتارهای من را ببیند؟
- چه کسی من را به کانال دعوت کند ؟
- چه کسی من را به گروه دعوت کند ؟
- هیچکس
- مخاطبین من
- تنظیمات خصوصی
- بگرد و کشف کن
- برگرداندن رنگ ها به پیش فرض
- لطفاً 5 کاراکتر ابتدایی نام کاربری را وارد کنید
- برای جستجو حداقل 3 کاراکتر وارد کنید
- نتیجه ای یافت نشد
- ارتباط با سرور برقرار نیست
- هنوز پیامی ندارید
- شما تاکنون هیچ تماسی برقرار نکرده اید
- نمایش اعضا
- نمایش لایه ثبت رای در کانال
- بستن
- نامعتبر
- ثبت شده
- محدودیت دریافت
- بریدن بخشی از ویدیو
- فشرده سازی ویدیو
- فشرده سازی
- رنگ انتخاب شده قابل نمایش در دستگاه شما نیست
- برای همیشه
- یک هفته
- "فایل در پوشه دانلود ذخیره شد"
- ابتدا فایل را دانلود کنید
- فایل در پوشه گالری ذخیره شد
- فایل در پوشه انتخاب شده ذخیره نشد.
- فایل در پوشه ویدیو ذخیره شد.
- فایل در پوشه تصاویر ذخیره شد.
- محدودیت در گفتگو (چت)
- لطفاً تا اتمام زمان منتظر بمانید (شما تنها می توانید همزمان حداکثر به ۱۰ کاربر ناشناس پیغام دهید؛ بعد از دهمین کاربر از ادامه این کار متوقف خواهید شد و باید تا اتمام شمارش معکوس صبر کنید).
- محدودیت در تعداد ساخت اتاق های گفتگو یا اطلاع رسانی
- شما اجازه دارید نهایتاً ۲۵ گروه و یا کانال بسازید
- نمایش نام فرستنده پیام در گروه
- تماس صوتی
- نقشه
- اطراف من
- تماس صوتی آی گپ
- در حال حاضر پیامی وجود ندارد
- پاک کردن تاریخچه تماس صوتی
- (الزامی)
- اختیاری
- توضیحات (اختیاری)
-
- تعیین رمزعبور
- فعال سازی دو مرحله ای
- شما می توانید رمزعبوری برای حساب کاربری خود تعیین کنید، این رمز زمانی مورد نیاز است که بخواهید جهت ورود به حساب کاربریتان از دستگاه دیگری استفاده نمایید. بعلاوهٔ این رمز شما زمان ورود به حساب کاربری کد تأییدی نیز به صورت پیامک دریافت خواهید کرد.
- رمز عبور را وارد کنید
- لطفاً رمز عبور خود را وارد نمایید
- رمزعبور
- لطفاً رمزعبور خود را یک بار دیگر وارد نمایید
- لطفاً برای رمزعبورتان یک نشانه در نظر بگیرید
- نشانهٔ رمزعبور
- سؤال امنیتی شماره ۱ (الزامی)
- برای مثال: معلم مورد علاقه تان کیست؟
- سؤال امنیتی شماره ۲ (الزامی)
- سوالات امنیتی جدید
- لطفاً سؤالات و پاسخ های جدید را جهت بازیابی رمز عبور وارد نمایید.
- برای مثال: بهترین دوست شما کیست؟
- جواب
- پرسش رمزعبور
- بازیابی از طریق پست الکترونیکی
- پست الکترونیکی (اختیاری)
- بازیابی از طریق سؤال امنیتی
- فعال سازی دو مرحله ای
- رمزعبور خود را فراموش کرده اید؟
- بازیابی از طریق پست الکترونیکی
- کد جدید
- کد را وارد کنید
- تغییر رمزعبور
- تغییر نشانهٔ رمزعبور
- غیرفعال سازی درخواست رمزعبور
- آیا مایلید رمز عبور را غیرفعال نمایید؟
- تعیین یا تغییر پست الکترونیکی
- تغییر سؤالات امنیتی
- تأیید پست الکترونیکی
-
- بازیابی از طریق:
- بازیابی از طریق سؤال امنیتی
-
- کد تأیید پست الکترونیکی
-
- بازیابی از طریق پست الکترونیکی
- بازیابی از طریق سؤال امنیتی
-
- سؤال امنیتی
- پست الکترونیکی
-
- بازیابی رمزعبور
- لطفاً پست الکترونیکی معتبری وارد کنید. این گزینه برای بازیابی رمزعبور فراموش شده است.
- انتخاب مخاطب
- لطفاً کد را وارد نمایید
- لطفاً کد را وارد نمایید
- نشانهٔ در نظر گرفته شده برای رمزعبور نباید مشابه با رمزعبور باشد.
- لطفاً همهٔ موارد را کامل کنید
- عدم مطابقت رمزعبور وارد شده
- رمزعبور باید بیش از ۲ کاراکتر باشد.
- "لطفاً همهٔ موارد را کامل کنید
- "نشانهٔ رمزعبور نباید با رمزعبور مشابه باشد
- "لطفاً نشانهٔ رمزعبور را وارد نمایید
- "لطفاً پست الکترونیکی خود را وارد نمایید
-
- اجازه برقراری ارتباط نیست
- یوزر بلاک شده است
- شماره گرفته شده فعال نیست
- شما با دستگاه دیگرتان در حال مکالمه هستید
- یوزر در حال مکالمه است
- بازگشت به صفحه تماس
- افراد مجاز برای تماس صوتی
- از دست رفته
- بدون پاسخ
- شما اجازه تماس با این مخاطب را ندارید.
-
- آی گپ با خطای پیش بینی نشده برخورد کرده است!
- شروع مجدد
- خطای پیش بینی نشده ای پیش آمده که منجر به از کار افتادن برنامه شده است. ما از خطای پیش آمده آگاهی داریم و در حال برطرف کردن آن هستیم، تنها کاری که باید انجام دهید کلیک بر روی گزینهٔ «شروع مجدد» است.
-
- چیزی نیست!
- آیا از حذف تمامی تماس های ورودی و خروجی اطمینان دارید؟
- لطفاً دلیل خود را بنویسید
- به دلیل تلاش پیاپی، رمزعبور برای مدتی غیرفعال است.
-
- لطفاً کد تأیید پست الکترونیکی را وارد کنید
- بیخیال
- ارسال مجدد کد تأیید
- کد تأیید نامعتبر است
- مجدداً کد تأیید را برای ایمیل شما ارسال کردیم
- لطفاً کد تأیید را وارد کنید
- کلمه عبور نامعتبر است
- تنظیم کلمه عبور
- تنظیم یاداوری
- پست الکترونیکی نا معتبر
- "بلی"
- "خیر"
-
-
- پاسخی دریافت نشد
- در دسترس نیست
- خیلی طولانی
- سیگنالینگ
- تماس ورودی
- در حال زنگ خوردن
- در حال اتصال
- متصل شد
- قطع شد
- ناموفق
- رد تماس
- مشغول
-
- "کد تأیید پست الکترونیکی نادرست است"
- "پاسخ شما نادرست است"
-
- "تماس صوتی از دست رفته"
- "ضبط شده توسط "
-
- ورود با کیوآر
- ورود موفق دستگاه
- بارکد اسکنر
- کیفیت تماس
- "درصورتی که از حساب کاربری خود در طول یکی از مدت زمان های تعیین شده به هیچ وجه استفاده نکنید، حساب شما پس از آن زمان به صورت خودکار تخریب و برای همیشه حذف می شود."
- آیا مایلید رنگ بندی همه قسمت های برنامه به حالت اولیه و پیش فرض باز گردد؟
-
- چرخاندن
- برش
- برگرداندن تصویر
- برگرداندن افقی تصویر
- برگرداندن عمودی تصویر
-
- دیده شدن آواتارهای من توسط
- دریافت لینک دعوت کانال از
- دریافت لینک دعوت گروه از
- دریافت تماس از
- چک شدن آخرین بازدید من توسط
- آیتم
-
- بایت
- کیلوبایت
- مگابایت
- گیگابایت
- ترابایت
-
- فایل صوتی
- حجم کل
-
- کنترل حافظهٔ برنامه
- پایگاه دادهٔ محلی
- ذخیره سازی اطلاعات
- نگهداری و حفظ رسانه ها
-
- این مخاطب هنوز به آی گپ نپیوسته. آیا مایلید ایشان را دعوت کنید؟
- پاک کردن پایگاه دادهٔ برنامه منجر به حذف پیام های متنی ذخیره شده در حافظهٔ نهان و فشرده شدن پایگاه داده به منظور ذخیرهٔ فضای داخلی خواهد شد. آی گپ برای کارکردن به مقداری از اطلاعات نیاز دارد، بنابراین حجم پایگاه داده کاملاً خالی نخواهد شد و به صفر نمیرسد. تکمیل این عملیات چند دقیقه زمان می برد.
- لیست مخاطبین شما
-
- محدودیت زمانی برای تغییر نام کاربری
-
- اطلاعات ذخیره شده در حافظهٔ نهان همان فایل های تصویری، ویدیویی یا اسنادی هستند که بر روی دستگاه شما دریافت و یا از سویِ آن ارسال شده اند؛ هر از گاهی عملیات پاکسازی باید بر روی این فایل ها انجام شود تا مانع از کُندی یا توقف در اجرای برنامه ها شود. هر گاه مایل باشید به این اطلاعات دست پیدا کنید می توانید دوباره فایل ها بارگیری کرده و مشاهده نمایید.
- نام
-
-
- موقعیت مکانی و سایر ویژگی های نقشه غیر فعال می باشد.با فعال کردن دکمه زیراز قابلیت های مربوط به آن استفاده کنید.
- خاموش
- روشن
- تعیین وضعیت
- بروزرسانی دستی
- نمایش بصورت لیست
- غیرفعال کردن قابلیت اطراف من
- در حال دریافت یادداشت
- بدون وضعیت
- حدود %d متر
- وضعیت شما
-
- فعال سازی
- غیر فعال سازی
- فعال سازی قابلیت "اطراف من" باعث خواهد شد وضعیت شما و سایرین برای یکدیگر قابل مشاهده شود. آیا مایل به ادامهٔ کار هستید؟
- با غیرفعال کردن این قابلیت موقعیت شما از سایرین مخفی خواهد شد و همچنین قادر به مشاهدهٔ افراد در محدودهٔ خود نخواهید بود. آیا همواره مایل به ادامهٔ کار هستید؟
- توجه! با فعال کردن دکمۀ زیر، موقعیت شما برای سایرین قابل مشاهده می باشد. لطفاً پیش از ادامه از انجام آن مطمئن شوید.
- حذف وضعیت
- شما وضعیتی برای خود تعیین نکرده اید. آیا مایلید برنامه را بدون تعیین وضعیت ادامه دهید؟
- تعداد کاراکترهای تعیین وضعیت نباید از چهار خط بیشتر باشد.
-
- تنها کاربرانی برای شما قابل مشاهده اند که تا شعاع پنج کیلومتری از شما قرار دارند و وضعیت نقشه آنها روشن است.
-
- چرخش خودکار صفحه
- حالت شب
-
- قفل ورود به برنامه
-
- قفل گشایی با اثرانگشت
- تغییر رمز
- قفل خودکار
- قابلیت گرفتن اسکرین شات
- برای ادامه و ورود به برنامه به تأیید اثرانگشت شما نیازمندیم
- به کمک اثر انگشت
- اثرانگشت
- اثر انگشت شما شناسایی و تأیید نشد. لطفاً مجدداً تلاش کنید
- بعد از هریک از زمان های انتخابی از میان لیست، برنامه قفل شده و برای ورود به برنامه باید رمز یا کد قفل گشا را وارد کنید.
- در صورتیکه این گزینه فعال شود، می توانید از هر قسمت در برنامه اسکرین شات بگیرید، اما فراموش نکنید که حتی با فعال بودن قابلیت قفل برنامه، سیستم همچنان چت های شما را در قسمت برنامه های در حال اجرا در بک گراند نمایش می دهد. شاید برای فعالسازی این قابلیت مجبور شوید یک بار برنامه را بسته و مجدداً باز کنید.
- با فعالسازی قفل ورود به برنامه، آیکن قفل در بالای صفحۀ اصلی چت ها پدیدار می شود که با استفاده از آن می توان برنامه را قفل یا قفل آن را باز کرد.
+ "اعلانات و صداها"
+ "اعلانات پیام"
+ "هشدار"
+ "پیش نمایش پیام"
+ "رنگ چراغ اِل ای دی"
+ "ویبره"
+ "پنجره اعلان پیام"
+ "صدا"
+ "اعلانات گروهی"
+ "اعلانات درون برنامهای"
+ "صداهای درون برنامهای"
+ "ویبرهٔ درون برنامهای"
+ "پیش نمایش درون برنامهای"
+ "صداهای درون گفتگو"
+ "رویدادها"
+ "مخاطبی اخیراً عضو آیگپ شده است."
+ "پیامهای چسبیده شده"
+ "سایر"
+ "اگر اپلیکیشن توسط کاربر یا سیستم از حالت اجرا خارج شده بود، باید دوباره اجرا شود. این کار اطمینان میدهد که شما تمام اعلانات را خواهید دید."
+ "سرویس همیشه در حال اجرا"
+ "اتصال پس زمینه"
+
+ "پیامهای چسبیده شده"
+ "پیامهای چسبیده شده"
+ "بازنشانی"
+ "بازنشانی همهٔ اعلانات"
+ "تمامی تنظیمات معمول اعلانات را برای همهٔ مخاطبین و گروه های خود خنثی کنید."
+ "آیا مایلید تمامی تنظیمات اعلانات برنامه را به حالت اولیه بازگردانید؟"
+ "بلی"
+ "خیر"
+ "پس زمينهٔ گفتگو"
+ "برچسبها و تصویر"
+
+
+ "حریم خصوصی"
+ "لیست مسدود شده"
+ "آخرین مشاهده"
+ "گروهها"
+ "امنیت"
+ "رمز عبور به هنگام قفل بودن اپلیکیشن"
+ "تأیید دو مرحلهای"
+ "جلسات فعال"
+ "خودتخریبی حساب کاربری"
+
+
+ "اعلانات و صداها"
+ "اعلانات"
+ "صدا"
+ "اعلانات هوشمند"
+
+
+ "رسانههای به اشتراک گذاشته شده"
+ "پاک کردن تاریخچهٔ گفتگو"
+ "مسدود کردن این مخاطب"
+ "تنظیمات"
+ "تماس"
+ "کپی"
+ "گام بعدی"
+
+
+ "افزودن مخاطب"
+ "اطلاعات مخاطب"
+ "نام"
+ "نام خانوادگی"
+ "شماره تلفن"
+ "یافتن در صفحه"
+ "باز کردن در مرورگر کروم"
+ "قدرت گرفته توسط آیگپ"
+ "افزودن مخاطب"
+ "رسانههای به اشتراک گذاشته شده"
+ "فایلهای به اشتراک گذاشته شده"
+ "پیوند به اشتراک گذاشته شده"
+ "موسیقی به اشتراک گذاشته شده"
+ "ذخیره کردن در بخش موسیقی"
+ "نمایش همهٔ رسانهها"
+ "ذخیره کردن در گالری"
+ "حذف از گالری"
+ "انتخاب گفتگو"
+ "ویرایش شده"
+ "امروز"
+ "دیروز"
+
+
+ "عکس"
+ "پیام صوتی"
+ "ویدئو"
+ "فایل"
+ "صوت"
+ "تصویر متحرک"
+ "افزودن به فهرست مخاطبین"
+ "تماس"
+ "کپی"
+ "خاموش"
+ "بدون پنجرۀ اعلان"
+ "تنها زمانی که صفحهٔ نمایشگر روشن است"
+ "تنها زمانی که صفحهٔ نمایشگر خاموش است"
+ "نمایش همیشگی پنجره های اعلان پیام"
+ "غیرفعال"
+ "فعال"
+ "پیشفرض"
+ "کوتاه"
+ "بلند"
+ "در حالت سکوت دستگاه"
+ "گالری"
+ "دوربین"
+ "حذف عکس"
+ "۵ دقیقه"
+ "۱۰ دقیقه"
+ "۳۰ دقیقه"
+ "۱ ساعت"
+ "۲ ساعت"
+ "۴ ساعت"
+ "آهنگ پیشفرض اعلانات "
+ "پاسخ"
+ "کپی"
+ "اشتراک"
+ "ارسال"
+ "حذف"
+ "ذخیره در پوشهٔ دانلودها"
+ "ویرایش"
+ "جستجو"
+ "حذف و ترک گروه"
+ "کانال جدید"
+ "گروه جدید"
+
+
+ "تست"
+
+ "از"
+ "با موفقیت ذخیره کردن در پوشهٔ موسیقی"
+ "دیدگاهی وجود ندارد."
+ "دیدگاه"
+ "انتخاب تصویر از"
+ "لغو"
+ "دوربین"
+ "لطفاً دوربین دستگاه خود را بررسی کنید."
+ "حذف عکس"
+ "نام گروه"
+ "ذخیره"
+ "لطفاً نام گروه را وارد کنید."
+ "توضیح مختصر گروه"
+ "لطفاً توضیح مختصری برای گروه وارد کنید."
+ "آیا از حذف این گفتگو اطمینان دارید؟"
+ "آیا از گرفتن نقش مدیر از این عضو اطمینان دارید؟"
+ "آیا از بیرون انداختن این عضو اطمینان دارید؟"
+ "آیا از گرفتن نقش ناظر از این عضو اطمینان دارید؟"
+ "در انتظار اتصال به اینترنت"
+ "در حال برقراری ارتباط"
+ "در حال بهروزرسانی"
+ "همین حالا"
+ "اعضا"
+ عضو
+ عضو
+ "خطا:"
+ "لطفاً شماره تماس را وارد کنید."
+ لطفا شماره تلفن صحیح وارد کنید
+ "لطفاً نام یا نام خانوادگی را وارد کنید."
+ کد تأیید
+ به منظور تشخیص و تأیید پست الکترونیکی، کد تأییدی برای ایمیل شما ارسال شده است.
+ "کانال جدید"
+ "عدم توانایی در ذخیرهٔ تصویر، لطفاً دوباره تلاش کنید."
+ "گفتگو"
+ "مخاطبین"
+ "پیامها"
+ "پیامهای قابل نمایش"
+ "تعداد پیامهای قابل نمایش"
+ "پیامهای جدید از"
+ "از"
+ "پیام جدید"
+ "پیام جدید"
+ "پیام جدید دریافت شد."
+ "موقعیت من:"
+ "عرض جغرافیایی:"
+ "طول جغرافیایی:"
+ "هنرمند نامشخص"
+ "افزودن عضو(های) جدید"
+ "تعیین مدیر"
+ "تعیین ناظر"
+ "بیرون انداختن"
+ "اعضا میتوانند عضوهای جدید اضافه کنند."
+ "اعلانات و صدا"
+ "پیوند شما"
+ "کانال عمومی"
+ "کانال خصوصی"
+ "کاربران تنها زمانی می توانند به این کانال بپیوندند که توسط مدیر(ان) به عنوان اعضای کانال اضافه شوند."
+ "کاربران می توانند با جستوجوی نام کاربری یا دریافت لینک دعوت به این کانال بپیوندند."
+ "%s"
+
+
+
+ "کاربر مسدود شده است و امکان تأیید وجود ندارد."
+ "کد تخریب"
+ نیاز به ورود به سیستم
+ "خطایی از کلاینت"
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ ""
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
+ "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
+ "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از کلاینت: شناسهٔ عضو اشتباه است."
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ "خطایی از کلاینت"
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از کلاینت: شناسهٔ کاربر اشتباه است."
+ "خطایی از کلاینت: شناسهٔ شروع پیام اشتباه است."
+ "خطایی از سمت کلاینت: نقش اشتباه است."
+ "خطای درونی سرور"
+ "کاربر از پیش در این گفتگو حضور دارد."
+ "این کار مجاز نیست."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از سمت کلاینت: نام کاربری اشتباه است."
+ "خطایی از سمت کلاینت: توضیحات اشتباه است."
+ "خطای درونی سرور"
+ شناسه نامعتبر است.
+ "خطای درونی سرور"
+ دسترسی شما مسدود شده است.
+ "خطایی از سمت کلاینت: نام مستعار اشتباه است."
+ "خطای درونی سرور"
+ "خطایی از سمت کلاینت: شناسهٔ عضو دیگر اشتباه است."
+ "خطای درونی سرور"
+ "هیچ کاربر فعالی با شناسهٔ عضو ارائه شده وجود ندارد. "
+ "خطایی از سمت کلاینت: شماره تلفن اشتباه است"
+ "خطایی از سمت کلاینت: نام اشتباه است."
+ "خطایی از سمت کلاینت: نام خانوادگی اشتباه است."
+ "خطایی از سمت کلاینت: نام یا نام خانوادگی اشتباه است."
+ "خطای درونی سرور"
+ "خطایی از سمت کلاینت: شماره تلفن اشتباه است"
+ "خطای درونی سرور"
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ توضیح نامعتبر است
+ "خطایی از سمت کلاینت: توضیحات اشتباه است."
+ "خطای درونی سرور"
+ شما نمی توانید این کاربر را به گروه دعوت کنید.
+
+ تغییر وضعیت امضاء کانال ممنوع است
+ شما نمی توانید این کاربر را به کانال دعوت کنید.
+
+ "خطایی از سمت کلاینت"
+ "خطای درونی سرور"
+ "خطایی از سمت کلاینت"
+ "خطای درونی سرور"
+ "چنین گفتگویی یافت نشد."
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از سمت کلاینت: شناسهٔ پیام اول اشتباه است."
+ "خطای درونی سرور"
+ "دیگر پیامی برای مشاهده وجود ندارد."
+ "نام کاربری پیدا نشد."
+ "خطایی از سمت کلاینت: نشانه اشتباه است."
+ "خطایی از سمت کلاینت: آفست اشتباه است."
+ "خطایی از سمت کلاینت: سقف محدودیت بالااشتباه است."
+ "خطایی از سمت کلاینت: انتخاب کننده اشتباه است."
+ "خطایی از سمت کلاینت: آفست اشتباه است."
+ "خطای درونی سرور"
+ "چنین فایلی یافت نشد."
+
+
+ گزارش تخلف قبلاً ارسال شده است.
+ در حال حاضر مجاز به ارسال گزارش تخلف نیستید.
+
+ دریافت شناسه امکان پذیر نیست
+ ارتباط با سرور امکان پذیر نیست
+ ارتباط با سرور امکان پذیر نیست
+ ارتباط با دریافت کننده برقرار نشد
+ ارتباط با سرور امکان پذیر نیست
+ دریافت کننده ثبت نام نکرده است
+ ثبت نام برای شما ممنوع است
+
+ Bad payload: User report
+ ServerError: User report internal
+ شما گزارش تخلف این کاربر را قبلاً ارسال کرده اید.
+ شما قادر به ارسال گزارش تخلف این کاربر نیستید.
+
+ "خطایی از کلاینت: شناسهٔ روم اشتباه است."
+ "خطایی از سمت کلاینت: شناسهٔ پیام اشتباه است."
+ "خطایی از سمت کلاینت: پیام اشتباه است."
+ "چنین فایلی برای درخواست یافت نشد."
+ "این کار مجاز نیست."
+ "خطایی از سمت کلاینت: توضیحات اشتباه است."
+ "خطای درونی سرور"
+ "این کار مجاز نیست."
+ کد نامعتبر:گرفتن کد
+ شما توسط این کاربر مسدود شده اید .
+ کد نامعتبر:گرفتن دلیل
+ تخریب اکانت : خطای داخلی سرور
+ تخریب اکانت : کد اشتباه است
+ تخریب اکانت : کد اعتبار ندارد
+ تخریب اکانت : تلاش بیش از اندازه
+ عدم امکان اتصال به سرور
+ "ارسال دوبارهٔ %d پیام"
+ "ارسال دوبارهٔ پیام"
+ "پس از"
+ "جنسیت:"
+ "ایمیل:"
+ " ۱ماه"
+ "۳ ماه"
+ "۶ ماه"
+ "یک سال"
+ "خطایی از سمت کلاینت: ایمیل اشتباه است."
+ "خطای درونی سرور"
+ "خطایی از سمت کلاینت: نوع جنسیت اشتباه است."
+ "خطای درونی سرور"
+ فهرست مدیران
+ فهرست ناظران
+ توضیحات
+ تست
+ آیا پیام متنی دریافت نکردید؟
+ منتظر باشید.
+ گفتگوی جدید
+ دعوت کردن دوستان
+ پرسشهای متداول آیگپ
+ اسناد
+ حذف مدیر
+ حذف ناظر
+ آقا
+ خانم
+ از ابتدا
+ از حالا
+ ۵۰ پیام آخر
+ سفارشی
+ تصویر انتخاب شده
+ ویدئوی انتخاب شده
+ ویدئوی انتخاب شده
+ صوت انتخاب شده
+ فایل انتخاب شده
+ نقاشی انتخاب شده
+ شماره تلفن انتخاب شده
+ تصویر انتخاب شده
+ پیام مکانی
+ تراکنش کیف پول
+ انتقال گفتگو به گروه
+ آخرین بار دیده شده در
+ خیلی وقت پیش
+ ماه گذشته
+ هفتهٔ گذشته
+ آنلاین
+ دقیقاْ
+ اخیراً
+ پشتیبانی
+ سرویس اعلانات برنامه
+ ویرایش
+ ترک کردن
+ کانال جدید
+ پیکان
+ آهنگ زنگ
+ رد کردن
+ ناشناس
+ افزودن به مخاطبین
+ آیا میخواهید این شماره تلفن را به مخاطبین خود بیفزایید؟
+
+ آیا از حذف این حساب کاربری اطمینان دارید؟
+ آیا از اخراج این مدیر اطمینان دارید؟؟
+ آیا از اخراج این ناظر اطمینان دارید؟
+ متأسفانه امکان ارسال پیام در گفتگو برای شما وجود ندارد.
+ حذف گفتگو
+ سایر
+ سایر
+ سایر
+ سایر
+ گرفتن تصویر
+ گرفتن فیلم ویدئویی
+ تنظیم و ویرایش جنسیت
+ تنظیم و ویرایش ایمیل
+ حذف مخاطب
+ نشانی ایمیل نامعتبر
+ آیا از حذف آیتم انتخاب شده اطمینان دارید؟
+ آیا از حذف این کانال اطمینان دارید؟
+ آیااز ترک این کانال اطمینان دارید؟
+
+
+ آیا از پاک کردن تاریخچه آیتم انتخاب شده اطمینان دارید؟
+ لغو و بستن جلسه
+ لغو و بستن جلسات
+ آیا از غیر فعال کردنِ این جلسۀ فعال اطمینان دارید؟
+ آیا از لغو همهٔ جلسات فعال اطمینان دارید؟
+ هیچ کاربری با نام کابری ارائه شده ثبت نام نکرده است.
+ کد تأییدیه به دلیل چندین مرتبه وارد کردن برای مدتی مسدود میباشد.
+ کد تأییدیه چندین مرتبه ارسال شده است.
+ کد تأییدیه منقضی شده است.
+ کاربر به دلیل درخواستش مسدود شده است.
+ آیا میخواهید این گفتگو را به گروه انتقال دهید؟
+ انتقال گفتگو به گروه
+ دقیقه پیش
+ دستگاه:
+ کشور:
+ ایجاد شده در:
+ شناسه
+ جلسهٔ فعلی
+ جلسهٔ فعال
+ غیرفعال کردن
+ لغو تمامی جلسات فعال
+ ارسال شده از
+ بیشتر…
+ آیا میخواهید این گفتگو را حذف کنید؟
+ صدای بلند
+ تعداد
+ عکس
+ عنوان موسیقی
+ زمانها
+ اطلاعات
+ توضیحات
+ تایپ کردن پیام
+ مکان
+ دقیقهها
+ پیوند کانال
+ پروفایل گروه
+ ایران
+ مجلهٔ نیچر
+ همه
+ زمان موسیقی
+ گروه جدید
+ حذف از حافظهٔ نهان
+ ترک کردن کانال
+ گزارش تخلف
+ پاسخ دادن
+ اعضا
+ رد کردن
+ تنظیمات
+ تنظیمات حساب آی گپ
+ لطفاْ پیام خود را بنویسید!
+ به اشتراک گذاشتن فایل صوتی
+ به اشتراک گذاشتن تصویر
+ به اشتراک گذاشتن تصویر
+ به اشتراک گذاشتن فایل ویدئویی
+ به اشتراک گذاشتن فایل ویدئویی
+ به اشتراک گذاشتن فایل
+ متن کپی شده
+
+ پیام
+ این قابلیت در آینده ارائه خواهد شد.
+ این نام وجود ندارد.
+ نام
+ نام خانوادگی
+ ارتباط این مخاطب مسدود شود؟
+ مسدود
+ آیا از حذف تاریخچۀ این گفتگو اطمینان دارید؟
+ پاک کردن
+ عدم امکان ذخیرهٔ تصویر
+ فقط مالک گروه میتواند حذف کند.
+
+ به اشتراک گذاشتن فایل صوتی
+ آخرین مشاهده
+ حذف کردن
+ لطفاْ شرایط ارتباطی خود را بررسی کنید.
+ پیام خطای تأیید
+ آقا
+ خانم
+ به اشتراک گذاشتن از طریق
+ خطا
+ لطفاْ به منظور تأیید کد را وارد کنید.
+ سرور پاسخ نمیدهد.
+ به اشتراک گذاشتن تصویر از آیگپ
+ لغو
+ آی گپ اندروید نسخه
+ کافه بازار
+ آیااز ترک ایتم انتخاب شده اطمینان دارید؟
+
+ آیا از ترک این گروه اطمینان دارید؟
+
+ در انتظار اتصال به سرور
+ "ذخیرهٔ تصویر در گالری"
+ موقعیت من
+ تصویر اشتراک گذاشته شده
+ ویدیو اشتراک گذاشته شده
+ فایل صوتی اشتراک گذاشته شده
+ پیام صوتی اشتراک گذاشته شده
+ تصویر متحرک اشتراک گذاشته شده
+ فایل به اشتراک گذاشته شده
+ هزینهٔ کیو آر
+ میزان شارژ
+ میزان کل
+ ریال
+ تشخیص داده نشده/
+ ارسال اسناد و مدراک
+ شارژ
+ تاریخچهٔ معاملات
+ انتقال پول
+ ایجاد کد کیو آر
+ پرداخت از طریق کد کیو آر
+ شارژ کردن
+ تجارت الکترونیک
+ توافق
+ پیغام شارژ کردن
+ توضیح (اختیاری)
+ کد را اینجا وارد کنید.
+ انتقال به
+ قیمت
+ مقدار
+ ایمیل (اختیاری)
+ ایجاد
+ تصویر متحرک انتخاب شده برای ارسال
+ ثبت پیام
+ ریال ایران (IRR)
+ "کد ورود شما هست: "
+ هیچ رسانهای به اشتراک گذاشته نشده است.
+ معلق
+ کامل شده
+ تاریخ پارسی
+ آیا از خروج از حساب کاربری خود اطمینان دارید؟
+ یک روز قبل
+ دو روز قبل
+ سه روز قبل
+ چهار روز قبل
+ پنج روز قبل
+ شش روز قبل
+ در
+ کپی
+ ابطال لینک
+ لینک گروه
+ can\'t do it please try later
+ توضیح کانال
+ نام کانال
+ حذف و خارج شدن از کانال
+ حذف کانال
+ "لطفاً نام کانال وارد کنید."
+ "کانال جدید"
+ "ترک کانال"
+ "لطفاً توضیح مختصری برای کانال وارد کنید."
+ "شما: "
+ "شما"
+ فروردین
+ اردیبهشت
+ خرداد
+ تیر
+ مرداد
+ شهریور
+ مهر
+ آبان
+ آذر
+ دی
+ بهمن
+ اسفند
+ عضویت
+ "آیا مایلید در این "
+ پیش نویس:
+ امضا
+ Spam
+
+ "یک شنبه"
+ دوشنبه
+ "سه شنبه"
+ "چهارشنبه"
+ "پنج شنبه"
+ "جمعه"
+ "شنبه"
+
+ مسدود کردن ارتباط مخاطب
+ "رفع مسدودیت ارتباط مخاطب"
+
+
+ "توسط"
+ "به آی گپ پیوست"
+ " آی گپ را ترک کرد"
+ "ایجاد شد"
+ "اضافه شد"
+ "حذف شد"
+ "را ترک کرد"
+ "از خصوصی به عمومی تبدیل شد"
+ "از عمومی به خصوصی تبدیل شد"
+ "با دعوت به"
+ "حذف شد"
+ ابطال
+ صفحه
+
+ "تماس از دست رفته"
+ "تماس صوتی از دست رفته"
+ "تماس تصویری از دست رفته"
+
+
+ ارسال موقعیت
+ پیام حذف شده
+ پیام خوانده نشده
+
+ باید اجازه استفاده از
+ دوربین را بدهید
+ لیست تماس ها را بدهید
+ تقویم را بدهید
+ موقعیت یاب گوشی را بدهید
+ ضبط صدا را بدهید
+ گوشی را بدهید
+ پیامک ها را بدهید
+ بلاگ رسمی آی گپ
+ درخواست پشتیبانی
+ صفحه رسمی آی گپ
+
+
+ لینک عمومی کانال
+ لینک دعوت
+ لینک دعوت به کانال
+ خود تخریبی
+ ذخیره شد
+
+ لطفاً منتظر بمانید تا :
+ حذف عکس
+ لینک دعوت گروه
+ تبدیل به کانال خصوصی
+ آیا می خواهید این کانال را به کانال خصوصی تبدیل کنید؟
+ تبدیل به کانال عمومی
+ آیا می خواهید این کانال را به کانال عمومی تبدیل کنید؟
+ تخصیص لینک عمومی کانال
+ تبدیل به گروه خصوصی
+ آیا می خواهید این گروه را به گروه خصوصی تبدیل کنید؟
+ تبدیل به گروه عمومی
+ آیا می خواهید این گروه را به گروه عمومی تبدیل کنید؟
+ تخصیص نام کاربری
+ محل ذخیره سازی را بدهید
+ برای ادامه کار نیاز به مجوز ذخیره سازی می باشد
+ پاک سازی کلی
+ پاک سازی
+ آیا از حذف کلیۀ اطلاعات چت ها از پایگاه دادۀ داخلی اطمینان دارید؟
+ ب ظ
+ ق ظ
+ ارسال پیام
+ پیام انتخاب شده است
+ پیام انتخاب شده است
+ فایل هنوز دانلود نشده است
+ بستن
+ فضای ابری من
+ اتصال با سرور برقرار نشد.
+ پیام خالی است.
+ لطفاً مجدداً تلاش نمایید
+ صفحه ای با این شناسه یافت نشد
+ رنگ پوسته آی گپ
+ رنگ اعلانات در آی گپg>
+ رنگ بندی
+
+
+
+ نفر
+ رنگ دکمه های ضامنی
+ رنگ آیکن ارسال و پیوست ها
+ رنگ تیتر نوشته ها
+ رنگ پروگرس بار
+ چه کسی آواتارهای من را ببیند؟
+ چه کسی من را به کانال دعوت کند ؟
+ چه کسی من را به گروه دعوت کند ؟
+ هیچکس
+ مخاطبین من
+ تنظیمات خصوصی
+ بگرد و کشف کن
+ برگرداندن رنگ ها به پیش فرض
+ لطفاً 5 کاراکتر ابتدایی نام کاربری را وارد کنید
+ برای جستجو حداقل 3 کاراکتر وارد کنید
+ نتیجه ای یافت نشد
+ ارتباط با سرور برقرار نیست
+ هنوز پیامی ندارید
+ شما تاکنون هیچ تماسی برقرار نکرده اید
+ نمایش اعضا
+ نمایش لایه ثبت رای در کانال
+ بستن
+ نامعتبر
+ ثبت شده
+ محدودیت دریافت
+ بریدن بخشی از ویدیو
+ فشرده سازی ویدیو
+ فشرده سازی
+ رنگ انتخاب شده قابل نمایش در دستگاه شما نیست
+ برای همیشه
+ یک هفته
+ "فایل در پوشه دانلود ذخیره شد"
+ ابتدا فایل را دانلود کنید
+ فایل در پوشه گالری ذخیره شد
+ فایل در پوشه انتخاب شده ذخیره نشد.
+ فایل در پوشه ویدیو ذخیره شد.
+ فایل در پوشه تصاویر ذخیره شد.
+ محدودیت در گفتگو (چت)
+ لطفاً تا اتمام زمان منتظر بمانید (شما تنها می توانید همزمان حداکثر به ۱۰ کاربر ناشناس پیغام دهید؛ بعد از دهمین کاربر از ادامه این کار متوقف خواهید شد و باید تا اتمام شمارش معکوس صبر کنید).
+ محدودیت در تعداد ساخت اتاق های گفتگو یا اطلاع رسانی
+ شما اجازه دارید نهایتاً ۲۵ گروه و یا کانال بسازید
+ نمایش نام فرستنده پیام در گروه
+ لیست تماس
+ تماس صوتی
+ تماس تصویری
+ نقشه
+ اطراف من
+ تماس صوتی آی گپ
+ در حال حاضر پیامی وجود ندارد
+ پاک کردن تاریخچه تماس صوتی
+ (الزامی)
+ اختیاری
+ توضیحات (اختیاری)
+
+ تعیین رمزعبور
+ فعال سازی دو مرحله ای
+ شما می توانید رمزعبوری برای حساب کاربری خود تعیین کنید، این رمز زمانی مورد نیاز است که بخواهید جهت ورود به حساب کاربریتان از دستگاه دیگری استفاده نمایید. بعلاوهٔ این رمز شما زمان ورود به حساب کاربری کد تأییدی نیز به صورت پیامک دریافت خواهید کرد.
+ رمز عبور را وارد کنید
+ لطفاً رمز عبور خود را وارد نمایید
+ رمزعبور
+ لطفاً رمزعبور خود را یک بار دیگر وارد نمایید
+ لطفاً برای رمزعبورتان یک نشانه در نظر بگیرید
+ نشانهٔ رمزعبور
+ سؤال امنیتی شماره ۱ (الزامی)
+ برای مثال: معلم مورد علاقه تان کیست؟
+ سؤال امنیتی شماره ۲ (الزامی)
+ سوالات امنیتی جدید
+ لطفاً سؤالات و پاسخ های جدید را جهت بازیابی رمز عبور وارد نمایید.
+ برای مثال: بهترین دوست شما کیست؟
+ جواب
+ پرسش رمزعبور
+ بازیابی از طریق پست الکترونیکی
+ پست الکترونیکی (اختیاری)
+ بازیابی از طریق سؤال امنیتی
+ فعال سازی دو مرحله ای
+ رمزعبور خود را فراموش کرده اید؟
+ بازیابی از طریق پست الکترونیکی
+ کد جدید
+ کد را وارد کنید
+ تغییر رمزعبور
+ تغییر نشانهٔ رمزعبور
+ غیرفعال سازی درخواست رمزعبور
+ آیا مایلید رمز عبور را غیرفعال نمایید؟
+ تعیین یا تغییر پست الکترونیکی
+ تغییر سؤالات امنیتی
+ تأیید پست الکترونیکی
+
+ بازیابی از طریق:
+ بازیابی از طریق سؤال امنیتی
+
+ کد تأیید پست الکترونیکی
+
+ بازیابی از طریق پست الکترونیکی
+ بازیابی از طریق سؤال امنیتی
+
+ سؤال امنیتی
+ پست الکترونیکی
+
+ بازیابی رمزعبور
+ لطفاً پست الکترونیکی معتبری وارد کنید. این گزینه برای بازیابی رمزعبور فراموش شده است.
+ انتخاب مخاطب
+ لطفاً کد را وارد نمایید
+ لطفاً کد را وارد نمایید
+ نشانهٔ در نظر گرفته شده برای رمزعبور نباید مشابه با رمزعبور باشد.
+ لطفاً همهٔ موارد را کامل کنید
+ عدم مطابقت رمزعبور وارد شده
+ رمزعبور باید بیش از ۲ کاراکتر باشد.
+ "لطفاً همهٔ موارد را کامل کنید
+ "نشانهٔ رمزعبور نباید با رمزعبور مشابه باشد
+ "لطفاً نشانهٔ رمزعبور را وارد نمایید
+ "لطفاً پست الکترونیکی خود را وارد نمایید
+
+ اجازه برقراری ارتباط نیست
+ یوزر بلاک شده است
+ شماره گرفته شده فعال نیست
+ شما با دستگاه دیگرتان در حال مکالمه هستید
+ یوزر در حال مکالمه است
+ بازگشت به صفحه تماس
+ افراد مجاز برای تماس صوتی
+ افراد مجاز برای تماس تصویری
+ از دست رفته
+ بدون پاسخ
+ شما اجازه تماس با این مخاطب را ندارید.
+
+ آی گپ با خطای پیش بینی نشده برخورد کرده است!
+ شروع مجدد
+ خطای پیش بینی نشده ای پیش آمده که منجر به از کار افتادن برنامه شده است. ما از خطای پیش آمده آگاهی داریم و در حال برطرف کردن آن هستیم، تنها کاری که باید انجام دهید کلیک بر روی گزینهٔ «شروع مجدد» است.
+
+ چیزی نیست!
+ آیا از حذف تمامی تماس های ورودی و خروجی اطمینان دارید؟
+ لطفاً دلیل خود را بنویسید
+ به دلیل تلاش پیاپی، رمزعبور برای مدتی غیرفعال است.
+
+ لطفاً کد تأیید پست الکترونیکی را وارد کنید
+ بیخیال
+ ارسال مجدد کد تأیید
+ کد تأیید نامعتبر است
+ مجدداً کد تأیید را برای ایمیل شما ارسال کردیم
+ لطفاً کد تأیید را وارد کنید
+ کلمه عبور نامعتبر است
+ تنظیم کلمه عبور
+ تنظیم یاداوری
+ پست الکترونیکی نا معتبر
+ "بلی"
+ "خیر"
+
+
+ پاسخی دریافت نشد
+ در دسترس نیست
+ خیلی طولانی
+ سیگنالینگ
+ تماس ورودی
+ در حال زنگ خوردن
+ در حال اتصال
+ متصل شد
+ قطع شد
+ ناموفق
+ رد تماس
+ مشغول
+
+ "کد تأیید پست الکترونیکی نادرست است"
+ "پاسخ شما نادرست است"
+
+ "تماس صوتی از دست رفته"
+ "ضبط شده توسط "
+
+ ورود با کیوآر
+ ورود موفق دستگاه
+ بارکد اسکنر
+ کیفیت تماس
+ "درصورتی که از حساب کاربری خود در طول یکی از مدت زمان های تعیین شده به هیچ وجه استفاده نکنید، حساب شما پس از آن زمان به صورت خودکار تخریب و برای همیشه حذف می شود."
+ آیا مایلید رنگ بندی همه قسمت های برنامه به حالت اولیه و پیش فرض باز گردد؟
+
+ چرخاندن
+ برش
+ برگرداندن تصویر
+ برگرداندن افقی تصویر
+ برگرداندن عمودی تصویر
+
+ دیده شدن آواتارهای من توسط
+ دریافت لینک دعوت کانال از
+ دریافت لینک دعوت گروه از
+ دریافت تماس از
+ چک شدن آخرین بازدید من توسط
+ آیتم
+
+ بایت
+ کیلوبایت
+ مگابایت
+ گیگابایت
+ ترابایت
+
+ فایل صوتی
+ حجم کل
+
+ کنترل حافظهٔ برنامه
+ پایگاه دادهٔ محلی
+ ذخیره سازی اطلاعات
+ نگهداری و حفظ رسانه ها
+
+ این مخاطب هنوز به آی گپ نپیوسته. آیا مایلید ایشان را دعوت کنید؟
+ پاک کردن پایگاه دادهٔ برنامه منجر به حذف پیام های متنی ذخیره شده در حافظهٔ نهان و فشرده شدن پایگاه داده به منظور ذخیرهٔ فضای داخلی خواهد شد. آی گپ برای کارکردن به مقداری از اطلاعات نیاز دارد، بنابراین حجم پایگاه داده کاملاً خالی نخواهد شد و به صفر نمیرسد. تکمیل این عملیات چند دقیقه زمان می برد.
+ لیست مخاطبین شما
+
+ محدودیت زمانی برای تغییر نام کاربری
+
+ اطلاعات ذخیره شده در حافظهٔ نهان همان فایل های تصویری، ویدیویی یا اسنادی هستند که بر روی دستگاه شما دریافت و یا از سویِ آن ارسال شده اند؛ هر از گاهی عملیات پاکسازی باید بر روی این فایل ها انجام شود تا مانع از کُندی یا توقف در اجرای برنامه ها شود. هر گاه مایل باشید به این اطلاعات دست پیدا کنید می توانید دوباره فایل ها بارگیری کرده و مشاهده نمایید.
+ نام
+
+
+ موقعیت مکانی و سایر ویژگی های نقشه غیر فعال می باشد.با فعال کردن دکمه زیراز قابلیت های مربوط به آن استفاده کنید.
+ خاموش
+ روشن
+ تعیین وضعیت
+ بروزرسانی دستی
+ نمایش بصورت لیست
+ غیرفعال کردن قابلیت اطراف من
+ در حال دریافت یادداشت
+ بدون وضعیت
+ حدود %d متر
+ وضعیت شما
+
+ فعال سازی
+ غیر فعال سازی
+ فعال سازی قابلیت "اطراف من" باعث خواهد شد وضعیت شما و سایرین برای یکدیگر قابل مشاهده شود. آیا مایل به ادامهٔ کار هستید؟
+ با غیرفعال کردن این قابلیت موقعیت شما از سایرین مخفی خواهد شد و همچنین قادر به مشاهدهٔ افراد در محدودهٔ خود نخواهید بود. آیا همواره مایل به ادامهٔ کار هستید؟
+ توجه! با فعال کردن دکمۀ زیر، موقعیت شما برای سایرین قابل مشاهده می باشد. لطفاً پیش از ادامه از انجام آن مطمئن شوید.
+ حذف وضعیت
+ شما وضعیتی برای خود تعیین نکرده اید. آیا مایلید برنامه را بدون تعیین وضعیت ادامه دهید؟
+ تعداد کاراکترهای تعیین وضعیت نباید از چهار خط بیشتر باشد.
+
+ تنها کاربرانی برای شما قابل مشاهده اند که تا شعاع پنج کیلومتری از شما قرار دارند و وضعیت نقشه آنها روشن است.
+
+ چرخش خودکار صفحه
+ حالت شب
+
+ قفل ورود به برنامه
+
+ قفل گشایی با اثرانگشت
+ تغییر رمز
+ قفل خودکار
+ قابلیت گرفتن اسکرین شات
+ برای ادامه و ورود به برنامه به تأیید اثرانگشت شما نیازمندیم
+ به کمک اثر انگشت
+ اثرانگشت
+ اثر انگشت شما شناسایی و تأیید نشد. لطفاً مجدداً تلاش کنید
+ بعد از هریک از زمان های انتخابی از میان لیست، برنامه قفل شده و برای ورود به برنامه باید رمز یا کد قفل گشا را وارد کنید.
+ در صورتیکه این گزینه فعال شود، می توانید از هر قسمت در برنامه اسکرین شات بگیرید، اما فراموش نکنید که حتی با فعال بودن قابلیت قفل برنامه، سیستم همچنان چت های شما را در قسمت برنامه های در حال اجرا در بک گراند نمایش می دهد. شاید برای فعالسازی این قابلیت مجبور شوید یک بار برنامه را بسته و مجدداً باز کنید.
+ با فعالسازی قفل ورود به برنامه، آیکن قفل در بالای صفحۀ اصلی چت ها پدیدار می شود که با استفاده از آن می توان برنامه را قفل یا قفل آن را باز کرد.
\nتوجه: برای تعیین رمز می توانید بدون محدودیت از اعداد یا ترکیب اعداد و حروف استفاده کنید. همچنین در صورت فراموشی آن کافی است یک بار از برنامه خارج شده و بار دیگر وارد شوید تا قفل ورود غیرفعال شود.
- در صورتیکه رمز خود را فرامش کرده اید تنها می توانید یک بار از برنامه خارج شده و بار دیگر وارد شوید. آیا مایل به ادامه این کار هستید؟
- رمز خود را فراموش کرده اید؟
- کد قفل گشا را وارد کنید
- کد قفل گشا جدید را وارد کنید
- کد قفل گشا را مجدداً وارد کنید
-
- غیرفعال
- یک دقیقه
- 5 دقیقه
- یک ساعت
- 5 ساعت
- کد قفل گشا را وارد کنید
- رمز ورود را فراموش کرده اید؟
-
- کد قفل گشا باید متشکل از حداقل ۴ حرف و یا عدد باشد
- مسدودی کردن مخاطب
- آیا از مسدودی کردن ارتباط این مخاطب اطمینان دارید؟
- رفع مسدودیت مخاطب
- آیا از رفع مسدودیت ارتباط این مخاطب اطمینان دارید؟
- پین
- رمز
- متأسفانه هیچ کاربری اطراف شما نفشه خود را فعال نکرده است
- ارسال پیام به
- آیا شما مطمئنید میخواهید انتقال دهید به
-
- بیو
- شما می توانید توضیح مختصری دربارهٔ خود در پروفایل وارد کنید. لازم به ذکر است هر کاربر با ورود به پروفایل شما این متن را خواهد دید.
- گزارش تخلف
- اسپم
- محتوای خشونت آمیز
- محتوای پورنوگرافی
- سایر موارد
- محتوای توهین آمیز و آزاردهنده
- حساب کاربری جعلی
- کاراکترهای استفاده شده بیش از حد مجاز است. تنها 70 کاراکتر در این قسمت قابل استفاده اند
- حذف برای
- آیا از حذف این %1$s پیام اطمینان دارید؟
- گزارش تخلف با موفقیت ارسال شد.
- عدم توانایی تنظیم موقعیت مکانی
- تاریخ
- میلادی
- هجری شمسی
- هجری قمری
- بارگذاری
-
- محرم
- صفر
- ربیعالاول
- ربیعالثانی
- جمادیالاول
- جمادیالثانی
- رجب
- شعبان
- رمضان
- شوال
- ذیقعده
- ذیحجه
-
- چند نواری
- زمینه تیره
- فهمیدم
- توجه
- نکته : قابل ذکر است افراد بر روی نقشه با خطای 500 متر نمایش داده خواهند شد. پس جای نگرانی نیست
- دوربین کوچک در پیوست ها
- ویدئو را با پخش کننده پیشفرض باز کن
- واکنش در کانال
- کانال تأیید شده
- کاربر تأیید شده
- ذخیره اطلاعات در کارت جانبی
- شما مطمئن هستید ؟
- تغییر مکان ذخیره سازی
- سایر فایل ها
- در حال وارد کردن لیست تماس
- متاسفانه تعداد مخاطبین شما بیش از حد مجاز میباشد. نمیتوانیم با سرور بررسی کنیم ، لطفا مخاطبین را در حد معقول ذخیره کنید
- اتاق دیگر
-
- آیا از تغییرات انجام داده منصرف شدید ؟
- روشنایی
- کنتراست
- اشباع
- فیلتر رنگ
- ویرایش
- این فایل باز نمی شود
- زمان ۲۴ ساعته
- "میخواهید این پیام را %s کنید؟"
- غیرسنجاق
- سنجاق
- سنجاق
- همه اعضا
- همین صفحه
- غیرفعال
- برنامه ریزی:
- از:
- تا:
- خودکار
- حالت شب از 19 تا 8 با انتخاب حالت خودکار فعال شد
- تنظیمات پوسته تاریک
- انتخاب زمان
- خدمات مالی
- نصب برنامه
- برای استفاده از خدمات :کارت به کارت، خرید بلیط اتوبوس ، خرید شارژ، پرداخت قبوض، خرید بسته اینترنتی و سایر خدمات پرداخت، اپلیکیشن تاپ را نصب نمایید.
- پیگیر ، کیف پول همراه شما برداشت و واریز آنی وجه ، پرداخت هدیه ، خرید از فروشگاه ها و پرداخت کرایه تاکسی.
- سفارشی سازی
- اعمال رنگ ها برای سفارشی سازی
- پرداخت
- خرید شارژ تلفن همراه
- پرداخت قبوض
- پرداخت قبوض راهنمایی و رانندگی
- بار کد خوان
- شناسه قبض
- وارد کنید
- شناسه پرداخت
- مبلغ(ریال)
- خرید
- انتخاب کنید
- همراه اول
- ایرانسل
- رایتل
- شارژ معمولی
- شگفت انگیز
- شارژ وایمکس
- شارژ سیم کارت دائمی
-
- 10.000 ریالی
- 20.000 ریالی
- 50.000 ریالی
- 100.000 ریالی
- 200.000 ریالی
-
- 10.000 ریالی + 9% ارزش افزوده = 10.900 ریال
- 20.000 ریالی + 9% ارزش افزوده = 21.180 ریال
- 50.000 ریالی + 9% ارزش افزوده = 54.500 ریال
- 100.000 ریالی + 9% ارزش افزوده = 109.000 ریال
- 200.000 ریالی + 9% ارزش افزوده = 218.000 ریال
-
- شناسه قبض نامعتبر است
- شناسه پرداخت نامعتبر است
- نوع شارژ
- اپراتور
- ترابرد
- خطای زمان پردازش
- خطای اتصال
- خطای سرور
- خطای شبکه
- لغو درخواست
- دستگاه روت شده است
- شماره تلفن معتبر نیست
- اپراتور را انتخاب کنید
- کیف پول
- در حال دریافت اطلاعات …
- با شرایط موافقم
- پذیرش شرایط
- توافق کیف پول
- ارسال پول
- مبلغ واریزی را وارد کنید:
- مبلغ به ریال:
- پرداخت
- انتقال به:
- پول
- کد پیگیری
- مبلغ:
- پرداخت لغو شد
- کیف پول در دسترس نیست
- استعلام قبوض همراه اول و تلفن ثابت
- استعلام قبوض همراه اول
- استعلام قبوض تلفن ثابت
- استعلام قبوض
- نوع قبض
- تلفن ثابت
- شماره تلفن
- پیش شماره
- استعلام
- این شماره از اپراتور همراه اول نیست
- میان دوره
- پرداخت میان دوره
- پایان دوره
- پرداخت پایان دوره
- مسئولیت کلیه خدمات مالی بر عهده
- شرکت تجارت الکترونیک پارسیان ( تاپ )
- می باشد
- مرکز پاسخگویی مشتریان : 2318-021
- مثال : 09123456789
- مثال : 021
- مثال : 44567899
- همگام سازی مخاطبین
- حالت ماهواره
- حالت پیش فرض
- ارسال موقعیت
- فاصله به متر
- در حال دریافت اطلاعات
- در حال محاسبه..
- ارسال شده
- ناموفق
- "پرداخت ناموفق بود"
- نتیجه پرداخت مشخص نیست به تاریخجه کیف پول مراجع یا با پشتیبانی تماس بگیرید
- پرداخت موفقیت آمیز بود اطلاعات بیشتر در قسمت تاریخچه کیف پول
-
- از:
- به:
- مبلغ:
- کد پیگیری:
- فاکتور:
- تاریخ:
- ---توضیحات پرداخت---
- تومان
- اعتبار شما:
- ریال
- خطا در برقراری ارتباط با سرور
-
- USER VERIFY MAX TRY
- USER GET DELETE TOKEN MAX TRY
- USER GET DELETE TOKEN MAX SEND
- USER DELETE MAX TRY
- USER PROFILE UPDATE USERNAME UPDATE
- GROUP UPDATE USERNAME UPDATE LOCK
- CHANNEL UPDATE USERNAME UPDATE
- GROUP_REVOKE_LINK_BAD_PAYLOAD
- GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
- GROUP_REVOKE_LINK_FORBIDDEN
- CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
- CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
- CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
- CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
- CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
- CHANNEL_UPDATE_USERNAME_FORBIDDEN
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
- USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
- iGap Notification
- 6 Month
- minutes ago
-
- به دلیل تلاش بیش از حد، IP شما برای مدتی مسدود شده است.
- استخراج پیام ها
- قادر به استخراج پیام ها نیست
-
- استفاده از داده بیسیم
- استفاده از داده سیم کارت
- ارسال شده
- دریافت شده
- حجم ارسال شده
- حجم دریافت شده
- جمع
- مجموع حجم ارسال شده
- مجموع حجم دریافت شده
- پاک کردن تاریخچه مصرف داده
- آیا مایل به پاک کردن تاریخچه مصرف داده هستید؟
-
- ایجاد الگوی جدید
- تکرار الگو
- رمز عبور با الگو
+ در صورتیکه رمز خود را فرامش کرده اید تنها می توانید یک بار از برنامه خارج شده و بار دیگر وارد شوید. آیا مایل به ادامه این کار هستید؟
+ رمز خود را فراموش کرده اید؟
+ کد قفل گشا را وارد کنید
+ کد قفل گشا جدید را وارد کنید
+ کد قفل گشا را مجدداً وارد کنید
+
+ غیرفعال
+ یک دقیقه
+ 5 دقیقه
+ یک ساعت
+ 5 ساعت
+ کد قفل گشا را وارد کنید
+ رمز ورود را فراموش کرده اید؟
+
+ کد قفل گشا باید متشکل از حداقل ۴ حرف و یا عدد باشد
+ مسدودی کردن مخاطب
+ آیا از مسدودی کردن ارتباط این مخاطب اطمینان دارید؟
+ رفع مسدودیت مخاطب
+ آیا از رفع مسدودیت ارتباط این مخاطب اطمینان دارید؟
+ پین
+ رمز
+ متأسفانه هیچ کاربری اطراف شما نفشه خود را فعال نکرده است
+ ارسال پیام به
+ آیا شما مطمئنید میخواهید انتقال دهید به
+
+ بیو
+ شما می توانید توضیح مختصری دربارهٔ خود در پروفایل وارد کنید. لازم به ذکر است هر کاربر با ورود به پروفایل شما این متن را خواهد دید.
+ گزارش تخلف
+ اسپم
+ محتوای خشونت آمیز
+ محتوای پورنوگرافی
+ سایر موارد
+ محتوای توهین آمیز و آزاردهنده
+ حساب کاربری جعلی
+ کاراکترهای استفاده شده بیش از حد مجاز است. تنها 70 کاراکتر در این قسمت قابل استفاده اند
+ حذف برای
+ آیا از حذف این %1$s پیام اطمینان دارید؟
+ گزارش تخلف با موفقیت ارسال شد.
+ عدم توانایی تنظیم موقعیت مکانی
+ تاریخ
+ میلادی
+ هجری شمسی
+ هجری قمری
+ بارگذاری
+
+ محرم
+ صفر
+ ربیعالاول
+ ربیعالثانی
+ جمادیالاول
+ جمادیالثانی
+ رجب
+ شعبان
+ رمضان
+ شوال
+ ذیقعده
+ ذیحجه
+
+ چند نواری
+ زمینه تیره
+ فهمیدم
+ توجه
+ نکته : قابل ذکر است افراد بر روی نقشه با خطای 500 متر نمایش داده خواهند شد. پس جای نگرانی نیست
+ دوربین کوچک در پیوست ها
+ ویدئو را با پخش کننده پیشفرض باز کن
+ واکنش در کانال
+ کانال تأیید شده
+ کاربر تأیید شده
+ ذخیره اطلاعات در کارت جانبی
+ شما مطمئن هستید ؟
+ تغییر مکان ذخیره سازی
+ سایر فایل ها
+ در حال وارد کردن لیست تماس
+ متاسفانه تعداد مخاطبین شما بیش از حد مجاز میباشد. نمیتوانیم با سرور بررسی کنیم ، لطفا مخاطبین را در حد معقول ذخیره کنید
+ اتاق دیگر
+
+ آیا از تغییرات انجام داده منصرف شدید ؟
+ روشنایی
+ کنتراست
+ اشباع
+ فیلتر رنگ
+ ویرایش
+ این فایل باز نمی شود
+ زمان ۲۴ ساعته
+ "میخواهید این پیام را %s کنید؟"
+ غیرسنجاق
+ سنجاق
+ سنجاق
+ همه اعضا
+ همین صفحه
+ غیرفعال
+ برنامه ریزی:
+ از:
+ تا:
+ خودکار
+ حالت شب از 19 تا 8 با انتخاب حالت خودکار فعال شد
+ تنظیمات پوسته تاریک
+ انتخاب زمان
+ خدمات مالی
+ نصب برنامه
+ برای استفاده از خدمات :کارت به کارت، خرید بلیط اتوبوس ، خرید شارژ، پرداخت قبوض، خرید بسته اینترنتی و سایر خدمات پرداخت، اپلیکیشن تاپ را نصب نمایید.
+ پیگیر ، کیف پول همراه شما برداشت و واریز آنی وجه ، پرداخت هدیه ، خرید از فروشگاه ها و پرداخت کرایه تاکسی.
+ سفارشی سازی
+ اعمال رنگ ها برای سفارشی سازی
+ پرداخت
+ خرید شارژ تلفن همراه
+ پرداخت قبوض
+ پرداخت قبوض راهنمایی و رانندگی
+ بار کد خوان
+ شناسه قبض
+ وارد کنید
+ شناسه پرداخت
+ مبلغ(ریال)
+ خرید
+ انتخاب کنید
+ همراه اول
+ ایرانسل
+ رایتل
+ شارژ معمولی
+ شگفت انگیز
+ شارژ وایمکس
+ شارژ سیم کارت دائمی
+
+ 10.000 ریالی
+ 20.000 ریالی
+ 50.000 ریالی
+ 100.000 ریالی
+ 200.000 ریالی
+
+ 10.000 ریالی + 9% ارزش افزوده = 10.900 ریال
+ 20.000 ریالی + 9% ارزش افزوده = 21.180 ریال
+ 50.000 ریالی + 9% ارزش افزوده = 54.500 ریال
+ 100.000 ریالی + 9% ارزش افزوده = 109.000 ریال
+ 200.000 ریالی + 9% ارزش افزوده = 218.000 ریال
+
+ شناسه قبض نامعتبر است
+ شناسه پرداخت نامعتبر است
+ نوع شارژ
+ اپراتور
+ ترابرد
+ خطای زمان پردازش
+ خطای اتصال
+ خطای سرور
+ خطای شبکه
+ لغو درخواست
+ دستگاه روت شده است
+ شماره تلفن معتبر نیست
+ اپراتور را انتخاب کنید
+ کیف پول
+ در حال دریافت اطلاعات …
+ با شرایط موافقم
+ پذیرش شرایط
+ توافق کیف پول
+ ارسال پول
+ مبلغ واریزی را وارد کنید:
+ مبلغ به ریال:
+ پرداخت
+ انتقال به:
+ پول
+ کد پیگیری
+ مبلغ:
+ پرداخت لغو شد
+ کیف پول در دسترس نیست
+ استعلام قبوض همراه اول و تلفن ثابت
+ استعلام قبوض همراه اول
+ استعلام قبوض تلفن ثابت
+ استعلام قبوض
+ نوع قبض
+ تلفن ثابت
+ شماره تلفن
+ پیش شماره
+ استعلام
+ این شماره از اپراتور همراه اول نیست
+ میان دوره
+ پرداخت میان دوره
+ پایان دوره
+ پرداخت پایان دوره
+ مسئولیت کلیه خدمات مالی بر عهده
+ شرکت تجارت الکترونیک پارسیان ( تاپ )
+ می باشد
+ مرکز پاسخگویی مشتریان : 2318-021
+ مثال : 09123456789
+ مثال : 021
+ مثال : 44567899
+ همگام سازی مخاطبین
+ حالت ماهواره
+ حالت پیش فرض
+ ارسال موقعیت
+ فاصله به متر
+ در حال دریافت اطلاعات
+ در حال محاسبه..
+ ارسال شده
+ ناموفق
+ "پرداخت ناموفق بود"
+ نتیجه پرداخت مشخص نیست به تاریخجه کیف پول مراجع یا با پشتیبانی تماس بگیرید
+ پرداخت موفقیت آمیز بود اطلاعات بیشتر در قسمت تاریخچه کیف پول
+
+ از:
+ به:
+ مبلغ:
+ کد پیگیری:
+ فاکتور:
+ تاریخ:
+ ---توضیحات پرداخت---
+ تومان
+ اعتبار شما:
+ ریال
+ خطا در برقراری ارتباط با سرور
+
+ USER VERIFY MAX TRY
+ USER GET DELETE TOKEN MAX TRY
+ USER GET DELETE TOKEN MAX SEND
+ USER DELETE MAX TRY
+ USER PROFILE UPDATE USERNAME UPDATE
+ GROUP UPDATE USERNAME UPDATE LOCK
+ CHANNEL UPDATE USERNAME UPDATE
+ GROUP_REVOKE_LINK_BAD_PAYLOAD
+ GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
+ GROUP_REVOKE_LINK_FORBIDDEN
+ CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
+ CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+ CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
+ CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
+ CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
+ CHANNEL_UPDATE_USERNAME_FORBIDDEN
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
+ USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+ iGap Notification
+ 6 Month
+ minutes ago
+
+ به دلیل تلاش بیش از حد، IP شما برای مدتی مسدود شده است.
+ استخراج پیام ها
+ قادر به استخراج پیام ها نیست
+
+ استفاده از داده بیسیم
+ استفاده از داده سیم کارت
+ ارسال شده
+ دریافت شده
+ حجم ارسال شده
+ حجم دریافت شده
+ جمع
+ مجموع حجم ارسال شده
+ مجموع حجم دریافت شده
+ پاک کردن تاریخچه مصرف داده
+ آیا مایل به پاک کردن تاریخچه مصرف داده هستید؟
+
+ ایجاد الگوی جدید
+ تکرار الگو
+ رمز عبور با الگو
+ رنگ های پس زمین
+ تصاویر پس زمینه
+
+ SMS
+ Call
+ Way to receive code:
+ Answer
+
+ اعلانات جداگانه
+ خوانده شده
+ \"iGapLocalDatabase.realm\"
+ iGapLocalDatabaseEncrypted.realm
+
+ شروع
+ ربات
+ بازگشت به منوی اصلی
+ به دستیار هوشمند آیگپ خوش آمدید!
+ نسخه فعلی منقضی شده است لطفا برای استفاده به روز رسانی نمایید
+ نسخه جدید موجود است
+ هشدار
+ نادیده گرفتن
+ هشتگ
+ بروزرسانی
+ لطفا برای رسیدن پیام ها حتی در زمانی که ای گپ در پس زمینه فعال نیست ای گپ را از منو انتخاب و فعال نمایید
+ مجددا نمایش نده
+ سلام!
+از طریق لینک زیر میتونی تو آیگپ عضو بشی، منتظرتیم
+ https://www.igap.net
+ شناسه دعوت کننده هست :
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index 34b6e2c..c45f42b 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -245,6 +245,11 @@
- @string/Female
+
+ - @string/verify_register_sms
+ - @string/verify_register_call
+
+
- @string/PIN
- @string/password
@@ -275,6 +280,11 @@
- @string/capture_video
+
+ - @string/voice_calls
+ - @string/video_calls
+
+
- @string/recovery_by_email_dialog
- @string/recovery_by_question_dialog
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index dc376e4..0e05057 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -9,6 +9,7 @@
#f23131
#ac3328
#00B0BF
+ #2000B0BF
#1da1f2
#7f9fff
#3c000000
diff --git a/app/src/main/res/values/icons.xml b/app/src/main/res/values/icons.xml
index 94bb3e2..eaf557d 100644
--- a/app/src/main/res/values/icons.xml
+++ b/app/src/main/res/values/icons.xml
@@ -5,6 +5,7 @@
\uf30c
\uf48a
\uf066
+ \uf757
\uf36c
\uf581
\uf497
@@ -113,7 +114,7 @@
\uf2ef
\uf1fe
\uf433
- \ue92a
+ \uf567
\ue928
\ue926
\uf24b
@@ -149,4 +150,8 @@
\uf4e6
\uf115
\uf207
+ \uf266
+ \ue927
+ \uf1f0
+ \uf569
\ 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 baf3218..88f27b7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,1357 +1,1387 @@
-
- i
- Gap
- Limitless Connection
- Build your own world by iGap right now.
- It takes only few minutes to join iGap community!
-
-
- Security & Privacy
- iGap attaches the utmost importance to your security and privacy using the individual encryption algorithms and guarantees a safe and secure connection between you, your friends and family.
-
-
- Chat
- You can have one-on-one or group chats and even create your own channel and add members in order to share information with millions of people.
-
-
- File Transferring
- You have an authority to transfer any file with any size and type or save them on your cloud storage; and then share anything you’d like to with anyone you’d want to.
-
-
- Voice Call
- You can make thoroughly free and secure voice calls to anyone on iGap and save your money. iGap voice call is P2P-based with no server\'s interference in voice transmission.
-
-
- Start Now
- Everything for Free in iGap!
- Let’s stop waiting! \n iGap is thoroughly free. So, just now build your own world freely.
-
-
-
- Complete Your User Profile
- Enter your Nickname and select a photo as your Profile Avatar/Picture
- Profile Picture
- First Name
- Continue
-
-
- Registration
- Please confirm your country name and code then enter your phone number without its first zero/0
- Let\'s Go
- Select your Country
- Recheck and confirm your phone number! We\'re sending a verification code to this number
- Connecting
- Waiting for the Code
- Creating Security Key
- Finalizing Registration
- I entered manually
- Resend Code
- You have entered this number :
- Tap OK if this entered phone number is correct or simply modify it if wrong.
- Please enter the verification code
- You have logged into your account on another device and iGap has sent a verification code via its Notification Service in your account, Please check another device and enter the verification code.
- iGap recognizes the code automatically; if not, enter it manually. (Please ask the app to resend the verification code if you have not received it yet)
- Unfortunately; the verification code is invalid , Please enter the correct one manually.
- Resending the verification code
- Phone Number
- Verifying the entered phone number
-
-
- Connecting and getting Info...
- Location not found.
- Don\'t need 0 at the beginning
- Please enter your phone number without the first zero/0
- The number of characters is less than the limit
- Please enter the verification code
- This number is blocked
- please wait until:
- Invalid Nickname,Please change it.
- Please enter your nickname
-
-
- Are you sure you want to delete your account?
- Destruction Code
- Now you are deleting your account; your phone number is :
- iGap automatically fills the field of Deletion Code; otherwise, fill it manually .
-
-
- Video Message
- File Message
- Audio Message
- Image Message
- Contact Message
- Gif Message
- Voice Message
- typing…
- Sending image…
- Capturing image…
- Sending video…
- Capturing video…
- Sending audio…
- Recording voice…
- Sending voice…
- Sending document…
- Sending gif…
- Sending file…
- Sending location…
- Choosing contact…
- Painting…
-
-
- Logout
- Delete Account
- Mute
- Unmute
- Mute Notification
- Pin to top
- UnPin from top
- Unmute Notification
- Clear History
- Delete Chat
- Leave Group
- Delete Group
-
-
- Search
- %d of %d
- Add to Contact
- iGap
- iGap Voice Call
-
-
- Chat
- Group
- Channel
- iGap
- iGap
-
- Are you sure you want to clear history?
- Are you sure you want to delete this chat?
- Are you sure you want to delete this contact?
- Cancel
- Cancel
- Skip
- Finish
- Ok
- Ok
- Confirm
- Camera
- Music
- Paint
- Picture
- Document
- Location
- Video
- File
- Contact
- Please Wait
- This device does not have a camera.
- Your GPS is off, do you want to turn it on?
- The Picture was Saved.
- Select Picture
- Unable to load data.
- Do you want to exit?
- Slide to Cancel
- %s (%s)
-
-
- Account Info
- Language
- Settings
- General Settings
- Username
- First Name
- Contact Name
- Phone Number
- Information
- Notifications and Sounds
- Clear Cache
- Privacy and Security
- Message Room
- Text Message Size
- Stickers and Pictures
- Chat Background
- Enable Animations
- In-App browser
- Crop and Resize Photo
- Send by Enter Key
- Multimedia
- Auto-download (Using Mobile Data)
- Auto-download\n(Using Mobile Data)
- Auto-download (When Connected on Wi-Fi)
- Auto-download\n(Using Wi-Fi)
- Auto-download (When Roaming)
- Auto-download\n(Using Data Roaming)
- Auto Play GIFs
- Save to Gallery
- iGap Support
- Ask a Question
- About iGap
- Privacy Policy
- Store Multimedia Files
- Photos, videos and all other files saved on your cloud storage could be removed from your device in order to free up space. All these removed files and media are stored on cloud storage and could be downloaded and saved again if needed.
- Notification & Sounds
- Message Notifications
- Alert
- Message Preview
- LED Color
- Vibration
- Pop-up Notifications
- Sound
- Group Notifications
- In-App Notifications
- In-App Sounds
- In-App Vibration
- In-App Preview
- Sounds in Chat
- Events
- Recently Joined iGap.
- Pinned Messages
- Other
- Relaunch app if shut down by user or system. This will ensure you all notifications will be shown.
- Keep Service Running all time
- Background Connection
- Keep a low impact background connection to iGap to receive notifications. Enable for reliable notifications.
- Pinned Messages
- Pinned Messages
- Reset
- Reset all Notifications
- Undo all custom notification settings for all your contacts and groups
- Are you sure you want to undo all custom notification settings?
- YES
- NO
- Chat Background
- Stickers and Pictures
-
-
- Privacy
- List of Blocked Users
- Last Seen
- Groups
- Security
- Pass Code Lock
- Two-Step Verification
- Active Sessions
- Account self-destructs
-
-
- Notifications & Sounds
- Notifications
- Sound
- Smart Notifications
-
-
- Shared Media
- Clear Chat History
- Block this contact
- Settings
- Voice Call
- Copy
- Next Step
-
-
- Add Contact
- Contact Info
- First Name
- Last Name
- Phone Number
- Find in Page
- Complete Action Using Chrome
- Powered by iGap
- Add Contact
- Shared Media
- Shared Files
- Shared Links
- Shared Music
- Save to Music
- Show all Media
- Save to Gallery
- Delete from Gallery
- Select Room
- Edited
- Today
- Yesterday
- Clear Call History
-
-
-
- Photo
- Voice Message
- Video
- File
- Music
- GIF
- Add to Contact List
- Call
- Copy
- Off
- No pop-up
- Only when the screen is on
- Only when the screen is off
- Show popup always
- Disable
- Enable
- Default
- Short
- Long
- When silent
- Gallery
- Camera
- Delete Photo
- 5 Minutes
- 10 Minutes
- 30 Minutes
- 1 Hour
- 2 Hours
- 4 Hours
- Default Notifications Tone
- Reply
- Copy
- Share
- Forward
- Delete
- Save To Downloads
- Edit
- Search
- Delete and Leave Group
- New Channel
- New Group
-
-
- Will likely mark this as an error despite being correct. You may want to add 91211111 will likely mark this as an error despite being correct. You may want to add
-
- Of
- Save to music folder successfully
- No Comment
- Comment
- Choose Picture from
- Cancel
- Camera
- Please Check your Device Camera.
- Delete Photo
- Group Name
- Group Link
- Save
- Please enter group name
- Group Description
- Please enter a description about group
- Are you sure you want to remove the admin role from this member?
- Are you sure you want to kick this member?
- Are you sure you want to remove the moderator role from this member?
- Waiting for network…
- Connecting…
- Updating…
- Just Now
- Members
- Members
- Member
- Saved
- Exception:
- Please enter your phone number
- Please enter correct phone number
- Please enter your first name or last name
- New Channel
- Can\'t save picture, please try again
- Chats
- Contacts
- Messages
- Displayable Messages
- Number of Displayable Messages
- New Messages from
- From
- New Message
- New Messages
- New Message Received
- My Location is:
- Latitude :
- Longitude :
- Unknown Artist
- Add New Members
- Assign Admin
- Assign Moderator
- Kick out
- Members Can Add New Members
- Notifications and Sounds
- Your Link
- Public Channel
- Private Channel
- Not anyone can join. They can only be added as members by the admin(s).
- Anyone can join public channels via searching or receiving the invitation link.
- %s
-
-
- User is blocked, no possibility to verify
- Destruction` Code
- Need to Log in
- Bad payload
- Internal Server Error
- This operation is not permitted.
- Bad payload: Invalid room ID
- Bad payload: Invalid member ID
- Internal Server Error
- This operation is not permitted.
- Bad payload: Invalid room ID
- Bad payload: Invalid member ID
- Internal Server Error
- This operation is not permitted.
- Bad payload: Invalid room ID
- Bad payload: Invalid member ID
- Bad payload: Invalid member ID
- Bad payload: Invalid member ID
- Bad payload: Invalid room ID
- Bad payload: Invalid member ID
- Internal Server Error
- This operation is not permitted.
- Bad payload
- Internal Server Error
- This operation is not permitted.
- Bad payload: Invalid room ID
- Bad payload: Invalid user ID
- Bad payload: Invalid starting Message ID
- Bad payload: Invalid role
- Internal Server Error
- The user is already in this conversation.
- This operation is not permitted.
- Bad payload: Invalid room ID
- Bad payload: Invalid username
- Bad payload: Invalid description
- Internal Server Error
- Invalid Token
- Internal Server Error
- User is blocked
- Bad payload: Invalid nickname
- Internal Server Error
- Bad payload: Invalid Peer ID
- Internal Server Error
- There is no active user with the given Peer ID.
- Bad payload: Invalid phone number
- Bad payload: Invalid first name
- Bad payload: Invalid last name
- Bad payload: first name or last name is required
- Internal Server Error
- Bad payload: Invalid phone number
- Internal Server Error
-
- USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
-
- Bad payload: Invalid room ID
- Internal Server Error
- This operation is not permitted.
- You have got Blocked by This User
- Bad payload: Invalid description
- Bad payload: Invalid description
- Internal Server Error
- You cannot invite this user to groups because of the protected privacy for the request
-
- GROUP_REVOKE_LINK_BAD_PAYLOAD
- GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
- GROUP_REVOKE_LINK_FORBIDDEN
-
- CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
- CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
-
- CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
- CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
- CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
- CHANNEL_UPDATE_USERNAME_FORBIDDEN
-
- channel update signature forbidden
- You cannot invite this user to groups because of the protected privacy for the request
-
- Bad payload
- Internal Server Error
- Bad payload
- Internal Server Error
- The Conversation not found.
- Bad payload: Invalid room ID
- Bad payload: Invalid ID of the first message
- Internal Server Error
- No Other Messages to be Viewed.
- Client Resolve Username Not Found
- Bad payload: Invalid token
- Bad payload: Invalid offset
- Bad payload: Invalid max limit
- Bad payload: Invalid selector
- Bad payload: Invalid offset
- Internal Server Error
- file not found.
-
- You have already sent report.
- You are forbidden to send a report.
-
- Unable to get initialize id
- Communication with the server is not possible
- Communication with the server is not possible
- Connection with recipient failed
- Communication with the server is not possible
- The recipient has not registered
- Your registration is forbidden
-
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
- USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
-
- Bad payload: User report
- ServerError: User report internal
- You have already reported this user.
- You are forbidden to do this action.
-
- Bad payload: Invalid room ID
- Bad payload: Invalid message ID
- Bad payload: Invalid message
- No such file is found for request.
- This operation is not permitted.
- Bad payload: Invalid room ID
- Internal Server Error
- This operation is not permitted.
- Resend %d messages
- Resend messages
- Away for
- Gender:
- Email:
- 1 month
- 3 months
- 6 months
- 1 year
- Bad payload: Invalid email address
- Internal Server Error
- Bad payload: Invalid gender
- Internal Server Error
- Bad payload: get token
- Bad payload: get reason
- USER_DELETE INTERNAL SERVER ERROR
- USER DELETE INVALID TOKEN
- USER DELETE EXPIRED TOKEN
- USER DELETE MAX TRY LOCK
- can\'t connect to server
- can\'t do it please try later
-
-
- List of Admin(s)
- List of Moderator(s)
- Description
- Hello blank fragment
-
- Did not you receive a text message?
- Please Wait.
- New Chat
- Invite Friends
- iGap FAQs
- Documents
- Remove Admin
- Remove Moderator
- Male
- Female
- From the Beginning
- From Now
- Last 50 Messages
- Customs
- selected image
- selected video
- "selected
- selected audio
- selected file
- selected paint
- selected phone
- selected Image
- Location Message
- Wallet Transaction
- Convert to Group
- last seen at
- long time ago
- last month
- last week
- online
- Exactly
- Recently
- Support
- Notification Services
- Edit
- Leave
- New Channel
- Arrow
- Ringtone
- Discard
- Unknown
- Add to Contact List
- Do you want to add this phone number to your contacts list?
-
- Are you sure you want to delete your account?
- (If you delete your account, all sort of files received as messages will be deleted permanently!)
- Are you sure you want to kick this admin out?
- Are you sure you want to kick this moderator out?
- Sorry, you are not allowed to send any messages to this chat.
- Delete Contact
-
- Capture Image
- Capture Video
- Set Gander
- Set Email
- Delete Contact
- Wrong Email Address
- Terminate the Active Session
- Terminate all Active Sessions
- Are you sure you want to terminate this active session?
- Are you sure you want to terminate all active sessions?
- There is no registered user with given username.
- Verification code is locked for a while due to too many tries.
- Verification code has been forwarded frequently.
- Verification code is expired.
- User is blocked for his/her request
- Do you want to convert this chat to a group?
- Convert chat to group
- minute ago
- minutes ago
- Device:
- Country:
- Create on:
- IP:
- Current Session
- Active Session
- Terminate
- Terminate all other Active Sessions
- Forwarded from
- more ...
- Do you want to delete this chat?
- Sound at most
- Number
- Photo
- Music Name
- Times
- Info
- Description
- Type your message
- Place
- Minutes
- Channel Link
- Group Profile
- Iran
- Nature Magazine
- Everybody
- Music Time
- New Group
- Delete From Cache
- Leave Channel
- Report
- Reply
- Members
- Skip
- Settings
- iGap Account Settings
- Please type your message!
- Shared Audios
- Shared Images
- Share Image
- Share Video
- Shared Videos
- Shared Files
- Text Copied
-
- Message
- will be offered in the future
- Name not exist
- First Name
- Last Name
- Block This Contact?
- Block
- Are you sure you want to clear this chat history?
- Clear
- Can\'t Save image
- Just Creator can delete
-
- Share audio File
- Last seen
- Remove
- Please check your connection
- Error verification SMS
- Male
- Female
- Share via
- Error
- "Please enter code to verify."
- Server don\'t response
- Share image from iGap
- "TERMINATE"
- "iGap Android Client V"
- "Bazaar"
-
- Are you sure you want to delete this group?
- Are you sure you want to leave this group?
- Waiting for Connecting to Server
- Delete Photo
- Delete Chat
- "picture saved to gallery"
- My Location
- Shared Images
- Shared Videos
- Shared Audios
- Shared Voices
- Shared Gifs
- Shared Files
- QR Payment
- Charge balance
- Total balance
- Rial
- Unverified/
- Sending documents
- Charge
- Transaction history
- Transfer Money
- Create QR code
- Pay via QR code
- Charge out
- E-Commerce
- Agreement
- Message of Charging out
- Description(optional)
- Enter the code here
- Transfer to
- Price
- Amount
- Email(optional)
- Create
- the GIF selected to send
- Log message
- Iranian Rial(IRR)
- "Your login code is:"
- There are no shared media
- Pending
- Completed
-
- Please Enter Channel Name
- New Channel
- Channel Name
- Channel Description
- Delete Channel
- Leave Channel
- Please Enter Channel Description
- Delete and Leave Channel
- Draft:
- You:
- You
- Persian Date
- "Are you sure you want to leave this room?"
- Are you sure you want to delete this room?
- Are you sure you want to delete this channel?
- Are you sure you want to leave this channel?
- Are you sure you want to clear history of this room?
- Are you sure you want to sign out of your iGap account?
- Signature
- Last day
- Two days ago
- Three days ago
- Four days ago
- Five days ago
- Six days ago
- at
-
- Farvardin
- Ordibehesht
- Khordad
- Tir
- Mordad
- Shahrivar
- Mehr
- Aban
- Azar
- Dey
- Bahman
- Esfand
-
- Copy
- Change Link
- Join
- "Do you want to join this "
- Block User
- "Unblock User"
- Spam
-
- "Sunday"
- Monday
- "Tuesday"
- "Wednesday"
- "Thursday"
- "Friday"
- "Saturday"
-
-
- "joined iGap"
- "left iGap"
- "created"
- "added"
- ""
- "kicked out"
- "left Page"
- "converted to Public"
- "converted to Private"
- "joined via Invite Link"
- "deleted Room"
- "conversation"
-
- "Missed Screen Share"
- "Missed Voice Call"
- "Missed Video Call"
-
-
- other
- other
- other
- other
- Revoke
- Invitation Link
- Channel Invitation Link
- Group Invitation Link
- Self-destruct
- Convert to private
- Do you want to convert this channel to private?
- Convert to public
- Do you want to convert this channel to public?
- Set Username
-
- Convert to Private
- Do you want to convert this group to private?
- Convert to Public
- Do you want to convert this group to public?
- Set Username
- Send Position
- Deleted Message
- Unread Message
-
-
- "iGap needs to access your"
- Camera
- Storage
- Contact
- Calender
- Location
- Record Audio
- Call Phone
- Received Messages
-
- USER VERIFY MAX TRY
- USER GET DELETE TOKEN MAX TRY
- USER GET DELETE TOKEN MAX SEND
- USER DELETE MAX TRY
- USER PROFILE UPDATE USERNAME UPDATE
- GROUP UPDATE USERNAME UPDATE LOCK
- CHANNEL UPDATE USERNAME UPDATE
-
- Channel Public Link
- iGap Official Blog
- Support Request
- iGap Official Home
- You need the storage permission for going on.
- Clean Up All
- Clean Up
- Are you sure you want to clean up all data in local chat rooms?
- PM
- AM
- Message(s) Selected
- Message(s) Selected
- Forward message
- File Not Downloaded Yet
- Open
- Close
- My Cloud
- Server not Found
- Text Is Empty
- Please Try Again
- There is no room with this ID
- iGap Theme Color
- Notification
- Color
- is
- are
- Members are
- Toggle Button Color
- Send and Attach Button
- Title
- Progress bar
- Who can see my Avatar?
- Who can invite me to Channels?
- Who can invite me to Groups?
- Nobody
- My Contacts
- Privacy Setting
- Look and Find
- Reset Colors Back to Default
- Please try to enter the first 5 characters of username
- Enter at least 3 characters to search
- No Result
- Server not found
- No Messages Yet
- You didn\'t make any call yet
- Show Members List
- Show Channel Vote Layout
- Close
- INVALID
- TAKEN
- RECEIVING IS LIMITED
- Trim Video
- Compress Video
- Compressing...
- Selected color cannot be set on your device
- Forever
- 1 Month
- 6 Month
- "File save to download folder"
- First download file
- File save to galary folder
- File can not save to selected folder
- File save to video folder
- File save to picture folder
- Restriction in Chatting
- Please wait for the process to finish (You are not allowed to send messages to more than 10 Unknown Users regularly at the same time; after getting to number 10, you get stopped until the end of countdown timer)
- Restriction in Number of Rooms
- You are allowed to create up to 25 Groups and/or Channels
- Show Sender Name in Groups
- Voice Calls
- Map
- Nearby
- iGap Voice Call
- No messages here yet…
- (Required)
- (Optional)
- Description (Optional)
- Set Additional Password
- Two-Step Verification
- You can set a password that will be required when you log in on a new device in addition to the code you get via SMS.
- Enter a Password
- Please enter your Password
- Your Password
- Please re-enter your password
- Please create a password hint
- Password Hint
- Question one (Required)
- eg: Who is your Favorite teacher?
- Question two (Required)
- New Security Questions
- Change old question with answers for recovering password.
- eg: Who is your best friend?
- Answer
- Password Question
- Recovery E-mail
- Your Email (Optional)
- Recovery Question
- Two-Step Verification
- Forgot password?
- Recovery via E-mail
- Recent code
- Enter your code
- Change Password
- Change Hint
- Turn Password off
- Do you really want to remove password?
-
- Set/change Recovery E-Mail
- Change Security Questions
- Recover password via:
-
- Confirm E-Mail
- Recovery with Question
- Confirmation Code
-
- Recovery via E-mail
- Recovery via Question
-
- Security Question
- E-mail
-
- Recovery Password
- Please add your valid e-mail! It is another way to recover your forgotten password
- Select Contact
- Please enter code
- Please enter code
- Hint can\'t be the same as password
- "Please complete all items
- "Password does not match
- "Password has to be more than 2 characters
- "Please complete all items
- "hint can\'t be the same as password
- "Please enter your hint
- "Please enter your email
-
- Password is locked for a while due to too many tries.
- Is not allowed to communicate
- User is blocked
- Dialed number is not active
- You are talking with your other devices
- The user is in conversation
- Is not allowed to communicate
- Return to Call Screen
-
- iGap has crashed!
- Reset
- An unexpected error occurred forcing the application to stop. We are aware of this error. Please be sure we are fixing this problem, all you have to do is only click "Reset".
- Who can call me?
- Missed Call
- Unanswered Call
-
- Nothing
- Are you sure you want to clear all incoming and outgoing calls?
- Please write your reasons
- Enter the confirmation code sent to Email
- Confirmation email
- A code has been sent to your email in order that your email address will be verified and confirmed then.
- Skip
- Resend Confirmation Code
- Invalid verify email code
- We\'ve resent the confirmation code to your email
- Please enter verify email code
- Password is invalid
- "Please set password"
- "Please set hint"
- "Your email is invalid"
- "Yes"
- "No"
-
-
- Not Answered ANSWERED
- Unavailable
- Too Long
- Signaling
- Incoming Call
- Ringing
- Connecting
- Connected
- Disconnected
- Failed
- Rejected
- Busy
-
- "Your email token is invalid"
- "Your answer is invalid"
-
- "Voice Call Cancelled"
- Recorded By
- Login with QR code
- Device login success
- QR code Scanner
- Call Quality
- "If you choose one of the periods in the following and never use your iGap account during the certain time, your account will be destructed and deleted spontaneously."
- Are you sure you want to reset all changes with color to default?
-
- Rotate
- Crop
- Flip
- Flip horizontally
- Flip vertically
-
- My Avatars get seen by
- Channels Invite Link received from
- Groups Invite Link received from
- Calls received from
- My Last Seen checked by
- item
-
- byte
- KB
- MB
- GB
- TB
-
-
- Audio
- Total Size
-
- Manage Spacing
- Local Database
- Data Storage
- Keep Media
-
-
- This user dose not have iGap yet, send an invitation?
- Clearing the local database will delete the texts of cached messages and compress the database to save internal disk space. iGap needs some data to work, so database size will not reach zero. \n\n This operation can take few minutes to complete.
- List of Phone Contacts
-
- Limit time for change Username
- Cached data on your device are the uploaded and/or downloaded files as photos, videos or documents, which must be cleared occasionally not to stop your device working or slow it down. Whenever you want to see them again, it is sufficient only to tap on them for downloading.
- Name
-
- The location status and other features of map are disabled. To use all the capabilities, turn the switch on first.
- turn off
- turn on
- positioning
- Manually Update the Map
- List of People Nearby
- Disable "Nearby" Visibility
- Receiving notes...
- No Status
- about %d m
- Your Status
- Clear Status
- You will be visible to others with no status. Are you sure to continue?
-
- Enable Nearby
- Disable Nearby
- Enabling Nearby will result in getting your and others\' status visible to both. Are you sure to continue?
- Disabling Nearby will not only result in hiding your status from others, but you won\'t also be able to see others\' status within your certain range. Are you still sure to continue?
- Notice! Activating "Map Status" will result in making your location visible to others. Please be sure about it before turning on.
- Only the users within your 5KM radius distance are visible to you if their Map Status in ON.
-
- Your status cannot exceed 4 lines.
-
- Auto-Rotate Screen
- 24 hour clock
- Dark Theme
- PassCode Lock
- Unlock With FingerPrint
- Change PassCode
- Auto-lock
- Allow Screen Capture
- Confirm fingerPrint to continue
- Touch sensor
- FingerPrint
- Fingerprint not recognized. Try again
- The app will be locked after each time you choose and you need to unlock it at the beginning.
- If enabled, you can take screenshots of the app, but the system will display your chats in the task switcher even when the passcode is on. You may need to restart the app for this to take effect.
- When you set a passcode, a lock icon will appear on top of the main chats page. Tap it to lock or unlock the app.
+
+ i
+ Gap
+ Limitless Connection
+ Build your own world by iGap right now.
+ It takes only few minutes to join iGap community!
+
+
+ Security & Privacy
+ iGap attaches the utmost importance to your security and privacy using the individual encryption algorithms and guarantees a safe and secure connection between you, your friends and family.
+
+
+ Chat
+ You can have one-on-one or group chats and even create your own channel and add members in order to share information with millions of people.
+
+
+ File Transferring
+ You have an authority to transfer any file with any size and type or save them on your cloud storage; and then share anything you’d like to with anyone you’d want to.
+
+
+ Voice Call
+ You can make thoroughly free and secure voice calls to anyone on iGap and save your money. iGap voice call is P2P-based with no server\'s interference in voice transmission.
+
+
+ Start Now
+ Everything for Free in iGap!
+ Let’s stop waiting! \n iGap is thoroughly free. So, just now build your own world freely.
+
+
+
+ Complete Your User Profile
+ Enter your Nickname and select a photo as your Profile Avatar/Picture
+ Profile Picture
+ First Name
+ Continue
+
+
+ Registration
+ Please confirm your country name and code then enter your phone number without its first zero/0
+ Let\'s Go
+ Select your Country
+ Recheck and confirm your phone number! We\'re sending a verification code to this number
+ Connecting
+ Waiting for the Code
+ Creating Security Key
+ Finalizing Registration
+ I entered manually
+ Resend Code
+ You have entered this number :
+ Tap OK if this entered phone number is correct or simply modify it if wrong.
+ Please enter the verification code
+ You have logged into your account on another device and iGap has sent a verification code via its Notification Service in your account, Please check another device and enter the verification code.
+ iGap recognizes the code automatically; if not, enter it manually. (Please ask the app to resend the verification code if you have not received it yet)
+ Unfortunately; the verification code is invalid , Please enter the correct one manually.
+ Resending the verification code
+ Phone Number
+ Verifying the entered phone number
+
+
+ Connecting and getting Info...
+ Location not found.
+ Don\'t need 0 at the beginning
+ Please enter your phone number without the first zero/0
+ The number of characters is less than the limit
+ Please enter the verification code
+ This number is blocked
+ please wait until:
+ Invalid Nickname,Please change it.
+ Please enter your nickname
+
+
+ Are you sure you want to delete your account?
+ Destruction Code
+ Now you are deleting your account; your phone number is :
+ iGap automatically fills the field of Deletion Code; otherwise, fill it manually .
+
+
+ Video Message
+ File Message
+ Audio Message
+ Image Message
+ Contact Message
+ Gif Message
+ Voice Message
+ typing…
+ Sending image…
+ Capturing image…
+ Sending video…
+ Capturing video…
+ Sending audio…
+ Recording voice…
+ Sending voice…
+ Sending document…
+ Sending gif…
+ Sending file…
+ Sending location…
+ Choosing contact…
+ Painting…
+
+
+ Logout
+ Delete Account
+ Mute
+ Unmute
+ Mute Notification
+ Pin to top
+ UnPin from top
+ Unmute Notification
+ Clear History
+ Delete Chat
+ Leave Group
+ Delete Group
+
+
+ Search
+ %d of %d
+ Add to Contact
+ iGap
+ iGap Voice Call
+
+
+ Chat
+ Group
+ Channel
+ iGap
+ iGap
+
+ Are you sure you want to clear history?
+ Are you sure you want to delete this chat?
+ Are you sure you want to delete this contact?
+ Cancel
+ Cancel
+ Skip
+ Finish
+ Ok
+ Ok
+ Confirm
+ Camera
+ Music
+ Paint
+ Picture
+ Document
+ Location
+ Video
+ File
+ Contact
+ Please Wait
+ This device does not have a camera.
+ Your GPS is off, do you want to turn it on?
+ The Picture was Saved.
+ Select Picture
+ Unable to load data.
+ Do you want to exit?
+ Slide to Cancel
+ %s (%s)
+
+
+ Account Info
+ Language
+ Settings
+ General Settings
+ Username
+ First Name
+ Contact Name
+ Phone Number
+ Information
+ Notifications and Sounds
+ Clear Cache
+ Privacy and Security
+ Message Room
+ Text Message Size
+ Stickers and Pictures
+ Chat Background
+ Enable Animations
+ In-App browser
+ Crop and Resize Photo
+ Send by Enter Key
+ Multimedia
+ Auto-download (Using Mobile Data)
+ Auto-download\n(Using Mobile Data)
+ Auto-download (When Connected on Wi-Fi)
+ Auto-download\n(Using Wi-Fi)
+ Auto-download (When Roaming)
+ Auto-download\n(Using Data Roaming)
+ Auto Play GIFs
+ Save to Gallery
+ iGap Support
+ Ask a Question
+ About iGap
+ Privacy Policy
+ Store Multimedia Files
+ Photos, videos and all other files saved on your cloud storage could be removed from your device in order to free up space. All these removed files and media are stored on cloud storage and could be downloaded and saved again if needed.
+ Notification & Sounds
+ Message Notifications
+ Alert
+ Message Preview
+ LED Color
+ Vibration
+ Pop-up Notifications
+ Sound
+ Group Notifications
+ In-App Notifications
+ In-App Sounds
+ In-App Vibration
+ In-App Preview
+ Sounds in Chat
+ Events
+ Recently Joined iGap.
+ Pinned Messages
+ Other
+ Relaunch app if shut down by user or system. This will ensure you all notifications will be shown.
+ Keep Service Running all time
+ Background Connection
+ Keep a low impact background connection to iGap to receive notifications. Enable for reliable notifications.
+ Pinned Messages
+ Pinned Messages
+ Reset
+ Reset all Notifications
+ Undo all custom notification settings for all your contacts and groups
+ Are you sure you want to undo all custom notification settings?
+ YES
+ NO
+ Chat Background
+ Stickers and Pictures
+
+
+ Privacy
+ List of Blocked Users
+ Last Seen
+ Groups
+ Security
+ Pass Code Lock
+ Two-Step Verification
+ Active Sessions
+ Account self-destructs
+
+
+ Notifications & Sounds
+ Notifications
+ Sound
+ Smart Notifications
+
+
+ Shared Media
+ Clear Chat History
+ Block this contact
+ Settings
+ Voice Call
+ Copy
+ Next Step
+
+
+ Add Contact
+ Contact Info
+ First Name
+ Last Name
+ Phone Number
+ Find in Page
+ Complete Action Using Chrome
+ Powered by iGap
+ Add Contact
+ Shared Media
+ Shared Files
+ Shared Links
+ Shared Music
+ Save to Music
+ Show all Media
+ Save to Gallery
+ Delete from Gallery
+ Select Room
+ Edited
+ Today
+ Yesterday
+ Clear Call History
+
+
+
+ Photo
+ Voice Message
+ Video
+ File
+ Music
+ GIF
+ Add to Contact List
+ Call
+ Copy
+ Off
+ No pop-up
+ Only when the screen is on
+ Only when the screen is off
+ Show popup always
+ Disable
+ Enable
+ Default
+ Short
+ Long
+ When silent
+ Gallery
+ Camera
+ Delete Photo
+ 5 Minutes
+ 10 Minutes
+ 30 Minutes
+ 1 Hour
+ 2 Hours
+ 4 Hours
+ Default Notifications Tone
+ Reply
+ Copy
+ Share
+ Forward
+ Delete
+ Save To Downloads
+ Edit
+ Search
+ Delete and Leave Group
+ New Channel
+ New Group
+
+
+ Will likely mark this as an error despite being correct. You may want to add 91211111 will likely mark this as an error despite being correct. You may want to add
+
+ Of
+ Save to music folder successfully
+ No Comment
+ Comment
+ Choose Picture from
+ Cancel
+ Camera
+ Please Check your Device Camera.
+ Delete Photo
+ Group Name
+ Group Link
+ Save
+ Please enter group name
+ Group Description
+ Please enter a description about group
+ Are you sure you want to remove the admin role from this member?
+ Are you sure you want to kick this member?
+ Are you sure you want to remove the moderator role from this member?
+ Waiting for network…
+ Connecting…
+ Updating…
+ Just Now
+ Members
+ Members
+ Member
+ Saved
+ Exception:
+ Please enter your phone number
+ Please enter correct phone number
+ Please enter your first name or last name
+ New Channel
+ Can\'t save picture, please try again
+ Chats
+ Contacts
+ Messages
+ Displayable Messages
+ Number of Displayable Messages
+ New Messages from
+ From
+ New Message
+ New Messages
+ New Message Received
+ My Location is:
+ Latitude :
+ Longitude :
+ Unknown Artist
+ Add New Members
+ Assign Admin
+ Assign Moderator
+ Kick out
+ Members Can Add New Members
+ Notifications and Sounds
+ Your Link
+ Public Channel
+ Private Channel
+ Not anyone can join. They can only be added as members by the admin(s).
+ Anyone can join public channels via searching or receiving the invitation link.
+ %s
+
+
+ User is blocked, no possibility to verify
+ Destruction` Code
+ Need to Log in
+ Bad payload
+ Internal Server Error
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid member ID
+ Internal Server Error
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid member ID
+ Internal Server Error
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid member ID
+ Bad payload: Invalid member ID
+ Bad payload: Invalid member ID
+ Bad payload: Invalid room ID
+ Bad payload: Invalid member ID
+ Internal Server Error
+ This operation is not permitted.
+ Bad payload
+ Internal Server Error
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid user ID
+ Bad payload: Invalid starting Message ID
+ Bad payload: Invalid role
+ Internal Server Error
+ The user is already in this conversation.
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid username
+ Bad payload: Invalid description
+ Internal Server Error
+ Invalid Token
+ Internal Server Error
+ User is blocked
+ Bad payload: Invalid nickname
+ Internal Server Error
+ Bad payload: Invalid Peer ID
+ Internal Server Error
+ There is no active user with the given Peer ID.
+ Bad payload: Invalid phone number
+ Bad payload: Invalid first name
+ Bad payload: Invalid last name
+ Bad payload: first name or last name is required
+ Internal Server Error
+ Bad payload: Invalid phone number
+ Internal Server Error
+
+ USER_PROFILE_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+
+ Bad payload: Invalid room ID
+ Internal Server Error
+ This operation is not permitted.
+ You have got Blocked by This User
+ Bad payload: Invalid description
+ Bad payload: Invalid description
+ Internal Server Error
+ You cannot invite this user to groups because of the protected privacy for the request
+
+ GROUP_REVOKE_LINK_BAD_PAYLOAD
+ GROUP_REVOKE_LINK_INTERNAL_SERVER_ERROR
+ GROUP_REVOKE_LINK_FORBIDDEN
+
+ CHANNEL_CHECK_USERNAME_BAD_PAYLOAD
+ CHANNEL_CHECK_USERNAME_INTERNAL_SERVER_ERROR
+
+ CHANNEL_UPDATE_USERNAME_BAD_PAYLOAD
+ CHANNEL_UPDATE_USERNAME_INTERNAL_SERVER_ERROR
+ CHANNEL_UPDATE_USERNAME_UPDATE_LOCK
+ CHANNEL_UPDATE_USERNAME_FORBIDDEN
+
+ channel update signature forbidden
+ You cannot invite this user to groups because of the protected privacy for the request
+
+ Bad payload
+ Internal Server Error
+ Bad payload
+ Internal Server Error
+ The Conversation not found.
+ Bad payload: Invalid room ID
+ Bad payload: Invalid ID of the first message
+ Internal Server Error
+ No Other Messages to be Viewed.
+ Client Resolve Username Not Found
+ Bad payload: Invalid token
+ Bad payload: Invalid offset
+ Bad payload: Invalid max limit
+ Bad payload: Invalid selector
+ Bad payload: Invalid offset
+ Internal Server Error
+ file not found.
+
+ You have already sent report.
+ You are forbidden to send a report.
+
+ Unable to get initialize id
+ Communication with the server is not possible
+ Communication with the server is not possible
+ Connection with recipient failed
+ Communication with the server is not possible
+ The recipient has not registered
+ Your registration is forbidden
+
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_EXPIRED_TOKEN
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_VERIFY_RECOVERY_EMAIL_INVALID_TOKEN
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_BAD_PAYLOAD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INTERNAL_SERVER_ERROR
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_MAX_TRY_LOCK
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_NO_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_INVALID_PASSWORD
+ USER_TWO_STEP_VERIFICATION_CHANGE_RECOVERY_EMAIL_CONFIRMED_BEFORE
+
+ Bad payload: User report
+ ServerError: User report internal
+ You have already reported this user.
+ You are forbidden to do this action.
+
+ Bad payload: Invalid room ID
+ Bad payload: Invalid message ID
+ Bad payload: Invalid message
+ No such file is found for request.
+ This operation is not permitted.
+ Bad payload: Invalid room ID
+ Internal Server Error
+ This operation is not permitted.
+ Resend %d messages
+ Resend messages
+ Away for
+ Gender:
+ Email:
+ 1 month
+ 3 months
+ 6 months
+ 1 year
+ Bad payload: Invalid email address
+ Internal Server Error
+ Bad payload: Invalid gender
+ Internal Server Error
+ Bad payload: get token
+ Bad payload: get reason
+ USER_DELETE INTERNAL SERVER ERROR
+ USER DELETE INVALID TOKEN
+ USER DELETE EXPIRED TOKEN
+ USER DELETE MAX TRY LOCK
+ can\'t connect to server
+ can\'t do it please try later
+
+
+ List of Admin(s)
+ List of Moderator(s)
+ Description
+ Hello blank fragment
+
+ Did not you receive a text message?
+ Please Wait.
+ New Chat
+ Invite Friends
+ iGap FAQs
+ Documents
+ Remove Admin
+ Remove Moderator
+ Male
+ Female
+ From the Beginning
+ From Now
+ Last 50 Messages
+ Customs
+ selected image
+ selected video
+ "selected
+ selected audio
+ selected file
+ selected paint
+ selected phone
+ selected Image
+ Location Message
+ Wallet Transaction
+ Convert to Group
+ last seen at
+ long time ago
+ last month
+ last week
+ online
+ Exactly
+ Recently
+ Support
+ Notification Services
+ Edit
+ Leave
+ New Channel
+ Arrow
+ Ringtone
+ Discard
+ Unknown
+ Add to Contact List
+ Do you want to add this phone number to your contacts list?
+
+ Are you sure you want to delete your account?
+ (If you delete your account, all sort of files received as messages will be deleted permanently!)
+ Are you sure you want to kick this admin out?
+ Are you sure you want to kick this moderator out?
+ Sorry, you are not allowed to send any messages to this chat.
+ Delete Contact
+
+ Capture Image
+ Capture Video
+ Set Gander
+ Set Email
+ Delete Contact
+ Wrong Email Address
+ Terminate the Active Session
+ Terminate all Active Sessions
+ Are you sure you want to terminate this active session?
+ Are you sure you want to terminate all active sessions?
+ There is no registered user with given username.
+ Verification code is locked for a while due to too many tries.
+ Verification code has been forwarded frequently.
+ Verification code is expired.
+ User is blocked for his/her request
+ Do you want to convert this chat to a group?
+ Convert chat to group
+ minute ago
+ minutes ago
+ Device:
+ Country:
+ Create on:
+ IP:
+ Current Session
+ Active Session
+ Terminate
+ Terminate all other Active Sessions
+ Forwarded from
+ more ...
+ Do you want to delete this chat?
+ Sound at most
+ Number
+ Photo
+ Music Name
+ Times
+ Info
+ Description
+ Type your message
+ Place
+ Minutes
+ Channel Link
+ Group Profile
+ Iran
+ Nature Magazine
+ Everybody
+ Music Time
+ New Group
+ Delete From Cache
+ Leave Channel
+ Report
+ Reply
+ Members
+ Skip
+ Settings
+ iGap Account Settings
+ Please type your message!
+ Shared Audios
+ Shared Images
+ Share Image
+ Share Video
+ Shared Videos
+ Shared Files
+ Text Copied
+
+ Message
+ will be offered in the future
+ Name not exist
+ First Name
+ Last Name
+ Block This Contact?
+ Block
+ Are you sure you want to clear this chat history?
+ Clear
+ Can\'t Save image
+ Just Creator can delete
+
+ Share audio File
+ Last seen
+ Remove
+ Please check your connection
+ Error verification SMS
+ Male
+ Female
+ Share via
+ Error
+ "Please enter code to verify."
+ Server don\'t response
+ Share image from iGap
+ "TERMINATE"
+ "iGap Android Client V"
+ "Bazaar"
+
+ Are you sure you want to delete this group?
+ Are you sure you want to leave this group?
+ Waiting for Connecting to Server
+ Delete Photo
+ Delete Chat
+ "picture saved to gallery"
+ My Location
+ Shared Images
+ Shared Videos
+ Shared Audios
+ Shared Voices
+ Shared Gifs
+ Shared Files
+ QR Payment
+ Charge balance
+ Total balance
+ Rial
+ Unverified/
+ Sending documents
+ Charge
+ Transaction history
+ Transfer Money
+ Create QR code
+ Pay via QR code
+ Charge out
+ E-Commerce
+ Agreement
+ Message of Charging out
+ Description(optional)
+ Enter the code here
+ Transfer to
+ Price
+ Amount
+ Email(optional)
+ Create
+ the GIF selected to send
+ Log message
+ Iranian Rial(IRR)
+ "Your login code is:"
+ There are no shared media
+ Pending
+ Completed
+
+ Please Enter Channel Name
+ New Channel
+ Channel Name
+ Channel Description
+ Delete Channel
+ Leave Channel
+ Please Enter Channel Description
+ Delete and Leave Channel
+ Draft:
+ You:
+ You
+ Persian Date
+ "Are you sure you want to leave this room?"
+ Are you sure you want to delete this room?
+ Are you sure you want to delete this channel?
+ Are you sure you want to leave this channel?
+ Are you sure you want to clear history of this room?
+ Are you sure you want to sign out of your iGap account?
+ Signature
+ Last day
+ Two days ago
+ Three days ago
+ Four days ago
+ Five days ago
+ Six days ago
+ at
+
+ Farvardin
+ Ordibehesht
+ Khordad
+ Tir
+ Mordad
+ Shahrivar
+ Mehr
+ Aban
+ Azar
+ Dey
+ Bahman
+ Esfand
+
+ Copy
+ Change Link
+ Join
+ "Do you want to join this "
+ Block User
+ "Unblock User"
+ Spam
+
+ "Sunday"
+ Monday
+ "Tuesday"
+ "Wednesday"
+ "Thursday"
+ "Friday"
+ "Saturday"
+
+
+ "joined iGap"
+ "left iGap"
+ "created"
+ "added"
+ ""
+ "kicked out"
+ "left Page"
+ "converted to Public"
+ "converted to Private"
+ "joined via Invite Link"
+ "deleted Room"
+ "conversation"
+
+ "Missed Screen Share"
+ "Missed Voice Call"
+ "Missed Video Call"
+
+
+ other
+ other
+ other
+ other
+ Revoke
+ Invitation Link
+ Channel Invitation Link
+ Group Invitation Link
+ Self-destruct
+ Convert to private
+ Do you want to convert this channel to private?
+ Convert to public
+ Do you want to convert this channel to public?
+ Set Username
+
+ Convert to Private
+ Do you want to convert this group to private?
+ Convert to Public
+ Do you want to convert this group to public?
+ Set Username
+ Send Position
+ Deleted Message
+ Unread Message
+
+
+ "iGap needs to access your"
+ Camera
+ Storage
+ Contact
+ Calender
+ Location
+ Record Audio
+ Call Phone
+ Received Messages
+
+ USER VERIFY MAX TRY
+ USER GET DELETE TOKEN MAX TRY
+ USER GET DELETE TOKEN MAX SEND
+ USER DELETE MAX TRY
+ USER PROFILE UPDATE USERNAME UPDATE
+ GROUP UPDATE USERNAME UPDATE LOCK
+ CHANNEL UPDATE USERNAME UPDATE
+
+ Channel Public Link
+ iGap Official Blog
+ Support Request
+ iGap Official Home
+ You need the storage permission for going on.
+ Clean Up All
+ Clean Up
+ Are you sure you want to clean up all data in local chat rooms?
+ PM
+ AM
+ Message(s) Selected
+ Message(s) Selected
+ Forward message
+ File Not Downloaded Yet
+ Open
+ Close
+ My Cloud
+ Server not Found
+ Text Is Empty
+ Please Try Again
+ There is no room with this ID
+ iGap Theme Color
+ Notification
+ Color
+ is
+ are
+ Members are
+ Toggle Button Color
+ Send and Attach Button
+ Title
+ Progress bar
+ Who can see my Avatar?
+ Who can invite me to Channels?
+ Who can invite me to Groups?
+ Nobody
+ My Contacts
+ Privacy Setting
+ Look and Find
+ Reset Colors Back to Default
+ Please try to enter the first 5 characters of username
+ Enter at least 3 characters to search
+ No Result
+ Server not found
+ No Messages Yet
+ You didn\'t make any call yet
+ Show Members List
+ Show Channel Vote Layout
+ Close
+ INVALID
+ TAKEN
+ RECEIVING IS LIMITED
+ Trim Video
+ Compress Video
+ Compressing...
+ Selected color cannot be set on your device
+ Forever
+ 1 Month
+ 6 Month
+ "File save to download folder"
+ First download file
+ File save to galary folder
+ File can not save to selected folder
+ File save to video folder
+ File save to picture folder
+ Restriction in Chatting
+ Please wait for the process to finish (You are not allowed to send messages to more than 10 Unknown Users regularly at the same time; after getting to number 10, you get stopped until the end of countdown timer)
+ Restriction in Number of Rooms
+ You are allowed to create up to 25 Groups and/or Channels
+ Show Sender Name in Groups
+ Call list
+ Voice Call
+ Video Call
+ Map
+ Nearby
+ iGap Voice Call
+ No messages here yet…
+ (Required)
+ (Optional)
+ Description (Optional)
+ Set Additional Password
+ Two-Step Verification
+ You can set a password that will be required when you log in on a new device in addition to the code you get via SMS.
+ Enter a Password
+ Please enter your Password
+ Your Password
+ Please re-enter your password
+ Please create a password hint
+ Password Hint
+ Question one (Required)
+ eg: Who is your Favorite teacher?
+ Question two (Required)
+ New Security Questions
+ Change old question with answers for recovering password.
+ eg: Who is your best friend?
+ Answer
+ Password Question
+ Recovery E-mail
+ Your Email (Optional)
+ Recovery Question
+ Two-Step Verification
+ Forgot password?
+ Recovery via E-mail
+ Recent code
+ Enter your code
+ Change Password
+ Change Hint
+ Turn Password off
+ Do you really want to remove password?
+
+ Set/change Recovery E-Mail
+ Change Security Questions
+ Recover password via:
+
+ Confirm E-Mail
+ Recovery with Question
+ Confirmation Code
+
+ Recovery via E-mail
+ Recovery via Question
+
+ Security Question
+ E-mail
+
+ Recovery Password
+ Please add your valid e-mail! It is another way to recover your forgotten password
+ Select Contact
+ Please enter code
+ Please enter code
+ Hint can\'t be the same as password
+ "Please complete all items
+ "Password does not match
+ "Password has to be more than 2 characters
+ "Please complete all items
+ "hint can\'t be the same as password
+ "Please enter your hint
+ "Please enter your email
+
+ Password is locked for a while due to too many tries.
+ Is not allowed to communicate
+ User is blocked
+ Dialed number is not active
+ You are talking with your other devices
+ The user is in conversation
+ Is not allowed to communicate
+ Return to Call Screen
+
+ iGap has crashed!
+ Reset
+ An unexpected error occurred forcing the application to stop. We are aware of this error. Please be sure we are fixing this problem, all you have to do is only click "Reset".
+ Who can voice call me?
+ Who can video call me?
+ Missed Call
+ Unanswered Call
+
+ Nothing
+ Are you sure you want to clear all incoming and outgoing calls?
+ Please write your reasons
+ Enter the confirmation code sent to Email
+ Confirmation email
+ A code has been sent to your email in order that your email address will be verified and confirmed then.
+ Skip
+ Resend Confirmation Code
+ Invalid verify email code
+ We\'ve resent the confirmation code to your email
+ Please enter verify email code
+ Password is invalid
+ "Please set password"
+ "Please set hint"
+ "Your email is invalid"
+ "Yes"
+ "No"
+
+
+ Not Answered ANSWERED
+ Unavailable
+ Too Long
+ Signaling
+ Incoming Call
+ Ringing
+ Connecting
+ Connected
+ Disconnected
+ Failed
+ Rejected
+ Busy
+
+ "Your email token is invalid"
+ "Your answer is invalid"
+
+ "Voice Call Cancelled"
+ Recorded By
+ Login with QR code
+ Device login success
+ QR code Scanner
+ Call Quality
+ "If you choose one of the periods in the following and never use your iGap account during the certain time, your account will be destructed and deleted spontaneously."
+ Are you sure you want to reset all changes with color to default?
+
+ Rotate
+ Crop
+ Flip
+ Flip horizontally
+ Flip vertically
+
+ My Avatars get seen by
+ Channels Invite Link received from
+ Groups Invite Link received from
+ Calls received from
+ My Last Seen checked by
+ item
+
+ byte
+ KB
+ MB
+ GB
+ TB
+
+
+ Audio
+ Total Size
+
+ Manage Spacing
+ Local Database
+ Data Storage
+ Keep Media
+
+
+ This user dose not have iGap yet, send an invitation?
+ Clearing the local database will delete the texts of cached messages and compress the database to save internal disk space. iGap needs some data to work, so database size will not reach zero. \n\n This operation can take few minutes to complete.
+ List of Phone Contacts
+
+ Limit time for change Username
+ Cached data on your device are the uploaded and/or downloaded files as photos, videos or documents, which must be cleared occasionally not to stop your device working or slow it down. Whenever you want to see them again, it is sufficient only to tap on them for downloading.
+ Name
+
+ The location status and other features of map are disabled. To use all the capabilities, turn the switch on first.
+ turn off
+ turn on
+ positioning
+ Manually Update the Map
+ List of People Nearby
+ Disable "Nearby" Visibility
+ Receiving notes...
+ No Status
+ about %d m
+ Your Status
+ Clear Status
+ You will be visible to others with no status. Are you sure to continue?
+
+ Enable Nearby
+ Disable Nearby
+ Enabling Nearby will result in getting your and others\' status visible to both. Are you sure to continue?
+ Disabling Nearby will not only result in hiding your status from others, but you won\'t also be able to see others\' status within your certain range. Are you still sure to continue?
+ Notice! Activating "Map Status" will result in making your location visible to others. Please be sure about it before turning on.
+ Only the users within your 5KM radius distance are visible to you if their Map Status in ON.
+
+ Your status cannot exceed 4 lines.
+
+ Auto-Rotate Screen
+ 24 hour clock
+ Dark Theme
+ PassCode Lock
+ Unlock With FingerPrint
+ Change PassCode
+ Auto-lock
+ Allow Screen Capture
+ Confirm fingerPrint to continue
+ Touch sensor
+ FingerPrint
+ Fingerprint not recognized. Try again
+ The app will be locked after each time you choose and you need to unlock it at the beginning.
+ If enabled, you can take screenshots of the app, but the system will display your chats in the task switcher even when the passcode is on. You may need to restart the app for this to take effect.
+ When you set a passcode, a lock icon will appear on top of the main chats page. Tap it to lock or unlock the app.
\nNote: you can set only numbers as a PIN or a combination of numbers and letters as a Password with no restriction. \nIf you forget your passcode, you just need to log out once and log in again with no need to enter the PIN/Password.
- If you have forgotten your PIN/Password, there is no way to recover but only to log out and log in again. Are you sure to log out?
- Forgot PIN/Password?
- Enter your passcode
- Enter your new passcode
- Re-enter your passcode
-
-
- Disable
- in 1 minute
- in 5 minutes
- in 1 hour
- in 5 hours
- PIN
- Password
- Unlock with your passcode
- Forgot Passcode?
- The passcode must contain at least 4 numbers and/or letters.
- Block the User
- Are you sure to block this User?
- Unblock the User
- Are you sure to unblock this User?
-
- Oops! No user nearby has turned on her/his map yet
- Send Message To
- Are you sure send forward for
-
- Bio
- You can add a few lines about yourself. anyone who opens your profile will see this text.
- Report
- Spam
- Violence
- Pornography
- Other
- Abuse
- Fake Account
- You have exceeded the allowed number of characters. You can use only 70 characters for Bio.
- Delete for
- Are you sure you want to delete %1$s message(s)?
- Report was successfully sent.
- Can not set position
- Date
- Gregorian
- Hijri Shamsi
- Hijri Lunar
- Uploading...
-
- Muharram
- Safar
- Rabi Awwal
- Rabi Thani
- Jumada Awwal
- Jumada Thani
- Rajab
- Shaaban
- Ramadhan
- Shawwal
- Thul Qidah
- Thul Hijjah
-
- Multi Tab
- Dark Theme
- Understood
- Attention
- Note: People on the map will be displayed with a 500-meter error. So no worries
- Small camera in attachments
- Open video with default player
- Channel Reaction
- Verified Channel
- Verified User
- Another Room
- Send
- Don\'t Send
- Save data in sd card
- Are you sure
- Change storage place
- Other Files
- Import contact list
- Your contact list is very large and can not import to server
-
- Are you discarding changes?
- Brightness
- Contrast
- Saturation
- Filters
- Edit
- This file can not be opened
- "Do you want to %s this message?"
- UnPin
- Pin
- Pinned Message
- All Members
- This Page
- Disable
- Scheduled:
- From:
- Until:
- Automatic
- The night mode was activated from 19 to 8 with automatic mode selection
- Setting Dark Theme
- Select Time
- Financial Services
- Install App
- To use the service: to install the application for the card, buy a bus ticket, purchase a charge, pay bills, buy a package and other payment services.
- Follow up, pick up your wallet and instant cash deposit, pay your gifts, buy from stores and pay tax limousines.
- customization
- Apply colors to customize
- iGap Notification
- Payment
- Top up SIM card
- Pay bills
- Pay traffic tickets
- Barcode reader
- Billing ID
- enter
- Payment code
- Amount(Rial)
- pay
- Select
- Hamrahe Aval
- IranCell
- Ritel
- Normal charge
- Amazing charge
- WiMAX charge
- Charge permanent SIM cards
-
- 10,000 Rials
- 20,000 Rials
- 50,000 Rials
- 100,000 Rials
- 200,000 Rials
-
- 10,000 Rials + 9% Value Added = 10,900 Rials
- 20,000 Rials + 9% Value Added = 21,180 Rials
- 50,000 Rials + 9% Value Added = 54,500 Rials
- 100,000 Rials + 9% Value Added = 109,000 Rials
- 200,000 Rials + 9% Value Added = 218,000 Rials
- Billing id is not valid
- Payment Id is not valid
- Charge type
- operator
- Ported subscriber
- time out error
- no connection error
- server error
- network error
- Request canceled
- device root
- phone number is not valid
- please select operator
- Wallet
- Loading wallet agreement …
- I agree with the terms
- Accept the terms
- Wallet agreement
- Send Money
- Enter the transfer amount below :
- Amount in Rial :
- pay
- Transfer to :
- money
- Trace Number
- amount :
- payment is canceled
- PayGear is unavailable
- MCI subscribers bill enquiry
- Home phones bill enquiry
- Bills inquiry mci and telecom
- Bills inquiry
- Bill Type
- Home phone
- Phone number
- Area code
- Inquiry
- This number is not an mci subscriber
- mid term
- mid-term payment
- last term
- last-term payment
- Responsible for all financial services
- Parsian e-commerce company (top)
-
- Customer Support Center: 021-2318
- Ex : 09123456789
- Ex : 021
- Ex : 44567899
- Sync Contact
- Satellite View
- Default View
- Send selected location
- m away
- Calculating...
- Getting data
-
- Unsuccessful
- "Payment was unsuccessful"
- The result of the payment is not known to the wallet period of the references or with the support contact.
- Payment was successful. Check more in the wallet history section.
-
- From:
- To:
- Amount:
- Trace Number:
- Invoice Number:
- Pay Time:
- ---Description---
- Toman
- Your credit:
- Rial
- Error communicating with server
-
- Due to overuse, your IP has been blocked for a while.
- Export Chat
- Not able to extract messages
-
- Wi-Fi Data Usage
- Mobile Data Usage
- Sent
- Received
- Bytes sent
- Bytes received
- Total
- Total sent
- Total received
- Clear data usage
- Are you sure you want to clear data usage?
-
-
- Create new pattern
- Repeat pattern
- Pattern PassCode
- Show line pattern
-
+ If you have forgotten your PIN/Password, there is no way to recover but only to log out and log in again. Are you sure to log out?
+ Forgot PIN/Password?
+ Enter your passcode
+ Enter your new passcode
+ Re-enter your passcode
+
+
+ Disable
+ in 1 minute
+ in 5 minutes
+ in 1 hour
+ in 5 hours
+ PIN
+ Password
+ Unlock with your passcode
+ Forgot Passcode?
+ The passcode must contain at least 4 numbers and/or letters.
+ Block the User
+ Are you sure to block this User?
+ Unblock the User
+ Are you sure to unblock this User?
+
+ Oops! No user nearby has turned on her/his map yet
+ Send Message To
+ Are you sure send forward for
+
+ Bio
+ You can add a few lines about yourself. anyone who opens your profile will see this text.
+ Report
+ Spam
+ Violence
+ Pornography
+ Other
+ Abuse
+ Fake Account
+ You have exceeded the allowed number of characters. You can use only 70 characters for Bio.
+ Delete for
+ Are you sure you want to delete %1$s message(s)?
+ Report was successfully sent.
+ Can not set position
+ Date
+ Gregorian
+ Hijri Shamsi
+ Hijri Lunar
+ Uploading...
+
+ Muharram
+ Safar
+ Rabi Awwal
+ Rabi Thani
+ Jumada Awwal
+ Jumada Thani
+ Rajab
+ Shaaban
+ Ramadhan
+ Shawwal
+ Thul Qidah
+ Thul Hijjah
+
+ Multi Tab
+ Dark Theme
+ Understood
+ Attention
+ Note: People on the map will be displayed with a 500-meter error. So no worries
+ Small camera in attachments
+ Open video with default player
+ Channel Reaction
+ Verified Channel
+ Verified User
+ Another Room
+ Send
+ Don\'t Send
+ Save data in sd card
+ Are you sure
+ Change storage place
+ Other Files
+ Import contact list
+ Your contact list is very large and can not import to server
+
+ Are you discarding changes?
+ Brightness
+ Contrast
+ Saturation
+ Filters
+ Edit
+ This file can not be opened
+ "Do you want to %s this message?"
+ UnPin
+ Pin
+ Pinned Message
+ All Members
+ This Page
+ Disable
+ Scheduled:
+ From:
+ Until:
+ Automatic
+ The night mode was activated from 19 to 8 with automatic mode selection
+ Setting Dark Theme
+ Select Time
+ Financial Services
+ Install App
+ To use the service: to install the application for the card, buy a bus ticket, purchase a charge, pay bills, buy a package and other payment services.
+ Follow up, pick up your wallet and instant cash deposit, pay your gifts, buy from stores and pay tax limousines.
+ customization
+ Apply colors to customize
+ iGap Notification
+ Payment
+ Top up SIM card
+ Pay bills
+ Pay traffic tickets
+ Barcode reader
+ Billing ID
+ enter
+ Payment code
+ Amount(Rial)
+ pay
+ Select
+ Hamrahe Aval
+ IranCell
+ Ritel
+ Normal charge
+ Amazing charge
+ WiMAX charge
+ Charge permanent SIM cards
+
+ 10,000 Rials
+ 20,000 Rials
+ 50,000 Rials
+ 100,000 Rials
+ 200,000 Rials
+
+ 10,000 Rials + 9% Value Added = 10,900 Rials
+ 20,000 Rials + 9% Value Added = 21,180 Rials
+ 50,000 Rials + 9% Value Added = 54,500 Rials
+ 100,000 Rials + 9% Value Added = 109,000 Rials
+ 200,000 Rials + 9% Value Added = 218,000 Rials
+ Billing id is not valid
+ Payment Id is not valid
+ Charge type
+ operator
+ Ported subscriber
+ time out error
+ no connection error
+ server error
+ network error
+ Request canceled
+ device root
+ phone number is not valid
+ please select operator
+ Wallet
+ Loading wallet agreement …
+ I agree with the terms
+ Accept the terms
+ Wallet agreement
+ Send Money
+ Enter the transfer amount below :
+ Amount in Rial :
+ pay
+ Transfer to :
+ money
+ Trace Number
+ amount :
+ payment is canceled
+ PayGear is unavailable
+ MCI subscribers bill enquiry
+ Home phones bill enquiry
+ Bills inquiry mci and telecom
+ Bills inquiry
+ Bill Type
+ Home phone
+ Phone number
+ Area code
+ Inquiry
+ This number is not an mci subscriber
+ mid term
+ mid-term payment
+ last term
+ last-term payment
+ Responsible for all financial services
+ Parsian e-commerce company (top)
+
+ Customer Support Center: 021-2318
+ Ex : 09123456789
+ Ex : 021
+ Ex : 44567899
+ Sync Contact
+ Satellite View
+ Default View
+ Send selected location
+ m away
+ Calculating...
+ Getting data
+
+ Unsuccessful
+ "Payment was unsuccessful"
+ The result of the payment is not known to the wallet period of the references or with the support contact.
+ Payment was successful. Check more in the wallet history section.
+
+ From:
+ To:
+ Amount:
+ Trace Number:
+ Invoice Number:
+ Pay Time:
+ ---Description---
+ Toman
+ Your credit:
+ Rial
+ Error communicating with server
+
+ Due to overuse, your IP has been blocked for a while.
+ Export Chat
+ Not able to extract messages
+
+ Wi-Fi Data Usage
+ Mobile Data Usage
+ Sent
+ Received
+ Bytes sent
+ Bytes received
+ Total
+ Total sent
+ Total received
+ Clear data usage
+ Are you sure you want to clear data usage?
+
+
+ Create new pattern
+ Repeat pattern
+ Pattern PassCode
+ Show line pattern
+
+ SMS
+ Call
+ Way to receive code:
+ Separate Notifications
+ Mark as read
+ Answer
+ Solid colors
+ Wallpapers
+ iGapLocalDatabase.realm
+ iGapLocalDatabaseEncrypted.realm
+
+ iGapLocalDatabaseEncrypted.realm
+ iGapLocalDatabase.realm
+ check internet connection
+ Start
+ Bot
+ back to main menu
+ Update
+ Welcome to iGap Smart Intelligence Assistant!
+ Hashtag
+ Version is deprecated please update to use
+ New version is available
+ Alert
+ Ignore
+ please select and active iGap from menu to receive messages when even app is not in background
+ Do not show again
+ \Hey Join iGap : https://www.igap.net/ I\'m waiting for you!\ \n Reagent ID is :
\ No newline at end of file